DockerCompose
提供的,站在一个项目
角度,管理和编排一定数量的容器。
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它使用 YAML 文件来定义应用程序的服务、网络和卷。使用 Docker Compose,您可以通过在单个文件中定义应用程序的期望状态,然后使用 docker-compose up
命令来启动和停止容器,轻松管理和扩展应用程序。
Docker Compose 的一些关键特性包括:
服务定义:您可以在 Docker Compose 文件中定义多个服务,每个服务都有自己的配置,例如镜像、端口、卷、环境变量等。
网络连接:Docker Compose 自动为应用程序创建一个网络,允许容器使用它们的服务名称相互通信。
卷管理:您可以在 Docker Compose 文件中定义卷,以在容器重新启动之间持久保存数据或在容器之间共享数据。
环境变量:Docker Compose 允许您为容器定义环境变量,以便轻松配置和定制应用程序。
扩展:使用 Docker Compose,您可以通过更改特定服务的副本数量轻松扩展应用程序。
总体而言,Docker Compose 简化了管理和运行多容器 Docker 应用程序的过程,对开发人员和系统管理员非常有价值。
总结
docker-compose.yml
文件
容器/Service服务
的信息:名字、端口、环境变量、启动顺序、数据卷映射、docker buildProject 项目
:一个web项目,其中包含多个容器。
Service 服务
:一个容器。
1. 安装扩展yum源
yum install -y epel-release
2. 安装docker-compose
yum install -y docker-compose
3. 验证docker-compose
[root@localhost ~]# docker-compose -v
docker-compose version 1.18.0, build 8dd22a9
准备一个项目cms相关容器:nginx、redis
(1) 创建目录,作为项目名
注意:空目录,不要放无关紧要其他文件。
(2) 在项目名目录中,创建docker-compose.yml
注意:文件名,固定,不要改。
(3) 编写资源(容器)清单:docker-compose.yml
# 第一步:先写版本
version: '3'
# 第二步:编写所有服务(容器)
services:
# nginx容器
nginx-1: # 容器名字: 项目名_容器名_x,例如:cms_nginx-1_?
image: nginx:1.21 # 使用的镜像:tag
ports: # 映射容器启动端口,相当于docker run -p
- 88:80
# redis容器
redis-1:
image: redis:5
ports:
- 6379:6379
(4) dockercompose管理服务(容器)
注意:必须在docker-compose.yml所在目录执行。
1. 启动
docker-compose up [-d]
2. 关闭
docker-compose down [-v]
3. 重启
docker-compose restart
4. 查看项目下的服务(容器)
docker-compose ps
说明:查看当前这个项目下的所有服务(容器)
(5) 版本参考
(1) image:
? 指定该服务(容器),用到的镜像名:tag
? 类似:docker run 后面的 镜像名:tag
(2) ports:
? 指定服务(容器),映射的端口
? 类似:docker run -p
(3) environment:
? 指定该服务(容器)的环境变量
? 类似:docker run -e MYSQL_ROOT_PASSWORD=xxxx
# 第一步:先写版本
version: '3'
# 第二步:编写所有服务(容器)
services:
mysql-1:
image: mysql:5.7
ports:
- 3306:3306
environment:
- MYSQL_ROOT_PASSWORD=admins
(4) env_file:
? 可以将环境变量的值全部存放在ENV文件中,通过env_file引用这个文件即可。
? 注意:通常放在当前docker-compose.yml 同级或者子目录中,例如:commons/mysql/ENV
。
# 第一步:先写版本
version: '3'
# 第二步:编写所有服务(容器)
services:
mysql-1:
image: mysql:5.7
ports:
- 3306:3306
# environment:
# - MYSQL_ROOT_PASSWORD=admins
env_file:
- ./ENV # 将环境变量写在一个文件中,这里引用即可。通常放在当前docker-compose.yml 同级或者子目录中。
(5) command:
? 可以在启动容器内部启动主进程,替换内部CMD启动命令。
? 类似:docker run … redis:5 redis-server --appendonly yes
# 第一步:先写版本
version: '3'
# 第二步:编写所有服务(容器)
services:
# nginx容器
nginx-1: # 容器名字: 项目名_容器名_x,例如:cms_nginx-1_?
image: nginx:1.21 # 使用的镜像:tag
ports: # 映射容器启动端口,相当于docker run -p
- 88:80
# redis容器
redis-1:
image: redis:5
ports:
- 6379:6379
command: redis-server --appendonly yes
(6) depends_on
? 表示服务启动,依赖了哪个服务,用来指定启动的先后顺序的。
? 注意:以后实际项目中,有数据的服务(mysql redis)先启动,没有数据例如(nginx tomcat)后启动。
(7) restart
? 指定重启策略,restart:always,默认容器随着docker引擎的启动而启动。
(8) volumes
? 指定服务的数据卷映射。
? 类似:docker run -v -v -v
? 注意:docker-compose指定的数据卷名字,不会自动创建。
# 第一步:先写版本
version: '3'
# 第二步:编写所有服务(容器)
services:
# redis容器
redis-1:
image: redis:5
ports:
- 6379:6379
command: redis-server --appendonly yes
volumes:
- redis_data:/data
# 数据卷
volumes:
redis_data: # 作用:创建数据卷,相当于docker volume create 作用。
(9) build
? 作用指定该服务(容器)对应的镜像,通过dockerfile来创建。自动执行创建过程。
? 类似:构建镜像时候使用docker build -t 镜像名:tag -f docker-file文件名
.
命令。
? 注意:docker-compose使用外部dockerfile,要放在当前目录下,或者子目录下。
# 第一步:先写版本
version: '3'
# 第二步:编写所有服务(容器)
services:
app-server:
build: # build替代image.
context: . #指定build的上下文,相当于docker build结尾的.
dockerfile: dockerfile-app #指定dockerfile文件名,相当docker build -f
ports:
- 8080:8080
# 第一步:先写版本
version: '3'
# 第二步:编写所有服务(容器)
services:
# nginx容器
nginx-1: # 容器名字: 项目名_容器名_x,例如:cms_nginx-1_?
image: nginx:1.21 # 使用的镜像:tag
ports: # 映射容器启动端口,相当于docker run -p
- 88:80
depends_on:
- redis-1
restart: always
# redis容器
redis-1:
image: redis:5
ports:
- 6379:6379
command: redis-server --appendonly yes
volumes:
- redis_data:/data
mysql-1:
image: mysql:5.7
ports:
- 3306:3306
# environment:
# - MYSQL_ROOT_PASSWORD=admins
env_file:
- ./ENV # 将环境变量写在一个文件中,这里引用即可。通常放在当前docker-compose.yml 同级或者子目录中。
app-server:
build: # build替代image.
context: . #指定build的上下文,相当于docker build结尾的.
dockerfile: dockerfile-app #指定dockerfile文件名,相当docker build -f
ports:
- 8080:8080
# 数据卷
volumes:
redis_data: # 作用:创建数据卷,相当于docker volume create 作用。
docker-compose [选项] [命令] --help
docker-compose [命令] --help
-f, --file FILE 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。
--verbose 输出更多调试信息。
1. 指定docker-compose.yml文件名
docker-compose -f docker-compose.yml文件名 up
# 说明:不执行-f,则默认使用docker-compose.yml这个名字
2. 指定项目名
docker-compose -p 自定义项目名 up
# 说明:如果不指定,则使用当前所在目录名作为项目名
3. 启动输出调试信息
docker-compose --verbose up
上线部署
1. 启动指定服务
docker-compose up [服务名]
2. 在后台运行服务容器,生产环境下使用。
docker-compose up -d
下线
1. 全局停止
docker-compose down -v
作用
命令
docker-compose exec mysql-1 bash
作用
命令
docker-compose ps
案例
1. 查看所有服务
[root@localhost his]# docker-compose ps
Name Command State Ports
------------------------------------------------------------------------------------------------------------
his_mysql-1_1 docker-entrypoint.sh mysqld Up 0.0.0.0:3307->3306/tcp,:::3307->3306/tcp, 33060/tcp
his_nginx-1_1 /docker-entrypoint.sh ngin ... Up 0.0.0.0:81->80/tcp,:::81->80/tcp
his_redis-1_1 docker-entrypoint.sh redis ... Up 0.0.0.0:6379->6379/tcp,:::6379->6379/tcp
2. 查看所有服务id
[root@localhost his]# docker-compose ps -q
ab57c820a6f62925e6204a25827402670a729df6a56669e43b7582ec7a330176
a978eab0a906f9a36ed5890fff0c880bf3c70e7e432b5d7c57dfe238b754f270
07d671c6292f48d8a6af1d187477dbe9bd0274b81bd961409aa20d04148cfbcd
作用
命令
docker-compose restart
作用
命令
docker-compose start 服务id
docker-compose stop 服务id
作用
命令
docker-compose rm 服务id
作用
命令
docker-compose top [服务id]
案例
1. 查看当前项目下所有容器的进程
[root@localhost his]# docker-compose top
his_mysql-1_1
UID PID PPID C STIME TTY TIME CMD
-------------------------------------------------------------
polkitd 91820 91781 0 08:45 ? 00:00:00 mysqld
his_nginx-1_1
UID PID PPID C STIME TTY TIME CMD
----------------------------------------------------------------------------------------------
root 91734 91687 0 08:45 ? 00:00:00 nginx: master process nginx -g daemon off;
101 91889 91734 0 08:45 ? 00:00:00 nginx: worker process
101 91890 91734 0 08:45 ? 00:00:00 nginx: worker process
his_redis-1_1
UID PID PPID C STIME TTY TIME CMD
--------------------------------------------------------------------------
polkitd 91741 91706 0 08:45 ? 00:00:00 redis-server *:6379
2. 查看某个服务容器下的进程
root@localhost his]# docker-compose top mysql-1
his_mysql-1_1
UID PID PPID C STIME TTY TIME CMD
-------------------------------------------------------------
polkitd 91820 91781 4 08:45 ? 00:00:00 mysqld
作用
命令
docker-compose logs [服务ID]
案例
1. 查看全局日志
docker-compose logs
2. 查看指定服务日志
docker-compose logs mysql-1
作用
命令
dockerc-compose pause [服务id]
docker-compose unpause [服务id]
案例
1. 全局暂停恢复
[root@localhost his]# docker-compose pause
Pausing his_nginx-1_1 ... done
Pausing his_redis-1_1 ... done
Pausing his_mysql-1_1 ... done
[root@localhost his]# docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------------------------------------
his_mysql-1_1 docker-entrypoint.sh mysqld Paused 0.0.0.0:3307->3306/tcp,:::3307->3306/tcp, 33060/tcp
his_nginx-1_1 /docker-entrypoint.sh ngin ... Paused 0.0.0.0:81->80/tcp,:::81->80/tcp
his_redis-1_1 docker-entrypoint.sh redis ... Paused 0.0.0.0:6379->6379/tcp,:::6379->6379/tcp
[root@localhost his]# docker-compose unpause
Unpausing his_mysql-1_1 ... done
Unpausing his_redis-1_1 ... done
Unpausing his_nginx-1_1 ... done
[root@localhost his]# docker-compose ps
Name Command State Ports
------------------------------------------------------------------------------------------------------------
his_mysql-1_1 docker-entrypoint.sh mysqld Up 0.0.0.0:3307->3306/tcp,:::3307->3306/tcp, 33060/tcp
his_nginx-1_1 /docker-entrypoint.sh ngin ... Up 0.0.0.0:81->80/tcp,:::81->80/tcp
his_redis-1_1 docker-entrypoint.sh redis ... Up 0.0.0.0:6379->6379/tcp,:::6379->6379/tcp
2. 指定服务暂停和恢复
[root@localhost his]# docker-compose pause mysql-1
Pausing his_mysql-1_1 ... done
[root@localhost his]# docker-compose unpause mysql-1
Unpausing his_mysql-1_1 ... done
部署一个web项目:包含nginx、springboot的jar、mysql、redis等。
资源清单
version: '3'
services:
nginx-1:
image: nginx:1.21
ports:
- 80:80
depends_on:
- app-server
app-server:
build:
context: .
dockerfile: dockerfile-app
ports:
- 8989:8080
depends_on:
- mysql-1
mysql-1:
image: mysql:5.7
ports:
- 3307:3306
environment:
- MYSQL_ROOT_PASSWORD=admins
- MYSQL_DATABASE=cms
volumes:
- mysql_data:/var/lib/mysql
- mysql_conf:/etc/mysql/conf.d
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
volumes:
mysql_conf:
mysql_data: