【 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":[]}
表示私有仓库搭建成功并且内容为空
(4)修改daemon.json
vi /etc/docker/daemon.json
添加以下内容,保存退出。
{"insecure-registries":["120.78.134.111:5000"]}
此步用于让 docker 信任私有仓库地址
(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
注意:以后下载要带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
修改后如下:
(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
执行后,会有如下输出,代码正在上传
成功:
浏览器访问 http://120.78.134.111:5000/v2/_catalog
(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 可以看到配置文件