1.docker-compose
1.1.什么是docker-compose
Docker Compose
是一个用于定义和运行多容器 Docker 应用程序的工具。
它使用一个 YAML
格式的配置文件(通常称为 docker-compose.yml
)来配置应用程序的服务。通过这个配置文件,可以指定每个服务使用的 Docker 镜像、环境变量、端口映射、数据卷挂载等信息,然后使用一个命令来创建并启动所有服务。
主要有三个步骤:
①使用 Dockerfile 定义应用程序的环境和依赖。
②使用 docker-compose.yml 定义构成应用程序的服务和它们之间的关系。
③使用 docker-compose up 命令来启动并运行整个应用程序。
使用 Docker Compose
可以方便地一键启动、停止和管理整个应用程序的多个相关容器,简化了复杂应用的部署和管理过程,提高了开发和运维的效率。
以下是 Docker Compose 的一些主要特点和用途:
- 单机多容器应用定义:Docker Compose 允许您在单个 YAML 文件中定义一个多容器应用的所有服务。
- 环境隔离:通过定义不同的环境配置,可以在隔离的环境中运行相同的服务。
- 简化启动过程:通过一条命令即可启动所有服务,不需要逐一启动每个容器。
- 服务管理:可以启动、停止、重建服务,甚至可以查看运行服务的日志。
- 依赖管理:Docker Compose 会根据配置文件中的依赖关系,按顺序启动服务。
- 环境变量管理:可以在配置文件中设置环境变量,便于在不同环境中配置应用程序。
- 卷管理:可以定义用于持久化数据的卷,这些卷可以在服务之间共享。
**docker compose官网地址:**https://github.com/docker/compose/releases?page=3
1.2.安装
对于 Linux 系统
1.2.1.安装 Docker
确保你的系统上已经安装了 Docker。可以通过以下命令来安装 Docker:
对于 Ubuntu/Debian
系统:
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
对于 CentOS
系统:
#安装 `yum-utils` 软件包(提供`yum-config-manager` 实用程序)并设置**稳定的**存储库。
sudo yum install -y yum-utils
# sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 使用国内镜像 , 国外连接不上
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装最新版本
sudo yum install docker-ce docker-ce-cli containerd.io
启动 docker
docker version # 查看安装版本
systemctl start docker # 启动
systemctl enable docker # 设置开机启动
1.2.2.远程仓库连接不上
error pulling image configuration: download failed after attempts=6: dial tcp 74.86.17.48:443: connect: connection refused
这个错误通常意味着Docker在尝试从远程仓库拉取镜像配置时遇到了网络问题。
可以通过设置国内镜像来解决
1.创建/etc/docker目录
sudo mkdir -p /etc/docker
2.创建docker镜像配置文件
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://ox288s4f.mirror.aliyuncs.com",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://mirror.ccs.tencentyun.com"
]
}
EOF
3.重启
sudo systemctl daemon-reload
sudo systemctl restart docker
或者
sudo service docker restart
1.2.3.下载 Docker Compose
安装docker-compose ( 现在上不去 )
**官网:**https://docs.docker.com/compose/install/standalone/#on-linux
1.下载 Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.18.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
请确保将 v2.18.0
替换为你想要的 Docker Compose 版本,
可以使用上面的命令在服务器下载docker-compose的安装文件,但是这种方式比较慢,需要一定的时间
可以访问下面的地址使用外网下载好上传到服务器上
https://github.com/docker/compose/releases/download/v2.18.0/docker-compose-linux-x86_64
下载好之后 上传到系统 /usr/local/bin 目录 并改名为 docker-compose
2.增加Docker Compose 可执行权限:
sudo chmod +x /usr/local/bin/docker-compose
3.验证:
使用测试并执行docker-compose命令
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose --version
2.配置文件
docker-compose.yml
是一个 YAML 文件,用于定义多容器 Docker 应用程序的配置。
2.1.基本结构
一个 docker-compose.yml
文件通常包含以下部分:
- 版本(version):指定 Compose 文件的格式版本。这是必须的,因为它告诉 Compose 使用哪个版本的 API 来解析文件,因为不同版本的 Compose 支持不同的特性和选项。
- 服务(services):定义应用程序中要运行的服务(容器)。这是文件中最关键的部分,因为它描述了每个容器的配置。
- 网络(networks)(可选):定义网络设置,允许容器之间进行通信。如果未指定,Compose 会自动创建一个默认网络, 可以配置如网络类型(bridge、overlay 等)和网络名称。
- 卷(volumes)(可选):定义卷设置,用于将数据持久化到宿主机或跨容器共享数据。
- 配置( configs )(可选,自 3.3 版本起可用):定义配置文件,这些文件可以在多个服务之间共享。
- 机密( secrets )(可选,自 3.1 版本起可用):定义敏感数据,如密码或证书,这些数据在运行时会被注入到服务中。
2.2.文件结构示例
version: '3' # 指定 Compose 文件格式版本
services:
web: # 定义一个名为 web 的服务
image: nginx:latest # 使用 nginx:latest 镜像
ports:
- "80:80" # 将容器内的 80 端口映射到宿主机的 80 端口
volumes:
- ./web:/usr/share/nginx/html # 将当前目录下的 web 文件夹挂载到容器的 /usr/share/nginx/html
networks:
- my-network # 将服务连接到 my-network 网络
db: # 定义一个名为 db 的服务
image: postgres:latest # 使用 postgres:latest 镜像
environment:
POSTGRES_DB: mydb # 设置环境变量,定义数据库名
POSTGRES_USER: user
POSTGRES_PASSWORD: example
volumes:
- db-data:/var/lib/postgresql/data # 将 db-data 卷挂载到容器内数据存储位置
networks:
- my-network
networks:
my-network: # 定义一个名为 my-network 的网络
volumes:
db-data: # 定义一个名为 db-data 的卷
2.3.版本(version)
指定 Compose 文件的版本号,不同版本的 Docker 可能支持不同的 Compose 文件格式版本。这有助于确保兼容性。
version: '3'
Version 1
:此版本是最早的Docker Compose版本,使用YAML v1语法。它提供了最基本的功能,适用于简单的应用场景。
Version 2
:此版本引入了一些新功能,如服务(service)和网络(network),并使用YAML v2语法。它支持容器的扩展性、网络连接和卷挂载等特性。
Version 3
:这是当前广泛使用的版本,它引入了更多功能和选项。它支持服务发现、密钥管理、配置文件和扩展性等特性。此版本可以通过Docker Swarm进行部署。
除了上述常见的版本之外,还有一些其他的版本,如Version 2.1、Version 2.2、Version 3.1等,它们在常规版本的基础上添加了一些额外的功能和选项。
2.4.服务(services)
在 services
部分下,可以定义多个服务,每个服务都有自己的配置。以下是服务配置中常用的选项:
2.4.0.service-name服务名
service-name : 每个服务都有一个唯一的名称,用于在 Compose 中引用。
services:
mysql:
2.4.1.image 镜像
image:指定容器使用的镜像。如果镜像不存在,Compose 会尝试从远程仓库拉取。
image: mysql:8.0.31
2.4.9.container_name容器名称
container_name: 为容器指定一个名称。
container_name: mysql
2.4.2.build 构建路径
build:指定 Dockerfile 的路径,用于构建自定义镜像。配置构建时使用的上下文路径。如果提供了 image
和 build
,则 build
优先。
build:
context: .
dockerfile: Dockerfile
2.4.3.ports 映射端口
ports:映射容器端口到宿主机。
ports:
- "3307:3306"
2.4.4.volumes 挂载卷
volumes:挂载宿主机路径或命名卷到容器内。
volumes:
# 数据挂载
- /docker/mysql/data/:/var/lib/mysql/
# 配置挂载
- /docker/mysql/conf/:/etc/mysql/conf.d/
2.4.5.environment设置环境变量
environment:设置容器内的环境变量。
environment:
# 时区上海
TZ: Asia/Shanghai
# root 密码
MYSQL_ROOT_PASSWORD: xxxxxx
# 初始化数据库(后续的初始化sql会在这个库执行)
MYSQL_DATABASE: db_name
2.4.5.networks 网络
networks:将容器加入指定网络。
networks:
- front_net
2.4.6.depends_on依赖
depends_on:定义服务之间的依赖关系,确保依赖的服务先启动。
depends_on:
- db
- redis
2.4.7.command指定
command:覆盖容器启动时默认执行的命令。
command:
# 将mysql8.0默认密码策略 修改为 原先 策略 (mysql8.0对其默认策略做了更改 会导致密码无法匹配)
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
2.4.8.restart重启策略
restart: 定义容器退出时的重启策略。
restart: always
2.4.10.entrypoint入口点
entrypoint: 覆盖容器的入口点。
entrypoint: ["sh", "-c"]
2.4.11.healthcheck健康检查
healthcheck: 定义健康检查命令和参数。
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3
2.4.12.元数据
labels: 为容器添加元数据。
labels:
com.example.description: "This service is a web application"
privileged: true
network_mode: "host"
2.5.网络(networks)
在 networks
部分中,可以定义应用的网络。这些网络在 services
部分被引用。网络配置可以指定驱动类型和其他网络选项。
-
driver:指定网络驱动程序,如
bridge
(默认)或host
。 -
ipam:配置 IP 地址分配策略。
networks:
default:
ipam:
config:
- subnet: 172.18.0.0/16
2.6.卷(volumes)
在 volumes
部分中,可以定义或命名卷,这些卷可以在不同的服务之间共享数据。
- driver:指定卷驱动程序,如
local
(默认)。 - driver_opts:设置卷驱动程序的选项。
volumes:
data:
driver: local
2.7.configs 配置文件
configs : 引用配置文件
configs:
- my_config
2.8.secrets 机密
secrets: 引用 Docker secrets。
secrets:
- my_secret
3.常用指令
3.1. 启动和停止服务
-
docker-compose up:启动所有服务。可以添加
-d
参数在后台运行。 -
docker-compose start:启动已经存在的服务容器。
-
docker-compose stop:停止正在运行的容器,可以通过
docker-compose start
再次启动。停止并重新启动服务:-
docker-compose stop && docker-compose start
-
-
docker-compose restart:重启项目中的服务。
-
docker-compose kill: 强制终止容器。这个命令用于立即停止容器的运行,通常在正常关闭命令无效时使用。
3.2. 构建和重构服务
- docker-compose build:构建(或重新构建)项目中的服务容器。如果服务镜像不存在,则构建镜像并启动服务。
- docker-compose up --force-recreate:强制重新创建容器并启动服务。
3.3. 查看状态和信息
- docker-compose ps:列出项目中所有的容器。
- docker-compose logs:查看服务容器的输出日志。可以通过
-f
参数跟踪日志输出。 - docker-compose config:验证
docker-compose.yml
文件配置,当配置正确时,不输出任何内容,当文件配置错误时,输出错误信息。
3.4. 操作容器镜像
- docker-compose down:停止和删除容器、网络、卷、镜像(可选)。可以通过
--rmi
和--volumes
选项删除镜像和卷。 - docker-compose rm:删除所有(停止状态的)服务容器。可以使用
-f
或--force
参数强制删除非停止状态的容器。 - docker-compose pull : 拉取服务依赖的镜像。
- docker-compose push : 推送服务的镜像。
- docker-compose top : 显示容器内的进程列表。
3.5. 扩容缩容
-
docker-compose scale:设置指定服务运行的容器个数,通过
service=num
的参数来设置数量。docker-compose up --scale [SERVICE]=NUM
3.6.执行指令
-
docker-compose exec:在指定服务容器上执行一个命令。例如,
docker-compose exec nginx bash
可以登录到nginx容器中。docker-compose exec [service_name] [command]
进入容器内部:
docker-compose exec [service_name] /bin/sh
-
docker-compose run:在指定服务上执行一次性命令。这个命令会启动一个新的容器来执行指定的命令,然后停止容器。
3.7. 其他常用指令
-
docker-compose pause:暂停一个或多个服务容器。
-
docker-compose unpause:恢复一个或多个服务容器。
-
docker-compose help : 显示命令帮助信息。
-
docker-compose version : 显示 Docker Compose 的版本信息。
-
docker-compose plugin : 管理 Docker Compose 插件。
-
docker-compose inspect : 查看服务的详细信息
-
docker-compose create network : 创建网络
3.8.注意事项
- 所有上述命令(除非特别说明)都需要在包含
docker-compose.yml
文件的目录下执行。 - 可以通过
-f
或--file
选项指定Compose模板文件,如果文件名不是docker-compose.yml
。 - 使用Docker Compose时,请确保已经安装了Docker Compose,并且Docker服务正在运行。
- 使用命令时,可以通过添加
--help
参数来获取每个命令的详细帮助信息。