⼀、Docker-compose 定义
1. docker compose 是 docker 官⽅的开源项⽬,负责实现对
docker 容器集群的快速编排(容器,依赖,⽹络,挂载。。)
2. compose 是 docker 公司推出的⼀个⼯具软件,可以管理多个
docker 容器组成的应⽤
3. 需要定义⼀个 YAML 格式的配置⽂件 docker-compose.yml,写
好多个容器之间的调⽤关系
4. 使⽤ compose 的步骤、
5. 1. 使⽤ Dockerfile 定义各个微服务应⽤并构建出对应的镜像⽂
件Dockerfile 的使⽤,以便可以在任何地⽅复制。
2. 使⽤ docker-compose.yml 定义⼀个完整的业务单元,安排
好整体应⽤中的各个容器服务。
3. 最后,执⾏ docker-compose up 命令来启动并运⾏整个应
⽤程序,完成⼀键部署。
⼆、Docker-compose 产⽣背景
1. 使⽤ Dockerfile 定义镜像⽂件,再⼿动构建、运⾏容器等操
作,⽽微服务架构⼀般包含若⼲个微服务,且每个微服务⼀般都
会部署多个实例,所以,若每个微服务都需要⼿动启停,那么维
护量会⾮常庞⼤,并且⼯作效率也会很低。2. ⽽ compose 是⽤于定义和运⾏多容器 docker 应⽤程序的⼯
具。通过 compose,可以使⽤ YML ⽂件来配置应⽤程序需要
的所有服务。
3. 仅需使⽤⼀个命令,就可以从 YML ⽂件配置中创建并启动所有
服务。
4. Compose 可以基于 Compose ⽂件帮我们快速的部署分布式应
⽤,⽆需⼿动⼀个个创建和运⾏容器。
5. Compose ⽂件是⼀个⽂本⽂件,通过指令定义集群中的每个容
器如何运⾏。
三、Docker-compose 核⼼概念
Docker-compose 将管理的容器分为三层:⼯程(project)、
服务(service)、容器(container)
1. ⼯程:运⾏ compose 的⽬录下所有的⽂件,包括 docker
compose.yml、extends ⽂件、环境变量⽂件等组成⼀个⼯程,
若⽆特殊指定⼯程,⼯程名即为当前⽬录名。⼯程的默认配置⽂
件为 docker-compose.yml,可通过环境变量 COMPOSE_FILE
或 -f 参数⾃定义配置⽂件,其定义了多个有依赖关系的服务及
每个服务运⾏的容器。
2. 服务:⼀个⼯程中包含多个服务,每个服务中定义了容器运⾏的
镜像、参数、依赖等。⼀个服务中可包括多个容器实例。3. 容器:被 docker-compose 管理或部署的容器集群,调⽤
docker 服务提供的 API 来对容器进⾏管理,只要操作的平台⽀
持 docker API,即可在其上进⾏ compose 的容器编排。
四、YAML ⽂件的格式和语法
1、YAML ⽂件格式
1. yaml 是⼀种标记语⾔很直观的数据序列化格式,可读性很⾼。
类似于 xml 描述性语⾔,语法⽐xml简单的很多。
2. yaml 数据结构通过缩进进⾏表示,连续的项⽬通过减号来表
示,键值对⽤冒号分隔,数组⽤中括号括起来,hash⽤花括号
括起来。
3. yaml ⽂件的基本格式由⼀系列键值对构成。每个键值对都⽤冒
号“: ”分隔
key: value
1. 在 yaml 中,键和值之间只需要⼀个空格,这是为了保证 yaml
⽂件的可读性和⼀致性
2. 对于字符串值,可以使⽤单引号或者双信号将其括起来,这样可
以避免出现特殊字符或空格等问题
name: 'Meng Mr'
age: "34"1. 如果值包含特殊字符(如冒号或短横线),则应该使⽤引号将其
括起来
description: "This is a YAML file: good for configuation
files."
2、YAML 注意事项
1. 不⽀持制表符 tab 键缩进,需要使⽤空格缩进。
2. 通常开头缩进 2 个空格。
3. 字符后缩进 1 个空格,如:冒号,逗号,横杠。
4. ⽤ # 表示注释。
5. 如果包含特殊字符⽤单引号引起来。
6. 布尔值(true、false、yes、no、on、off)必须使⽤“”引号括起
来,这样分析器会将它们解释为字符串。
3、列表和数组
在yaml中,可以使⽤“-”符号表示⼀个列表和数组4、嵌套数据结构
yaml⽀持嵌套数据结构,可以⽤缩进来表示不同层级之间的关系,
可使⽤ # 号表示注释信息。
五、Docker-compose 安装
1. 官⽹:https://docs.docker.com/compose/
fruits: # fruits是⼀个键,它对应⼀个列表,包含三个元
素:apple、banana、orange
- apple # fruits为⼀个⼤项,下⾯的⼩项只需要缩进⼏个
空格,与其他项⽬对⻬即可
- banana
- orange
person:
name: 'Meng Mr' # 两个空格,name和age是person的⼀
级⼦节点
age: "34"
address: # address是person的⼆级⼦节点
street: '123 Main St' # address节点包含了
street、city、state和zip四个⼀级⼦节点
city: 'Anytown'
state: 'CA'
zip: '12345'2. Github:https://github.com/docker/compose#docker-compos
e-v2
3. 需要提前添加好 apt 仓库,因为之前安装过 docker,所以不需
要在准备。
六、docker-compose 命令解析
1、⽂件内常⽤指令字段
(1)version
指定了Docker compose编排⽂件的版本
Docker Compose ⽬前有三个版本,分别为 Version1、
Version2和Version3。
Version1 是较早的版本,它将来会被弃⽤。
Version2 是⽬前的稳定版本,⽀持更多的指令。
[root@docker ~]# yum -y update
[root@docker ~]# yum -y install docker-compose
plugin
# 通过检查版本来验证 Docker Compose 是否已正确安装
[root@docker ~]# docker compose version
Docker Compose version v2.20.2
[root@docker ~]#Version3 在功能上与 Version2 类似,但进⾏了⼀些改进和
扩展,例如增加了对 Docker BuildKit 的⽀持,可以加速构
建过程。
(2)service
指定了在 docker compose 编排中要运⾏的服务,每个服务都有⼀
个名称,并指定要使⽤的镜像和容器的配置选项。
(3)image
指定要使⽤的 docker 镜像。
version:'3'
services:
mysql: #服务名
# 再往下可以对该服务进⾏定义,⽐如指定映射端⼝,指定使⽤的
镜像等,但要注意缩进格式。
services:
mysql: # 服务名
image: mysql:5.5 # 指定mysql镜像,如果主机内不存在
该镜像,会从登录的docker镜像仓库内拉取,⼀般都是从
dockerhub上拉取(4)build
允许在 docker compose 编排中指定 dockerfile 的位置。
(5)environment
指定了要设置的环境变量。
services:
mysql: # 服务名
build: /docker/mysql # 这⾥为⽤户微服务⽂件夹,
⾥⾯存放的是该服务代码jar包和Dockerfile⽂件
services:
mysql: # 服务名
environment: # 下⾯是MySQL环境变量的例⼦
MYSQL_ROOT_PASSWORD: 000000 # 设置MySQL的
root⽤户的密码
MYSQL_DATABASE: database # 指定要创建的数
据库名称
MYSQL_USER: user # 指定要创建的
MySQL⽤户名
MYSQL_PASSWORD: 123 # 指定要创建的
MySQL⽤户的密码(6)volumes
挂载宿主机路径或命名卷
1. 指定路径挂载
1. ⽣成 volume 卷挂载
1. 共享⽬录挂载
services:
mysql: # 服务名
volumes:
- ./mysql/data:/var/lib/mysq # 直接指定路径挂载
[root@doc ~]# docker volume create mysql # ⽣成名为
mysql的volume卷
[root@doc ~]# vim docker-compose.yml
services:
mysql: # 服务名
volumes:
- mysql:/var/lib/mysq # 指定volume卷挂载(7)port
指定了要宿主机映射到容器的端⼝,端⼝不能低于 60(宿主机端
⼝:容器端⼝),如果选择的端⼝号低于 60,可能会与系统保留的
知名端⼝冲突。
[root@doc ~]# vim docker-compose.yml
version: '2' # 使⽤共享⽬录挂载只有‘2’版本⽀持
service:
mysql: # 服务名
volumes:
- /var/lib/mysql # 将这个⽬录作为共享⽬录
nginx:
volumes:
- /usr/local/nginx/html
php:
volumes_from: # 共享⽬录来⾃
- mysql # 挂载的共享⽬录,挂载后会在容器内⽣成与
被挂载的⽬录同名的路径
- nginx # 共享挂载可以是⼀个列表
services:
mysql: # 服务名
ports:
- 3306:3306 # 宿主机端⼝:容器端⼝(8)expose
⽤于在 docker 容器内部暴露端⼝的选项。
(9)networks
加⼊⽹络,引⽤顶级 networks 条⽬.
(10)hostname
设定容器主机名
services:
mysql: # 服务名
expose:
- 3306
networks: # 与services同级
dev: # ⾃定义或已存在的⽹络设备名
driver: bridge # 设备类型:⽹桥
external: true # 外部存在:是
services:
mysql: # 服务名
hostname: mysql(11)command
指定容器启动时要运⾏的命令,覆盖构建时的默认命令
2、docker compose 命令选项
1. build:重新构建服务
2. ps:列出容器
3. up:启动所有docker-compose服务
4. up -d:启动所有docker-compose服务启动并后台运⾏
5. exec:进⼊容器实例内部
6. scale:指定⼀个服务器启动数量
7. top:显示容器进程
8. logs:查看容器输出⽇志
9. down:停⽌并删除容器、⽹络、卷、镜像
10. stop:停⽌服务
11. start:启动服务
12. restart:重启服务
13. config:检查配置
services:
mysql: #服务名
command: --character-set·server=utf814. config -q:检查配置,有问题才有输出
15. --version:查看版本
七、docker-compose 实例
1、创建 yml ⽂件
[root@localhost ~]# cd test/
[root@localhost test]# ls # 创建⼀个⽬录,该⽬录是⼀
个:(project)⼯程
[root@localhost test]# cat docker-compose.yml #这
⾥⽂件名称是固定不变的
version: "3" # 指定⽂件版本
services:
nginx: # 这是service名
container_name: nginx01 # 这是容器名
image: nginx:latest
ports:
- "8001:80" # 端⼝映射
volumes:
- /www/wwwroot/8001:/usr/share/nginx/html # 挂
载
hostname: nginx.test.com # 容器主机名
nginx-php: # 第⼆个service服务名称
container_name: nginx02 # 第⼆个容器的名称2、创建数据卷⽬录
3、启动 compose 集群
要在 docker-compose.yml ⽂件所在的⽬录下才能通过 docker
compose 命令启动容器。
image: nginx:latest
ports:
- "8002:80"
volumes:
- /www/wwwroot/8002:/usr/share/nginx/html
hostname: nginx-php.test.com
[root@localhost test]# mkdir -p /www/wwwroot/8001
# 创建⽬录
[root@localhost test]# mkdir -p /www/wwwroot/8002
[root@localhost test]# echo "8001" >
/www/wwwroot/8001/index.html # 准备索引⽂件
[root@localhost test]# echo "8002" >
/www/wwwroot/8002/index.html4、访问测试
5、查看并关闭容器
[root@localhost test]# docker compose up -d # 启动
⼯程后会根据指定的容器名称,⽣成对应的容器
[+] Running 3/3
✔ Network test_default Created 0.1s
✔ Container nginx02 Started 0.1s
✔ Container nginx01 Started 0.1s
[root@localhost test]# curl 192.168.15.3:8001
8001
[root@localhost test]# curl 192.168.15.3:8002
80026、删除集群中的容器
rm 命令只能删除已经停⽌的容器
[root@localhost test]# docker compose ps -a #
查看docker-compose的所有容器
NAME IMAGE COMMAND
SERVICE CREATED
STATUS PORTS
nginx01 nginx:latest "/docker-entrypoint.sh
nginx -g 'daemon off;'" nginx 3 minutes
ago Up 3 minutes 0.0.0.0:8001->80/tcp,
:::8001->80/tcp
nginx02 nginx:latest "/docker-entrypoint.sh
nginx -g 'daemon off;'" nginx-php 3 minutes
ago Up 3 minutes 0.0.0.0:8002->80/tcp,
:::8002->80/tcp
[root@localhost test]# docker compose stop nginx01
# 以容器名关闭compose失败
no such service: nginx01
[root@localhost test]# docker compose stop nginx
# 必须使⽤service关闭docker-compose
[+] Stopping 1/1
✔ Container nginx01 Stopped[root@localhost test]# docker compose rm #删除容
器,不需要指定容器名称
? Going to remove nginx01 Yes
[+] Removing 1/0
✔ Container nginx01 Removed
0.0s
[root@localhost test]# docker compose rm #再次删
除找不到容器,因为没有停⽌的容器
No stopped containers
[root@localhost test]# docker compose ps #查看运⾏
的容器,⽬前只有⼀个nginx02
NAME IMAGE COMMAND
SERVICE CREATED
STATUS PORTS
nginx02 nginx:latest "/docker-entrypoint.sh
nginx -g 'daemon off;'" nginx-php 6 minutes
ago Up 6 minutes 0.0.0.0:8002->80/tcp,
:::8002->80/tcp
强制删除7、检查 YAML ⽂件语法
[root@localhost test]# docker compose down #强制
删除创建的容器及其他内容
[+] Running 2/2
✔ Container nginx02 Removed
0.5s
✔ Network test_default Removed
0.1s
[root@localhost test]# docker compose config #检
查test⽬录下docker-compose是否存在语法错误
name: test
services:
nginx:
container_name: nginx01
hostname: nginx.test.com
image: nginx:latest
networks:
default: null
ports:
- mode: ingress
target: 80
published: "8001"
protocol: tcp
volumes:- type: bind
source: /www/wwwroot/8001
target: /usr/share/nginx/html
bind:
create_host_path: true
nginx-php:
container_name: nginx02
hostname: nginx-php.test.com
image: nginx:latest
networks:
default: null
ports:
- mode: ingress
target: 80
published: "8002"
protocol: tcp
volumes:
- type: bind
source: /www/wwwroot/8002
target: /usr/share/nginx/html
bind:
create_host_path: true
networks:
default:
name: test_default
[root@localhost test]# docker compose config -q
#-q 检查语法,但不输出8、进⼊容器或执⾏临时命令
[root@localhost test]# docker compose config --
services #--services 查看service
nginx
nginx-php
[root@localhost test]# docker compose config --
volumes #--volumes 查看volume
[root@localhost test]# docker compose exec nginx
/bin/bash # 进⼊nginx容器内部,并给容器⼀个bash环境
root@nginx:/# ls
bin dev docker-entrypoint.sh home lib64
mnt proc run srv tmp var
boot docker-entrypoint.d etc lib media
opt root sbin sys usr
root@nginx:/# exit
[root@localhost test]# docker compose run nginx
php ls # 让容器临时执⾏⼀下ls命令
bin dev docker-entrypoint.sh home lib64
mnt proc run srv tmp var
boot docker-entrypoint.d etc lib media
opt root sbin sys usr
root@nginx-php:/# exit9、查看容器的输出⽇志
[root@localhost test]# docker compose logs nginx
#查看docker-compose中nginx服务的⽇志
nginx01 | /docker-entrypoint.sh: /docker
entrypoint.d/ is not empty, will attempt to
perform configuration
nginx01 | /docker-entrypoint.sh: Looking for
shell scripts in /docker-entrypoint.d/
nginx01 | /docker-entrypoint.sh: Launching
/docker-entrypoint.d/10-listen-on-ipv6-by
default.sh
nginx01 | 10-listen-on-ipv6-by-default.sh: info:
Getting the checksum of
/etc/nginx/conf.d/default.conf
nginx01 | 10-listen-on-ipv6-by-default.sh: info:
Enabled listen on IPv6 in
/etc/nginx/conf.d/default.conf
nginx01 | /docker-entrypoint.sh: Launching
/docker-entrypoint.d/20-envsubst-on-templates.sh
nginx01 | /docker-entrypoint.sh: Launching
/docker-entrypoint.d/30-tune-worker-processes.sh
nginx01 | /docker-entrypoint.sh: Configuration
complete; ready for start up
nginx01 | 2023/12/13 13:37:24 [notice] 1#1: using
the "epoll" event methodnginx01 | 2023/12/13 13:37:24 [notice] 1#1:
nginx/1.21.5
nginx01 | 2023/12/13 13:37:24 [notice] 1#1: built
by gcc 10.2.1 20210110 (Debian 10.2.1-6)
nginx01 | 2023/12/13 13:37:24 [notice] 1#1: OS:
Linux 4.18.0-425.3.1.el8.x86_64
nginx01 | 2023/12/13 13:37:24 [notice] 1#1:
getrlimit(RLIMIT_NOFILE): 1048576:1048576
nginx01 | 2023/12/13 13:37:24 [notice] 1#1: start
worker processes
nginx01 | 2023/12/13 13:37:24 [notice] 1#1: start
worker process 30
nginx01 | 2023/12/13 13:37:24 [notice] 1#1: start
worker process 31
nginx01 | 2023/12/13 13:37:24 [notice] 1#1: start
worker process 32
nginx01 | 2023/12/13 13:37:24 [notice] 1#1: start
worker process 33
[root@localhost test]# docker compose logs #查看
docker-compose中所有服务的⽇志
nginx01 | /docker-entrypoint.sh: /docker
entrypoint.d/ is not empty, will attempt to
perform configuration
nginx01 | /docker-entrypoint.sh: Looking for
shell scripts in /docker-entrypoint.d/nginx01 | /docker-entrypoint.sh: Launching
/docker-entrypoint.d/10-listen-on-ipv6-by
default.sh
nginx01 | 10-listen-on-ipv6-by-default.sh: info:
Getting the checksum of
/etc/nginx/conf.d/default.conf
nginx01 | 10-listen-on-ipv6-by-default.sh: info:
Enabled listen on IPv6 in
/etc/nginx/conf.d/default.conf
nginx01 | /docker-entrypoint.sh: Launching
/docker-entrypoint.d/20-envsubst-on-templates.sh
nginx01 | /docker-entrypoint.sh: Launching
/docker-entrypoint.d/30-tune-worker-processes.sh
nginx01 | /docker-entrypoint.sh: Configuration
complete; ready for start up
nginx01 | 2023/12/13 13:37:24 [notice] 1#1: using
the "epoll" event method
nginx01 | 2023/12/13 13:37:24 [notice] 1#1:
nginx/1.21.5
nginx01 | 2023/12/13 13:37:24 [notice] 1#1: built
by gcc 10.2.1 20210110 (Debian 10.2.1-6)
nginx01 | 2023/12/13 13:37:24 [notice] 1#1: OS:
Linux 4.18.0-425.3.1.el8.x86_64
nginx01 | 2023/12/13 13:37:24 [notice] 1#1:
getrlimit(RLIMIT_NOFILE): 1048576:1048576
nginx01 | 2023/12/13 13:37:24 [notice] 1#1: start
worker processesnginx01 | 2023/12/13 13:37:24 [notice] 1#1: start
worker process 30
nginx01 | 2023/12/13 13:37:24 [notice] 1#1: start
worker process 31
nginx01 | 2023/12/13 13:37:24 [notice] 1#1: start
worker process 32
nginx01 | 2023/12/13 13:37:24 [notice] 1#1: start
worker process 33
nginx02 | /docker-entrypoint.sh: /docker
entrypoint.d/ is not empty, will attempt to
perform configuration
nginx02 | /docker-entrypoint.sh: Looking for
shell scripts in /docker-entrypoint.d/
nginx02 | /docker-entrypoint.sh: Launching
/docker-entrypoint.d/10-listen-on-ipv6-by
default.sh
nginx02 | 10-listen-on-ipv6-by-default.sh: info:
Getting the checksum of
/etc/nginx/conf.d/default.conf
nginx02 | 10-listen-on-ipv6-by-default.sh: info:
Enabled listen on IPv6 in
/etc/nginx/conf.d/default.conf
nginx02 | /docker-entrypoint.sh: Launching
/docker-entrypoint.d/20-envsubst-on-templates.sh
nginx02 | /docker-entrypoint.sh: Launching
/docker-entrypoint.d/30-tune-worker-processes.shnginx02 | /docker-entrypoint.sh: Configuration
complete; ready for start up
nginx02 | 2023/12/13 13:37:24 [notice] 1#1: using
the "epoll" event method
nginx02 | 2023/12/13 13:37:24 [notice] 1#1:
nginx/1.21.5
nginx02 | 2023/12/13 13:37:24 [notice] 1#1: built
by gcc 10.2.1 20210110 (Debian 10.2.1-6)
nginx02 | 2023/12/13 13:37:24 [notice] 1#1: OS:
Linux 4.18.0-425.3.1.el8.x86_64
nginx02 | 2023/12/13 13:37:24 [notice] 1#1:
getrlimit(RLIMIT_NOFILE): 1048576:1048576
nginx02 | 2023/12/13 13:37:24 [notice] 1#1: start
worker processes
nginx02 | 2023/12/13 13:37:24 [notice] 1#1: start
worker process 31
nginx02 | 2023/12/13 13:37:24 [notice] 1#1: start
worker process 32
nginx02 | 2023/12/13 13:37:24 [notice] 1#1: start
worker process 33
nginx02 | 2023/12/13 13:37:24 [notice] 1#1: start
worker process 34
# -f:跟踪输出⽇志10、查看容器集群的镜像
11、启动多个相同配置的容器
1. 有时候需要⼀个集群,启动多个相同的容器,但是 compose 不
提供负载代理功能,只能⾃⼰启动代理。
2. 需要伸展的容器必须不能使⽤名字和固定端⼝。
[root@localhost test]# docker compose images
CONTAINER REPOSITORY
TAG IMAGE ID SIZE
nginx01 nginx
latest 605c77e624dd 141MB
nginx02 nginx
latest 605c77e624dd 141MB
test-nginx-run-b1081d144ae5 nginx
latest 605c77e624dd 141MB
[root@localhost test]# cat docker-compose.yml
version: "3"
networks:
haha:
external: true
services: nginx:
#container_name: nginx01 # 使⽤scale不能使⽤名
字,注释掉
image: nginx:latest
# ports: # 使⽤scale不能使⽤端⼝,注释掉
#- "8001:80"
volumes:
- /www/wwwroot/8001:/usr/share/nginx/html
hostname: nginx.test.com
networks:
- haha
nginx-php:
# container_name: nginx02
image: nginx:latest
#ports:
#- "8002:80"
volumes:
- /www/wwwroot/8002:/usr/share/nginx/html
hostname: nginx-php.test.com
networks:
- haha
[root@localhost test]# docker compose up -d --
scale nginx=3
# 指定启动3个nginx容器,不加参数默认启动⼀个,nginx-php没
加该参数,所以只启动了⼀个
[+] Running 4/412、控制容器集群的注意事项
✔ Container test-nginx-3 Started
0.0s
✔ Container test-nginx-php-1 Started
0.1s
✔ Container test-nginx-2 Started
0.0s
✔ Container test-nginx-1 Started
0.0s
# 在启动docker-compose的注意事项
# 所有docker-compose命令必须在docker-compose.yml⽂件所
在的项⽬⽬录下⾯,否则执⾏会失败
[root@localhost ~]# docker compose up -d #在其他
⽬录下启动docker-compose失败
no configuration file provided: not found
[root@localhost ~]# docker compose -f test/docker
compose.yml -p web up -d #需要使⽤参数书指定⽬录位置
# -f 指定yaml⽂件名字及路径
# -p 必须指定项⽬名,否则默认为yaml⽂件所在⽬录名
# 使⽤这两个选项优点麻烦,不如直接cd到docker-compose的⼯
程⽬录
[+] Running 3/3
✔ Network web_default Created
0.1s #创建⽹络✔ Container nginx02 Started
0.1s #创建容器
✔ Container nginx01 Started
0.1s #创建容器
# 查询也必须指定yaml⽂件和项⽬⽬录
[root@localhost ~]# docker compose ps # 没有
yaml和项⽬名⽆法查看,正确的查看⽅法是假-f和-p
no configuration file provided: not found
[root@localhost ~]# docker compose -f test/docker
compose.yml ps # 没有-p,不能得到查询结果
NAME IMAGE COMMAND SERVICE CREATED
STATUS PORTS
[root@localhost ~]# docker compose -f test/docker
compose.yml -p web ps # -f和-p可以查出结果
NAME IMAGE COMMAND
SERVICE CREATED
STATUS PORTS
nginx01 nginx:latest "/docker-entrypoint.sh
nginx -g 'daemon off;'" nginx 34 seconds
ago Up 32 seconds 0.0.0.0:8001->80/tcp,
:::8001->80/tcp
nginx02 nginx:latest "/docker-entrypoint.sh
nginx -g 'daemon off;'" nginx-php 34 seconds
ago Up 31 seconds 0.0.0.0:8002->80/tcp,
:::8002->80/tcp
⼋、docker-compose 编排 lnmp 集群⼋、docker-compose 编排 lnmp 集群
1、docker-compose.yml ⽂件
[root@doc lnmp]# vim docker-compose.yml
version: '2'
volumes:
mysql-conf:
php-conf:
networks:
lnmp_net:
external: true
services:
nginx:
image: nginx
container_name: nginx-lnmp
hostname: nginx-lnmp
privileged: true
ports:
- 90:80
volumes:
-
/root/lnmp/nginx/html/:/usr/share/nginx/html/:rw
-
/root/lnmp/nginx/conf.d/:/etc/nginx/conf.d/:rw- /root/lnmp/nginx/logs/:/var/log/nginx/:rw
restart: always
networks:
- lnmp_net
php:
image: php:7.3.29-fpm
container_name: php-lnmp
hostname: php-lnmp
privileged: true
volumes:
- /root/lnmp/nginx/html/:/var/www/html/:rw
- php-conf:/usr/local/etc/php
volumes_from:
- mysql
restart: always
networks:
- lnmp_net
mysql:
image: mysql:5.6
container_name: mysql-lnmp
ports:
- 3306:3306
privileged: true
volumes:
- /var/lib/mysql
- /root/lnmp/mysql/data/:/var/lib/mysql/:rw2、⼯程⽬录结构树状图
- mysql-conf:/etc/mysql/
restart: always
networks:
- lnmp_net
environment:
MYSQL_ROOT_PASSWORD: "123456"
[root@doc lnmp]# tree ./
./
"## docker-compose.yml
"## mysql
$ %## data
"## mysql-conf
$ "## conf.d
"## nginx
$ "## conf.d
$ "## html
$ $ "## index.html
$ $ "## testa.php
$ $ "## testb.php
$ $ %## wordpress
$ %## logs
%## php-conf
"## conf.d
$ "## docker-php-ext-pdo_mysql.ini3、修改并导⼊配置⽂件
(1)nginx 配置⽂件
$ %## docker-php-ext-sodium.ini
"## php.ini
"## php.ini-development
%## php.ini-production
[root@doc lnmp]# vim nginx/conf.d/default.conf
server {
listen 80;
root /usr/share/nginx/html;
index index.html index.htm index.php;
# redirect server error pages to the static
page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location / {
index index.html index.htm index.php ;(2)导⼊ mysql 和 php 的配置⽂件到容器内
try_files $uri $uri/ /index.php?
$query_string;
autoindex on;
}
location ~ \.php$ {
fastcgi_pass php-lnmp:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param PATH_INFO
$fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME
/var/www/html/$fastcgi_script_name;
}
}
[root@doc lnmp]# mv mysql-conf/*
/var/lib/docker/volumes/lnmp_mysql-conf/_data/
[root@doc lnmp]# mv php-conf/*
/var/lib/docker/volumes/lnmp_php-conf/_data/(3)php 容器安装 mysql 扩展插件
[root@doc lnmp]# docker compose exec php bash
root@php-lnmp:/var/www/html# docker-php-ext
install pdo_mysql
root@php-lnmp:/var/www/html# docker-php-ext
install mysqli
root@php-lnmp:/var/www/html#
exit
[root@doc lnmp]# docker compose restart php
[+] Restarting 1/1
✔ Container php-lnmp Started
0.3s