【 DockerMaven插件 构建镜像 】

1 Dockerfile

1.1 什么是 Dockerfile

Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。
1、对于开发人员:可以为开发团队提供一个完全一致的开发环境;
2、对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新
的镜像开始工作了;
3、对于运维人员:在部署时,可以实现应用的无缝移植。

1.2 常用命令

命令 作用
FROM image_name:tag 定义了使用哪个基础镜像启动构建流程
MAINTAINER user_name 声明镜像的创建者
ENV key value 设置环境变量 (可以写多条)
RUN command 是Dockerfile的核心部分(可以写多条)
ADD source_dir/file dest_dir/file 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
COPY source_dir/file dest_dir/file 和ADD相似,但是如果有压缩文件并不能解压
WORKDIR path_dir 设置工作目录
EXPOSE port1 prot2 用来指定端口,使容器内的应用可以通过端口和外界交互
CMD argument 在构建容器时使用,会被docker run 后的argument覆盖
ENTRYPOINT argument 和CMD相似,但是并不会被docker run指定的参数覆盖
VOLUME 将本地文件夹或者其他容器的文件挂载到容器中

1.3 使用脚本创建镜像

由于我们的项目是用 Java 写的,依赖JDK,所以我们先构建 JDK镜像

步骤:
(1)创建目录

mkdir -p /usr/local/dockerjdk8

(2)下载 jdk-8u171-linux-x64.tar.gz 并上传到服务器(虚拟机)中的/usr/local/dockerjdk8目录
(3)创建文件Dockerfile ,需要在/usr/local/dockerjdk8目录下创建

vi Dockerfile
#依赖镜像名称和ID
FROM centos:7
#指定镜像创建者信息
MAINTAINER YANGSHUO
#切换工作目录
WORKDIR /usr
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把java添加到容器中
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

(4)执行命令构建镜像(要进入到/usr/local/dockerjdk8目录中)

docker build -t='jdk1.8' .

注意后边的空格和点,不要省略
‐t='jdk1.8':构建一个什么样的镜像
点表示当前目录

[[email protected] dockerjdk8]# docker build -t='jdk1.8' .
Sending build context to Docker daemon  190.9MB
Step 1/9 : FROM centos:7
7: Pulling from library/centos
8ba884070f61: Pull complete 
Digest: sha256:8d487d68857f5bc9595793279b33d082b03713341ddec91054382641d14db861
Status: Downloaded newer image for centos:7
 ---> 9f38484d220f
Step 2/9 : MAINTAINER YANGSHUO
 ---> Running in e80c65a3ea50
Removing intermediate container e80c65a3ea50
 ---> 353786b045ce
Step 3/9 : WORKDIR /usr
 ---> Running in 02506b611b90
Removing intermediate container 02506b611b90
 ---> ce089459e7f4
Step 4/9 : RUN mkdir /usr/local/java
 ---> Running in 721830fde10f
Removing intermediate container 721830fde10f
 ---> bbea453f000e
Step 5/9 : ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
 ---> 8aa26005cfbf
Step 6/9 : ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
 ---> Running in 2de62581a617
Removing intermediate container 2de62581a617
 ---> cda67eec6f80
Step 7/9 : ENV JRE_HOME $JAVA_HOME/jre
 ---> Running in 5395714b41e9
Removing intermediate container 5395714b41e9
 ---> 2862656dcf6e
Step 8/9 : ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
 ---> Running in b93b4b55d6c1
Removing intermediate container b93b4b55d6c1
 ---> a2548adafe07
Step 9/9 : ENV PATH $JAVA_HOME/bin:$PATH
 ---> Running in 32b23a14fae3
Removing intermediate container 32b23a14fae3
 ---> e1e56eb41f1c
Successfully built e1e56eb41f1c
Successfully tagged jdk1.8:latest
[[email protected] dockerjdk8]# 

(5)查看镜像是否建立完成

[[email protected] dockerjdk8]# docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
jdk1.8                    latest              e1e56eb41f1c        2 minutes ago       589MB
rabbitmq                  management          5ae7e27bcf34        5 days ago          213MB
centos                    7                   9f38484d220f        5 days ago          202MB
mongo                     latest              a3abd47e8d61        8 days ago          394MB
redis                     latest              0f88f9be5839        2 weeks ago         95MB
centos/mysql-57-centos7   latest              ee80146ff512        4 weeks ago         453MB
hello-world               latest              fce289e99eb9        2 months ago        1.84kB
elasticsearch             latest              5acf0e8da90b        6 months ago        486MB
elasticsearch             5.6.8               6c0bdf761f3b        12 months ago       570MB
[[email protected] dockerjdk8]# 

