1. docker-compose是什么?
1. 1 简介
compose、machine 和 swarm 是docker 原生提供的三大编排工具。
简称docker三剑客。Compose
项目是 Docker 官方的开源项目,定义和运行多个 Docker 容器
的应用(Defining and running multi-container Docker applications)。它允许用户通过一个单独的 docker-compose.yml
模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Compose
中有两个重要的概念:
【官方解释】:
-
服务 (service):
一个
应用的容器,实际上可以包括若干运行相同镜像的容器实例。 -
项目 (project):由
一组关联的
应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
【个人理解】:
-
服务是
一个应用程序的逻辑单元
,它可以由一个或多个
容器组成。每个服务都拥有自己的配置,包括镜像、端口映射、环境变量、卷和网络等。 -
项目是一个包含
多个服务
的集合。它定义了应用程序的整体架构,并提供了管理所有服务的工具。
【服务和项目的例子】
-
一个 Web 应用程序可以包含以下服务:
-
web:运行应用程序代码的服务。
-
db:运行数据库的服务。
-
cache:运行缓存服务的服务。
-
一个 Docker Compose 项目可以包含以下文件:
-
docker-compose.yml:定义所有服务的配置文件。
-
Dockerfile:构建服务镜像的配置文件。
Compose 的默认管理对象是项目
,通过子命令对项目中的一组容器
进行便捷地生命周期管理。
1.2 Docker Compose, Docker Swarm 和 Kubernetes 对比
Docker Compose
- 单机部署 :Docker Compose 通常用于
单机部署
,因为它没有集群管理
功能。 - 简单易用:Docker Compose 使用 YAML 文件定义应用,语法简单易懂,易于上手。
- 开发和测试:Docker Compose 非常适合在开发和测试环境中使用,因为它可以快速启动和停止应用,并方便地进行配置更改。
Docker Swarm
- 集群管理 :Docker Swarm 是一个
集群管理
工具,可以管理多个 Docker 主机,并把它们作为一个集群来使用。 - 服务发现和负载均衡 :Docker Swarm 提供
服务发现
和负载均衡
功能,可以自动发现集群中的服务并进行负载均衡。 - 高可用性 :Docker Swarm 可以自动重启失败的容器,并确保应用的
高可用性
。 - 生产环境部署:Docker Swarm 非常适合在生产环境中使用,因为它可以提供高可用性、可扩展性和容错性。
Kubernetes
- 集群管理 :k8s 是一个
集群管理
工具,可以管理多个 Docker 主机,并把它们作为一个集群来使用。 - 功能强大 :Kubernetes 是一个功能强大的容器编排工具,它提供了丰富的功能,例如
服务发现
、负载均衡
、自动扩展
、滚动更新
、健康检查
等。 - 高可用性 :Docker Swarm 可以自动重启失败的容器,并确保应用的
高可用性
。 - 复杂性高:Kubernetes 的学习曲线比较陡峭,需要掌握大量的概念和配置选项。
- 生产环境部署:Kubernetes 非常适合在生产环境中使用,因为它可以提供高可用性、可扩展性和容错性。
总结
特征 | Docker Compose | Docker Swarm | Kubernetes |
---|---|---|---|
功能 | 简单 | 中等 | 强大 |
复杂性 | 低 | 中等 | 高 |
部署方式 | 单机 | 集群 | 集群 |
服务发现 | 无 | 有 | 有 |
负载均衡 | 无 | 有 | 有 |
高可用性 | 无 | 有 | 有 |
滚动更新、健康检查、高级调度等 | 无 | 无 | 有 |
适用场景 | 开发和测试 | 生产环境 | 生产环境 |
2. docker compose安装
2.1 二进制包
shell
# 1. 安装
$ sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 国内用户可以使用以下方式加快下载
$ sudo curl -L https://download.fastgit.org/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
# 2. 卸载
$ sudo rm /usr/local/bin/docker-compose
2.2 pip安装
shell
# 1. 安装
$ sudo pip install -U docker-compose
# 2. 卸载
$ sudo pip uninstall docker-compose
# 3. 查看版本
docker-compose --versiom
3. compose模版文件
Docker Compose YAML 文件解释
yaml
version: '3'
services:
mysql:
build:
context: ./mysql
environment:
MYSQL_ROOT_PASSWORD: admin
restart: always
container_name: mysql
volumes:
- /data/edu-bom/mysql/test:/var/lib/mysql
image: mysql/mysql:5.7
ports:
- 3306:3306
networks:
net:
eureka:
build:
context: ./edu-eureka-boot
restart: always
ports:
- 8761:8761
container_name: edu-eureka-boot
hostname: edu-eureka-boot
image: edu/edu-eureka-boot:1.0
depends_on:
- mysql
networks:
net:
networks:
net:
volumes:
vol:
详细解释:
-
version: 指定 Docker Compose 文件的版本。此处为 3。
-
services: 定义服务部分,包含应用程序的不同组件。
-
mysql: 定义名为 "mysql" 的服务,用于构建和运行 MySQL 数据库。
-
build: 指示 Docker Compose 从 ./mysql 目录构建 Docker 镜像。
-
environment: 设置环境变量,包括 MySQL 数据库的 root 用户密码。
-
restart: 指定容器在意外停止后自动重启。
-
container_name: 指定容器的名称为 "mysql"。
-
volumes: 将主机上的 /data/edu-bom/mysql/test 目录挂载到容器的 /var/lib/mysql 目录,用于存储数据库数据。
-
image: 指定使用官方的 MySQL 5.7 镜像。
-
ports: 将容器的 3306 端口映射到主机的 3306 端口,以便访问 MySQL 数据库。
-
networks: 将 "mysql" 服务连接到名为 "net" 的网络。
-
eureka: 定义名为 "eureka" 的服务,用于构建和运行 Eureka 服务发现服务器。
-
build: 指示 Docker Compose 从 ./edu-eureka-boot 目录构建 Docker 镜像。
-
restart: 指定容器在意外停止后自动重启。
-
ports: 将容器的 8761 端口映射到主机的 8761 端口,以便访问 Eureka 服务发现服务器。
-
container_name: 指定容器的名称为 "edu-eureka-boot"。
-
hostname: 指定容器的主机名为 "edu-eureka-boot"。
-
image: 指定使用 edu/edu-eureka-boot:1.0 镜像。
-
depends_on: 指定 "eureka" 服务依赖于 "mysql" 服务,确保数据库启动后再启动 Eureka 服务。
-
networks: 将 "eureka" 服务连接到名为 "net" 的网络。
-
networks: 定义名为 "net" 的网络。
-
volumes: 定义名为 "vol" 的卷,但未被任何服务使用。
4. docker-compose命令
up
shell
docker-compose up [options] [SERVICE...]
该命令十分强大,它将尝试自动完成包括构建镜像
,(重新)创建服务
,启动服务
,并关联服务相关容器的一系列操作。
可以说,大部分时候都可以直接通过该命令来启动一个项目。
如果使用 docker-compose up -d
,将会在后台启动并运行所有的容器。
默认情况,如果服务容器已经存在,docker-compose up
将会尝试停止容器,然后重新创建(保持使用 volumes-from
挂载的卷),以保证新启动的服务匹配 docker-compose.yml 文件的最新内容。如果用户不希望容器被停止并重新创建,可以使用 docker-compose up --no-recreate
。这样将只会启动处于停止状态的容器,而忽略已经运行的服务 。如果用户只想重新部署某个服务,可以使用 docker-compose up --no-deps -d <SERVICE_NAME>
来重新创建服务并后台停止旧服务,启动新服务,并不会影响到其所依赖的服务。
选项:
-d
在后台运行服务容器。
---no-color
不使用颜色来区分不同的服务的控制台输出。--no-deps
不启动服务所链接的容器。--force-recreate
强制重新创建容器,不能与 --no-recreate 同时使用。--no-recreate
如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用。--no-build
不自动构建缺失的服务镜像。-t
, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。
start
shell
docker-compose start [SERVICE...]
启动已经存在的服务容器
down
shell
docker-compose down
此命令将会停止 up 命令所启动的容器,并移除网络
stop
shell
docker-compose stop [options] [SERVICE...]
停止已经处于运行状态的容器,但不删除它。通过 docker-compose start
可以再次启动这些容器。
选项:
-t
, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。
ps
shell
docker-compose ps [options] [SERVICE...]
列出项目中目前的所有容器。
选项:
-q
只打印容器的 ID 信息。
logs
shell
docker-compose logs [options] [SERVICE...]
查看服务容器的输出。默认情况下,docker-compose
将对不同的服务输出使用不同的颜色来区分。可以通过 --no-color
来关闭颜色。
build
shell
docker-compose build [options] [SERVICE...]
构建(重新构建)项目中的服务容器。
服务容器一旦构建后,将会带上一个标记名,例如对于 web 项目中的一个 db 容器,可能是 web_db
。
可以随时在项目目录下运行 docker-compose build 来重新构建服务。
选项:
--force-rm
删除构建过程中的临时容器。--no-cache
构建镜像过程中不使用 cache(这将加长构建过程)。--pull
始终尝试通过 pull 来获取更新版本的镜像。
restart
shell
docker-compose restart [options] [SERVICE...]
重启项目中的服务
选项:
-t
, --timeout TIMEOUT 指定重启前停止容器的超时(默认为 10 秒)。
rm
shell
docker-compose rm [options] [SERVICE...]
删除所有停止状态的)
服务容器。推荐先执行docker-compose stop 命令
来停止容器。
选项:
-f
, --force 强制直接删除,包括非停止状态的容器。一般尽量不要使用该选项。-v
删除容器所挂载的数据卷。
top
shell
docker-compose top
查看各个服务容器内运行的进程。
images
shell
docker-compose images
列出 Compose 文件中包含的镜像。
run
shell
docker-compose run [options] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]
在指定服务上执行一个命令。
使用举例:
1.在web服务器运行python脚本
shell
docker-compose run web python my_script.py
2. 在 Web 服务容器中运行 shell 命令,并映射端口,设置环境变量,使用卷,连接网络:
shell
docker-compose run -p 8080:80 -e MY_VAR=value -v my_volume:/path/to/file/in/container --network my_network web bash
这将在 "web" 服务的容器中打开一个交互式 shell,并进行以下操作:
- 将容器的 80 端口映射到主机的 8080 端口。
- 设置环境变量 MY_VAR 的值为 "value"。
- 将名为 "my_volume" 的卷挂载到容器中的 /path/to/file/in/container 路径。
- 连接到名为 "my_network" 的网络。
3. 在数据库容器中运行 SQL 命令,使用环境变量,连接网络:
shell
docker-compose run -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=password --network my_network db psql -U postgres mydatabase
这将在 "db" 服务的容器中使用 PostgreSQL 客户端连接到 "mydatabase" 数据库,并进行以下操作:
- 设置环境变量 POSTGRES_USER 的值为 "postgres"。
- 设置环境变量 POSTGRES_PASSWORD 的值为 "password"。
- 连接到名为 "my_network" 的网络。
4. 在 Web 服务容器中运行 Python 脚本,使用卷,连接网络:
shell
docker-compose run -v my_volume:/path/to/file/in/container --network my_network web python my_script.py
这将在 "web" 服务的容器中运行名为 "my_script.py" 的 Python 脚本,并进行以下操作:
- 将名为 "my_volume" 的卷挂载到容器中的 /path/to/file/in/container 路径。
- 连接到名为 "my_network" 的网络。
port
shell
docker-compose port [options] SERVICE PRIVATE_PORT
打印某个容器端口所映射的公共端口。
选项:
--protocol=proto
指定端口协议,tcp(默认值)或者 udp。--index=index
如果同一服务存在多个容器,指定命令对象容器的序号(默认为 1)。
shell
# 下面结果表示:将web服务的5000端口映射到了宿主机的5001端口
$ docker-compose port web 5000
0.0.0.0:5001
5. 简单示例
参考链接:
[Docker] Docker Compose 基础教程(概念/基础操作)
全网最详细的Docker-Compose详细教程
Docker Compose