docker-compose 的引入

在没有 docker-compose 之前,我们创建一个容器要怎么做呢?

  1. 首先我可以用 Dockerfile bulid 这个镜像,或者 直接从Docker hub上面拉取镜像
  2. docker run 一个容器,中间还要加一些复杂的参数。
  3. 我们运行了容器还要用命令还管理这些容器。

这些加入我们只有一个容器还好,能接受。但如果我们有一堆容器。这样管理是极其麻烦的。所以 Docker-compose 出现了。

docker-compose 是什么

它是一个批处理工具,我们可以通过配置一个 yml 文件去定义多个容器的应用,通过一条命令,就可以根据yml文件创建出制定的容器。

如何使用docker-compose

如果你看到本章,默认代表你有 docker 的基础知识

首先我们到官网拉取一段 compose 的示例代码。

version: '3'
services:
  web:
    build: .
    ports:
    - "5000:5000"
    volumes:
    - .:/code
    - logvolume01:/var/log
    links:
    - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

version 是 compose 版本信息,不同版本的compose 有差异,具体看官网,我们这里是 V3
services 一个 service 代表一个容器,镜像可以从 Docker hub 上面拉取,也可以从 Dockerfile 中构建

service 下面的配置和 docker run 命令启动的参数很相似。我
例如: services 中的一个 service

web:     
    build: .
    ports:
    - "5000:5000"
    volumes:
    - .:/code
    - logvolume01:/var/log
    links:
    - redis

web: 相当于 docker run --name web 是用户自定义的容器名称。

build 构建 Dockerfile 文件 ,我们上面的例子是构建当前目录下的 Dockerfile 文件 ,

image如果我们不需要Dockerfile文件的话,我们可以使用image: image-name 的方式来获取镜像
注意:如果我们同时写了 buildimages 的话,compose 会 build 一个容器,然后以 image 后面的名字的方式命名。

ports 端口号映射

volumes 物理卷映射

links 链接 我们这里是链接我们的 redis 容器。 如果我们设置了两个容器属于同一个 networks 我们可以不用写links,因为他们就在同一个网络

command 可以覆盖容器启动后默认执行的命令。 例如command: bundle exec thin -p 3000
depends_on 因为我们容器启动室友依赖关系的,所以我们例如我们启动上面的 Web 他就依赖一个redis, 所以应该是 redis 先启动,然后 在启动我们的 web 容器
我们可以

web:     
    build: .
    ports:
    - "5000:5000"
    volumes:
    - .:/code
    - logvolume01:/var/log
    links:
    - redis
    depends_on:
    - redis

这样的话,我们启动 web 时候会先启动,redis

entrypoint Dockerfile 中也有一个文件叫做在 Dockerfile 中有一个指令叫做 ENTRYPOINT 指令,用于指定接入点。
在 docker-compose.yml 中可以定义接入点,覆盖 Dockerfile 中的定义:

environment 和 Dockerfile 中的 env 类似,把一些变量信息保存在镜像和容器中,类似 docker run -e

volumes 挂在目录,映射目录,或者挂载物理卷。 * 劲量写 绝对路径

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