Dockerfile概述
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。
Docker可以通过读取来自 Dockerfile
的指令自动构建镜像。 Dockerfile
是一个文本文档,其中包含用户可以在命令行上调用、组合容器的所有命令。使用docker build
可以构建连续执行的多个指令集。
接下来用一个简单的示例来感受一下 Dockerfile 是如何用来构建镜像启动容器。我们以docker部署springboot项目为例。
准备springboot项目
首先我们通过spring initializr
来构建一个springboot工程,只添加了一个HelloController
,代码如下:
1 | @RestController |
可以使用docker构建插件来构建镜像,可以查考纯洁的微笑的博客来构建,这里我们直接将springboot工程打成jar包,来构建docker镜像。
首先将之前构建的springboot工程打包,这样我们就得到了一个hello-docker-0.0.1-SNAPSHOT.jar
,然后我们再准备一个Dockerfile,内容如下
1 | FROM java:8 |
其中
- FROM ,表示使用 Jdk8 环境 为基础镜像,如果镜像不是本地的会从 DockerHub 进行下载
- VOLUME ,VOLUME 指向了一个
/tmp
的目录,由于 Spring Boot 使用内置的Tomcat容器,Tomcat 默认使用/tmp
作为工作目录。这个命令的效果是:在宿主机的/var/lib/docker
目录下创建一个临时文件并把它链接到容器中的/tmp
目录 - ADD ,拷贝文件并且重命名
- ENTRYPOINT ,为了缩短 Tomcat 的启动时间,添加
java.security.egd
的系统属性指向/dev/urandom
作为 ENTRYPOINT
构建镜像
1 | docker build -t image-name . |
然后我们通过docker images
就能看见我们制作的docker镜像
1 | REPOSITORY TAG IMAGE ID CREATED SIZE |
这样我们可以启动该镜像
1 | docker run -p 8080:8080 -t hello-docker |
如果出现了端口映射错误,可以暂时关闭防火墙systemctl stop firewalld.service
,然后重启docker服务service docker restart
,重新启动镜像即可。
通过docker ps
可以查看正在运行的项目
1 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
然后通过访问http://your-ip:8080/hello
,返回
1 | hello, 2018-09-25T13:38:53.246 |
即部署成功。