目录
版本历史 | |
---|---|
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