Docker教程-10-Docker Compose使用入门

Posted 孔子-说

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker教程-10-Docker Compose使用入门相关的知识,希望对你有一定的参考价值。

目录

1、了解Compose

1.1 Compose介绍

1.2 Compose和Docker兼容性

1.3 docker、dockerfile与docker-compose区别

2、安装compose(需先安装docker)

2.1 安装环境查看

2.2 安装compose

方式一:从github上下载docker-compose二进制文件安装

方式二:python-pip方式安装docker-compose

3、Compose快速入门

3.1 Compose 使用的三个步骤

3.2 Compose 入门范例

3.3 Compose容器分层

3.4 Docker Compose 常用命令

4、Docker-compose模板文件

4.1 Docker-compose模板文件简介

4.2 docker-compose.yml命令说明

1)image

2)build

3)context

4)dockerfile

5)args

6)commond

7)container_name

8)volumes

9)volumes_from

10)depends_on

11)PID

12)ports

13)restart

14)environment

15)expose

16)extra_hosts

17)dns

19)net

5、Compose模板文件实例

5.1 Docker-compose模板文件(docker-compose.yml)编写

5.2 启动应用

5.3 服务访问


参考: https://docs.docker.com/compose/overview/

1、了解Compose

1.1 Compose介绍

我们使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器。然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而知,使用 Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具(用来做docker 的多容器控制)。Docker-compose 是一个用来把 docker 自动化的东西。
有了 Docker-compose 你可以把所有繁复的 docker 操作全都一条命令,自动化的完成。

Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。通过一个配置文件(YML 文件)来管理多个Docker容器,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务,不再需要使用shell脚本来启动容器。 在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。

Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡。

Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API,就可以在其上利用Compose来进行编排管理。

1.2 Compose和Docker兼容性

Compose 文件格式有多个版本 - 1、2、2.x 和 3.x,下表显示哪些 Compose 文件版本支持特定的 Docker 版本。详情可参考Compose file versions and upgrading | Docker Documentation

compose文件格式版本docker版本
Compose specification19.03.0+
3.819.03.0+
3.718.06.0+
3.618.02.0+
3.517.12.0+
3.417.09.0+
3.317.06.0+
3.217.04.0+
3.11.13.1+
3.01.13.0+
2.317.06.0+
2.21.13.0+
2.11.12.0+
2.01.10.0+
1.01.9.1.+

Compose 文件格式有三个旧版本:

  • 版本 1(已弃用)。这是通过省略versionYAML 根的一个键来指定的。
  • 版本 2.x。这是通过 YAML 根目录下的version: '2'或version: '2.1'等条目指定的。
  • 版本 3.x,旨在在 Compose 和 Docker 引擎的群模式之间交叉兼容 。这是通过 YAML 根目录下的version: '3'或version: '3.1'等条目指定的。

Compose 文件格式的最新和推荐版本由Compose Specification定义。这种格式合并了 2.x 和 3.x 版本,由Compose 1.27.0+实现。

Docker版本变化说明:

Docker从1.13.x版本开始,版本分为企业版EE和社区版CE,版本号也改为按照时间线来发布,比如17.03就是2017年3月。

Docker的linux发行版的软件仓库从以前的https://apt.dockerproject.org和https://yum.dockerproject.org变更为目前的https://download.docker.com, 软件包名字改为docker-ce和docker-ee。

1.3 docker、dockerfile与docker-compose区别

docker

  • 和操作系统无关的一个沙箱容器,宿主机安装的什么操作系统和其本身无关,在它基础上可以制作各种系统类型的基础服务。

Dockerfile

  • 是把手工安装docer镜像的过程变成一个配置文件的方式运行,这样每次不需要一步步手敲命令去安装了,而只是需要一个配置文件运行既可生成一个镜像。

docker-compose

  • 提供了服务和项目的概念,这样一个服务可以配置多个项目,这个服务是多个项目的集合体,启动和关闭都相对一个一个项目的启动要方便很多。

2、安装compose(需先安装docker)

2.1 安装环境查看

uname -a :显示主机名、内核等系统信息
lsb_release -a :显示操作系统信息
docker -v :查看docker版本

要求:

  • 1)操作系统
  • 推荐使用Ubuntu、Debian和RHEL(Centos、Fedora等)
  • 在Windows和OS X中也可以使用,但要安装Docker Toolbox工具
  • 2)内核
  • 推荐3.8及以上的内核,虽然只是要求内核>=2.6,但是虽然一些老版本的也能运行,但运行结果会有很大的不同。
  • 内核必须支持并开启cgroup和命名空间功能

