Docker入门与实践(三)

2023-01-05  本文已影响0人  宏势

服务的编排

Docker三剑客Docker ComposeDocker MachineDocker Swarm分别是Docker官方开源的三个项目。

Docker Compose

安装

sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose #添加可执行权限
docker-compose --version #查看版本

入门例子

创建docker-compose.yml文件

  version: "3.8"
  services:
    web1:
      build: .
      ports:
        - "5000:5000"
      environment:
         active:""
      volumes:
        - "./config:/config"
    web2:
      build:
         context: .
         dockerfile: Dockerfile
      ports:
        - "5001:5001"
      volumes:
        - "./config:/config"
    redis:
      image: "redis:alpine"

变量设置

通过environment属性设置

web:
  environment:
    - DEBUG=1  

类似通过docker run -e DEBUG=1 ... 或者 docker-compose run -e DEBUG=1 ...

通过env_file指定文件传递

web:
  env_file:
    - web-variables.env

变量文件格式:key=value,例如:DEBUG=1;
类似docker run --env-file=web-variables.env

通过默认文件.env,设置变量

$ cat .env
TAG=v1.5

$ cat docker-compose.yml
version: '3'
services:
  web:
    image: "webapp:${TAG}"  

通过shell环境变量

$ export TAG=v2.0
$ cat docker-compose.yml
version: '3'
services:
  web:
    image: "webapp:${TAG}"  # 该行解析结果 image: "webapp:v2.0"  
  • 运行时传递变量给dockerfile ENV 变量
  • dockerfile里面也有ARG, 与ENV区别在于ARG是在编译镜像阶段传递的,ENV可以在编译阶段生成默认值,运行容器时传递变量覆盖,ARG是唯一一个可以放在FROM 前面的指令
  • docker-compose 环境变量采用${TAG}取值,无法取得当前文件设置的值
  • 同一个变量优先级从高到低如下:
    compose 文件指定environment最高 > shell 环境变量 > env_file文件 > dockerfile

网络设置

网络设置只支持version 2以上(含),假设目录名是myapp,执行docker-compse up,默认网络myapp_default 会被创建,docker-compose.yml 里面的容器会使用该网络

加入已存在的网络

docker network creat my-pre-existing-network  

version: 3.8
....
networks:
  default:
    external:
      name: my-pre-existing-network

配置默认网络

version: "3"
services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres
networks:
  default:
    # Use a custom driver
    driver: custom-driver-1

自定义网络

<details>
<summary>示例</summary>

version: "3"
services:
  proxy:
    build: ./proxy
    networks:
      - frontend
  app:
    build: ./app
    networks:
      - frontend
      - backend
  db:
    image: postgres
    networks:
      - backend

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

</details>

服务扩展(两种方式)

使用多个docker-compose.yml 文件

docker-compose.yml

version: "3.8"
services:
  web:
    image: example/my_web_app:latest

docker-compose.prod.yml

version: "3.8"
services:
    web:
      ports:
        - 80:80
      environment:
        PRODUCTION: 'true'  

部署

docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

采用多个docker-compose文件部署服务,会合并多个文件的内容(并集),如果遇到有冲突的参数(一个属性在多个文件里面定义,以最后一个指定的文件为准)

使用extends, version 3(已经去除)

具体参见官网: https://docs.docker.com/compose/extends/

Docker Swarm

由于目前主流采用k8s,暂不往下写,可以看后面写的K8S

上一篇 下一篇

猜你喜欢

热点阅读