上一篇中解释了Docker与虚拟机的不同,以及使用它的好处--一次创建到处运行。那么这一篇就介绍怎么创建一个可以在各处运行的Docker镜像。创建Docker有不同的方式,一种是基于基础镜像创建容器,在容器中做相关配置,安装运行应用需要的包,然后提交新的镜像, 这种方式适合配置复杂的镜像;另外一种是使用Dockerfile,自动化的生成镜像,这种方式适用于需要自动化的场景。
手工配置镜像
在最近的小项目中,我们要创建一个Jenkins的Docker镜像,它负责编译打包工程,安装AWS CLI, 打包应用的Docker镜像,所以需要安装很多的组件。接下来我们来一步一步配置我们的Docker镜像。
首先,我们从DockerHub上找到一个基础镜像,我们运行命令来创建进行配置的基础容器:
docker run -d -p 18080:8080 -v ${PWD}/jenkins_home:/var/jenkins_home jenkins
登陆容器,并执行安装操作:
docker exec -it --user jenkins containerId bash
查看容器的相关配置信息:
docker inspect containerId
装好相关应用后将配置的容器提交到本地镜像:
docker commit containerId lane0201/jenkins:latest
也可以添加环境变量,开放新的接口和卷,例如
docker commit --change "ENV DEBUG true" --change "VOLUME /tmp" -c "EXPOSE 8080" containerId lane0201/jenkins:version1
提交本地镜像到远程仓库,之后就可以根据新的镜像创建容器了:
docker push lane0201/jenkins:latest
相关命令的具体配置参考官方的docker文档
使用Dockerfile生成镜像
docker build命令根据指定的Dockerfile文件生成镜像, 例如:
docker build -f /path/to/a/Dockerfile .
一个简单的Dockerfile是这样的:
FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ENV MYSQL_HOST 127.0.0.1
ENV MYSQL_PORT 3306
ENV MYSQL_USER myUser
ENV MYSQL_DATABASE myDatabase
ADD 17high_web-0.0.1-SNAPSHOT.jar app.jar
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "sleep 15 && java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
关于Dockerfile的具体配置可以参考docker build文档