2.2 安装compose

在已安装了docker的 ubuntu 上安装最新的compose版本3,ubuntu上需要先安装docker。docker的安装可参考:Docker教程-1-学习及安装Docker 

两种docker安装方式:

方式一:从github上下载docker-compose二进制文件安装

1)下载最新版docker-compose

# 下载最新版的docker-compose文件 
sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

# 若是github访问太慢,可以用daocloud下载
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

2)添加可执行权限

sudo chmod +x /usr/local/bin/docker-compose

3)测试安装结果

docker-compose --version

4)Docker-compose卸载

若通过curl方式安装的Docker-compose需要卸载,可以使用如下命令卸载:

rm /usr/local/bin/docker-compose
  • 注意: 如果出现了"Permission denied"的错误,那可能是你没有适当的权限去删除docker-compose。你可以在前面加上sudo来删除。

方式二:python-pip方式安装docker-compose

1)安装python-pip

可参考如下命令:

# 更新索引
apt-get update

# 安装python-pip
apt-get install python-pip

# 如果python-pip无效,可安装python3-pip
apt-get install python3-pip

# pip3的升级
pip3 install --upgrade pip

# pip3的卸载
apt-get remove -purge python3-pip

# 查看默认python3版本
python3 -V

 2)安装docker-compose

sudo pip install docker-compose

3)测试安装结果

docker-compose --version

4)Docker-compose卸载

若通过pip安装的Docker-compose需要卸载,可以使用如下命令卸载:

pip uninstall docker-compose

3、Compose快速入门

3.1 Compose 使用的三个步骤

  1. 使用 Dockerfile 定义应用程序的环境。
  2. 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
  3. 最后,执行 docker-compose up 命令来启动并运行整个应用程序。

3.2 Compose 入门范例

1)打包项目,获得 jar 包 docker-demo-0.0.1-SNAPSHOT.jar

mvn clean package

2)在 jar 包所在路径创建 Dockerfile 文件,添加以下内容

FROM java:8
VOLUME /tmp
ADD docker-demo-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 9000
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]

3)在 jar 包所在路径创建文件 docker-compose.yml,添加以下内容

version: '3' # 表示该 Docker-Compose 文件使用的是 Version 3 file
services:
  docker-demo:  # 指定服务名称
    build: .  # 指定 Dockerfile 所在路径
    ports:    # 指定端口映射
      - "9000:8761"

4)在 docker-compose.yml 所在路径下执行该命令 Compose 就会自动构建镜像并使用镜像启动容器

docker-compose up
docker-compose up -d  // 后台启动并运行容器

5)访问 http://localhost:9000/hello 即可访问微服务接口

3.3 Compose容器分层

Docker Compose将所管理的容器分为三层,分别是工程(project)、服务(service)、容器(container)。

Docker Compose运行目录下的所有文件(docker-compose.yml、extends文件或环境变量文件)组成一个工程(默认为docker-compose.yml所在目录的目录名称)。一个工程可包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖,一个服务可包括多个容器实例。

3.4 Docker Compose 常用命令

Docker-compose命令格式

docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]

命令选项如下
-f --file FILE指定Compose模板文件,默认为docker-compose.yml
-p --project-name NAME 指定项目名称,默认使用当前所在目录为项目名
--verbose  输出更多调试信息
-v,-version 打印版本并退出
--log-level LEVEL 定义日志等级(DEBUG, INFO, WARNING, ERROR, CRITICAL)

1)ps:列出所有运行容器

docker-compose ps

命令格式:
docker-compose  ps [options] [SERVICE...]
列出项目中所有的容器

2)logs:查看服务日志输出

docker-compose logs

命令格式
docker-compose logs [options] [SERVICE...]
查看服务容器的输出。默认情况下,docker-compose将对不同的服务输出使用不同的颜色来区分。可以通过–no-color来关闭颜色。
docker-compose logs
查看服务容器的输出
-f 跟踪日志输出

3)port:打印绑定的公共端口

下面命令可以输出 eureka 服务 8761 端口所绑定的公共端口
docker-compose port eureka 8761

