Docker 镜像构建一般使用Dockerfile,首先我们需要了解Dockerfile语法(Dockerfile官方文档),然后我们编写好Dockerfile文件之后就可以开始构建我们的项目对应Docker镜像,如果构建呢?我们可以手动使用docker命令构建,也可以使用开源插件帮助构建,请往下看。
Dockerfile 构建镜像
自己手动构建
- 首先我们使用maven 命令将项目打包成 jar 包(jar包一般生成在项目的target目录中)
1 | mvn install |
将jar包复制到服务器我们想要的位置,使用docker命令构建docker镜像
1
2# 格式:docker build -t 标签名称 Dockerfile的相对位置
docker build -t configserver .Dockerfile 内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14# 基于哪个镜像
FROM java:8
# 将本地文件夹挂载到当前容器
VOLUME /data/cloudtest
# 拷贝文件到容器,也可以直接写成ADD xxxxx.jar /app.jar
ADD configserver-0.0.1-SNAPSHOT.jar /app.jar
# 声明需要暴露的端口
EXPOSE 8666
# 配置容器启动后执行的命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]启动构建好的镜像
1 | docker run -p 8666:8666 configserver |
使用插件来构建镜像
- 使用插件之前,如果本地环境中没有安装docker,则我们也可以使用远程服务器安装的docker来帮助我们构建,如何使用远程docker呢,首先我们要开启docker的远程访问
Centos7中docker开启远程访问
在/usr/lib/systemd/system/docker.service,配置远程访问。主要是在[Service]这个部分,加上下面两个参数
1
2
3
4# vim /usr/lib/systemd/system/docker.service
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock以上配置完成之后我们需要重新读取docker配置文件,重新启动docker服务
1 | systemctl daemon-reload |
看进程docker是否已经监听2375端口,命令为 ps aux | grep docker
1
2root 8902 0.5 0.1 637948 37388 ? Ssl 10:34 1:30 /usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
root 8909 0.0 0.0 432312 10904 ? Ssl 10:34 0:09 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc此时docker已经开启远程访问地址为 服务器地址:2375(别忘了服务器防火墙需要开放2375端口)
docker-maven-plugin(spotify)
- 使用docker-maven-plugin来构建镜像
配置POM build 模块,使用docker 镜像私服(nexus)作为镜像仓库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.0</version>
<configuration>
<imageName>172.31.116.12:9290/mao/microservice-discovery-eureka:0.0.1</imageName>
<dockerDirectory>${project.basedir}</dockerDirectory>
<!--远程docker 地址-->
<dockerHost>http://172.31.76.16:2375</dockerHost>
<!--<dockerCertPath></dockerCertPath>-->
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<!-- 与maven配置文件settings.xml中配置的server.id一致,用于推送镜像 -->
<serverId>docker-nexus</serverId>
</configuration>
</plugin>
</plugins>
</build>创建并上传镜像执行
1 | mvn clean package docker:build -DpushImage |
- 构建成功,使用docker 查看构建成功的镜像
- 可借助imageTags元素更为灵活地指定镜像名称和标签
1 | <build> |
- 使用如下命令进行构建(注意构建命令和没有加入imageTags有所不同)
1 | mvn clean package docker:build -DpushImageTag |
docker-maven-plugin 多项目共同构建
- 以上配置我们只是针对单个项目配置,如果项目中包含多个子项目,我们希望一起打包成镜像并上传到私服,则需要用到phase 将镜像构建绑定到maven 命令上
平常打包构建命令为mvn clean package docker:build,而对应maven的命令格式为mvn phase:goal,所以打包构建命令中package docker对应为phase,build则对应goal,这样根据官方文档提示将POM改造得出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.0</version>
<!--将构建的触发绑定到对应的命令上-->
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
<execution>
<id>tag-image</id>
<phase>package</phase>
<goals>
<goal>tag</goal>
</goals>
<configuration>
<image>test1/eureka1:${project.version}</image>
<newName>172.31.116.12:9290/test1/eureka1:${project.version}</newName>
</configuration>
</execution>
<execution>
<id>push-image</id>
<phase>package</phase>
<goals>
<goal>push</goal>
</goals>
<configuration>
<imageName>172.31.116.12:9290/test1/eureka1:${project.version}</imageName>
</configuration>
</execution>
</executions>
<configuration>
<imageName>test1/eureka1:${project.version}</imageName> <!--镜像名-->
<!--Dockerfile文件路径 此路径代表本项目根目录-->
<dockerDirectory>${project.basedir}</dockerDirectory>
<!--本地不安装 docker 使用远程docker 地址,该地址为docker 开启远程访问地址 -->
<dockerHost>http://172.31.76.16:2375</dockerHost>
<!--<dockerCertPath></dockerCertPath>-->
<resources>
<resource> <!-- 指定资源文件 -->
<targetPath>/</targetPath> <!-- 指定要复制的目录路径,这里是当前目录 -->
<directory>${project.build.directory}</directory> <!-- 指定要复制的根目录,这里是target目录 -->
<include>${project.build.finalName}.jar</include> <!-- 指定需要拷贝的文件,这里指最后生成的jar包 -->
</resource>
</resources>
<!--重复构建相同标签名称的镜像,可将forceTags设为true,这样就会覆盖构建相同标签的镜像-->
<forceTags>true</forceTags> <!--覆盖相同标签镜像-->
<!-- 与maven配置文件settings.xml中配置的server.id一致,用于推送镜像 -->
<serverId>docker-nexus</serverId>
</configuration>
</plugin>
</plugins>
</build>如此我们只要在项目根目录使用命令,则项目就会自动打包构建镜像并上传到nexus私服
1
2## -DskipTests 表示 跳过Test
mvn clean package -DskipTests
Docker 私有仓库结合 nexus 搭建与使用
- 每次构建好的镜像我们存放在哪呢,这里可以搭建自己的私服仓库来存放docker镜像。
安装nexus
- Centos下 Nexus 搭建Maven 私服
创建私有仓库
docker连接私服仓库
- 上一小节我们创建好了私服仓库,还需配置,在docker服务器新建文件
1 |
|
- 登录仓库,输入nexus的用户名和密码,默认用户名为admin,密码为admin123
1 | docker login xxx.xxx.xxx.xxx:9290 |