一、关于
Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速在集群中部署分布式应用。
Compose 定位是“defining and running complex applications with Docker”,前身是 Fig,兼容 Fig 的模板文件。
Dockerfile 可以让用户管理一个单独的应用容器;而 Compose 则允许用户在一个模板(YAML 格式)中定义一组相关联的应用容器(被称为一个 project,即项目),例如一个 Web 服务容器再加上后端的数据库服务容器等。
该项目由 Python 编写,实际上调用了 Docker 提供的 API 来实现。
Compose 面向项目进行管理,一个项目可以由多个服务(容器)关联而成。
- 服务(service):一个应用容器,实际上可以运行多个相同镜像的实例。
- 项目(project):由一组关联的应用容器组成的一个完整业务单元。
二、安装
运行下面的命令去下载 Docker Compose 的最新稳定版。
curl -SL https://github.com/docker/compose/releases/download/v2.13.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose
添加软链接
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
测试安装
$ docker-compose --version
三、Compose 命令
基本的使用格式是
docker-compose [options] [COMMAND] [ARGS...]
支持以下选项:
- –verbose 输出更多调试信息。
- –version 打印版本并退出。
- -f, –file FILE 使用特定的 compose 模板文件,默认为 docker-compose.yml。
- -p, –project-name NAME 指定项目名称,默认使用目录名称。
支持以下命令
- build:构建或重新构建服务。
- kill:通过发送 SIGKILL 信号来强制停止服务容器。
- logs:查看服务的输出。
- port:打印绑定的公共端口。
- ps:列出所有容器。
- pull:拉取服务镜像。
- rm:删除停止的服务容器。
- run:在一个服务上执行一个命令。
- scale:设置同一个服务运行的容器个数。
- start:启动一个已经存在的服务容器。
- stop:停止一个已经运行的容器,但不删除它。通过 docker-compose start 可以再次启动这些容器。
- restart:重新启动一个已经存在的服务容器。
- up:构建,(重新)创建,启动,链接一个服务相关的容器。
- down:停止并删除一个服务相关的容器。
- config:检查配置,添加-q参数只输出错误。
- exec [服务ID]:进入容器示例内部
如果使用 docker-compose up -d
,将会在后台启动并运行所有的容器。默认情况,如果该服务的容器已经存在, docker-compose up 将会停止并尝试重新创建他们(保持使用volumes-from 挂载的卷),以保证 docker-compose.yml 的修改生效。如果你不想容器被停止并重新创建,可以使用 docker-compose up –no-recreate。如果需要的话,这样将会启动已经停止的容器。
四、YAML 模板文件
默认的模板文件是 docker-compose.yml,其中定义的每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)来自动构建。其它大部分指令都跟 docker run
中的类似。
如果使用 build 指令,在 Dockerfile 中设置的选项(例如:CMD, EXPOSE, VOLUME, ENV 等) 将会自动被获取,无需在 docker-compose.yml 中再次设置。
常用指令如下:
- image:指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉去这个镜像
- build:指定 Dockerfile 所在文件夹的路径。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。
- command:覆盖容器启动后默认执行的命令。
- links:链接到其它服务中的容器。使用服务名称(同时作为别名)或服务名称:服务别名 (SERVICE:ALIAS) 格式都可以。
- external_links:链接到 docker-compose.yml 外部的容器,甚至 并非 Compose 管理的容器。参数格式跟 links 类似。
- ports:暴露端口信息。
- expose:暴露端口,但不映射到宿主机,只被连接的服务访问。
- volumes:卷挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro)。
- volumes_from:从另一个服务或容器挂载它的所有卷。
- environment:设置环境变量。
- env_file:从文件中获取环境变量,可以为单独的文件路径或列表。
- extends:基于已有的服务进行扩展。
- net:设置网络模式。
- dns:配置 DNS 服务器。
五、部署一个springboot服务
创建docker-compose.yml
文件
version: '3'
services:
mysql:
image: mysql:5.7
container_name: mysql
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/init:/docker-entrypoint-initdb.d/
environment:
- MYSQL_ROOT_PASSWORD=123456
ports:
- "3306:3306"
restart: always
networks:
- rabb_net
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
redis:
image: redis:6.0.8
container_name: redis
ports:
- "6379:6379"
volumes:
- ./redis/data:/data
- ./redis/conf/redis.conf:/etc/redis/redis.conf
command: redis-server /etc/redis/redis.conf
restart: always
networks:
- rabb_net
springboot:
image: rabb-springboot-test:2.0
container_name: springboot
ports:
- "12345:12345"
restart: always
command: --spring.data.redis.host=redis --spring.datasource.url=jdbc:mysql://mysql:3306/test?useSSL=false&charsetEncoding=utf8
depends_on:
- redis
- mysql
networks:
- rabb_net
networks:
rabb_net:
启动
docker-compose build --no-cache
docker-compose up -d
另外,上边的docker-compose.yml
文件需要先构建出rabb-springboot-test:2.0
镜像,我们也可以直接在中定义build
指令来直接从Dockerfile
文件中构建出对应镜像
...
springboot:
image: rabb-springboot-test:3.0
build: ./springboot
container_name: springboot
ports:
- "12345:12345"
restart: always
command: --spring.data.redis.host=redis --spring.datasource.url=jdbc:mysql://mysql:3306/test?useSSL=false&charsetEncoding=utf8
depends_on:
- redis
- mysql
networks:
- rabb_net
...