什么是 Docker Compose
Docker Compose是Docker官方的开源项目,是一个用于定义和运行多容器Docker应用程序的工具。
- 服务(Service):在Docker Compose中,一个服务实际上可以包括若干运行相同镜像的容器实例,代表一个应用的容器。例如,一个Web应用、数据库等都可以被视为一个服务。
- 项目(Project):由一组关联的应用容器组成的一个完整业务单元。在docker-compose.yml文件中定义,整个docker-compose.yml文件定义一个项目。Compose的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷的生命周期管理。
核心功能
- 定义和运行多容器应用:通过docker-compose.yml文件,用户可以定义多个容器的配置信息,包括容器之间的依赖关系、网络配置、数据卷管理等。然后,只需一个命令(如docker-compose up),就可以创建并启动所有定义的容器。
- 容器编排:Docker Compose支持容器的编排,可以根据容器的依赖关系自动启动和停止容器,确保应用在运行时具有正确的环境。
- 网络配置:Docker Compose支持自定义网络配置,使得容器之间的通信更加灵活和可靠。服务之间可以通过网络通信,Compose会自动创建网络。
- 数据卷管理:Docker Compose支持数据卷的挂载和管理,可以轻松地共享和持久化容器数据。
docker-compose.yml文件
docker-compose.yml
文件是 Docker Compose 的核心配置文件,用于定义和运行多容器 Docker 应用程序。
这个文件遵循 YAML
格式,包含了一系列关于服务、网络、卷等配置的信息。
以下是一个基本的 docker-compose.yml 文件示例,以及一些关键字段的解释:
version: '3.8' # 指定 Compose 文件的格式版本services: # 定义服务(容器)的列表web:image: nginx:latest # 指定容器使用的镜像ports:- "80:80" # 将主机的80端口映射到容器的80端口volumes:- ./html:/usr/share/nginx/html # 将主机的./html目录挂载到容器的/usr/share/nginx/html目录networks:- mynetwork # 指定容器使用的网络db:image: mysql:5.7environment:MYSQL_ROOT_PASSWORD: example # 设置环境变量volumes:- db_data:/var/lib/mysql # 使用命名卷存储数据库数据networks:- mynetworknetworks: # 定义自定义网络mynetwork:driver: bridge # 使用桥接网络模式volumes: # 定义命名卷db_data:
在这个示例中:
- version 字段指定了 Compose 文件的版本。不同版本的 Compose 文件支持不同的配置选项。(最新版本使用的是name,version已经被舍弃)
- services 字段下定义了一个或多个服务(容器)。在这个例子中,定义了两个服务:web 和 db。
- image 字段指定了容器使用的 Docker 镜像。
- ports 字段定义了端口映射。
- volumes 字段用于数据持久化或数据共享,可以挂载主机目录到容器目录,或使用命名卷。
- environment 字段用于设置环境变量。
- networks 字段指定了容器使用的网络。
- networks 字段定义了一个或多个自定义网络。在这个例子中,定义了一个名为 mynetwork 的桥接网络。
- volumes 字段定义了一个或多个命名卷。在这个例子中,定义了一个名为 db_data 的卷,用于存储 MySQL 数据库的数据。
注意,YAML 文件对缩进非常敏感,因此请确保每个字段都正确缩进。
此外,根据实际需求,您可以添加更多配置选项或自定义服务、网络和卷。
详细参考官方文档:https://docs.docker.com/reference/compose-file/version-and-name/
docker compose 常用命令
- docker-compose up:创建并启动容器。
- docker-compose down:停止并删除容器、网络和卷(如果使用–volumes选项)。
- docker-compose start:启动服务。
- docker-compose stop:停止服务。
- docker-compose restart:重启服务。
- docker-compose logs:查看容器日志。
- docker-compose ps:列出所有容器。
- docker-compose config:检查docker-compose.yml文件的配置。
详细参考官方文档:https://docs.docker.com/reference/cli/docker/compose/
Docker Compose 基本操作
创建一个目录并进入到该目录下:
mkdir -p /data/ahri/compose/base
cd /data/ahri/compose/base
创建一个yml文件
vi docker-compose.yml
编写配置文件,注意,格式一定要正确
name:test_compose
services:web:image: nginx:1.24.0environment:TEST: 1ports:- 8979:80networks:- mytestnetvolumes:- ./mynginxhome:/usr/share/nginx/htmldepends_on:mysql:condition: service_healthy redis:condition: service_healthymysql:image: mysql:5.7environment:MYSQL_ROOT_PASSWORD: "bit@123"networks:- mytestnetvolumes:- /data/maxhou/mysqldata/varlib/:/var/lib/mysqlhealthcheck:test: mysql --user=root --password='bit@123' -e "SELECT 1;"interval: 10stimeout: 5sretries: 10redis:image: redis:7networks:- mytestnethealthcheck:test: redis-cli pinginterval: 10stimeout: 5sretries: 10networks:mytestnet:
通过该命令查看配置文件是否出现错误:
docker compose config
创建首页目录,编辑首页内容:
mkdir -p ./mynginxhome
cd ./mynginxhome
echo "Test Docker Compose" > index.html
启动服务:
docker compose up -d
查看运行的容器:
通过浏览器测试访问:
进入nginx容器查看环境变量TEST:
docker exec -it test_compose-web-1 bash
停止服务:
docker compose stop
启动服务:
docker compose start
删除服务:
docker compose down
配置文件解析
当前项目的命名:
设置镜像为nginx:1.23.4 ,环境变量为TEST,端口映射为8080,连接网络为mytestnet,映射卷为mynginxhome;
依赖关系分别是mysql和redis;condition可以设置满足依赖项条件;
mysql和redis启动前都会进行健康检查,只有健康了才满足该条件;
镜像为mysql:5.7 ,并设置密码;连接网络mytestnet;映射卷为varlib;
healthcheck就是健康检查:通过test进行测试,规定时间为10s;错误超时不过5s,重试次数为10 ;
redis也是跟mysql配置服务相同;
通过networks来创建一个docker network.
Docker部署WordPress
WordPress
WordPress 是使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设属于自己的网站。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。
WordPress 是一款个人博客系统,并逐步演化成一款内容管理系统软件,它是使用PHP 语言和 MySQL 数据库开发的,用户可以在支持 PHP 和 MySQL 数据库的服务器上使用自己的博客。
利用docker compose进行部署
1.编写yml配置文件
对项目进行命名:
服务db:创建镜像mysql 存储卷为db_data,设置环境变量,最后进行健康检查;
restart
定义平台在容器终止时应用的策略。
always
:该策略始终重新启动容器,直到将其删除。
name: docker_WordPressservices:db:image: mysql:5.7volumes:- ./db_data:/var/lib/mysqlrestart: alwaysenvironment:MYSQL_ROOT_PASSWORD: mywordpressMYSQL_DATABASE: wordpressMYSQL_USER: wordpressMYSQL_PASSWORD: wordpresshealthcheck:test: mysql --user=root --password='mywordpress' -e "SELECT 1;"interval: 10stimeout: 5sretries: 10wordpress:depends_on:db:condition: service_healthyimage: wordpress:latestports:- "8081:80"restart: alwaysvolumes: - ./wordpress:/var/www/htmlenvironment:WORDPRESS_DB_HOST: db:3306WORDPRESS_DB_USER: wordpressWORDPRESS_DB_PASSWORD: wordpressWORDPRESS_DB_NAME: wordpress
通过该命令对配置文件进行自动检查,直到没有报错:
docker compose config
可以看到,如果我们网络没有创建一个docker network,那么会自动配置一个默认的网络
通过浏览器访问ip:
配置参数,点击安装.
进入容器,查看我们数据库存储的数据:
docker exec -it docker_wordpress-db-1 bash
mysql -u wordpress -p
use wordpress;
查看使用者:
select user_login from wp_users;
可以看到我们数据是放到我们的数据库中了.
退出,并释放空间:
docker compose down