1.基础理论
当在宿主机启动较多的容器时候,如果都是手动操作会觉得比较麻烦而且容易出错,此时推荐使用docker 单机编排工具 docker-compose。
docker-compose 是 docker 容器的一种单机编排服务,docker-compose 是一个管理多个容器的工具,比如:可以解决容器之间的依赖关系,就像启动一个nginx 前端服务的时候会调用后端的tomcat,那就得先启动tomcat,但是启动tomcat 容器还需要依赖数据库,那就还得先启动数据库,docker-compose 可以用来解决这样的嵌套依赖关系,并且可以替代docker命令对容器进行创建、启动和停止等手工的操作。
因此,如果说docker命令就像linux的命令,docker compse就像shell脚本,可以自动的执行容器批量操作,从而实现自动化的容器管理,或者说docker命令相当于ansible命令,那么docker compose文件,就相当于ansible-playbook的yaml文件。
docker-compose 项目是Docker 官方的开源项目,负责实现对Docker 容器集群的快速编排,docker-compose 将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。
Docker Compose 使用 YAML 文件来定义多服务的应用。YAML 是 JSON 的一个子集,因此也可以使用JSON。Docker Compose 默认使用文件名compose.yml,同时也支持docker-compose.yml。当然,也可以使用 -f 参数指定具体文件。
1.1.选项参数说明
#选项说明:
-f,–file FILE #指定Compose 模板文件,默认为docker-compose.yml。
-p,–project-name NAME #指定项目名称,默认将使用当前所在目录名称作为项目名。
--verbose #显示更多输出信息
--log-level LEVEL #定义日志级别 (DEBUG, INFO, WARNING, ERROR, CRITICAL)
--no-ansi #不显示ANSI 控制字符
-v, --version #显示版本
#以下为命令选项,需要在docker-compose.yml|yaml 文件所在在目录里执行
build #构建镜像
bundle #从当前docker compose 文件生成一个以<当前目录>为名称的json格式的Docker
Bundle 备份文件 config -q #查看当前配置,没有错误不输出任何信息
create #创建服务,较少使用
down #停止和删除所有容器、网络、镜像和卷
#events #从容器接收实时事件,可以指定json 日志格式,较少使用
exec #进入指定容器进行操作
help #显示帮助细信息
images #显示镜像信息,较少使用
kill #强制终止运行中的容器
logs #查看容器的日志
pause #暂停服务
port #查看端口
ps #列出容器,较少使用
pull #重新拉取镜像,镜像发生变化后,需要重新拉取镜像,较少使用
push #上传镜像
restart #重启服务,较少使用
rm #删除已经停止的服务
run #一次性运行容器
scale #设置指定服务运行的容器个数
start #启动服务 ,较少使用
stop #停止服务,较少使用
top #显示容器运行状态
unpause #取消暂定
up #创建并启动容器 ,较少使用
1.2.常用命令
docker-compose up:启动所有服务。
docker-compose up :启动指定的服务。
docker-compose down:停止并删除所有服务。
docker-compose down :停止并删除指定的服务。
docker-compose ps:列出所有正在运行的服务。
docker-compose logs:查看所有服务的日志。
1.3.docker-compose模本文件解析
1.3.1.version
version
字段指定了 Docker Compose 编排文件的版本,例如:
version: '3'
1.3.2 services
services
字段指定了在 Docker Compose 编排中要运行的服务。每个服务都有一个名称,并指定要使用的镜像和容器的配置选项。例如:
services:
mysql: #服务名
image: mysql:5.5 #mysql镜像
1.3.3 build 和 image
build
字段允许在 Docker Compose 编排中指定 Dockerfile 的位置,从而可以使用 Docker Compose 构建镜像。image
字段指定要使用的 Docker 镜像。例如:
services:
mysql: #服务名
image: mysql:5.5 #mysql镜像
user: #服务名
build: ./user #这里为用户微服务文件夹,里面存放的是该服务代码jar包和Dockerfile文件
1.3.4 volumes 和 environment
volumes
字段指定了要使用的数据卷。environment
字段指定了要设置的环境变量。例如:
services:
mysql: #服务名
image: mysql:5.5 #mysql镜像
environment:
MYSQL_ROOT_PASSWORD: 000000 #设置数据库密码
volumes:
- "$PWD/mysql/data:/var/lib/mysql" #数据卷挂载
1.3.5 ports 和 expose
ports
字段指定了要宿主机映射到容器的端口(宿主机端口:容器端口)。expose
字段是用于在 Docker 容器内部暴露端口的选项,可以让其他容器连接到这些端口,但不会将它们映射到 Docker 主机上。expose
与 ports
不同的是,expose
字段仅仅是将容器内部的端口暴露给其他容器使用,而不是直接映射到宿主机上的端口
例如:
services:
gateway: #服务名
build: ./gateway #这里为网关文件夹,里面存放的是该服务代码jar包和Dockerfile文件
ports:
-"7000:7000"
nginx:
image: nginx
expose:
-"8080"
1.3.6.ulimits
指定容器的 ulimits
限制值。例如,指定最大进程数为 65535,指定文件句柄数为 20000(软限制,应用可以随时修改,不能超过硬限制) 和 40000(系统硬限制,只能 root 用户提高)。
ulimits:
nproc:65535
nofile:
soft:20000
hard:40000
1.3.7.depends_on
解决容器的依赖、启动先后的问题。以下例子中会先启动 redis mysql 再启动 web
version:'3'
services:
web:
build:.
depends_on:
-db
-redis
redis:
image:redis
db:
image:mysql
1.3.8.environment
设置环境变量。你可以使用数组或字典两种格式。
environment:
SW_STORAGE:elasticsearch
SW_STORAGE_ES_CLUSTER_NODES:elasticsearch:9200
environment:
-SW_STORAGE=elasticsearch
-SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200
1.3.9.restart
指定容器退出后的重启策略为始终重启。该命令对保持服务始终运行十分有效,在生产环境中推荐配置为 always
或者 unless-stopped
。
restart: always
1.3.10.networks
networks
应用的网络,在它下面可以定义应用的名字、使用的网络类型等。
networks:
halo_network:
1.3.11.healthcheck
healthcheck
配置运行的检查以确定此服务的容器是否“健康”。
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
start_period: 40s
1.3.12.command
command
重写默认的命令,即指定启动容器的命令。
command:
- --spring.r2dbc.url=r2dbc:pool:postgresql://halodb/halo
- --spring.r2dbc.username=halo
# PostgreSQL 的密码,请保证与下方 POSTGRES_PASSWORD 的变量值一致。
- --spring.r2dbc.password=openpostgresql
- --spring.sql.init.platform=postgresql
# 外部访问地址,请根据实际需要修改
- --halo.external-url=http://localhost:8090/
# 初始化的超级管理员用户名
- --halo.security.initializer.superadminusername=admin
# 初始化的超级管理员密码
- --halo.security.initializer.superadminpassword=P@88w0rd
2.docker-compose安装
docker-compose安装很简单,下载对应文件,添加执行权限即完成安装,不需要依赖docker引擎
2.1.下载最新Docker-compose文件
curl -SL https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
2.2.添加可执行权限,即完成安装
[root@localhost ~]# chmod +x /usr/local/bin/docker-compose
2.3.查看版本信息
[root@localhost ~]# docker-compose -v
Docker Compose version v2.20.3
3.使用docker-compose批量部署nginx服务
部署3个nginx服务,并实现端口映射,容器卷挂载服务等
3.1.提前拉去好实验镜像(本次是自己制作的镜像,版本1.25.1),并准备好对应的nginx配置文件
3.2.编写docker-compose.yaml文件
version: "3"
networks:
mynet110:
driver: bridge
ipam:
config:
- subnet: 172.18.0.0/16
services:
nginx01:
image: cs/nginx:latest
container_name: nginx01
restart: always
networks:
mynet110:
ipv4_address: 172.18.0.2
volumes:
- /usr/local/nginx01/html:/usr/local/nginx/html
- /usr/local/nginx01/conf.d:/usr/local/nginx/conf.d
- /usr/local/nginx01/logs:/usr/local/nginx/logs
- /usr/local/nginx01/conf/nginx.conf:/usr/local/nginx/conf/nginx.conf
ports:
- "80:80"
nginx02:
image: cs/nginx:latest
container_name: nginx02
restart: always
networks:
mynet110:
ipv4_address: 172.18.0.3
volumes:
- /usr/local/nginx02/html:/usr/local/nginx/html
- /usr/local/nginx02/conf.d:/usr/local/nginx/conf.d
- /usr/local/nginx02/logs:/usr/local/nginx/logs
- /usr/local/nginx02/conf/nginx.conf:/usr/local/nginx/conf/nginx.conf
ports:
- "81:80"
nginx03:
image: cs/nginx:latest
container_name: nginx03
restart: always
networks:
mynet110:
ipv4_address: 172.18.0.4
volumes:
- /usr/local/nginx03/html:/usr/local/nginx/html
- /usr/local/nginx03/conf.d:/usr/local/nginx/conf.d
- /usr/local/nginx03/logs:/usr/local/nginx/logs
- /usr/local/nginx03/conf/nginx.conf:/usr/local/nginx/conf/nginx.conf
ports:
- "82:80"
3.3.检查语法错误
[root@localhost nginx]# docker-compose config -q
3.4.启动服务并查看容器
[root@localhost nginx]# docker-compose up -d
[+] Running 3/3
✔ Container nginx03 Started 0.6s
✔ Container nginx01 Started 0.6s
✔ Container nginx02 Started 0.6s
[root@localhost nginx]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f26352c93337 cs/nginx:latest "nginx -g 'daemon of…" About a minute ago Up About a minute 0.0.0.0:80->80/tcp, :::80->80/tcp nginx01
02d1d0cd7827 cs/nginx:latest "nginx -g 'daemon of…" About a minute ago Up About a minute 80/tcp, 0.0.0.0:81->81/tcp, :::81->81/tcp nginx02
8ec762adabe0 cs/nginx:latest "nginx -g 'daemon of…" About a minute ago Up About a minute 80/tcp, 0.0.0.0:82->82/tcp, :::82->82/tcp nginx03
3.5.放入首页测试文件,并测试
[root@localhost nginx]# touch this is nginx01 web site > /usr/local/nginx01/html/index.html
[root@localhost nginx]# touch this is nginx02 web site > /usr/local/nginx02/html/index.html
[root@localhost nginx]# touch this is nginx03 web site > /usr/local/nginx03/html/index.html
4.使用docker-compose批量部署mysql服务
#使用docker-compose部署mysql项目,mysql版本为5.7
4.1.编写docker-compose.yaml文件
version: "3"
networks:
mynet110:
driver: bridge
ipam:
config:
- subnet: 172.18.0.0/16
services:
mysql01:
image: mysql:5.7
container_name: mysql01
restart: always
networks:
mynet110:
ipv4_address: 172.18.0.2
volumes:
- /home/mysql01/conf:/etc/mysql/conf.d
- /home/mysql01/data:/var/lib/mysql
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=0000
command:
--max_connections=1000
# 最大连接数
--character-set-server=utf8mb4
# 字符编码
--collation-server=utf8mb4_general_ci
# 在比较和排序的时候更快
--default-authentication-plugin=mysql_native_password
# 身份验证插件
mysql02:
image: mysql:5.7
container_name: mysql02
restart: always
networks:
mynet110:
ipv4_address: 172.18.0.3
volumes:
- /home/mysql02/conf:/etc/mysql/conf.d
- /home/mysql02/data:/var/lib/mysql
ports:
- "3307:3306"
environment:
- MYSQL_ROOT_PASSWORD=0000
command:
--max_connections=1000
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--default-authentication-plugin=mysql_native_password
mysql03:
image: mysql:5.7
container_name: mysql03
restart: always
networks:
mynet110:
ipv4_address: 172.18.0.4
volumes:
- /home/mysql03/conf:/etc/mysql/conf.d
- /home/mysql03/data:/var/lib/mysql
ports:
- "3308:3306"
environment:
- MYSQL_ROOT_PASSWORD=0000
command:
--max_connections=1000
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--default-authentication-plugin=mysql_native_password
4.2.语法没有错误后启动容器服务
[root@localhost mysql]# docker-compose config -q
[root@localhost mysql]# docker-compose up -d
[+] Running 4/4
✔ Network mysql_mynet110 Created 0.2s
✔ Container mysql03 Started 0.0s
✔ Container mysql01 Started 0.0s
✔ Container mysql02 Started 0.0s
4.3.查看运行的容器
[root@localhost mysql]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ee1c2ae06a3c mysql:5.7 "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql01
834040baeb6e mysql:5.7 "docker-entrypoint.s…" About a minute ago Up About a minute 33060/tcp, 0.0.0.0:3308->3306/tcp, :::3308->3306/tcp mysql03
ea87d1ff63fd mysql:5.7 "docker-entrypoint.s…" About a minute ago Up About a minute 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp mysql02
4.5.测试访问
5.使用docker-compose部署lnmp环境
基于官方镜像配置lnmp环境
nginx 1.25.1、mysql 5.7、php 7.6
5.1.编写docker-compose文件
version: "3"
networks:
mynet110:
driver: bridge
ipam:
config:
- subnet: 172.18.0.0/16
services:
php:
image: php:latest
container_name: php
restart: always
volumes:
- /www/wwwroot/cs.com:/var/www
networks:
mynet110:
ipv4_address: 172.18.0.2
ports:
- "9000:9000"
nginx:
image: cs/nginx:latest
container_name: nginx
restart: always
networks:
mynet110:
ipv4_address: 172.18.0.3
volumes:
- /www/wwwroot/cs.com:/usr/local/nginx/html
- /www/nginx/conf.d:/usr/local/nginx/conf.d
- /www/nginx/logs:/usr/local/nginx/logs
- /www/nginx/conf/nginx.conf:/usr/local/nginx/conf/nginx.conf
ports:
- "80:80"
mysql:
image: mysql:5.7
container_name: mysql
restart: always
networks:
mynet110:
ipv4_address: 172.18.0.4
volumes:
- /www/mysql/conf:/etc/mysql/conf.d
- /www/mysql/data:/var/lib/mysql
ports:
- "3307:3306"
environment:
- MYSQL_ROOT_PASSWORD=0000
command:
--max_connections=1000
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--default-authentication-plugin=mysql_native_password
5.2.语法没有错误后启动容器服务
[root@localhost lnmp]# docker-compose up -d
[+] Running 10/10
✔ fpm 9 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 48.6s
✔ a2abf6c4d29d Pull complete 9.9s
✔ c5608244554d Pull complete 0.4s
✔ 2d07066487a0 Pull complete 1.0s
✔ 40f5e6ee20ce Pull complete 8.7s
✔ 718b027f9905 Pull complete 9.1s
✔ 3bf01f3e893c Pull complete 19.3s
✔ af85a153f85f Pull complete 10.5s
✔ e052a88c20f6 Pull complete 11.3s
[+] Running 4/4
✔ Network lnmp_mynet110 Created 0.2s
✔ Container mysql Started 0.5s
✔ Container fpm Started 0.5s
✔ Container nginx Started 0.5s
[root@localhost lnmp]#
5.3.查看容器运行情况
6.使用docker-compose部署redis服务
7.使用docker-compose构建halo项目
3.1.任意位置创建halo目录
[root@localhost ~]# mkdir ~/halo && cd ~/halo
3.2.创建 docker-compose.yaml
文件
#采用halo+mysql方式
[root@localhost halo]# vim docker-compose.yaml
version: "3"
services:
halo:
image: halohub/halo:2.8
container_name: halo
restart: on-failure:3
depends_on:
halodb:
condition: service_healthy
networks:
halo_network:
volumes:
- ./:/root/.halo2
ports:
- "8090:8090"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]
interval: 30s
timeout: 5s
retries: 5
start_period: 30s
command:
- --spring.r2dbc.url=r2dbc:pool:mysql://halodb:3306/halo
- --spring.r2dbc.username=root
# MySQL 的密码,请保证与下方 MYSQL_ROOT_PASSWORD 的变量值一致。
- --spring.r2dbc.password=0000
- --spring.sql.init.platform=mysql
# 外部访问地址,请根据实际需要修改
- --halo.external-url=http://localhost:8090/
# 初始化的超级管理员用户名
- --halo.security.initializer.superadminusername=admin
# 初始化的超级管理员密码
- --halo.security.initializer.superadminpassword=660910../
halodb:
image: mysql:8.0.31
container_name: halodb
restart: on-failure:3
networks:
halo_network:
command:
- --default-authentication-plugin=mysql_native_password
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_general_ci
- --explicit_defaults_for_timestamp=true
volumes:
- ./mysql:/var/lib/mysql
- ./mysqlBackup:/data/mysqlBackup
ports:
- "3306:3306"
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"]
interval: 3s
retries: 5
start_period: 30s
environment:
# 请修改此密码,并对应修改上方 Halo 服务的 SPRING_R2DBC_PASSWORD 变量值
- MYSQL_ROOT_PASSWORD=0000
- MYSQL_DATABASE=halo
networks:
halo_network:
3.3.启动halo服务
[root@localhost halo]# docker-compose up -d
[+] Running 23/23
✔ halo 10 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 348.8s
✔ 9d19ee268e0d Pull complete 15.0s
✔ f2b566cb887b Pull complete 11.4s
✔ 2eb275343c46 Pull complete 325.8s
✔ d6398d1ffae6 Pull complete 12.7s
✔ c6cc8e703200 Pull complete 14.1s
✔ ae6a9433814d Pull complete 40.5s
✔ 2c46e2604ceb Pull complete 17.0s
✔ 4f4fb700ef54 Pull complete 18.4s
✔ 8d293f9b2fa4 Pull complete 21.6s
✔ 0e19c09dfee6 Pull complete 23.0s
✔ halodb 11 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 192.6s
✔ 0ed027b72ddc Pull complete 141.3s
✔ 0296159747f1 Pull complete 25.0s
✔ 3d2f9b664bd3 Pull complete 27.0s
✔ df6519f81c26 Pull complete 29.6s
✔ 36bb5e56d458 Pull complete 31.1s
✔ 054e8fde88d0 Pull complete 34.1s
✔ f2b494c50c7f Pull complete 46.1s
✔ 132bc0d471b8 Pull complete 47.4s
✔ 135ec7033a05 Pull complete 61.3s
✔ 5961f0272472 Pull complete 62.9s
✔ 75b5f7a3d3a4 Pull complete 64.2s
[+] Running 3/3
✔ Network halo_halo_network Created 0.2s
✔ Container halodb Healthy 0.2s
✔ Container halo Started 0.0s
3.4.测试访问
3.5.安装nginx并配置nginx反向代理
#提前拷贝一份nginx.conf核心配置文件至相关目录下
[root@localhost halo]# docker run --name nginx -it -d -p 80:80 \
> -v /usr/local/nginx/html:/usr/local/nginx/html \
> -v /usr/local/nginx/conf.d:/usr/local/nginx/conf.d \
> -v /usr/local/nginx/logs:/usr/local/nginx/logs \
> -v /usr/local/nginx/conf/nginx.conf:/usr/local/nginx/conf/nginx.conf \
> --network halo_halo_network bcf638382021
[root@localhost halo]# vim /usr/local/nginx/conf/nginx.conf
proxy_pass http://halo:8090;
测试
评论区