docker-compose用法

安装docker-compose

需要前置安装 docker

脚本安装

docker版本一般有推荐的最低建议docker-compose版本,自行搜索

下载地址: github.com/docker/comp...

以安装v2.40.3版本为例,如果想要安装其它版本,替换掉这个版本号就行

shell 复制代码
sudo curl -L "https://github.com/docker/compose/releases/download/v2.40.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

下载安装

自己手动下载系统对应的版本,然后授予可执行权限

如果下载比较慢,可以搜下网上有很多提供的github release镜像加速网站

shell 复制代码
# 在系统上执行如下命令,得到系统信息
echo $(uname -s)   # Linux
echo $(uname -m)   # x86_64

# 那么下载命令就行
curl -L "https://github.com/docker/compose/releases/download/v2.40.3/docker-compose-Linux-x86_64" -o ./docker-compose

# 然后授权可执行,并移动到对应目录
sudo chmod +x ./docker-compose
sudo mv ./docker-compose /usr/local/bin/

docker-compose常用命令

shell 复制代码
# 启动所有服务(后台运行)
docker-compose up -d

# 停止并删除容器、网络
docker-compose down

# 停止但不删除容器
docker-compose stop

# 启动已停止的容器
docker-compose start

# 重启所有服务
docker-compose restart

docker-compose.yml

文件结构概览

yaml 复制代码
version: '3.8'           # Compose 文件版本
services:                # 定义所有服务
  service1:              # 服务名称
    image: ...           # 指定镜像
    container_name: ...  # 容器名称
  service2:
    build: ...   # 指定Dockerfile
networks:        # 自定义网络

version

docker-compose v2.40.x 以上版本,已经不需要指定这个值了

指定本 yml 依从的 compose 哪个版本制定的

restart

重启策略

  • no 不重启
  • always 总是重启
  • on-failure 非正常退出,重启
  • unless-stopped

volumes

将主机的文件或目录挂载到容器里

yaml 复制代码
service:
  testapp:
    volumes:
      - ./mysql/data:/var/lib/mysql # [主机目录/文件]:[容器目录/文件]
      - ./mysql/my.cnf:/etc/my.cnf

ports

主机端口映射到容器端口

yaml 复制代码
service:
  testapp:
    ports:
      - "9848:9848" # [主机目录/文件]:[容器目录/文件]
      - "8848:8848"

build

  1. 作为Dockerfile路径信息配置
yaml 复制代码
services:
  testapp:
    build: ./dir  # 代表指定 ./dir/Dockerfile 文件
  1. 指定Dockerfile构建信息对象配置 指定构建镜像的Dockerfile信息
  • context:上下文路径
  • dockerfile:指定构建镜像的 Dockerfile 文件名。
  • args:添加构建参数,这是只能在构建过程中访问的环境变量。
  • labels:设置构建镜像的标签。
  • target:多层构建,可以指定构建哪一层。
yaml 复制代码
services:
  testapp:
    build:
      context: ./dir  # 指定上下文目录
      dockerfile: Dockerfile_test # 指定具体Dockerfile文件
      args:
        buiildno: 1
      labels:
        - "mode1"
      target: prod

command

覆盖容器默认命令

yaml 复制代码
command: ["redis-server", "/usr/local/etc/redis.conf"]

depends_on

服务启动/停止依赖关系

yaml 复制代码
services:
  mysql:
    image: mysql:5.7 # 从容器构建

  redis:
    image: redis:5.0
    depends_on:
      - mysql57

注意:redis 服务不会等待 mysql 完全启动 之后才启动,只是启动顺序是先启动redis,然后启动mysql

environment

添加环境变量

yaml 复制代码
environment:
  - MYSQL_ROOT_PASSWORD=mysql123
  - TZ=Asia/Shanghai

env_file

从文件添加环境变量,可以是一个值,也可以是多个值

yaml 复制代码
# 一个值
env_file: 1.env

# 多个值
env_file:
  - 1.env
  - 2.env

networks

配置容器连接的网络

yaml 复制代码
services:
  testapp:
    images: nacos/nacos-server:v2.5.2
    container_name: nacos
    restart: always
    networks:
      dev_net: # 指定顶层的networks下的dev_net网络
        aliases:
          - testapp # 默认值container_name,同一网络上的其他容器可以使用服务名称或此别名来连接到对应容器的服务
networks: # 定义网络
  dev_net: # 网络名称
    # driver: bridge # 桥接模式,会创建一张桥接虚拟网卡,网卡名称会加上docker-compose的目录名作为前缀,防止冲突
    external: true # 查找已经存在的网卡,而不是创建,不会用目录名作为前缀
  • 示例
yaml 复制代码
version: '3'

services:
  mysql57:
    image: mysql:5.7 # 从容器构建
    container_name: mysql57
    restart: always # no | always | on-failure | unless-stopped
    environment: # 容器环境变量
      - MYSQL_ROOT_PASSWORD=mysql123
      - TZ=Asia/Shanghai
    volumes: # 文件/文件夹映射 [主机文件/文件夹]:[容器文件/文件夹]
      - ./mysql/data:/var/lib/mysql
      - ./mysql/my.cnf:/etc/my.cnf
    ports: # 端口映射 [主机端口]:[容器端口]
      - 3306:3306
    networks:
      dev_net: # 关联到网络
        aliases: # 网络别名,默认使用容器名,可以起一个别名,方便使用
          - mysql57

  redis:
    image: redis:5.0
    container_name: redis5
    restart: always
    volumes:
      - ./redis/conf/redis.conf:/usr/local/etc/redis.conf
      - ./redis/data:/data
    ports:
      - 6379:6379
    # depends_on: # 依赖关系(控制启动顺序)
      # - mysql57
    networks:
      dev_net:
        aliases:
          - redis
    command: ["redis-server", "/usr/local/etc/redis.conf"] # 容器启动时执行的命令

networks: # 定义网络
  dev_net: # 网络名称
    driver: bridge # 桥接模式,会创建一张桥接虚拟网卡,网卡名称会加上docker-compose的目录名作为前缀,防止冲突
    # external: true # 查找已经存在的网卡,而不是创建,不会用目录名作为前缀
相关推荐
骂我的人都死了36 分钟前
DevOps架构部署
运维·ubuntu·docker·k8s·github·devops·python3.11
AL31741 分钟前
模拟实现NetDevOps全生命周期自动化网络运维
运维·docker·centos·ensp·netmiko
Alaaaaaaan44 分钟前
[DevOps]使用github-action工具部署docker容器(实现提交代码一键推送部署到服务器)
服务器·前端·docker·容器·github
70asunflower1 小时前
Docker exec 命令完全解析
linux·ubuntu·docker
玉梅小洋3 小时前
Docker 镜像在节点间的高效拷贝的方案
运维·docker·容器
firstacui3 小时前
搭建harbor仓库
linux·docker
好好沉淀4 小时前
Docker 部署 Kibana:查 ES 版本 + 版本匹配 + 中文界面
linux·docker
啦啦啦小石头4 小时前
CVAT使用记录
docker·ai
BLUcoding4 小时前
使用 Docker Compose 安装常用中间件
docker·中间件·容器