她说可以呀头像
Dockerfile通过IDEA远程容器化部署封面图

Dockerfile通过IDEA远程容器化部署

本文章介绍IDEA界面化远程构建部署到服务方式,本文提供大致思路,具体细节可以配合AI执行

方式一(推荐单节点少服务)

前置连接证书准备

  • 如果你对安全无需求(比如在虚拟机上)可以跳过证书准备环节
  1. 自行配置好顶部信息栏

    #!/bin/bash
    
    #vi /lib/systemd/system/docker.service
    #--tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem
    
    SERVER="你的服务器主机"
    PASSWORD="你的服务器密码"
    COUNTRY="CN"
    STATE="ShanXi"
    CITY="XiAn"
    ORGANIZATION="bitejiuyeke"
    ORGANIZATIONAL_UNIT="Dev"
    EMAIL="[email protected]"
    
    #临时文件夹
    TEMP_DIR='/data/cert/docker'
    
    mkdir -p ${TEMP_DIR}
    cd ${TEMP_DIR}
    
    #生成`ca-key.pem` 文件 设置密码
    openssl genrsa -aes256 -passout pass:${PASSWORD} -out ca-key.pem 4096
    echo "生成ca私钥完成"
    
    
    #生成 `ca.pem` 文件,设置国家、省市、组织名、邮箱
    
    openssl req -new -x509  -passin "pass:${PASSWORD}"  -days 3650 -key ca-key.pem -sha256 -out ca.pem -subj "/C=${COUNTRY}/ST=${STATE}/L=${CITY}/O=${ORGANIZATION}/OU=${ORGANIZATIONAL_UNIT}/emailAddress=${EMAIL}"
    echo "填写配置信息完成"
    
    #生成 `server-key.pem` 文件
    
    openssl genrsa -out server-key.pem 4096
    
    #生成 `server.csr` 文件
    
    openssl req -subj "/CN=${SERVER}" -sha256 -new -key server-key.pem -out server.csr
    
    #生成配置文件 `extfile.cnf`
    
    echo subjectAltName = IP:${SERVER},IP:0.0.0.0 >> extfile.cnf
    
    echo extendedKeyUsage = serverAuth >> extfile.cnf
    
    #生成服务器证书,需要输入之前输入的密码
    openssl x509 -req -days 3650 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem  -passin "pass:${PASSWORD}"  \-CAcreateserial -out server-cert.pem -extfile extfile.cnf
    
    echo "生成自签证书完成"
    
    #添加配置,使密钥适合客户端身份验证
    echo extendedKeyUsage = clientAuth >> extfile.cnf
    #生成 `key.pem` 文件
    openssl genrsa -out key.pem 4096
    #创建`client.csr`文件
    openssl req -subj '/CN=client' -new -key key.pem -out client.csr
    #生成证书
    openssl x509 -req -days 3650 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:${PASSWORD}" \-CAcreateserial -out cert.pem -extfile extfile.cnf
    echo "生成client自签证书完成"
    rm -v -f client.csr server.csr
    chmod -v 0444 ca-key.pem key.pem server-key.pem
    chmod -v 0444 ca.pem server-cert.pem cert.pem
    echo "复制证书到指定目录"
    cp server-*.pem  /etc/docker/
    cp ca.pem /etc/docker/
    
    
    
  2. 将脚本复制到服务器然后执行sh cert.sh

  3. 证书会复制到/etc/docker目录下,复制ca.pem cert.pem key.pem 后缀的文件到本机Windows项目中

    在这里插入图片描述

    得到目录结构
    在这里插入图片描述

  4. 开放端口号
    进入到/lib/systemd/system/docker.service
    添加此配置
    -H tcp://0.0.0.0:2376 --tlsverify=true --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem -H fd:// --containerd=/run/containerd/containerd.sock

    root@Ubuntu:/etc/docker# cat /lib/systemd/system/docker.service 
    [Unit]
    Description=Docker Application Container Engine
    Documentation=https://docs.docker.com
    After=network-online.target nss-lookup.target docker.socket firewalld.service containerd.service time-set.target
    Wants=network-online.target containerd.service
    Requires=docker.socket
    StartLimitBurst=3
    StartLimitIntervalSec=60
    
    [Service]
    Type=notify
    # the default is not to use systemd for cgroups because the delegate issues still
    # exists and systemd currently does not support the cgroup feature set required
    # for containers run by docker
    ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 --tlsverify=true --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem -H fd:// --containerd=/run/containerd/containerd.sock
    ExecReload=/bin/kill -s HUP $MAINPID
    TimeoutStartSec=0
    RestartSec=2
    Restart=always
    
    
  5. 重启Docker

    systemctl daemon-reload
    service docker restart
    

