Docker Compsoe
Docker Compose是用于定义和管理多容器Docker应用的工具,通过yaml文件配置服务、网络和数据卷,实现一键部署和全生命周期管理。
Docker Compose将所管理的容器分为工程(project)、服务(service)、容器(container)三层。在Docker Compose运行的目录下的所有文件组成一个工程,如果没有指定工程名,那就是当前目录名。在一个工程中可以包含多个服务,在每个服务内定义多个容器。
Docker Compose的配置文件默认为docker-compose.yml,可以通过环境变量COMPOSE_FILE或-f参数指定配置文件
#使用环境变量指定配置文件,多个文件使用“:”分隔
export COMPOSE_FILE=compose_1.yml:compose_2.yml
docker-compose up
#使用-f参数指定配置文件,多个文件写多个-f
docker-compose -f compose_1.yml -f compose_2.yml up
核心功能:
- 多容器编排:将多个容器(如数据库、Web服务、缓存等)整合为一个项目,统一管理依赖关系和启动顺序。
- 声明式配置:通过docker-compose.yml文件定义服务、数据卷、网络,实现环境一致性。
- 快速启停:一条命令可以实现启动所有服务和停止并且清理资源。
- 跨环境移植:配置文件可复用,降低部署差异风险。
安装
#安装docker-compose
yum -y install docker-compose
#查看版本
docker-compose --version
编写配置文件
配置文件说明
build | 指定Dockerfile文件名(需要使用子级标签dockerfile指定) |
dockerfile | build的自己标签,指定Dockerfile的路径 |
context | 可以使dockerfile的路径,或者是指向git仓库的URL地址 |
image | 指定镜像 |
command | 容器启动后默认执行的命令,会覆盖dockerfile的CMD的命令 |
container_name | 指定容器名 |
deploy | 指定部署和运行服务相关配置,只在swarm模式使用 |
environment | 添加环境变量 |
networks | 加入网络,引用顶级networks下条目 |
ports | 暴露容器端口,端口不能低于60 |
network_mode | 设置容器网络模式 |
volumes | 挂载一个宿主机目录到容器,命名卷要在顶级volumes定义卷名称 |
volumes_from | 从另一个服务或容器挂载卷,可选参数:ro和rw,(仅版本2支持) |
示例
准备docker-compose.yml
services:
mysql: #服务名称
image: mysql:5.7 #声明容器使用的镜
container_name: mysql_db #容器名
environment:
MYSQL_ROOT_PASSWORD: testroot #环境变量,root密码
MYSQL_DATABASE: app_db #指定数据库
MYSQL_USER: app_user #普通用户
MYSQL_PASSWORD: testuser #普通用户密码
ports:
- "3306:3306" #端口映射
restart: always #重启策略
volumes:
- mysql_data:/var/lib/mysql #挂载数据卷,数据持久化
- ./init.sql:/docker-entrypoint-initdb.d/init.sql #mysql默认回执习惯这个目录下的sql、sh等文件,这里创建一个表,插入几条数据
- ./mysql-charset.cnf:/etc/mysql/conf.d/charset.cnf #配置字符集
nginx:
build:
context: .
dockerfile: ./Dockerfile #当前目录的Dockerfile
container_name: nginx
volumes:
- ./html:/usr/share/nginx/html #挂载静态网站文件
ports:
- 80:80
restart: always
volumes:
mysql_data: #声明卷名称
driver: local #使用本地驱动
driver_opts:
type: none #卷类型
device: /var/lib/mysql #宿主机路径
o: bind
准备Dockerfile
FROM nginx:1.25
#这里将nginx默认显示的页面换成我们自己的
COPY ./index.html /usr/share/nginx/html/index.html
EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;"]
准备init.sql
-- 显式开启事务
START TRANSACTION;
-- 设置会话参数
SET sql_mode = 'NO_ENGINE_SUBSTITUTION';
SET autocommit = 1;
-- 创建学生表(包含自增主键)
CREATE TABLE student (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT,
gender VARCHAR(1) CHECK (gender IN ('男', '女'))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 插入三条示例数据
INSERT INTO student (name, age, gender) VALUES
('张三', 20, '男'),
('李四', 19, '女'),
('王五', 21, '男');
ON DUPLICATE KEY UPDATE id=id;
-- 提交数据
COMMIT;
准备mysql-charset.cnf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
启动
docke-compose up -d #在后台启动
#这时候就可以查看我们插入到表中的数据
docker exec -it <容器ID> mysql -u root -p -e "use app_db;select * from student"
#在浏览器访问宿主机的80端口或者使用curl就可以访问到我们自己设置的index.html
curl <IP>:80
#然后因为我们将html这个目录挂载到了nginx容器中,所以在html目录下修改index.html的内容后就会发现nginx的页面也会发生变化
命令
命令 | 含义 |
build | 重新构建服务 |
ps | 列出容器 |
up | 创建和启动容器 |
exec | 在容器中执行命令 |
scale | 指定容器启动数量,如果指定了容器名则无法使用 |
top | 显示容器进程 |
logs | 查看容器输出 |
down | 删除容器、网络、数据卷和镜像 |
stop/start/restart | 停止/启动/重启服务 |