命令格式
docker-compose port [options] SERVICE PRIVATE_PORT
显示某个容器端口所映射的公共端口。
选项包括:
–protocol=proto,指定端口协议,TCP(默认值)或者UDP
–index=index,如果同意服务存在多个容器,指定命令对象容器的序号(默认为1)

4)build:构建或者重新构建服务

docker-compose build

命令格式
docker-compose build [options] [--build-arg key=val...] [SERVICE...]
构建(重新构建)项目中的服务容器。
选项包括:
–compress 通过gzip压缩构建上下环境
–force-rm 删除构建过程中的临时容器
–no-cache 构建镜像过程中不使用缓存
–pull 始终尝试通过拉取操作来获取更新版本的镜像
-m, –memory MEM为构建的容器设置内存大小
–build-arg key=val为服务设置build-time变量
服务容器一旦构建后,将会带上一个标记名。可以随时在项目目录下运行docker-compose build来重新构建服务

5)start:启动指定服务已存在的容器

docker-compose start eureka

命令格式
docker-compose start [SERVICE...]
docker-compose start
启动已经存在的服务容器。

6)restart:重新启动服务

命令格式
docker-compose restart [options] [SERVICE...]
重启项目中的服务。
选项包括:
-t, –timeout TIMEOUT,指定重启前停止容器的超时(默认为10秒)
docker-compose restart
重启项目中的服务

7)stop:停止已运行的服务的容器

docker-compose stop eureka

命令格式
docker-compose stop [options] [SERVICE...]
选项包括
-t, –timeout TIMEOUT 停止容器时候的超时(默认为10秒)
docker-compose stop
停止正在运行的容器,可以通过docker-compose start 再次启动

8)rm:删除指定服务的容器

docker-compose rm eureka

命令格式
docker-compose rm [options] [SERVICE...]
删除所有(停止状态的)服务容器。
选项包括:
–f, –force,强制直接删除,包括非停止状态的容器
-v,删除容器所挂载的数据卷
docker-compose rm
删除所有(停止状态的)服务容器。推荐先执行docker-compose stop命令来停止容器。

9)up:构建、启动容器

docker-compose up

命令格式
docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...]
选项包括:
-d 在后台运行服务容器
-no-color 不是有颜色来区分不同的服务的控制输出
-no-deps 不启动服务所链接的容器
--force-recreate 强制重新创建容器,不能与-no-recreate同时使用
–no-recreate 如果容器已经存在,则不重新创建,不能与–force-recreate同时使用
–no-build 不自动构建缺失的服务镜像
–build 在启动容器前构建服务镜像
–abort-on-container-exit 停止所有容器,如果任何一个容器被停止,不能与-d同时使用
-t, –timeout TIMEOUT 停止容器时候的超时(默认为10秒)
–remove-orphans 删除服务中没有在compose文件中定义的容器

10)kill:通过发送 SIGKILL 信号来停止指定服务的容器

docker-compose kill eureka

命令格式
docker-compose kill [options] [SERVICE...]
通过发送SIGKILL信号来强制停止服务容器。
支持通过-s参数来指定发送的信号,例如通过如下指令发送SIGINT信号:
docker-compose kill -s SIGINT

11)pull:下载服务镜像

docker-compose pull

命令格式
docker-compose pull [options] [SERVICE...]
拉取服务依赖的镜像。
选项包括:
–ignore-pull-failures,忽略拉取镜像过程中的错误
–parallel,多个镜像同时拉取
–quiet,拉取镜像过程中不打印进度信息
docker-compose pull
拉取服务依赖的镜像

12)push:推送服务镜像

docker-compose push [options] [SERVICE...]
推送服务的镜像。
选项包括:
–ignore-push-failures 忽略推送镜像过程中的错误

13)scale:设置指定服务运气容器的个数,以 service=num 形式指定

docker-compose scale user=3 movie=3

docker-compose scale web=3 db=2
设置指定服务运行的容器个数。通过service=num的参数来设置数量

14)run:在一个服务上执行一个命令

docker-compose run web bash

命令格式
docker-compose run [options] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]
在指定服务上执行一个命令。
docker-compose run ubuntu ping www.baidu.com
在指定容器上执行一个ping命令。

15)down:停止和删除容器、网络、卷、镜像

