Compose有多种安装方式,例如通过 shell, pip以及将 Compose作为容器安装等。本次安装以Shell 为主。
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,然而当输 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 大致有 3 个步骤:
下面以 wzq-swagger-mng 为例讲解 compose 的基本步骤。
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"]
version: '2'# 表示该docker-compose.yml文件使用的是version 2 file
services:
wzq-swagger-mng:# 指定服务名称
build:#指定Dockerfile所在文件夹的路径
context: ./
dockerfile: ./Dockerfile
ports:
- "10086:10086"# 指定端口映射,类似 docker run 的 -p 选项,注意使用字符串形式。
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是 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:./Dockerfile
也可以是一个对象,用于指定 Dockerfile和参数, 例如
build:
context: ./
dockerfile: ./Dockerfile
agrs:
jacob: 1
command: bundle exec thin -p 3000
也可以是一个list,类似于 Dockerfile中的CMD指令,格式如下:
command: [bundle, exec, thin,-p, 3000]
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
dns_search:example.com
dns_search:
- dc1.example.com
- dc2.example.com
environment
RACK_ENV: development
SHOW: true
SESSION SECRET
environment
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
eny_file: .env
eny_file
- /common.env
- /apps/web.env
- /opt/secrets. env
expose:
- "3000"
- "8090"
external_links:
- redis_1
- project_db_1: mysql
- project_db_1: postgresql
image: Java
web:
links:
- db
- db:database
- redis
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
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
# 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
- 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/