配置 IDEA 的 Docker 连接

  1. Dockerfile示例

    FROM openjdk:21-jdk-slim
    ENV TZ=Asia/Shanghai
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    WORKDIR /workspace
    MAINTAINER bitejiuyeke
    COPY target/*.jar /workspace/app.jar
    ENTRYPOINT exec java $JAVA_OPTS -jar app.jar
    
  2. 在IDEA左下角点击三角符号Services
    在这里插入图片描述

  3. 进入Connection设置
    在这里插入图片描述

  4. tcp://你的虚拟机或者服务器主机:2376
    证书选择的是存放ca.pem cert.pem key.pem 的文件夹
    在这里插入图片描述 如果连接失败,就改成https://你的虚拟机或者服务器主机:2376在这里插入图片描述

    在这里插入图片描述

  5. 右击Dockerfile文件在这里插入图片描述
    自行选择修改端口号
    在这里插入图片描述
    添加 Run Maven Goal 跳过测试环节
    在这里插入图片描述

  6. 在本地先打包package,然后Dockerfile用本地jar包打镜像在这里插入图片描述

  7. Run Dockerfile可以直接打镜像并启动容器,如果有挂载需求可以先打镜像,手动启动挂载-v
    在这里插入图片描述

方式二(单节点多服务)

通过pom文件中的Docker插件一键部署

<!--docker部署配置-->
<dockerhost.addr>tcp://192.168.56.107:2376</dockerhost.addr>
<dockerregistry.url>registry.cn-chengdu.aliyuncs.com</dockerregistry.url>
<dockerregistry.username>[email protected]</dockerregistry.username>
<dockerregistry.password>admin@666777</dockerregistry.password>
<dockerregistry.namespace>flashcode</dockerregistry.namespace>
<docker.skip.push>true</docker.skip.push>

配置基本信息,还可以配置卷映射,环境一些更常用的一些参数

<plugin>
    <groupId>io.fabric8</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>0.45.0</version>

    <configuration>
        <!--指定远程服务器的Docker服务访问地址-->
        <dockerHost>${dockerhost.addr}</dockerHost>
        <certPath>${project.basedir}/../deploy/dev/app/config/cert</certPath>
        <!--指定私有仓库的访问路径-->
        <pushRegistry>${dockerregistry.url}</pushRegistry>
        <!--指定库的用户名与密码-->
        <authConfig>
            <username>${dockerregistry.username}</username>
            <password>${dockerregistry.password}</password>
        </authConfig>
        <containerNamePattern>${dockerregistry.namespace}-%n-%i</containerNamePattern>
        <images>
            <image>
                <!--指定私有仓库访问地址/镜像名称-->
                <name>${dockerregistry.namespace}/${project.build.finalName}:${project.version}</name>
                <build>
                    <!--指定Dockerfile的路径-->
                    <dockerFileDir>${project.basedir}</dockerFileDir>
                </build>
                <run>
    		       <volumes>
                        <bind>
                            <volume>/root/emrys-java/flashcode/deploy/dev/data/flashcodedata/flashcode-app/user-code:/workspace/user-code</volume>
                            <volume>/root/emrys-java/flashcode/deploy/dev/data/flashcodedata/flashcode-app/user-preview:/workspace/user-preview</volume>
                            <volume>/root/emrys-java/flashcode/deploy/dev/data/flashcodedata/flashcode-app/user-deploy:/workspace/user-deploy</volume>
                            <volume>/root/emrys-java/flashcode/deploy/dev/app/config/cert:/workspace/cert:ro</volume>
                        </bind>
                    </volumes>
                    <ports>
                        <port>18080:18080</port>
                    </ports>
                    <env>
                        <NACOS_ADDR>${nacos.addr}</NACOS_ADDR>
                        <RUN_ENV>${runenv}</RUN_ENV>
                        <JAVA_OPTS>${java.opts.default}</JAVA_OPTS>
                    </env>
                </run>
            </image>
        </images>
    </configuration>

    <executions>
        <execution>
            <id>build</id>
            <phase>deploy</phase>
            <goals>
                <goal>stop</goal>
                <goal>build</goal>
                <goal>start</goal>
                <!--推送到远端仓库 -->
                <goal>push</goal>
            </goals>
        </execution>
    </executions>
</plugin>

执行:mvn deploy 一键部署,建议每次clean。在这里插入图片描述

两种方式区别

对比项方式一:IDEA + Dockerfile Run方式二:docker-maven-plugin
适用场景单服务、学习演示、临时发版多微服务、参数多、希望命令可脚本化
操作入口Services 里连 Docker + 运行 DockerfileIDEA Maven 面板 deploy 或命令行 mvn deploy
打 jar需先 package(可绑在 Before launch)随 deploy 生命周期,依赖前面 phase 已编译打包
构建发生在哪里本地有 jar;镜像 build 在连接的 Docker 守护进程(配远程即远程)由插件连 dockerHost,在远程守护进程 build
环境变量 / 端口IDEA 运行配置里填写在 pom 的 <run><env>、<ports>
卷挂载运行配置 Volume 或手动 docker run -v写在 <run><volumes>,可进 Git 统一
停旧容器 / 命名需手动删容器或改配置stop + containerNamePattern
推私有镜像仓库不内置,需另执行 docker push 或 CI可绑 push goal
多服务依赖顺序需 Compound / Compose / 手动起可用 <dependsOn>(如 portal 依赖 mcp)
团队可复现性配置多在 .idea 或本机,易不一致pom + 父工程属性,更易对齐
证书IDEA 选证书文件夹(客户端三件套)certPath 指向项目内 cert 目录
与 Maven 私服 deploy无关,不用点 deploy需 maven-deploy-plugin skip,否则会报 distributionManagement
学习 / 维护成本低,直观中高,需懂 Maven 与插件 goal

怎么选:

  • 一个 demo / 一个 jar:方式一足够。
  • 多模块、固定挂载与 Nacos:方式二更省事;本地调试仍可方式一。

生产流水线部署

通常使用 CI/CD 自动化或 k8s 部署,Dockerfile同样有作用.本文不提及

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/2301_79245606/article/details/167920266

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--