命令格式
docker-compose down [options]
停止和删除容器、网络、卷、镜像。
选项包括:
–rmi type,删除镜像,类型必须是:all,删除compose文件中定义的所有镜像;local,删除镜像名为空的镜像
-v, –volumes,删除已经在compose文件中定义的和匿名的附在容器上的数据卷
–remove-orphans,删除服务中没有在compose中定义的容器
docker-compose down
停用移除所有容器以及网络相关

16)pause:暂停一个服务容器

docker-compose pause [SERVICE...]
暂停一个服务容器

17)uppause:恢复处于暂停状态中的服务 

docker-compose unpause [SERVICE...]
恢复处于暂停状态中的服务。

18)create:为服务创建容器

docker-compose create [options] [SERVICE...]
为服务创建容器。
选项包括:
–force-recreate:重新创建容器,即使配置和镜像没有改变,不兼容–no-recreate参数
–no-recreate:如果容器已经存在,不需要重新创建,不兼容–force-recreate参数
–no-build:不创建镜像,即使缺失
–build:创建容器前  ,生成镜像

19)exec:登陆服务 

docker-compose exec [options] SERVICE COMMAND [ARGS...]
选项包括:
-d 分离模式,后台运行命令。
–privileged 获取特权。
–user USER 指定运行的用户。
-T 禁用分配TTY,默认docker-compose exec分配TTY。
–index=index,当一个服务拥有多个容器时,可通过该参数登陆到该服务下的任何服务,例如:docker-compose exec –index=1 web /bin/bash ,web服务中包含多个容器

20)docker-compose -h 查看帮助

4、Docker-compose模板文件

4.1 Docker-compose模板文件简介

Compose允许用户通过一个docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

Compose模板文件是一个定义服务、网络和卷的YAML文件。Compose模板文件默认路径是当前目录下的docker-compose.yml,可以使用.yml或.yaml作为文件扩展名。

与docker运行一样,默认情况下,Dockerfile中指定的选项(例如,CMD,EXPOSE,VOLUME,ENV)都被遵守,你不需要在docker-compose.yml中再次指定它们。

Docker-Compose标准模板文件应该包含version、services、networks 三大部分,最关键的是services和networks两个部分。

  • version:指定 docker-compose.yml 文件的写法格式
  • services:多个容器集合
  • build:配置构建时,Compose 会利用它自动构建镜像,该值可以是一个路径,也可以是一个对象,用于指定 Dockerfile 参数

docker-compose.yml

version: "3"
services:
 
  redis:
    image: redis:alpine
    ports:
      - "6379"
    networks:
      - frontend
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure
 
  db:
    image: postgres:9.4
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend
    deploy:
      placement:
        constraints: [node.role == manager]
 
  vote:
    image: dockersamples/examplevotingapp_vote:before
    ports:
      - 5000:80
    networks:
      - frontend
    depends_on:
      - redis
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
      restart_policy:
        condition: on-failure
 
  result:
    image: dockersamples/examplevotingapp_result:before
    ports:
      - 5001:80
    networks:
      - backend
    depends_on:
      - db
    deploy:
      replicas: 1
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure
 
  worker:
    image: dockersamples/examplevotingapp_worker
    networks:
      - frontend
      - backend
    deploy:
      mode: replicated
      replicas: 1
      labels: [APP=VOTING]
      restart_policy:
        condition: on-failure
        delay: 10s
        max_attempts: 3
        window: 120s
      placement:
        constraints: [node.role == manager]
 
  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    stop_grace_period: 1m30s
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]
 
networks:
  frontend:
  backend:
 
volumes:
  db-data:

4.2 docker-compose.yml命令说明

1)image

每一个定义在docker-compose.yml中的服务必须明确指定一个image或者build选项,这与docker run命令行中输入的是对应相同的,对于docker run,在Dockerfile文件中指定的选项(比如CMD、EXPOSE、VOLUME、ENV)是默认的,因此不必在docker-compose.yml中再指定一次

image 是指定服务的镜像名称或镜像ID,这个image ID可以是本地也可以是远程的,如果本地不存在,Compose会尝试去拉取镜像。如果你还指定了build,在这种情况下,它将使用指定的build选项构建它,并使用image指定的名字和标记对其进行标记。

image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd

2)build

服务除了可以基于指定的镜像,还可以基于一份Dockerfile,在使用up启动时执行构建任务,构建标签是build,可以指定Dockerfile所在文件夹的路径。Compose将会利用Dockerfile自动构建镜像,然后使用镜像启动服务容器。

build: /path/to/build/dir

