1 Star 0 Fork 28

柚子 / notebook

forked from JustryDeng / notebook 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
[05]通过idea插件快速部署docker.md 13.46 KB
一键复制 编辑 原始数据 按行查看 历史
JustryDeng 提交于 2023-01-19 15:02 . 通过idea插件快速部署docker

通过idea插件快速部署docker

相关说明

  • 本文以实现需求——在本地idea上开发java代码,通过idea的docker插件,将代码部署至远程服务器上进行示例
  • 本文示例中,涉及到的linux操作系统为CentOS7

准备工作

确保远程服务器安装启动有docker

安装教程见[CentOS 7安装docker、docker-compose](./[04]CentOS 7安装docker、docker-compose.md)

查看运行的docker版本

docker -v

image-20221203082303705

确保本地idea上安装有docker插件

位置:File | Settings | Plugins |Docker

image-20221203083825414

通过idea插件快速部署docker

第一步:远程服务器上,设置允许远程访问docker

  • 在启动指令上增加-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock,表示允许任何ip访问2375端口

    # 版本不一样,可能docker.service文件的位置不一样
    # 可使用指令locate docker.service进行查找,如果查到到多个,选一个最像的进行修改即可(不放心的话,可以全部都修改)
    vim /lib/systemd/system/docker.service
    # 注:-H unix:///var/run/docker.sock可以试情况加不加,如下图中已经指定了运行时为containerd那么就可以不加unix:///var/run/docker.sock
    #    如果没指定运行时,那么需要加unix:///var/run/docker.sock
    #    简单的,修改配置后,重启docker后,使用docker ps指令验证一下,如果执行没报错说明可以不加unix:///var/run/docker.sock,如果报错了,则说明需要加上
    -H tcp://0.0.0.0:2375  -H unix:///var/run/docker.sock

    image-20221203084634099

  • 重启docker

    # 重新加载配置文件
    systemctl daemon-reload    
    # 重启服务
    systemctl restart docker.service 
    # 测试docker正常(若报错,请vim /lib/systemd/system/docker.service,去掉或加上-H unix:///var/run/docker.sock再试一试)
    docker ps
  • 确保2375端口已开放

    # 开放指定端口
    firewall-cmd --zone=public --add-port=2375/tcp --permanent
    # 重新载入(重启)防火墙
    firewall-cmd --reload
    # 查询指定端口是否开放
    firewall-cmd --zone=public --query-port=2375/tcp

第二步:本地idea上,docker插件里新增远程docker信息配置

位置:File | Settings | Build,Execution,Deployment | Docker

image-20221203085955690

点击OK后,在Services里面就能看到对应的docker了(注:有的版本的idea,docker信息不在Services里看,而是专门有个tab页给予呈现)

image-20221203090151454

第三步:在pom中引入docker-maven-plugin插件,并作相应配置

方式一:纯插件

提示:如果要编写的Dcodkerfile过于复杂,那么建议使用方式二

<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>1.2.2</version>
    <executions>
        <execution>
            <id>build-image</id>
            <!-- 设置只有当mvn install时,才激活当前插件的build与push功能 -->
            <phase>install</phase>
            <goals>
                <goal>removeImage</goal>
                <goal>build</goal>
                <!-- 需要推送镜像至docker私服时,开启此goal -->
                <!--
                角色&流程:
                             ①        removeImage/build           ②                     push             ③
                windows(idea所在机器) ==================>  执行docker api的机器   ==================> docker registry(docker私服)

                说明:
                  removeImage: 将②上, 同标签名+同镜像名的旧镜像移除
                  build: 将①上的代码构建成镜像到②上, 执行完build后在②docker images可以看到当前镜像
                  push:将②上的镜像推送至③
                 -->
                <!-- <goal>push</goal> -->
            </goals>
        </execution>
    </executions>
    <configuration>
        <!-- 指定生成的镜像名(注:如果需要上传到私有仓库,那么格式一般为: {私有仓库地址ip:port}/{imageName}:${标签}) -->
        <!--
           注:如果你的docker私有仓库需要账号密码的话,那么还需要在maven的settings.xml中的<servers>标签中指定账号密码,如:
               <server>
                   <id>aliyun-justrydeng-harbor</id>
                   <username>admin</username>
                   <password>dengshuai</password>
               </server>
           然后这里使用serverId进行引用
        <serverId>aliyun-justrydeng-harbor</serverId>
        <imageName>47.105.39.189:8635/library/${project.artifactId}:${project.version}</imageName>
        -->
        <imageName>${project.artifactId}:${project.version}</imageName>
        <!-- 指定标签-->
        <imageTags>
            <imageTag>${project.version}</imageTag>
        </imageTags>
        <!-- 指定远程docker机器的地址和ip(这里指定的host,即前面角色①②③中的②) -->
        <dockerHost>http://192.168.44.137:2375</dockerHost>
        <!-- 这复制jar包到 ocker容器指定目录配置 -->
        <resources>
            <resource>
                <!-- 指定需要复制的根目录. ${project.build.directory}即target目录 -->
                <directory>${project.build.directory}</directory>
                <!-- 指定需要directory中需要复制进docker的文件 -->
                <include>${project.build.finalName}.jar</include>
                <!-- 指定复制到docker的哪个文件夹 -->
                <targetPath>/data</targetPath>
            </resource>
        </resources>
        <!--
            直接在这里完成Dockerfile的功能(注:如果要编写的Dcodkerfile过于复杂,那么建议使用方式二)
        -->
        <!-- 基础镜像jdk 1.8 -->
        <baseImage>openjdk:8-jdk</baseImage>
        <!-- 制作者信息 -->
        <maintainer>13548417409@163.com</maintainer>
        <!-- 设置 启动容器时,切换到容器中的指定目录,并执行执行 -->
        <workdir>/data</workdir>
        <cmd>["java", "-version"]</cmd>
        <entryPoint>["java", "-jar", "${project.build.finalName}.jar"]</entryPoint>
    </configuration>
