docker compose

 

顶级配置项

  • version 定义了版本信息
  • services 定义了服务的配置信息
  • networks 定义了网络信息,提供给 services 中的 具体容器使用
  • volumes 定义了卷信息,提供给 services 中的 具体容器使用

示例:

version: "3.8"
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

  result:
    image: nginx
    ports:
      - "5001:80"
    networks:
      - backend
    depends_on:
      - db
    deploy:
      replicas: 1
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  worker:
    image: nginx
    networks:
      - frontend
      - backend
    deploy:
      mode: replicated
      replicas: 1
      labels: [APP=VOTING]
      restart_policy:
        condition: on-failure
        delay: 10s
        max_attempts: 3
        window: 120s

networks:
  frontend:
  backend:
volumes:
  db-data:

SERVICES配置指令

1. container_name

指定容器名称


version: "3"
services:

  redis:
    image: redis:alpine
    container_name: redis_test

2. image

指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。


version: "3"
services:

  redis:
    image: redis:alpine

3. build

指定 Dockerfile 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。


version: '3'
services:
  webapp:
    build: ./dir

也可以使用 context 指令指定 Dockerfile 所在文件夹的路径(或者是git仓库的URL)。同时使用 dockerfile 指令指定 Dockerfile 文件名。


version: '3'
services:

  webapp:
    build:
      context: ./dir
      dockerfile: Dockerfile-name

注意:
如果同时指定了 image和 build, image 不在具有单独使用它的意义,而是指定了目前要构建的镜像的名称。 也就是说 Compose 会使用 build 指令中指定的 Dockerfile 构建的镜像,之后构建的镜像名称使用 image 中指定的名字 webapp:tag命名。

4. command

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


#写成shell形式
command: bundle exec thin -p 3000
#写成Dockerfile中的exec格式
command: [bundle, exec, thin, -p, 3000]

5. depends_on

解决容器的依赖、启动先后的问题。


version: '3'

services:
  web:
    image: redis:alpine
    container_name: redis_test
    depends_on:
      - db

6. environment

设置环境变量。可以使用数组或字典两种格式。

只给定名称的变量会自动获取运行 Compose 主机上的对应变量的信息。


environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SHOW=true
  - SESSION_SECRET

如果变量名称或者值中用到 true|false,yes|no 等表达 布尔 含义的词汇,最好放到引号里,避免 YAML 自动解析某些内容为对应的布尔语义。这些特定词汇。

y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF

7. expose

暴露端口,但不映射到宿主机,只被连接的服务访问。

仅可以指定容器内部的端口为参数


expose:
 - "3000"
 - "8000"

8. 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 进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式。

9. extra_hosts

类似 Docker 中的 –add-host 参数,指定额外的 host 名称映射信息。会在启动后的服务容器中 /etc/hosts 文件中添加host映射信息。


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

10. networks

要加入的网络,使用顶级 networks 定义下的条目 。


services:
  some-service:
    networks:
     - some-network
     - other-network
networks:
  some-network:
  other-network:

11. entrypoint

指定服务容器启动后执行的入口文件。

12. user

指定容器中运行应用的用户名。

13. working_dir

指定容器中工作目录。

14. restart

指定容器退出后的重启策略为始终重启。该命令对保持服务始终运行十分有效,在生产环境 中推荐配置为 always 或者 unless-stopped 。

restart: always

15. alias

网络上此服务的别名(备用主机名)。同一网络上的其他容器可以使用服务名称或此别名连接到其中一个服务的容器。
由于aliases是网络范围的,因此相同的服务可以在不同的网络上具有不同的别名。
注意:网络范围的别名可以由多个容器共享,甚至可以由多个服务共享。如果是,则无法保证名称解析为的容器。


services:
  some-service:
    networks:
      some-network:
        aliases:
         - alias1
         - alias3
      other-network:
        aliases:
         - alias2

VOLUMES配置指令

数据卷所挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro)。

该指令中路径支持相对路径。


volumes:
 - /var/lib/mysql
 - cache/:/tmp/cache
 - ~/configs:/etc/configs/:ro

VOLUMES配置指令

1. 未显式声明网络环境的docker-compose.yml

使用docker-compose up启动容器后,这些容器都会被加入app_default网络中。使用docker network ls可以查看网络列表,docker network inspect 可以查看对应网络的配置。


version: '3'
services:
  web:
    image: nginx:latest
    container_name: web
    depends_on:
      - db
    ports:
      - "9090:80"
    links:
      - db
  db:
    image: mysql
    container_name: db

2. networks关键字指定自定义网络

例如下面的docker-compose.yml文件,定义了front和back网络,实现了网络隔离。其中proxy和db之间只能通过app来实现通信。其中,custom-driver-1并不能直接使用,你应该替换为host, bridge, overlay等选项中的一种。


version: '3'

services:
  proxy:
    build: ./proxy
    networks:
      - front
  app:
    build: ./app
    networks:
      - front
      - back
  db:
    image: postgres
    networks:
      - back

networks:
  front:
    # Use a custom driver
    driver: custom-driver-1
  back:
    # Use a custom driver which takes special options
    driver: custom-driver-2
    driver_opts:
      foo: "1"
      bar: "2"

3. 配置默认网络


version: '2'

services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres

networks:
  default:
    # Use a custom driver
    driver: custom-driver-1

4. 使用已存在的网络

networks:
  default:
    external:
      name: my-pre-existing-network

Docker-Compose常用命令

1) docker-compose up

用于部署一个 Compose 应用。

默认情况下该命令会读取名为 docker-compose.yml 或 docker-compose.yaml 的文件。

当然用户也可以使用 -f 指定其他文件名。通常情况下,会使用 -d 参数令应用在后台启动。

2) docker-compose stop

停止 Compose 应用相关的所有容器,但不会删除它们。

被停止的应用可以很容易地通过 docker-compose restart 命令重新启动。

3) docker-compose rm

用于删除已停止的 Compose 应用。

它会删除容器和网络,但是不会删除卷和镜像。

4) docker-compose restart

重启已停止的 Compose 应用。

如果用户在停止该应用后对其进行了变更,那么变更的内容不会反映在重启后的应用中,这时需要重新部署应用使变更生效。

5) docker-compose ps

用于列出 Compose 应用中的各个容器。

输出内容包括当前状态、容器运行的命令以及网络端口。

6) docker-compose down

停止并删除运行中的 Compose 应用。

它会删除容器和网络,但是不会删除卷和镜像。

 

测试 同时建立多个nginx

version: "3.8"
services:
  nginx1: 
    image: nginx:latest 
    container_name: nginx11
    ports:
      - "8083:80"
    expose:
      - "80"
  nginx2: 
    image: nginx:latest 
    container_name: nginx2
    ports:
      - "8084:80"
    expose:
      - "80"

演示dockerfile 建立

dockerfile 内容

ARG VERSION=latest
FROM nginx:${VERSION}
EXPOSE 80

  

docker-compose 内容

version: "3.8"
services:
    webapp: 
      container_name: mydockerfile
      ports:
        - "8091:80"
      build: 
        context: /home/admin1/yyx/
        dockerfile: dockerfile

  

 

 

 

 

 

posted on 2023-08-02 22:01  是水饺不是水饺  阅读(20)  评论(0编辑  收藏  举报

导航