docker-compose的用法

半兽人 发表于: 2018-10-31   最后更新时间: 2025-05-06 14:44:49  
{{totalSubscript}} 订阅, 6,391 游览

docker-compose是什么?

假如,你有一个java镜像,一个mysql镜像,一个nginx镜像。如果没有docker-compose,那么每次启动的时候,你需要敲各个容器的启动参数,环境变量,容器命名,指定不同容器的链接参数等等一系列的操作,相当繁琐。而用了docker-composer之后,你就可以把这些命令一次性写在docker-composer.yml文件中,以后每次启动这一整个环境(含3个容器)的时候,你只要敲一个docker-composer up命令就ok了。

先简单理解 docker 的使用过程,它分为镜像构建与容器启动。

  1. 镜像构建:即创建一个镜像,它包含安装运行所需的环境、程序代码等。这个创建过程就是使用 dockerfile 来完成的。

  2. 容器启动:容器最终运行起来是通过拉取构建好的镜像,通过一系列运行指令(如端口映射、外部数据挂载、环境变量等)来启动服务的。针对单个容器,这可以通过 docker run 来运行。

而如果涉及多个容器的运行(如服务编排)就可以通过docker-compose来实现,它可以轻松的将多个容器作为 service 来运行(当然也可仅运行其中的某个),并且提供了 scale (服务扩容) 的功能。

yaml 文件级

Docker Compose 的 YAML 文件包含 4 个一级 key:

  • version
  • services
  • networks
  • volumes

version 是必须指定的,而且总是位于文件的第一行。它定义了 Compose 文件格式的版本。注意,version 并非定义 Docker Compose 或 Docker 引擎的版本号。

services 用于定义不同的应用服务,Docker Compose 会将每个服务部署在各自的容器中。

networks 用于指引 Docker 创建新的网络。默认情况下,Docker Compose 会创建 bridge 网络。 这是一种单主机网络,只能够实现同一主机上容器的连接。当然,也可以使用 driver 属性来指定不 同的网络类型。

volumes 用于指引 Docker 来创建新的卷。

配置文件

version: '3'
services:
  mysql:
    build:
      context: ./mysql
    environment:
      MYSQL_ROOT_PASSWORD: admin
    restart: always
    container_name: mysql
    volumes:
    - /data/edu-bom/mysql/test:/var/lib/mysql
    image: mysql/mysql:5.7
    ports:
      - 3306:3306
    networks:
      net:
  eureka:
    build:
      context: ./edu-eureka-boot
    restart: always
    ports:
      - 8761:8761
    container_name: edu-eureka-boot
    hostname: edu-eureka-boot
    image: edu/edu-eureka-boot:1.0
    depends_on:
      - mysql
    networks:
      net:
networks:
    net:
volumes:
    vol:

假设你的 docker-compose.yml 文件在项目根目录下,目录结构大概长这样:

your-project/
├── docker-compose.yml
└── mysql/
    ├── Dockerfile
    ├── my.cnf                # 可选:MySQL 配置文件
    └── init.sql              # 可选:初始化 SQL 脚本

mysql 服务

mysql:
  build:
    context: ./mysql
  • Docker 会从 ./mysql 目录构建一个自定义 MySQL 镜像。
  • 构建时会查找 ./mysql/Dockerfile 文件。
image: mysql/mysql:5.7
  • 构建完成后,这个本地镜像会被打上标签为 mysql/mysql:5.7
  • 注意:不是拉官方镜像,而是你本地构建的镜像起了个“官方名字”,可能导致误解
 environment:
   MYSQL_ROOT_PASSWORD: admin
  • 设置 MySQL root 用户密码。
volumes:
  - /data/edu-bom/mysql/test:/var/lib/mysql
  • 把宿主机的 /data/edu-bom/mysql/test 挂载到容器的 /var/lib/mysql,用于持久化数据库数据。
ports:
  - 3306:3306
  • 将容器的 3306 端口映射到宿主机同一端口。
networks:
  net:
  • 加入自定义的 net 网络,与 eureka 服务互通。

eureka 服务

eureka:
  build:
    context: ./edu-eureka-boot
  image: edu/edu-eureka-boot:1.0
  • 同样是从本地 ./edu-eureka-boot 目录构建镜像;
  • 构建后命名为 edu/edu-eureka-boot:1.0,也是本地镜像,不会拉远程版本。
ports:
  - 8761:8761
  • Eureka 服务暴露端口 8761。
depends_on:
  - mysql
  • 指定在启动顺序上,eureka 依赖 mysql,Docker Compose 会确保 mysql 先启动。

networksvolumes

networks:
  net:
  • 定义了一个名为 net 的用户自定义网络,让服务之间可以通过名称互通。
volumes:
  vol:
  • 虽然声明了 vol,但目前没有被使用到,可以删掉或者后续扩展使用。

注意点:你这个配置中的镜像版本到底是什么?

mysql 服务

  • 不是官方的 mysql/mysql:5.7 镜像
  • 而是你从 ./mysql 构建出的自定义镜像,被你自己标记成了 mysql/mysql:5.7
  • 所以运行时用的是你本地构建的版本(内容由 ./mysql/Dockerfile 决定)!

eureka 服务

  • 同理,也是你从 ./edu-eureka-boot 构建出的镜像,标记为 edu/edu-eureka-boot:1.0
  • 并没有从 Docker Hub 拉取任何已有镜像。

推荐改法(避免混淆)

如果你想避免误认为用了官方镜像,可以改成这样:

mysql:
  build:
    context: ./mysql
  image: my-local-mysql:5.7

运行以及常见的docker-compose的命令

  • docker-compose up运行编写的命令
  • docker-compose run 命令允许你为你的应用程序运行一次性命令
  • docker-compose stop 运行完成后停止服务
  • docker-compose down --volumes 停掉所有一切,使用 down 命令完全移除容器。传递 —volumes 还可以删除容器使用过程中所使用的数据卷
更新于 2025-05-06

查看docker更多相关的文章或提一个关于docker的问题,也可以与我们一起分享文章