(6)创建容器

[[email protected] dockerjdk8]# docker run -di --name=coder_jdk8 jdk1.8 /bin/bash
fc7de4b831233f56d462f25a22469d8396e5a39f150ba84108ca8fcc449b396b
[[email protected] dockerjdk8]# docker ps
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                                                                                                                      NAMES
fc7de4b83123        jdk1.8                    "/bin/bash"              7 seconds ago       Up 5 seconds                                                                                                                                   coder_jdk8
8cff2d81b969        rabbitmq:management       "docker-entrypoint.s…"   3 days ago          Up 3 days           0.0.0.0:4369->4369/tcp, 0.0.0.0:5671-5672->5671-5672/tcp, 0.0.0.0:15671-15672->15671-15672/tcp, 0.0.0.0:25672->25672/tcp   coder_rabbitmq
a0a58215ea6d        mongo                     "docker-entrypoint.s…"   4 days ago          Up 4 days           0.0.0.0:27017->27017/tcp                                                                                                   coder_mongo
92ad8ac5307a        redis                     "docker-entrypoint.s…"   4 days ago          Up 4 days           0.0.0.0:6379->6379/tcp                                                                                                     coder_redis
712ca75d0768        centos/mysql-57-centos7   "container-entrypoin…"   5 days ago          Up 5 days           0.0.0.0:3306->3306/tcp                                                                                                     tensquare_mysql
[[email protected] dockerjdk8]# 

2 Docker 私有仓库

2.1 私有仓库搭建与配置

(1)拉取私有仓库镜像

docker pull registry

(2)启动私有仓库容器

[[email protected] dockerjdk8]# docker run -di --name=registry -p 5000:5000 registry
081d5d21d2da2cc7cde2f6ef512b3c191b66c62a20216901efe30dc6b49adf7a
[[email protected] dockerjdk8]# docker ps
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                                                                                                                      NAMES
081d5d21d2da        registry                  "/entrypoint.sh /etc…"   11 seconds ago      Up 11 seconds       0.0.0.0:5000->5000/tcp                                                                                                     registry
fc7de4b83123        jdk1.8                    "/bin/bash"              3 minutes ago       Up 3 minutes                                                                                                                                   coder_jdk8
8cff2d81b969        rabbitmq:management       "docker-entrypoint.s…"   3 days ago          Up 3 days           0.0.0.0:4369->4369/tcp, 0.0.0.0:5671-5672->5671-5672/tcp, 0.0.0.0:15671-15672->15671-15672/tcp, 0.0.0.0:25672->25672/tcp   coder_rabbitmq
a0a58215ea6d        mongo                     "docker-entrypoint.s…"   4 days ago          Up 4 days           0.0.0.0:27017->27017/tcp                                                                                                   coder_mongo
92ad8ac5307a        redis                     "docker-entrypoint.s…"   4 days ago          Up 4 days           0.0.0.0:6379->6379/tcp                                                                                                     coder_redis
712ca75d0768        centos/mysql-57-centos7   "container-entrypoin…"   5 days ago          Up 5 days           0.0.0.0:3306->3306/tcp                                                                                                     tensquare_mysql
[[email protected] dockerjdk8]# 

(3)打开浏览器 输入地址 http://120.78.134.111:5000/v2/_catalog 看到 {"repositories":[]} 表示私有仓库搭建成功并且内容为空
【 DockerMaven插件 构建镜像 】

(4)修改daemon.json

vi /etc/docker/daemon.json

添加以下内容,保存退出。

{"insecure-registries":["120.78.134.111:5000"]}

此步用于让 docker 信任私有仓库地址

【 DockerMaven插件 构建镜像 】

(5)重启docker 服务

systemctl restart docker

(6)启动仓库

