目录
| 版本历史 | |
|---|---|
| 2019/09/15 | 开篇 |
新手可能一开始会混淆
Dockerfile和docker-compose。两者区别在于Dockerfile是用于编写镜像image, 而docker-compose是用于运行镜像image。一个私以为贴切的比喻:把docker比作一杯鸡尾酒,写Dockerfile就像在制作鸡尾酒中的每一款酒,而写docker-compose.yml就像是调酒的过程。
Dockerfile
Dockerfile中可以使用多个stage,最常见的场景是第一个stage用于编译容器内的程序build,第二个stage用于真正运行该程序的环境,这样可以减小image体积。不同stage之间使用FROM区分开。
# 第一层
FROM ubuntu:latest AS Builder
...
...
...
# 第二层
FROM alpine:latest
...
...
...
Dockerfile中每一个关键词都会创建一个层layer,层数会影响最终image的体积,所以在实现功能的前提下尽量少增加层。比如同一个stage中的RUN命令可以多条命令写成一句(使用&&分割)。ENV用于定义环境变量,作用类似命令行界面中的export XXX=value,对容器内的编译起作用。 *如:编译 GO 程序时,定义环境变量ENV GO111MODULE=on*ENTRYPOINT描述了一个image的初始命令,必须要有且不会被运行时的命令覆盖。相对地,CMD作为ENTRYPOINT的补充,可有可无且可被运行容器时传递的命令覆盖。两者的搭配可见官方文档Dockerfile不支持占位符(如$1、$2)
Docker-compose
EXPOSE和PORTS的区别在于前者会被随机安排一个端口映射,而后者需要用户自定义映射或者不映射。- Docker 用于获取和控制容器状态的
docker.socks。如果需要控制容器运行,如使用容器管理软件或需要实时修改容器,可以挂载/var/run/docker.socks:/var/run/docker.socks