idea docker打包springboot镜像自动推送服务器

127 阅读6分钟

1.安装docker

# 安装必要工具
yum install -y yum-utils device-mapper-persistent-data lvm2

# 添加 Docker 源(用阿里云镜像源加速)
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安装 Docker
yum install -y docker-ce docker-ce-cli containerd.io

# 启动 Docker
systemctl start docker
systemctl enable docker

# 验证
docker -v

2.修改宿主机的docker配置,让其可以远程访问,开放http可访问

#1. 用sudo管理员权限 打开配置文件
sudo vi /lib/systemd/system/docker.service

#2. 在ExecStart=后添加配置 
‐H tcp://0.0.0.0:44888 ‐H unix:///var/run/docker.sock

例如完整替换:ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:44888 -H unix
:///var/run/docker.sock

#3. 保存退出
**先退出编辑模式**:按一下键盘上的 `Esc` 键(左下角状态栏会从 `-- INSERT --` 变为空白或显示文件名)。
**保存并退出**:  
    输入 `:wq`(注意是英文冒号开头,`w` 表示保存,`q` 表示退出),然后按 `Enter` 键。
**如果不需要保存修改**:  
    输入 `:q!``!` 表示强制退出不保存),按 `Enter` 键。

#4. 通知docker服务做出的修改 
systemctl daemon-reload 

#5. 重启docker服务 
systemctl restart docker

#6.服务器开放端口

#7.接下来测试一下看是否能连接到docker api
浏览器访问
http://111.170.6.95:44888/version
输出:
{"Platform":{"Name":"Docker Engine - Community"},"Components":[{"Name":"Engine","Version":"26.1.4","Details":{"ApiVersion":"1.45","Arch":"amd64","BuildTime":"2024-06-05T11:31:02.000000000+00:00","Experimental":"false","GitCommit":"de5c9cf","GoVersion":"go1.21.11","KernelVersion":"3.10.0-957.1.3.el7.x86_64","MinAPIVersion":"1.24","Os":"linux"}},{"Name":"containerd","Version":"1.6.33","Details":{"GitCommit":"d2d58213f83a351ca8f528a95fbd145f5654e957"}},{"Name":"runc","Version":"1.1.12","Details":{"GitCommit":"v1.1.12-0-g51d5e94"}},{"Name":"docker-init","Version":"0.19.0","Details":{"GitCommit":"de40ad0"}}],"Version":"26.1.4","ApiVersion":"1.45","MinAPIVersion":"1.24","GitCommit":"de5c9cf","GoVersion":"go1.21.11","Os":"linux","Arch":"amd64","KernelVersion":"3.10.0-957.1.3.el7.x86_64","BuildTime":"2024-06-05T11:31:02.000000000+00:00"}
则成功开放!



备注:1和2步骤快捷解决:可使用自动安装脚本安装 docker-install.sh

 1.将docker-install.sh放到服务器目录
 2.sudo chmod +x docker-install.sh  #添加root执行权限
 3. ./docker-install.sh  #执行docker-install.sh 
 
 或
 直接通过 curl 执行(不保存脚本)
 curl -fsSL https://api.6600k.cn/public/docker-install.sh | sudo bash
#!/bin/bash
set -e

# 定义可配置的参数
DOCKER_PORT=44888  # 远程访问端口

echo "===== 开始安装必要工具 ====="
sudo yum install -y yum-utils device-mapper-persistent-data lvm2 net-tools

echo "===== 添加阿里云Docker源 ====="
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

echo "===== 安装Docker ====="
sudo yum install -y docker-ce docker-ce-cli containerd.io

echo "===== 启动Docker服务并设置开机自启 ====="
sudo systemctl start docker
sudo systemctl enable docker

echo "===== 验证Docker版本 ====="
docker -v || sudo docker -v  # 兼容不同环境下的权限配置

echo "===== 配置Docker镜像加速 ====="
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
        "https://docker.registry.cyou/",
        "https://docker-cf.registry.cyou/",
        "https://dockercf.jsdelivr.fyi/",
        "https://docker.jsdelivr.fyi/",
        "https://dockertest.jsdelivr.fyi/",
        "https://mirror.aliyuncs.com/",
        "https://dockerproxy.com/",
        "https://mirror.baidubce.com/",
        "https://docker.m.daocloud.io/",
        "https://docker.nju.edu.cn/",
        "https://docker.mirrors.sjtug.sjtu.edu.cn/",
        "https://docker.mirrors.ustc.edu.cn/",
        "https://mirror.iscas.ac.cn/",
        "https://docker.rainbond.cc/",
        "https://jq794zz5.mirror.aliyuncs.com",
        "https://66a84trh.mirror.aliyuncs.com"]
}
EOF

echo "===== 备份并修改配置文件(使用端口: $DOCKER_PORT) ====="
# 备份原始配置
sudo cp /lib/systemd/system/docker.service /lib/systemd/system/docker.service.bak

# 使用变量修改配置文件,设置远程访问端口
sudo sed -i "s#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:${DOCKER_PORT} -H unix:///var/run/docker.sock#g" /lib/systemd/system/docker.service

echo "===== 重新加载配置并重启Docker ====="
sudo systemctl daemon-reload
sudo systemctl restart docker

echo "===== 检查服务状态 ====="
if sudo systemctl is-active --quiet docker; then
    echo "Docker服务运行正常"
