Ubuntu下Docker容器编排的常用方法及实践
Docker Compose是Ubuntu下最常用的容器编排工具之一,通过docker-compose.yml文件定义多容器应用的服务、网络、卷等配置,实现一键启动、停止和管理。
sudo apt remove -y docker.io docker-compose docker-compose-v2
sudo apt update
sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
docker --version # 应输出类似 Docker version 24.x.x
docker compose version # 应输出类似 Docker Compose version v2.x.x
在项目目录(如~/myapp)中创建docker-compose.yml,定义服务、环境变量、网络、卷等配置。示例如下:
version: "3.8" # 指定Compose文件格式版本
services:
web: # 服务名称(自定义)
image: nginx:latest # 使用官方Nginx镜像
ports:
- "80:80" # 将宿主机80端口映射到容器80端口
depends_on:
- db # 定义服务依赖(web启动前需先启动db)
db: # 数据库服务
image: postgres:15 # 使用PostgreSQL 15镜像
environment:
POSTGRES_PASSWORD: mysecretpassword # 设置环境变量(数据库密码)
volumes:
- db-data:/var/lib/postgresql/data # 持久化数据(挂载卷)
volumes:
db-data: # 自定义卷名称(用于数据持久化)
docker-compose.yml所在目录运行,-d表示后台运行:docker compose up -d
docker compose down
docker compose ps
web)的日志输出:docker compose logs -f web # -f表示实时跟踪日志
web服务的容器内部(执行bash):docker compose exec web /bin/bash
build指令或Dockerfile,需重建服务镜像:docker compose build
环境变量分离:将敏感信息(如数据库密码)存入.env文件,避免硬编码:
# .env文件内容
POSTGRES_PASSWORD=mysecretpassword
修改docker-compose.yml中的环境变量引用:
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} # 引用.env文件中的变量
自定义网络:创建专用网络实现服务间通信(默认使用bridge网络):
networks:
my-network:
driver: bridge
services:
web:
networks:
- my-network
db:
networks:
- my-network
服务间可通过服务名访问(如web服务访问db服务的PostgreSQL端口:postgres://db:5432)。
卷持久化:通过volumes指令将容器内目录挂载到宿主机,防止数据丢失(如数据库数据、应用日志):
volumes:
- ./logs:/var/log/nginx # 将宿主机./logs目录挂载到容器/var/log/nginx
- db-data:/var/lib/postgresql/data # 使用命名卷(推荐)
若需要跨主机部署或高可用集群,可使用Docker Swarm(Docker原生集群管理工具),支持服务扩缩容、负载均衡、故障转移等功能。
在管理节点(如Ubuntu服务器)上运行以下命令,初始化Swarm:
docker swarm init --advertise-addr <MANAGER-IP> # 替换为管理节点的实际IP
输出结果会显示加入集群的命令(包含Token),用于将工作节点加入集群。
在工作节点(其他Ubuntu服务器)上运行管理节点输出的命令,加入Swarm集群:
docker swarm join --token <SWARM-TOKEN> <MANAGER-IP>:2377
使用docker service create命令部署服务,示例如下:
docker service create --name web --replicas 3 -p 80:80 nginx:latest
--name web:服务名称(自定义);--replicas 3:创建3个服务实例(实现高可用);-p 80:80:将宿主机80端口映射到容器80端口;nginx:latest:使用的镜像。docker service ls
web服务的详细信息(包括节点分布、端口映射):docker service inspect --pretty web
web服务扩展到5个实例):docker service scale web=5
web服务及其所有实例:docker service rm web