1、首先需要开启docker的远程API端口监听
【旧版本docker】编辑文件:
vim /etc/docker/daemon.json
加入键值对:
{"hosts":["0.0.0.0", "unix:///var/run/docker.sock"]}
【新版本docker】编辑文件:
vim /usr/lib/systemd/system/docker.service
修改ExecStart:
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
重新加载配置文件:
systemctl daemon-reload
※注意如果绑定到0.0.0.0意味着所有人都可以任意操作这台机器上的docker,而且docker拥有root权限,也就是说实际上开启之后别人可以通过docker来任意操作这台计算机,实际中一定不要将接口直接暴露在外面,使用内网或者unix连接。
重启docker:
systemctl restart docker
验证端口:
netstat -nptl
curl http://127.0.0.1:2375/info
2、使用maven集成编译、推送docker镜像,以下使用Springboot工程为例说明
① 在工程中src/main/docker添加Dockerfile:
FROM java:8
MAINTAINER watashi
VOLUME /tmp
ARG JAR_FILE
ADD ${JAR_FILE} app.jar
ENV JAVA_OPTS=""
ENTRYPOINT ["sh","-c","java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar"]
② 修改工程POM文件,build标签部分如下:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.14</version>
<!-- 简化mvn执行命令 -->
<executions>
<!-- when executing mvn package, it will execute mvn docker:build
at the same time -->
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
<!-- when executing mvn package, it will execute mvn docker:build
-DpushImage at the same time -->
<execution>
<id>push-image</id>
<phase>package</phase>
<goals>
<goal>push</goal>
</goals>
</execution>
</executions>
<configuration>
<imageName>${env.DOCKER_REGISTRY_NAME}/${docker.image.prefix}/${project.artifactId}</imageName>
<imageTags>
<imageTag>${project.version}</imageTag>
<imageTag>latest</imageTag>
</imageTags>
<forceTags>true</forceTags>
<dockerDirectory>src/main/docker</dockerDirectory>
<!-- 配置docker仓库以及证书路径到环境变量,docker-registry在maven的setting.xml里配置 -->
<serverId>docker-registry</serverId>
<registryUrl>${env.DOCKER_REGISTRY}</registryUrl>
<dockerCertPath>${env.DOCKER_CERT_PATH}</dockerCertPath>
<!-- 添加远程docker主机,该主机必须开启了远程API,监听2375端口有两种方式添加docker主机 -->
<!-- 在系统环境变量中添加DOCKER_HOST系统变量,值为tcp://docker-host-ip:2375 -->
<dockerHost>${env.DOCKER_HOST}</dockerHost>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<buildArgs>
<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
</plugins>
</build>
※参考https://spring.io/guides/gs/spring-boot-docker/
※打包时会自动从$DOCKER_CERT_PATH目录下读取.crt证书文件。
※设置serverId,打包时会从maven的setting.xml中查找对应的serverId,读取username、password、email配置,push镜像时自动登录。setting.xml里配置如下:
<servers>
<server>
<id>docker-registry</id>
<username>username</username>
<password>password</password>
<configuration>
<email>xxx@xxx.com</email>
</configuration>
</server>
</servers>
※配置了executions,这样可以把
mvn clean package docker:build -DpushImage -DskipTests |
命令简化成
mvn clean package -DskipTests |
※如果pom.xml里没有带版本号,可以用-DdockerImageTags=1.0.0 -DdockerImageTags=latest参数上传或者tag版本号再上传:-DpushImageTag=0.1.1 -DpushImageTag=latest。
③ 编译完成以后,可以看到build success
到docker主机上通过docker images命令查看镜像:
④ 启动镜像,运行容器
a) 使用固定端口启动:
docker run -d -p 8080:8080 -i -t cmpaas/hello-service:1.0.0
启动后,通过http://docker-host-ip:8080/hello访问服务。
b) 使用动态端口启动:
docker run -e JAVA_OPTS='-Dserver.port=8084' -d -p 8084:8084 -i -t cmpaas/hello-service:1.0.0
启动后,可以通过docker ps命令列出在运行的容器:
并通过http://docker-host-ip:8084/hello访问服务。
⑤ 查看docker服务的日志
journalctl -u docker.service -f