# 也可以是相对路径,只要上下文确定就可以读取到Dockerfile。
build: ./dir

# 设定上下文根目录,然后以该目录为准指定Dockerfile。另外还可以指定args参数
build:
  context: ../
  dockerfile: path/of/Dockerfile
  args:
    buildno: 1

build是一个目录,如果要指定Dockerfile文件需要在build标签的子级标签中使用dockerfile标签指定。如果同时指定image和build两个标签,那么Compose会构建镜像并且把镜像命名为image值指定的名字。 

# 由./dir构建的名为webapp和标记为tag的镜像。
build: ./dir
image: webapp:tag

3)context

包含Dockerfile文件的目录路径,或者是git仓库的URL。 当提供的值是相对路径时,它被解释为相对于当前compose文件的位置。 该目录也是发送到Docker守护程序构建镜像的上下文。

build:
  context: ./dir

4)dockerfile

使用dockerfile文件来构建,必须指定构建路径。

build:
  context: .
  dockerfile: Dockerfile-alternate

5)args

添加构建镜像的参数,环境变量只能在构建过程中访问。 

首先,在Dockerfile中指定要使用的参数:

ARG buildno
ARG password
 
RUN echo "Build number: $buildno"
RUN script-requiring-password.sh "$password"

然后在args键下指定参数。 你可以传递映射或列表:

build:
  context: .
  args:
    buildno: 1
    password: secret
 
build:
  context: .
  args:
    - buildno=1
    - password=secret
  • 注意:YAML布尔值(true,false,yes,no,on,off)必须用引号括起来,以便解析器将它们解释为字符串。

6)commond

使用command可以覆盖容器启动后默认执行的命令。

command: bundle exec thin -p 3000

该命令也可以是一个类似于dockerfile的列表:

command: ["bundle", "exec", "thin", "-p", "3000"]

7)container_name

Compose的容器生成的默认名称格式是:<项目名称><服务名称><序号>,可以自定义项目名称、服务名称,但如果想自定义容器名称,可以使用标签指定:container_name: my-web-container;由于Docker容器名称必须是唯一的,因此如果指定了自定义名称,则无法将服务扩展到多个容器。 

container_name: my-web-container

8)volumes

挂载一个目录或者一个已存在的数据卷容器,可以直接使用 [HOST:CONTAINER]格式,或者使用[HOST:CONTAINER:ro]格式,后者对于容器来说,数据卷是只读的,可以有效保护宿主机的文件系统。Compose的数据卷指定路径可以是相对路径,使用 . 或者 .. 来指定相对目录。数据卷的格式可以是下面多种形式:

volumes:
  // 只是指定一个路径,Docker 会自动在创建一个数据卷(这个路径是容器内部的)。
  - /var/lib/mysql
  // 使用绝对路径挂载数据卷
  - /opt/data:/var/lib/mysql
  // 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器。
  - ./cache:/tmp/cache
  // 使用用户的相对路径(~/ 表示的目录是 /home/<用户目录>/ 或者 /root/)。
  - ~/configs:/etc/configs/:ro
  // 已经存在的命名的数据卷。
  - datavolume:/var/lib/mysql

如果要跨多个服务并重用挂载卷,请在顶级volumes关键字中命名挂在卷,但是并不强制,如下的示例亦有重用挂载卷的功能,但是不提倡。

version: "3"
 
services:
  web1:
    build: ./web/
    volumes:
      - ../code:/opt/web/code
  web2:
    build: ./web/
    volumes:
      - ../code:/opt/web/code

注意:通过顶级volumes定义一个挂载卷,并从每个服务的卷列表中引用它, 这会替换早期版本的Compose文件格式中volumes_from。

version: "3"
 
services:
  db:
    image: db
    volumes:
      - data-volume:/var/lib/db
  backup:
    image: backup-service
    volumes:
      - data-volume:/var/lib/backup/data
 
volumes:
  data-volume:

9)volumes_from

从另一个服务或容器挂载其数据卷:

volumes_from:
   - service_name   
     - container_name

10)depends_on

在使用Compose时,最大的好处就是少打启动命令,但一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动应用容器,应用容器会因为找不到数据库而退出。depends_on标签用于解决容器的依赖、启动先后的问题。

version: '2'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

上述YAML文件定义的容器会先启动redis和db两个服务,最后才启动web 服务。

11)PID

