内容目录
compose基本概述
为何需要compose
使用docker
命令来部署像wordpress
这样的多容器应用会比较繁琐。
因为需要手动指定存储、环境变量等多个参数,这种方法效率较低。
docker pull wordpress
docker pull mysql:8.0
docker run -d --name mysql \
-v mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-e MYSQL_DATABASE=wordpress \
mysql:8.0
docker run -d --link mysql \
-e WORDPRESS_DB_HOST=mysql:3306 \
-p 8080:80 \
wordpress
如果一个应用 比较复杂,需要维护多个镜像,并且还要创建及管理多个容器,同时容器与容器之间还存在依赖关系,该如何解决?
什么是compose
docker compose
是一个单机容器编排工具,它通过YAML
文件的方式来定义一组相关联的容器。
然后通过docker compose up
读取YAML
文件,最终完成对应服务容器的创建和启动。
docker compose
简化了docker
应用程序部署的复杂性。主要功能和优点如下:
- 1.使用
YAML
文件定义整个应用程序,所需要的服务; - 2.一个命令就可以启动和停止整个应用;
- 3.简化
docker
应用的部署
compose核心概念
services
services
(服务):表示一个容器实例,可以定义容器使用的镜像,容器的网络、以及容器的存储等。
如下示例定义了两个services
db services
:
- 1.运行
mysql
数据库,使用的镜像是mysql:8.0
- 2.使用
environment
环境变量的方式来设置数据库的基本信息,如密码和初始数据库
wordpress services
:
- 1.运行一个
wordpress
的容器,使用的镜像是wordpress:6.2.2
- 2.通过
depen_don
定义依赖关系,确保在mysql
服务启动后才启动wordpress
服务 - 3.使用
environment
环境变量方式来定义wordpress
连接mysql
的相关信息 - 4.使用
ports
配置项来指定对外开放的端口。
[root@docker-node1 wordpress]# cat docker-compose.yml
services:
mysql: # 定义服务名称
image: mysql:8.0 # 定义容器镜像
restart: always # 定义容器重启策略,always表示容器退出时总是重启
environment: # 定义mysql容器的系统的环境变量
MYSQL_ROOT_PASSWORD: oldxu
MYSQL_DATABASE: wordpress
MYSQL_USER: app
MYSQL_PASSWORD: app.oldxu.net
wordpress: # 定义服务名称
depends_on:
- mysql # 定义依赖关系
image: wordpress:6.2.2 # 定义容器镜像
environment: # 定义Wordpress容器的系统环境变量
WORDPRESS_DB_HOST: mysql:3306
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: app
WORDPRESS_DB_PASSWORD: app.oldxu.net
ports: # 定义容器对外的端⼝ 宿主机端⼝:容器端⼝
- 80:80
network
为了确保wordpress
和mysql
服务可以通过服务名称互相访问,我们需要在docker compose
配置中自定义网络。
这样它们就可以通过服务名称进行互联。
- 1.添加自定义网络:在
docker-compose.yaml
中定义一个自定义网络的名称和类型,以及地址段范围。 - 2.指定服务加入的网络:在
wordpress
和mysql
服务定义中明确指定加入到自定义网络
通过这种方式,一旦将两个服务加入到同一网络中,wordpress
和mysql
就可以通过定义的服务名称直接访问到彼此。
[root@docker-node1 wordpress]# cat docker-compose.yml
services:
mysql:
image: mysql:8.0
restart: always
environment:
MYSQL_ROOT_PASSWORD: oldxu
MYSQL_DATABASE: wordpress
MYSQL_USER: app
MYSQL_PASSWORD: app.oldxu.net
networks: # 定义mysql容器加⼊⾄哪个⽹络名称中
- blog_net
wordpress:
depends_on:
- mysql # 定义依赖关系
image: wordpress:6.2.2
environment:
WORDPRESS_DB_HOST: mysql:3306
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: app
WORDPRESS_DB_PASSWORD: app.oldxu.net
ports:
- 80:80
networks: # 定义wordpress容器加⼊⾄哪个⽹络名称中
- blog_net
# ⾃定义⽹络名称为blog_net、驱动类型为bridge、地址段范围为172.26.0.0/24。
networks:
blog_net:
driver: bridge
ipam:
config:
- subnet: 172.26.0.0/24
volumes
除了网络以外,我们还需要考虑数据持久化的问题,因此我们需要为每个服务定义和配置数据卷。
猪样可以确保数据不会在容器删除后丢失。
mysql
:
- 1.定义数据卷名称:例如
mysql_data
,用于存储mysql
的数据。 - 2.配置
mysql
的services
使用数据卷:将mysql
容器内的/var/lib/mysql
目录的数据持久化到mysql_data
数据卷中。
wordpress
:
- 1.
wordpress
就不采用数据卷的管理方式,而是采用bindmounting
方式来实现; - 2.使用
volumes
将宿主机的某个目录与wordpress
容器/var/www/html
建立映射,将容器数据持久化到宿主机目录中。
[root@docker-node1 wordpress]# cat docker-compose.yml
services:
mysql:
image: mysql:8.0
restart: always
environment:
MYSQL_ROOT_PASSWORD: oldxu
MYSQL_DATABASE: wordpress
MYSQL_USER: app
MYSQL_PASSWORD: app.oldxu.net
networks:
- blog_net
volumes: # 使⽤mysql_data卷持久化容器的/var/lib/mysql数据⽬录
- mysql_data:/var/lib/mysql
wordpress:
depends_on:
- mysql # 定义依赖关系
image: wordpress:6.2.2
environment:
WORDPRESS_DB_HOST: mysql:3306
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: app
WORDPRESS_DB_PASSWORD: app.oldxu.net
ports:
- 80:80
networks:
- blog_net
volumes: # 将宿主机⽬录与容器⽬录进⾏绑定
- /data/wordpress:/var/www/html
networks:
blog_net:
driver: bridge
ipam:
config:
- subnet: 172.26.0.0/24
volumes: # 由于容器需要使⽤mysql_data数据卷进⾏持久化,所以需要使⽤volumes创建该卷
mysql_data:
compose实战案例-1
wordpress部署
- 准备
wordpress
的完整compose
清单文件
[root@docker-node01 wordpresscompose]# cat docker-compose.yml
services:
mysql:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: 123456
networks:
- blog_net
volumes:
- mysql_wordpress:/var/lib/mysql
wordpress:
depends_on:
- mysql
image: wordpress
environment:
WORDPRESS_DB_HOST: mysql:3306
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: 123456
ports:
- 80:80
networks:
- blog_net
volumes:
- /data/wordpress:/var/www/html
networks:
blog_net:
driver: bridge
ipam:
config:
- subnet: 172.26.0.0/24
volumes:
mysql_wordpress:
- 创建并启动
docker-compose
中指定的wordpress
和mysql
容器,然后通过-d
在后台运行;
# 启动wordpress项目:先启动数据库服务,再启动wordpress服务
docker compose up -d
[+] Running 4/4
✔ Network wordpresscompose_blog_net Created 0.1s
✔ Volume "wordpresscompose_mysql_wordpress" Created 0.0s
✔ Container wordpresscompose-mysql-1 Started 0.4s
✔ Container wordpresscompose-wordpress-1 Started 0.6s
# 停止wordpress项目:先停止wordpress服务,然后停止数据库
[root@docker-node01 wordpresscompose]# docker compose stop
[+] Stopping 2/2
✔ Container wordpresscompose-wordpress-1 Stopped
✔ Container wordpresscompose-mysql-1 Stopped
- 查看
docker-compose
运行的容器
docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
wordpresscompose-mysql-1 mysql "docker-entrypoint.s…" mysql 5 minutes ago Up 5 minutes 3306/tcp, 33060/tcp
wordpresscompose-wordpress-1 wordpress "docker-entrypoint.s…" wordpress 5 minutes ago Up 5 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp
wordpress验证
- 通过浏览器访问宿主机
ip
,就可以正常访问wordpress
- 发布文章进行测试
留言