else
    echo "错误:Docker服务未正常启动" >&2
    exit 1
fi

echo "===== 验证镜像加速配置 ====="
# 忽略大小写匹配,同时显示实际配置的镜像源
if docker info | grep -qi "registry mirrors"; then
    echo "镜像加速配置已生效"
    # 显式输出镜像源列表(兼容不同格式)
    docker info | grep -A 20 -i "registry mirrors"
else
    echo "警告:镜像加速配置未生效" >&2
fi

echo "===== 测试访问 ====="
echo "本地测试结果:"
curl -s http://localhost:${DOCKER_PORT}/version

echo "====================================="
echo "Docker 安装配置完成!远程访问端口:${DOCKER_PORT}"
echo "====================================="

3.使用插件docker-maven-plugin

# 1.根目录新建docker文件夹放入Dockerfile文件  docker/Dockerfile
Dockerfile内容如下:

# 用 JDK 8 作为基础镜像(你是 JDK 1.8)
FROM openjdk:8-jdk-alpine

# 维护者信息(可选)
LABEL maintainer="597172583@qq.com"

# 把 jar 包复制到容器
COPY bootapi-0.0.1-BOOTAPI.jar bootapi.jar

# 暴露 Spring Boot 端口(根据你项目配置改)
EXPOSE 8800

# 启动命令
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/bootapi.jar", "--spring.profiles.active=prod"]


2. #pom.xml中导入docker-maven-plugin插件配置  ${project.basedir}指向Dockerfile文件路径

 <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>${docker.plugin.version}</version>
                <configuration>
                    <dockerHost>http://111.170.6.95:2375</dockerHost>
                    <imageName>${project.name}</imageName>
                    <dockerDirectory>${project.basedir}/docker</dockerDirectory>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
            

4.idea 底部服务链接dicker http镜像端口

显示连接成功则可看到镜像

image.png

5.maven打包推送镜像

idea执行命令
mvn docker:build -X

6.idea docker插件 运行项目docker容器

可直接服务器启动
docker run -d --restart=unless-stopped -e TZ=Asia/Shanghai -e LANG=C.UTF-8 -p 8899:8899 --name bootapi bootapi:latest

备注: **`-p 0.0.0.0:9900:8800`**
    -   **0.0.0.0** → 表示监听服务器上所有可用 IP(本地回环、本地局域网 IP、公网 IP 等)
    -   **9900** → 宿主机端口(外部访问时用这个)
    -   **8800** → 容器内部应用的端口(Docker 容器里的程序监听的端口)

    🔹 这样设置后,无论是:
  
    http://127.0.0.1:9900
    http://你的内网IP:9900
    http://你的公网IP:9900
  
    都可以访问。

-   **`--name bootapi`**  
    容器名字叫 `bootapi`。

-   **`-d`**  
    让容器在后台运行(detached mode),不占用你的终端窗口。

-   **`bootapi:latest`**  
    要运行的镜像名是 `bootapi`,标签是 `latest`。

1.更具镜像创建容器

image.png

image.png

2.创建映射端口号

3.添加运行容器配置

-d --restart=unless-stopped -e TZ=Asia/Shanghai -e LANG=C.UTF-8 -p 9900:9900

image.png

image.png

4.容器运行成功

image.png

7.服务器配置服务器或docker重启时,自动重启之前的docker容器

# 1. 设置Docker服务开机自启
sudo systemctl enable docker

# 2. 为所有容器配置自动重启(仅需设置一次)
sudo docker update --restart=always $(sudo docker ps -aq)
# 为所有容器设置unless-stopped策略
sudo docker update --restart=unless-stopped $(sudo docker ps -aq)
-   `always`:无论何种情况,Docker 服务启动就会启动容器(即使是手动停止的)
-   `unless-stopped`:只有容器是意外停止的才会自动重启(手动停止的容器不会被自动启动)


**创建新容器时直接指定策略**(推荐)

Docker 的 `--restart` 参数用于配置容器的自动重启策略,共有 4 种常用参数,分别适用于不同场景:

 **`--restart=no`(默认值)**

    -   含义:容器退出后不会自动重启,完全需要手动启动。
    -   适用场景:临时测试的容器、不需要持久运行的一次性任务。
 **`--restart=on-failure[:max-retries]`**
 
    -   含义:仅当容器**以非 0 状态退出**(即运行出错退出)时才自动重启。
    -   可选参数 `max-retries`:最多重启次数(如 `on-failure:3` 表示最多重启 3 次,超过后不再尝试)。
    -   适用场景:可能偶尔因外部因素(如网络波动)出错,但可通过重启恢复的服务(如数据库连接临时中断的应用)。
    
  **`--restart=unless-stopped`**

    -   含义:容器会一直自动重启,除非用户手动执行 `docker stop` 停止容器(手动停止后,即使 Docker 服务重启也不会再启动)。
    -   适用场景:需要长期运行,但可能需要手动临时停止维护的服务(如 Web 应用、API 服务)。
    
 **`--restart=always`**

    -   含义:无论容器以何种状态退出(包括正常退出、错误退出),甚至被手动停止,只要 Docker 服务重启,容器就会被重新启动。
    -   适用场景:必须始终运行、不允许手动停止后 “遗忘启动” 的核心服务(如监控代理、关键中间件)。