🎬慕斯主页:修仙—别有洞天
♈️今日夜电波:秒針を噛む—ずっと真夜中でいいのに。
0:34━━━━━━️💟──────── 4:20
🔄 ◀️ ⏸ ▶️ ☰
💗关注👍点赞🙌收藏您的每一次鼓励都是对我莫大的支持😍
目录
首先理解几个概念
Docker 容器编排(Compose)是什么?
docker-compose 是 Docker 官方的开源项目,使用 python 编写,实现上调用了Docker 服务的 API 进行容器管理及编排,其官方定义为定义和运行多个 Docker 容器 的应用。
docker-compose 中有两个非常重要的概念:
• 服务 ( service ):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
• 项目( project ):由一组关联的应用容器组成的一个完整业务单元,在 dockercompose.yml 文件中定义, 整个 docker-compose.yml 定义一个项目。
Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
通过 compose 可以方便的管理多个服务。
为什么要 Docker Compose?
Docker Compose 被设计出来主要是为了解决在开发、测试和部署涉及多个容器的应用程序时的复杂性和一致性问题。在使用单一 Docker 容器的情况下,一个 Dockerfile 就足以描述和构建容器镜像,但是现代应用程序往往包含多个服务,比如 Web 服务器、数据库、缓存服务等,这些服务通常需要在不同的容器中运行。这就引入了一个新的挑战:如何保证这些服务能够一起正常工作,相互之间正确地通信,并且能够容易地在不同的环境中复制这种设置。
以下是使用 Docker Compose 的几个主要原因:
- 多容器编排:
Docker Compose 允许你在一个 YAML 文件中定义多个服务及其依赖关系。这意味着你可以用一个命令启动或停止所有相关的服务,而不是分别处理每个容器。- 一致性:
使用 Docker Compose,无论是在开发者的本地机器上,还是在测试、预生产和生产环境中,都可以保持一致的环境配置。这有助于避免“在我的机器上能运行”的问题。- 简化环境搭建:
开发者只需运行一个命令,即可在他们的本地环境中搭建起整个应用栈,包括所有服务和依赖。这对于新加入团队的成员尤其有用,可以快速设置开发环境。- 资源隔离:
通过 Docker Compose,每个服务可以运行在自己的容器中,这样可以更好地隔离应用的不同组件,避免资源竞争。- 易于维护和升级:
当需要更新应用的任何部分时,只需修改docker-compose.yml
文件,然后重新启动服务即可,无需手动调整每个容器的设置。- 可移植性和可重复性:
Docker Compose 文件是文本文件,可以被版本控制系统跟踪,这使得应用配置可以随代码库一起被管理和分发。- 网络和环境变量管理:
Docker Compose 还允许你定义网络和环境变量,使得容器间通信更加容易,同时可以针对不同的环境配置不同的变量。- 自动化和持续集成:
Docker Compose 可以很容易地整合到 CI/CD 流水线中,自动部署和测试应用的完整堆栈。
Docker Compose 的功能
- 使用步骤
Compose 使用的步骤:
• 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中
一起运行。
• 最后,执行 docker compose up 命令来启动并运行整个应用程序。- 核心功能
Compose 具有管理应用程序整个生命周期的命令:
• 启动,停止和重建服务
• 查看正在运行的服务的状态
• 流式传输运行服务的日志输出
• 在服务上运行一次性命令- 使用场景
单主机部署
快速搭建一个单节点开发或者测试环境,方便使用。
不同环境隔离
通过指定 project 来运行不同的环境,实现隔离的目的。
docker-compose.yml常用的文件基本结构
docker-compose.yml
文件是 Docker Compose 使用的主要配置文件,用于定义和管理多容器的 Docker 应用程序。以下是docker-compose.yml
文件中一些常见指令的详细解释,包括它们的用途、语法和一个综合示例。
基本结构
version: '3' # 或其他版本号,如 '3.7'
services:
<service_name>:
# 指令定义
...
networks:
<network_name>: # 可选
# 网络定义
...
volumes:
<volume_name>: # 可选
# 卷定义
...
常见指令详解
1. image
- 用途:指定服务使用的 Docker 镜像。
- 语法:
image: <image_name>:<tag>
2. command
- 用途:覆盖容器的默认命令。
- 语法:
command: ["executable", "param1", "param2"] # 长语法
command: executable param1 param2 # 短语法
3. entrypoint
- 用途:覆盖容器的默认入口点。
- 语法:
entrypoint: ["executable", "param1", "param2"] # 长语法
entrypoint: executable param1 param2 # 短语法
#数组语法
entrypoint:
- php
- -d
- zend_extension=/usr/local/lib/php/extensions/no-debug-nonzts-20100525/xdebug.so
- -d
- memory_limit=-1
- vendor/bin/phpunit
4. environment
- 用途:设置环境变量。
- 语法:
#数组语法
environment:
- KEY=VALUE
- ANOTHER_KEY=ANOTHER_VALUE
#map 语法
environment:
RACK_ENV: development
SHOW: "true"
5. networks
- 用途:定义服务所属的网络。
- 语法:
networks:
- network_name
#配置网络驱动和子网信息
services:
frontend:
image: awesome/webapp
networks:
front-tier:
ipv4_address: 172.16.238.10
networks:
front-tier:
ipam:
driver: default
config:
- subnet: "172.16.238.0/24"
6. volumes
- 用途:定义数据卷或挂载宿主机目录到容器。
- 语法:
volumes:
- /host/path:/container/path:rw # 挂载宿主机路径
- volume_name:/container/path # 使用命名卷
7. ports
- 用途:映射容器端口到宿主机端口。
- 语法:
#短语法
ports:
- "80:80"
- "3000-3005"
- "8000:8000"
- "9090-9091:8080-8081"
- "49100:22"
- "127.0.0.1:8001:8001"
- "127.0.0.1:5000-5010:5000-5010"
- "6060:6060/udp
#完整语法
ports:
- target: 80
host_ip: 127.0.0.1
published: 8080
protocol: tcp
mode: host
- target: 80
host_ip: 127.0.0.1
published: 8000-9000
protocol: tcp
mode: host
8. expose
- 用途:声明容器监听的端口,但不进行映射。
- 语法:
expose:
- "80"
- "443"
9. build
- 用途:指定 Dockerfile 构建镜像。
- 语法:
build:
context: .
dockerfile: Dockerfile-alternate
args:
buildno: 1
cache_from:
- alpine:latest
- corp/web_app:3.14
10. depends_on
- 用途:定义服务之间的依赖。
- 语法:
depends_on:
- service_name
设置依赖关系。
• docker compose up :以依赖性顺序启动服务。在以下示例中,先启动 db 和
redis ,才会启动 web。
• docker compose up SERVICE :自动包含 SERVICE 的依赖项。在以下示例中,
docker compose up web 还将创建并启动 db 和 redis。
• docker compose stop :按依赖关系顺序停止服务。在以下示例中, web 在 db 和
redis 之前停止
version: "3.7"
services:
web:
build: .
depends_on:
-db
-redis
redis:
image: redis
db:
image: postgres
可以指定条件, healthy 需要配置 healthcheck 来完成
services:
web:
build: .
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
redis:
image: redis
db:
image: postgres
health check 样例
version: "3.8"
services:
web:
image: nginx:1.24.0
environment:
TEST: 1
depends_on:
mysql:
condition: service_healthy
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: "bit@123"
volumes:
- /data/maxhou/mysqldata/varlib/:/var/lib/mysql
healthcheck:
test: mysql --user=root --password='bit@123' -e "SELECT 1;"
interval: 10s
timeout: 5s
retries: 10
11. env_file
- 用途:从文件加载环境变量。
- 语法:
env_file:
- .env
完整示例
下面是一个 docker-compose.yml
文件的完整示例:
version: '3.7'
services:
web:
build:
context: ./app
dockerfile: Dockerfile.prod
command: gunicorn wsgi:app
volumes:
- .:/code
- static_volume:/home/app/web/static
expose:
- "8000"
env_file:
- ./.env.prod
depends_on:
- db
networks:
- app-network
db:
image: postgres:12.0-alpine
volumes:
- db_data:/var/lib/postgresql/data/
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=example
- POSTGRES_DB=dev_db
volumes:
static_volume:
db_data:
networks:
app-network:
driver: bridge
在这个示例中,web
服务依赖于 db
服务,使用自定义的 Dockerfile 构建,并将代码卷入容器。同时,db
服务使用 Postgres 数据库镜像,并配置了环境变量。两个服务都在名为 app-network
的网络上通信。此外,静态文件和数据库数据分别被存储在命名卷中。
Docker Compose常用命令
1. docker-compose up
docker-compose up
命令用来启动和建立在 docker-compose.yml
文件中定义的所有服务。它会创建并启动所有必要的容器,并处理任何依赖关系。
- 基本语法:
docker-compose up [options] [SERVICE...]
- 选项:
-
-d
: 后台运行服务。这意味着容器将在后台启动,而不是在前台运行并输出日志到控制台。--build
: 在启动之前重新构建服务的镜像。--force-recreate
: 强制重新创建容器,即使容器已经在运行中。--no-recreate
如果容器已经存在了,则不重新创建,不能与 --forcerecreate 同时使用
- 示例:
docker-compose up -d
2. docker-compose down
docker-compose down
命令用来停止和删除在 docker-compose.yml
文件中定义的服务的容器、网络、卷和图像(默认情况下图像不会被删除)。这是清理环境的好方法。
- 基本语法:
docker-compose down [options]
- 选项:
-
--volumes,-v
: 删除所有未被外部服务使用的数据卷。--rmi type
: 删除类型为local
或all
的镜像。local
表示只删除由 Compose 创建的本地镜像,all
则会删除所有镜像。
- 示例:
docker-compose down
3. docker-compose run
docker-compose run
命令用来启动一个服务的一次性容器。这很有用,比如当你想要在容器内执行一个命令然后让容器退出时。
- 基本语法:
docker-compose run [options] SERVICE [COMMAND] [ARGS...]
- 选项:
-
-d
: 在后台运行命令。--rm
: 运行后自动删除容器。--service-ports
: 将服务的端口映射到宿主机。- --name NAME 为容器指定一个名字 。
- --entrypoint CMD 覆盖默认的容器启动指令。
- -u, --user="" 指定运行容器的用户名或者 uid 。
- -p, --publish=[] 映射容器端口到本地主机。
- -e KEY=VAL 设置环境变量值,可多次使用选项来设置多个环境变量。
- 示例:
docker-compose run --rm web python manage.py shell
感谢你耐心的看到这里ღ( ´・ᴗ・` )比心,如有哪里有错误请踢一脚作者o(╥﹏╥)o!
给个三连再走嘛~