基础使用
官方文档:https://docs.docker.com/compose/install/
基础使用
基础步骤
- 通过dockerfile定义应用程序的环境
- 通过
docker-compose.yml
自定意义应用的环境容器 - 最后执行
docker-compose up
运行所有容器
安装
安装内置版
yum install docker-compose-plugin -y
# 检查是否安装成功
docker compose version
安装独立版(不推荐,官方貌似放弃维护)
# 下载
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 给予执行权限
chmod +x /usr/local/bin/docker-compose
chmod a+rx /usr/local/bin/docker-compose
# 查看是否安装成功
docker-compose -h
docker-compose -v
卸载
sudo rm /usr/local/bin/docker-compose
常用指令
# 验证当前文件夹下的 "docker-compose.yml" 文件是否合法
docker-compose config
# 查看当前文件夹的执行配置
docker compose config
docker compose convert
# 启动一个yml文件
docker compose up
docker compose up -d # -d 后台运行容器
# 启动yml中的指定容器
docker compose run <servers名> env
# 查看指定服务的log
docer compose logs <服务名>
docer compose logs <服务名>
# 查看当前运行情况
docker compose ps
# 停止
docker compose stop
# 删除容器
docker compose down --volumes
环境变量
Compose配置环境变量的方式有很多种,一下根据
优先等级:
Compose file
在 docker-compose.yml 文件中直接设置的值优先级是最高的。
Shell environment variables
当前 shell 中 export 的环境变量值
Environment file
环境变量文件
.env
、env_file:xxx
中定义的值。Dockerfile
Variable is not defined
配置文件
默认情况下
顶层变量
变量名 | 说明 | 备注 |
---|---|---|
version | 指定本 yml 依从的 compose 哪个版本制定的 | |
service | ||
networks | 网络配置 | |
volumes |
networks
默认情况下docker-compose会建立一个默认的网络,名称为docker-compose.yml所在目录名称小写形式加上“_default”,我们的TFLinux环境就是“tflinux_default”。
这个默认网络会对所有services下面的服务生效,所以services下面的各个服务之间才能够通过service名称互相访问。
子级变量 | 说明 | 备注 |
---|---|---|
aliases | ||
restart | ||
secrets |
networks:
restart: always
default:
driver: bridge
<自定义一个网络>
driver: bridge
固定ip地址设置
networks:
loki:
ipam:
driver: default
config:
- subnet: "172.22.0.0/24"
gateway: 172.22.0.1
services:
web:
image: beyond147896/resty:latest
ports:
- "80:80"
- "443:443"
networks:
loki:
ipv4_address: 172.22.0.2
redis:
image: redis:latest
ports:
- "6379:6379"
networks:
loki:
ipv4_address: 172.22.0.99
aliases
同一网络上的其他容器可以使用服务名称或此别名来连接到对应容器的服务。
restart
重启时的应对策略
- no:是默认的重启策略,在任何情况下都不会重启容器。
- always:容器总是重新启动。
- on-failure:在容器非正常退出时(退出状态非0),才会重启容器。
- unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
networks:
restart: always
注:swarm 集群模式,请改用 restart_policy。
secrets
存储敏感数据,例如密码:
version: "3.1"
services:
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/my_secret
secrets:
- my_secret
secrets:
my_secret:
file: ./my_secret.txt
service
子级变量 | 说明 | 备注 |
---|---|---|
build | 宿主机的工作目录,构建镜像时的上下文路径 | 构建时默认读取build 指定目录下的Dockfile 文件构建 |
ports | 端口配置 | 设置端口的映射关系 |
volumes | ||
container_name | 指定容器名称 | |
command | 覆盖镜像的CMD命令 | |
cgroup_parent | 为容器指定父 cgroup 组,意味着将继承该组的资源限制 | |
depends_on | 依赖关系,根据依赖关系来顺序启动容器 | |
expose | 暴露端口,但不映射到宿主机,只被内部连接的服务访问。 |
build
# 字符串形式:仅指定路径
# 这种形式下,默认使用 ./dir/Dockerfile
services:
web:
build: ./dir
# 对象形式:
services:
web:
build:
context: ./dir # 上下文路径
dockerfile: Dockerfile-alternate # 指定Dockerfile
args: # 添加构建参数,这是只能在构建过程中访问的环境变量。
buildno: 1
labels: # 设置构建镜像的标签。
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
target: prod # 多层构建,可以指定构建哪一层。
command: ["python", "main.py"]
version
volumes
volumes是用来定义挂载目录的
volumes:
dir-psd-tools-app:
配置文件
Docker-Compose.yml
# 基础语法
version: "3.9"
service:
{容器1}:
command:[] # 定义容器的启动命令,相当于覆盖 Dockerfile的CMD
build: . # Dockerfile的目录
prots: # 镜像暴露的端口 宿主端口:镜像端口
- "5000:5000"
expose: # 暴露端口,但不镜像映射
- "5000"
image:{容器1镜像} # 关联的镜像
profiles:
- debug
depends_on: # 依赖 容器2和容器3启动后才会启动容器1
- 容器2
- 容器n
- 容器3
{容器2}:
{容器n}:
version: "3.9"
services:
web:
build: ./webDockfileDir # Dockerfile的目录
ports:
- "5000:5000" # 镜像暴露的端口 宿主端口:镜像端口
redis: # 镜像在 docker内网的实例名称
build: ./redisDockfileDir
image: "redis:alpine" # 指定 docker images内的镜像
容器空运行
version: "3.9"
command: /bin/bash -c "while true; do echo hello world; sleep 10; done"