[[email protected] ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[[email protected] ~]# docker start registry
registry
[[email protected] ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
081d5d21d2da        registry            "/entrypoint.sh /etc…"   10 minutes ago      Up 4 seconds        0.0.0.0:5000->5000/tcp   registry
[[email protected] ~]# 

2.2 镜像上传至私有仓库

(1)标记此镜像为私有仓库的镜像

docker tag jdk1.8 120.78.134.111:5000/jdk1.8
[[email protected] ~]# docker tag jdk1.8 120.78.134.111:5000/jdk1.8
[[email protected] ~]# docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
120.78.134.111:5000/jdk1.8   latest              e1e56eb41f1c        21 minutes ago      589MB
jdk1.8                       latest              e1e56eb41f1c        21 minutes ago      589MB
rabbitmq                     management          5ae7e27bcf34        5 days ago          213MB
centos                       7                   9f38484d220f        5 days ago          202MB
mongo                        latest              a3abd47e8d61        8 days ago          394MB
registry                     latest              f32a97de94e1        12 days ago         25.8MB
redis                        latest              0f88f9be5839        2 weeks ago         95MB
centos/mysql-57-centos7      latest              ee80146ff512        4 weeks ago         453MB
hello-world                  latest              fce289e99eb9        2 months ago        1.84kB
elasticsearch                latest              5acf0e8da90b        6 months ago        486MB
elasticsearch                5.6.8               6c0bdf761f3b        12 months ago       570MB
[[email protected] ~]# 

(2)上传标记的镜像

docker push 120.78.134.111:5000/jdk1.8

测试:打开浏览器 输入地址 http://120.78.134.111:5000/v2/_catalog
【 DockerMaven插件 构建镜像 】

注意:以后下载要带ip和端口docker pull 120.78.134.111:5000/jdk1.8

2.3 DockerMaven插件

微服务部署有两种方法:
(1)手动部署:首先基于源码打包生成jar包(或war包),将jar包(或war包)上传至虚拟机并拷贝至JDK容器。
(2)通过Maven插件自动部署
对于数量众多的微服务,手动部署无疑是非常麻烦的做法,并且容易出错。所以我们这里学习如何自动部署,这也是企业实际开发中经常使用的方法。

Maven插件自动部署步骤:
(1)修改宿主机的docker配置,让其可以远程访问

vi /lib/systemd/system/docker.service

其中ExecStart=后添加配置 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
修改后如下:

【 DockerMaven插件 构建镜像 】
(2)刷新配置,重启服务

systemctl daemon-reload
systemctl restart docker
docker start registry

由于我们的项目配置文件都在 coder_config 上面,所以我们先传该模块

(3)在coder_config工程pom.xml 增加配置

Maven 的 pom.xml 里面的信息分为三类:自己的信息、依赖的jar包信息、各种各样的插件。

    <build>
        <finalName>app</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!-- docker的maven插件,官网:
            https://github.com/spotify/docker-maven-plugin -->
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.4.13</version>
                <configuration>
                    <imageName>120.78.134.111:5000/${project.artifactId}:${project.version}</imageName>
                    <baseImage>jdk1.8</baseImage>
                    <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                    <dockerHost>http://120.78.134.111:2375</dockerHost>
                </configuration>
            </plugin>
        </plugins>
    </build>

注意:一定要确保上面配置的所有依赖都开启,例如 rabbitmq 等要开启,因为要编译,需要连接,如果不能连接,那么编译就不能成功。

以上配置会自动生成Dockerfile

FROM jdk1.8
ADD app.jar /
ENTRYPOINT ["java","‐jar","/app.jar"]

(5)在windows的命令提示符下,进入 coder_config工程所在的目录,输入以下命令,进行打包和上传镜像

mvn clean package docker:build -DpushImage

【 DockerMaven插件 构建镜像 】

执行后,会有如下输出,代码正在上传

【 DockerMaven插件 构建镜像 】

成功:
【 DockerMaven插件 构建镜像 】

浏览器访问 http://120.78.134.111:5000/v2/_catalog
【 DockerMaven插件 构建镜像 】

(6)进入宿主机 , 查看镜像

[[email protected] ~]# docker images
REPOSITORY                         TAG                 IMAGE ID            CREATED              SIZE
120.78.134.111:5000/coder_config   1.0.0-SNAPSHOT      4a04c4bd9a51        About a minute ago   627MB
jdk1.8                             latest              e1e56eb41f1c        About an hour ago    589MB
120.78.134.111:5000/jdk1.8         latest              e1e56eb41f1c        About an hour ago    589MB
[[email protected] ~]# 

输出如上内容,表示coder_config微服务已经做成镜像

(7) 启动容器:

docker run -di --name=coder_config -p 12000:12000 120.78.134.111:5000/coder_config:1.0.0-SNAPSHOT

测试:浏览器输入 http://120.78.134.111:12000/base-dev.yml 可以看到配置文件