Docker Compose 的前身是Fig。Fig是一个由Orchard公司开发的强有力的工具。Fig是基于Docker的Python工具,允许用户基于一个YAML文件定义多容器应用,从而可以使用fig命令行工具进行应用的部署。Fig可以对应用的全生命周期进行管理。
2014年,Docker公司收购了Orchard公司,将Fig更名为Docker Compose。
部署和管理多个服务是比较困难的,而这就是Docker Compose需要解决的问题
Docker Compose 并不是通过脚本和各种冗长的docker命令来将应用组件组织起来,而是通过一个声明式的配置文件描述整个应用,从而使用一条命令完成部署。
二、安装Docker Compose在linux系统安装时分为两步。首先使用curl命令下载二进制文件,然后使用chmod命令将其置为可运行。
Docker Compose 在linux中使用,同样需要先安装Docker引擎。
下面是下载Docker Compose到/usr/local/bin目录下,版本是1.29.2
[root@localhost bin]# sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed100 664 100 664 0 0 587 0 0:00:01 0:00:01 --:--:-- 587100 12.1M 100 12.1M 0 0 168k 0 0:01:13 0:01:13 --:--:-- 120k
下载docker-compose二进制文件之后,使用如下命令使其可执行。
chmod +x /usr/local/bin/docker-compose
检查安装情况以及版本
[root@localhost bin]# docker-compose --versiondocker-compose version 1.29.2, build 5becea4c
现在就可以在Linux中使用Docker Compose了。
还有一个通过pip安装的Docker Compose的Python包
pip install docker-compose
不做演示
三、Compose 文件Docker Compose 使用YAML文件来定义多服务的应用。YAML是JSON的一个子集,因此也可以使用JSON。
Docker Compose 默认使用文件名 docker-compose.yml, 当然用户也可以使用-f参数指定具体的文件。
version: "3.9" services: web: build: . command: python3 app.py ports: - target: 5000 published: 5000 networks: - counter-net volumes: - type: volume source: counter-vol target: /code redis: image: "redis:alpine" networks: counter-net: networks: counter-net: volumes: counter-vol:
关键字段解释:
version 位于文件第一行,必须存在,它定义了Compose文件格式(主要是API)的版本。
services 用于定义不同的应用服务。Docker Compose 会将每个服务部署在各自的容器中。
networks 用于指引Docker创建新的网络。默认情况下,Docker Compose 会创建bridge网络。这是一种单主机网络,只能实现同一主机上容器的连接。
volumes 用于指引Docker来创建新的卷。
下面是services服务中的指令解释:
build: 、指定Docker基于当前目录(.)下Dockerfile中定义的指令来构建一个新的镜像。command: python app.py 指定Docker在容器中执行名为app.py的Python脚本作为主程序。ports: 指定Docker将容器内(-target)的5000端口映射到主机(published)的5000端口。networks: 使得Docker可以将服务连接到指定的网络上。volumes:指定Docker将counter-vol 卷(source:)挂载到容器内的 /code (target:)。