【docker】 Dockerfile & Docker Compose

本文介绍 Dockerfile 和 Docker Compose 的指令以及用使用方法

Dockerfile

Dockerfile 是一个文本格式的配置文件,使用 Dockerfile 可以快速创建自定义的镜像

基本结构

Dockerfile 由一行行命令语句组成,支持以 # 开头的注释行。 Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

示例:基于 debian:jessie 基础镜像上安装 nginx 环境,制作一个新的 nginx 镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

# 基础镜像信息
FROM debian:jessie

# 维护者信息
MAINTAINER NGINX Docker Maintainers "docker-maint@nginx.com"

# 镜像操作指令
ENV NGINX_VERSION 1.10.1-1~jessie

RUN apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 \
&& echo "deb http://nginx.org/packages/debian/ jessie nginx" >> /etc/apt/sources.list \
&& apt-get update \
&& apt-get install --no-install-recommends --no-install-suggests -y \
ca-certificates \
nginx=${NGINX_VERSION} \
nginx-module-xslt \
nginx-module-geoip \
nginx-module-image-filter \
nginx-module-perl \
nginx-module-njs \
gettext-base \
&& rm -rf /var/lib/apt/lists/*

RUN ln -sf /dev/stdout /var/log/nginx/access.log \
&& ln -sf /dev/stderr /var/log/nginx/error.log

EXPOSE 80 433

# 容器启动时执行指令
CMD ["nginx", "-g", "daemon off;"]

Dockerfile 指令说明

指令 说明
FROM 指定基础镜像,FROM [image]:[tag],每个 Dockerfile 的第一件指令必须是 FROM
MAINTAINER 指定维护者信息,MAINTAINER [name]
RUN 运行命令制作镜像,RUN [command] 或 RUN [“executable”, “param1”, “param2”]
LABEL 指定生成镜像的元数据标签信息
EXPOSE 声明镜像内服务所监听的端口
ENV 指定环境变量,镜像生成过程中可以被后续 RUN 指令使用,镜像启动的容器中也会存在
ADD 复制URL的内容到容器, ADD [src] [dest]
COPY 复制宿主中的内容到容器, COPY [src] [dest]
VOLUME 创建数据卷挂载点,VOLUME [dir]
USER 指定运行容器时的用户
WORKDIR 配置工作目录,为后续的 EVN,CMD 和 ENTRYPOINT 指令配置工作目录
ARG 指定镜像内使用的参数,这些参数在使用 docker build 命令时才传入
ONBUILD 配置当所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作指令
STOPSIGNAL 容器退出的信号值
HEALTHCHECK 如何进行健康检查,HEALTHCHECK [OPTIONS]
SHELL 指定使用 shell 时的默认 shell 类型
ENTRYPOINT 指定镜像的默认入口,每个 Dockerfile 只有一个 ENTRYPOINT 生效
CMD 指定启动容器默认执行的命令

Docker Compose

Compose 负责实现对容器集群的快速编排,可以定义和运行多个 Docker 容器的应用。

Compose 有两个重要的概念

  • 服务: 一个应用的容器,实际上可以包括若干运行相同镜像的容器实例
  • 项目:由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义

Compose 命令说明

Compose 有多个子命令,如下

命令 说明
build 构建项目中的服务容器
help 获得一个命令的帮助
kill 通过发送 SIGKILL 信号来强制停止服务容器
logs 查看服务器的输出
pause 暂停一个服务容器
port 打印某个容器端口所映射的公共端口
ps 列出项目中目前的所有容器
pull 拉取项目依赖的镜像
restart 重启项目中的服务
rm 删除所有(停止状态的)服务容器
run 在指定服务上执行一个命令
scale 设置指定服务运行的容器个数
start 启动已经存在的服务容器
stop 停止已经处于运行状态的容器。但不删除
uppause 恢复处于暂停状态中的服务
up 自动完成包括构建镜像,创建服务,启动服务并关联服务相关容器等一系列操作
migrate-to-labels 重新创建容器,并添加 label
version 打印版本信息

Compose 模板文件

模板文件是使用 Compose 的核心,默认的模板文件名称为 docker-compose.yml,YAML格式。 文件由一系列的指定组成,也可以使用变量。

模板文件指令如下

指令 功能
build 指定服务镜像 Dockerfile 所在路径
cap_add, cap_drop 指定容器的内核能力分配
*command 覆盖容器启动的默认执行命令
cgroup_parent 指定父 cgroup 组,意味着将继承该组的资源限制
container_name 指定容器名称
devices 指定设备映射关系
dns 自定义 DNS 服务器。可以是一个值,也可以是列表
dns_search 配置 DNS 搜索域
dockerfile 指定额外编译镜像的 Dockerfile
env_file 从文件中获取环境变量
environment 设置环境变量
expose 暴露端口
extends 基于其他模板文件进行扩展
external_links 链接到 docker-compose.yml 外部的容器
extra_hosts 指定额外的 host 名称映射信息
image 指定为容器名称或镜像 ID
labels 为容器添加 Docker 元数据信息
links 链接到其他服务中的容器
log_driver 指定日志驱动类型
log_opt 日志驱动的相关参数
net 设置网络模式
pid 跟宿主系统共享进程命名空间
ports 暴露端口信息
security_opt 指定容器模板标签机制的默认属性
ulimits 指定容器的 ulimits 限制值
volumes 数据卷所挂载路径设置
volumes_driver 数据卷的插件驱动
volumes_from 从另一个服务或容器挂载数据卷

模板文件示例

示例1 redis 集群——服务 6 个 redis 节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74

version: '3.4'

# 定义变量
x-image:
&default-image
publicisworldwide/redis-cluster
x-restart:
&default-restart
always
x-netmode:
&default-netmode
host

# 定义服务
services:
# 项目1
redis1:
# 基础镜像
image: *default-image
# 网络模式
network_mode: *default-netmode
restart: *default-restart
# 数据卷
volumes:
- /data/redis/7001/data:/data
# redis 服务端口
environment:
- REDIS_PORT=7001

redis2:
image: *default-image
network_mode: *default-netmode
restart: *default-restart
volumes:
- /data/redis/7002/data:/data
environment:
- REDIS_PORT=7002

redis3:
image: *default-image
network_mode: *default-netmode
restart: *default-restart
volumes:
- /data/redis/7003/data:/data
environment:
- REDIS_PORT=7003

redis4:
image: *default-image
network_mode: *default-netmode
restart: *default-restart
volumes:
- /data/redis/7004/data:/data
environment:
- REDIS_PORT=7004

redis5:
image: *default-image
network_mode: *default-netmode
restart: *default-restart
volumes:
- /data/redis/7005/data:/data
environment:
- REDIS_PORT=7005

redis6:
image: *default-image
network_mode: *default-netmode
restart: *default-restart
volumes:
- /data/redis/7006/data:/data
environment:
- REDIS_PORT=7006

示例2, spark

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 服务 1, 安装 spark master
master:
image: sequenceiq/spark:1.4.0
hostname: master
ports:
- "4040:4040"
- "8042:8042"
- "7077:7077"
- "8088:8088"
- "8080:8080"
restart: always
# 容器运行的命令,即启动 spark master
command: bash /usr/local/spark/sbin/start-master.sh && ping localhost > /dev/null

worker:
image: sequenceiq/spark:1.4.0
links:
- master:master
expose:
- "8081"
restart: always
command: bash /usr/local/spark/sbin/start-slave.sh spark://master:7077 && ping localhost > /dev/null

用 docker-compose up 可以启动
服务起来后, 可以用 docker-compose scale worker=2 来动态扩展 worker 节点数