</plugin>

方式二:插件 + Dockerfile

  • pom中插件的配置

    <plugin>
        <groupId>com.spotify</groupId>
        <artifactId>docker-maven-plugin</artifactId>
        <version>1.2.2</version>
        <executions>
            <execution>
                <id>build-image</id>
                <!-- 设置只有当mvn install时,才激活当前插件的build与push功能 -->
                <phase>install</phase>
                <goals>
                    <goal>removeImage</goal>
                    <goal>build</goal>
                    <!-- 需要推送镜像至docker私服时,开启此goal -->
                    <!--
                    角色&流程:
                                 ①        removeImage/build           ②                     push             ③
                    windows(idea所在机器) ==================>  执行docker api的机器   ==================> docker registry(docker私服)
    
                    说明:
                      removeImage: 将②上, 同标签名+同镜像名的旧镜像移除
                      build: 将①上的代码构建成镜像到②上, 执行完build后在②docker images可以看到当前镜像
                      push:将②上的镜像推送至③
                     -->
                    <!-- <goal>push</goal> -->
                </goals>
            </execution>
        </executions>
        <configuration>
            <!-- 指定生成的镜像名(注:如果需要上传到私有仓库,那么格式一般为: {私有仓库地址ip:port}/{imageName}:${标签}) -->
            <!--
               注:如果你的docker私有仓库需要账号密码的话,那么还需要在maven的settings.xml中的<servers>标签中指定账号密码,如:
                   <server>
                       <id>aliyun-justrydeng-harbor</id>
                       <username>admin</username>
                       <password>dengshuai</password>
                   </server>
               然后这里使用serverId进行引用
            <serverId>aliyun-justrydeng-harbor</serverId>
            <imageName>47.105.39.189:8635/library/${project.artifactId}:${project.version}</imageName>
            -->
            <imageName>${project.artifactId}:${project.version}</imageName>
            <!-- 指定标签-->
            <imageTags>
                <imageTag>${project.version}</imageTag>
            </imageTags>
            <!-- 指定远程docker机器的地址和ip(这里指定的host,即前面角色①②③中的②) -->
            <dockerHost>http://192.168.44.137:2375</dockerHost>
            <!-- 这复制jar包到 ocker容器指定目录配置 -->
            <resources>
                <resource>
                    <!-- 指定需要复制的根目录. ${project.build.directory}即target目录 -->
                    <directory>${project.build.directory}</directory>
                    <!-- 指定需要directory中需要复制进docker的文件 -->
                    <include>${project.build.finalName}.jar</include>
                    <!-- 指定复制到docker的哪个文件夹 -->
                    <targetPath>/data</targetPath>
                </resource>
            </resources>
            <!-- 指定Dockerfile文件所在目录 -->
            <dockerDirectory>${project.basedir}/src/main/resources</dockerDirectory>
        </configuration>
    </plugin>
  • 在dockerDirectory指定的目录(我们这里即${project.basedir}/src/main/resources)下创建Dockerfile

    FROM openjdk:8-jdk
    MAINTAINER JustryDeng<13548417409@163.com>
    ADD /data/*.jar /app.jar
    ENTRYPOINT [ "java", "-jar", "/app.jar" ]

    image-20221203102930422

第四步:触发docker-maven-plugin插件,完成镜像的构建与推送

提示:在上面的第三步,我们指定的是当进行maven install时,会触发docker-maven-plugin插件

进行mvn install,通过日志可以看到,install之后,docker-maven-plugin就开始执行了

image-20221203094150412

验证一下,此步完成后,进入远程服务器查看docker镜像:

image-20221203094409746

说明:openjdk是依赖的基础镜像,lastest标签是自动对最新版镜像的记录,1.0.1则是本人刚才通过执行mvn install触发激活docker-maven-plugin插件生成的镜像;1.0.0是之前本人测试时生成的镜像

由此可见,成功了!

第五步:在本地idea中,选择镜像创建容器以完成部署

image-20221203095056357

image-20221203100516889

image-20221203100926041

验证一下,登录远程服务器,查看容器

image-20221203100610314

可见,成功了!

第六步: 访问测试

我们的java代码是

/**
 * start-class
 *
 * @author JustryDeng
 * @since 1.0.0
 */
@Slf4j
@RestController
@SpringBootApplication
public class DeployDockerDemoApplication {
    
    public static void main(String[] args) {
        SpringApplication.run(DeployDockerDemoApplication.class, args);
    }
    
    @GetMapping("/hello")
    public String hello() {
        final String info = "hello" + LocalDateTime.now();
        log.info(info);
        return info;
    }
    
}

在服务器上测试访问curl localhost:8080/hello

image-20221203101006789

由此可见,成功了!

相关资料

1
https://gitee.com/WY784755850/notebook.git
git@gitee.com:WY784755850/notebook.git
WY784755850
notebook
notebook
master

搜索帮助