服务部署与持续集成(一)
Dockerfile
什么是Dockerfile?
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。
- 对于开发人员:可以为开发团队提供一个完全一致的开发环境;
- 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新
的镜像开始工作了; - 对于运维人员:在部署时,可以实现应用的无缝移植。
常用命令列表
命令 | 作用 |
---|---|
FROM image_name:tag | 定义了使用哪个基础镜像启动构建流程 |
MAINTAINER user_name | 声明镜像的创建者 |
RUN command | 是Dockerfile的核心部分(可以写多条) |
ADD source_dir/file dest_dir/file | 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压 |
COPY source_dir/fi ledest_dir/file | 和ADD相似,但是如果有压缩文件并不能解压 |
ENV key value | 设置变设置量 (可以设置多条) |
WORKDIR path_dir | 设置工作目录 |
EXPOSE port1 prot2 | 用来指定端口,使容器内的应用可以通过端口和外界交互 |
CMD argument | 在构建容器时使用,会被docker run 后的argument覆盖 |
ENTRYPOINT argument | 和CMD相似,但是并不会被docker run指定的参数覆盖 |
VOLUME | 将本地(宿主机)文件夹或者其他容器的文件挂载到容器中 |
使用脚本制作Java镜像
创建文件夹usr/local/dockerjava
mkdir –p /usr/local/dockerjdk
将下载好的jdk放在该目录下
当前使用的是jdk-8u201-linux-x64.tar.gz
在该目录下创建Dockerfile
vim Dockerfile
注意只能使用Dockerfile命名
#依赖镜像名称和ID
FROM centos:7
#指定镜像创建者信息
MAINTAINER KL
#切换工作目录
WORKDIR /usr
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把java添加到容器中
ADD jdk-8u201-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_201
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
执行命令构建镜像
语法: docker build [OPTIONS] PATH | URL | -
docker build -t='jdk1.8' .
-t
: 镜像的名字及标签
.
这里的.
代表当前目录
Docker私有仓库
私有仓库搭建与配置
(1)拉取私有仓库镜像
docker pull registry
(2)启动私有仓库容器
docker run -di --name=registry -p 5000:5000 registry
(3)打开浏览器 输入地址http://47.96.70.206:5000/v2/_catalog
看到 {“repositories”:[]} 表示私有仓库搭建成功并且内容为空
(4)修改daemon.json
vi /etc/docker/daemon.json
添加以下内容,保存退出。
{
"insecure‐registries":["47.96.70.206:5000"]
}
此步用于让 docker信任私有仓库地址
注意:更换自己的ip,另外如果你的内容格式错误,重启时会报如下异常
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
(5)重启docker 服务
systemctl restart docker
镜像上传至私有仓库
(1)标记此镜像为私有仓库的镜像
语法: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
示例
docker tag jdk1.8 47.96.70.206:5000/jdk1.8
jdk1.8是源镜像名称
47.96.70.206:5000/jdk1.8是目标镜像名称
(2)上传标记的镜像
语法: docker push [OPTIONS] NAME[:TAG]
示例
docker push 47.96.70.206:5000/jdk1.8
过程可能有点慢
最后访问你的镜像私有库http://47.96.70.206:5000/v2/_catalog,如果你的repositories中出现了jdk1.8,如下,说明push成功
{"repositories":["jdk1.8"]}
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)刷新配置,重启服务
sudo systemctl daemon-reload
sudo systemctl restart docker
(3)在iot-server工程pom.xml 增加配置
<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>47.96.70.206:5000/${project.artifactId}:${project.version}</imageName>
<baseImage>java</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://47.96.70.206:2375</dockerHost>
</configuration>
</plugin>
</plugins>
</build>
(4)在iot-server工程的src/main目录下创建docker目录,目录下创建Dockerfile文件,内容如下:
FROM jdk1.8
VOLUME /tmp
ADD app.jar app.jar
ENTRYPOINT ["java","‐jar","/app.jar"]
解释下这个配置文件:
VOLUME 指定了临时文件目录为 /tmp 。其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的 /tmp 。此步骤是可选的,如果涉及到文件系统的应用就很有必要了。 /tmp 目录用来持久化到 Docker 数据文件夹,因为 SpringBoot 使用的内嵌 Tomcat 容器默认使用 /tmp 作为工作目录项目的 jar 文件作为 “app.jar” 添加到容器的ENTRYPOINT 执行项目 app.jar。
为了缩短 Tomcat 启动时间,添加一个系统属性指向 “/dev/./urandom” 作为 Entropy Source,比如ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
,为何这样做请猛击
(5)在windows的命令提示符下,进入iot-server工程所在的目录,输入以下命令,进行打包和上传镜像
mvn clean package docker:build -DpushImage -DskipTests
执行后,代码会正在上传,这个过程可能会比较慢,最终构建并push成功.浏览器访问 http://47.96.70.206:5000/v2/_catalog ,输出
{"repositories":["dx-iot-server","jdk1.8"]}
代表成功.
(6)进入宿主机 , 查看镜像
docker images
输出如上内容,表示iotserver微服务已经做成镜像
(7) 启动容器:
docker run ‐di ‐‐name=iotserver -p 8099:8099 47.96.70.106:5000/iotserver:1.0‐SNAPSHOT
启动时注意按照自己项目端口启动.
总结
这篇文章重要介绍了Dockerfile和Docker私有仓库的简单配置,大家感兴趣可以自己玩一下,上边那个是我的服务器,快到期了,大家可以-DpushImage玩玩.工作之余,注意享受生活.