安装 Docker-Compose
Compose有多种安装方式,例如通过 shell, pip以及将 Compose作为容器安装等。本次安装以Shell 为主。
- 通过以下命令自动下载并安装适应系统版本的 Compose:
curl -L "https://github.com/docker/compose/releases/download/1.10.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
- 为安装脚本添加执行权限
chmod +x/usr/local/bin/docker-compose
这样, Compose就安装完成了。
可使用以下命令测试安装结果:
docker-compose --version
可输出类似于如下的内容:4 586bhjnkmv
docker-compose version 1.10.0, build 4bd6f1a
说明 Compose已成功安装。
安装 Compose命令补全工具
现在已成功安装 Compose,然而当输 Docker Compose并按下Tab键时, Compose并没有补全命令。要想使用 Compose的命令补全,需要安装命令补全工具。
命令补全工具在Bash和zsh下的安装方式不同,本次以Bash安装为主。
执行以下命令,即可安装命令补全工具:
curl -l https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
这样,在重新登录后,输入 docker-compose并按下Tab键,compose就可自动补全命令了。
Docker Compose 快速入门
基本步骤
使用 Docker Compose 大致有 3 个步骤:
- 使用 Dockerfile (或其他方式)定义应用程序环境,以便在任何地方重现该环境。
- 在 docker-compose.yml 文件中定义组成应用程序的服务,以便各个服务在一个隔离的环境中一起运行。
- 运行 docker-compose up 命令,启动并运行整个应用程序。
人门示例
下面以 wzq-swagger-mng 为例讲解 compose 的基本步骤。
- 使用 mvn clean package 命令打包项目,获得 wzq-swagger-mng.jar。
- 在 wzq-swagger-mng.jar 所在路径(默认是项目的 target 目录)创建 Dockerfile 文件,并在其中添加如下内容。
FROM java:8
VOLUME /tmp
ADD wzq-swagger-mng.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 10086
ENTRYPOINT ["java","-Djava.security.edg=file:/dev/.urandom","-jar","/app.jar"]
- 在 wzq-swagger-mng.jar 所在路径创建文件 docker-compose.yml,在其中添加如下内容。
version: '2'# 表示该docker-compose.yml文件使用的是version 2 file
services:wzq-swagger-mng:# 指定服务名称build:#指定Dockerfile所在文件夹的路径context: ./dockerfile: ./Dockerfileports:- "10086:10086"# 指定端口映射,类似 docker run 的 -p 选项,注意使用字符串形式。
- 在 docker-compose.yml 所在路径执行以下命令:
docker-compose up
Compose就会自动构建镜像并使用镜像启动容器。也可使用 docker-compose up -d后台启动并运行这些容器。 - 测试访问
工程、服务、容器
Docker Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。Docker Compose运行目录下的所有文件( docker-compose.yml、extends文件或环境变量文件等)组成一个工程(默认为 docker-compose.yml所在目录的目录名称)。一个工程可包含多个服务,每个服务中定义了容器运行的镜像、参数和依赖,一个服务可包括多个容器实例。
对应上面案例中工程名称是 docker-compose.yml 所在的目录名。该工程包含了1个服务,服务名称是 wzq-swagger-mng。执行 docker-compose up -d 时,启动了 wzq-swagger-mng 服务的1个容器实例。
docker-compose.yml 常用命令
docker-compose.yml是 Compose的默认模板文件。该文件有多种写法,例如 Version 1 file format、 Version2 file format、Version2. 1 file format、 Version3 file format等。其中, Version 1 file format将逐步被被弃用, Version2x及 Version3x基本兼容,是未来的趋势。本次只讨论 Version2 file format下的常用命令。
- build
配置构建时的选项, Compose会利用它自动构建镜像。buld的值可以是一个路径
例如
build:./Dockerfile
也可以是一个对象,用于指定 Dockerfile和参数,
例如
build:context: ./dockerfile: ./Dockerfile
agrs:jacob: 1
- command
覆盖容器启动后默认执行的命令,示例
command: bundle exec thin -p 3000
也可以是一个list,类似于 Dockerfile中的CMD指令,格式如下:
command: [bundle, exec, thin,-p, 3000]
- dns
配置dns服务器。可以是一个值,也可以是一个列表。示例:
dns: 8.8.8.8
dns:- 8.8.8.8- 9.9.9.9
- dns_search
配置DNS的搜索域,可以是一个值,也可以是一个列表。示例
dns_search:example.com
dns_search:- dc1.example.com- dc2.example.com
- environment
环境变量设置,可使用数组或字典两种方式。示例:
environmentRACK_ENV: developmentSHOW: trueSESSION SECRETenvironment- RACK_ENV=development- SHOW=true- SESSION_SECRET
- env_file
从文件中获取环境变量,可指定一个文件路径或路径列表。如果通过 docker-compose FILe指定了 Compose 文件,那么 eny_file中的路径是 Compose 文件所在目录的相对路径。使用 environment 指定的环境变量会覆盖 eny_file指定的环境变量。示例
eny_file: .env
eny_file- /common.env- /apps/web.env- /opt/secrets. env
- expose
暴露端口,只将端口暴露给连接的服务,而不暴露给宿主机。示例:
expose:- "3000"- "8090"
- external_links
连接到 docker-compose.yml外部的容器,甚至并非 Compose 管理的容器,特别是提供共享或公共服务的容器。格式跟 links类似,例如:
external_links:- redis_1- project_db_1: mysql- project_db_1: postgresql
- image
指定镜像名称或镜像Id,如果本地不存在该镜像, Compose会尝试下载该镜像。
示例
image: Java
- links
连接到其他服务的容器。可以指定服务名称和服务别名( SERVICE: ALIAS),也可只指定服务名称。例如:
web:links:- db- db:database- redis
-
networks
详细查看:Docker-compose 常用命令及网络设置(五) -
network_mode
设置网络模式。示例
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
- ports
暴露端口信息,可使用H0ST:CONTAINER的格式,也可只指定容器端口(此时宿主机将会随机选择端口),类似于 docker run-p。
需要注意的是,当使用H0ST:CONTAINER格式映射端口时,容器端口小于60将会得到错误的接口,因为yaml会把xx:yy的数字解析为60进制。因此,建议使用字符串的形式。示例:
ports- "3000"- "3000-3905"- "8000:8000"- "9099-9091:8080-8081"- "49100:22"- "127.0.0.1:8001:8001"- "127,0.0.1:5000-5010:5000-5010"
- volumes
卷挂载路径设置。可以设置宿主机路径(HOST:CONTAINER),也可指定访问模式(HOST:C0ONTAINER:ro)。示例:
volumes# Just specify a path and let the Engine create a volume- /var/lib/mysql# Specify an absolute path mapping- /opt/data:/var/lib/mysql# Path on the host relative to the Compose file- ./cache:/tmp/cache# User-relative path- ~/configs:/etc/configs/:ro#f Named volume- datavolume:/var/lib/mysql
- volumes_from
从另一个服务或容器挂载卷。可指定只读(ro)或读写(rw),默认是读写(rw)。
示例
volumes from- service_name- service_name:ro- container:container_name- container:container_name:rw
docker-compose.yml还有很多其他命令,比如 depends_on、pid、 devices等。
本次仅挑选常用的命令进行讲解,其他命令不再赘述。感兴趣的读者们可参考官方文档:https://docs.docker.com/compose/compose-file/