将PID模式设置为主机PID模式。 这就打开了容器与主机操作系统之间的共享PID地址空间。 使用此标志启动的容器将能够访问和操作裸机的命名空间中的其他容器,反之亦然。即打开该选项的容器可以相互通过进程 ID 来访问和操作。

pid: "host"

12)ports

ports用于映射端口的标签。常用的简单格式:使用HOST:CONTAINER格式或者只是指定容器的端口(宿主机会随机映射端口)

ports:
 - "3000"
 - "3000-3005"
 - "8000:8000"
 - "9090-9091:8080-8081"
 - "49100:22"
 - "127.0.0.1:8001:8001"
 - "127.0.0.1:5000-5010:5000-5010"
 - "6060:6060/udp"
  • 当使用HOST:CONTAINER格式来映射端口时,如果使用的容器端口小于60可能会得到错误得结果,因为YAML将会解析xx:yy这种数字格式为60进制。所以建议采用字符串格式。

在v3.2中ports的长格式的语法允许配置不能用短格式表示的附加字段。 长格式如下:

ports:
  - target: 80
    published: 8080
    protocol: tcp
    mode: host
  • target:容器内的端口 
  • published:物理主机的端口 
  • protocol:端口协议(tcp或udp) 
  • mode:host 和ingress 两种模式,host用于在每个节点上发布主机端口,ingress 用于被负载平衡的swarm模式端口。

13)restart

no是默认的重启策略,在任何情况下都不会重启容器。 指定为always时,容器总是重新启动。 如果退出代码指示出现故障错误,则on-failure将重新启动容器。

restart: "no"
restart: always
restart: on-failure
restart: unless-stopped

14)environment

添加环境变量。 你可以使用数组或字典两种形式。 任何布尔值; true,false,yes,no需要用引号括起来,以确保它们不被YML解析器转换为True或False。 只给定名称的变量会自动获取它在 Compose 主机上的值,可以用来防止泄露不必要的数据。

environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET:
 
environment:
  - RACK_ENV=development
  - SHOW=true
  - SESSION_SECRET
  • 注意:如果你的服务指定了build选项,那么在构建过程中通过environment定义的环境变量将不会起作用。 将使用build的args子选项来定义构建时的环境变量。

15)expose

暴露端口,但不映射到宿主机,只允许能被连接的服务访问。仅可以指定内部端口为参数,如下所示:

expose:
    - "3000"
    - "8000"

16)extra_hosts

添加主机名的标签,会在/etc/hosts文件中添加一些记录。

extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"

启动后查看容器内部hosts:

162.242.195.82  somehost
50.31.209.229   otherhost

17)dns

配置 DNS 服务器。可以是一个值,也可以是一个列表。

dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 9.9.9.9

链接到其它服务中的容器。使用服务名称(同时作为别名),或者“服务名称:服务别名”(如 SERVICE:ALIAS),例如:

links:
    - db
    - db:database
    - redis

19)net

设置网络模式。

net: "bridge"
net: "none"
net: "host"

5、Compose模板文件实例

5.1 Docker-compose模板文件(docker-compose.yml)编写

version: '2'
services:
  web1:
    image: nginx
    ports:
      - "6061:80"
    container_name: "web1"
    networks:
      - dev
  web2:
    image: nginx
    ports:
      - "6062:80"
    container_name: "web2"
    networks:
      - dev
      - pro
  web3:
    image: nginx
    ports:
      - "6063:80"
    container_name: "web3"
    networks:
      - pro
 
networks:
  dev:
    driver: bridge
  pro:
    driver: bridge

docker-compose.yml文件指定了3个web服务

5.2 启动应用

创建一个webapp目录,将docker-compose.yaml文件拷贝到webapp目录下,使用docker-compose启动应用。

docker-compose up -d

5.3 服务访问

通过浏览器访问web1,web2,web3

http://127.0.0.1:6061
http://127.0.0.1:6062
http://127.0.0.1:6063

以上是关于Docker教程-10-Docker Compose使用入门的主要内容,如果未能解决你的问题,请参考以下文章

Docker教程-10-Docker Compose使用入门

Windows10 Docker安装详细教程

docker-compos

ubuntu18.04在线安装dockernvidia-docker2与docker-compos

Windows 环境下载安装Docker

postgres和mysql基于docker搭建以及phppgadmin和phpmyadmin的应用(个人备份用非教程)