DOCKER 06:docker compose

本文主要谈谈关于单机 docker 在部署多个依赖的容器的时候如何把敲命令转换成配置文件形式!

docker compose

简单的了解一个概念,容器编排:

指定容器以什么顺序,什么配置,这么运行,就是容器编排。而 docker compose 就是这也一个容器编排工具,适用于单机 docker!

需要知道,docker compose 并未集成到 docker 中,需要手动下载:

https://docs.docker.com/compose/install/

找到 Linux 的安装方法安装好即可,其实就是一个命令脚本!

# 下载
curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 修改权限
chmod +x /usr/local/bin/docker-compose

# 建立软链接
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

# 查看
docker-compose --version

如果 github 下载慢可以使用国内的地址:

http://get.daocloud.io/

下载:

curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

关于 docker compose 最重要的就是 docker-compose.yml 文件,该文件定义了容器得运行方式。

其主要关键字包含:services,networks,volumes

这里以安装 wordpress 博客为例:

version: "3"

# 容器
services:
  # 数据库容器
  wordpress-db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: wordpress
    volumes:
      - wordpress-db-data:/var/lib/mysql
    networks:
      - wordpress-bridge
  # web 服务容器
  wordpress-web:
    image: wordpress
    ports:
      - 8000:80
    environment:
      WORDPRESS_DB_HOST: wordpress-db
      WORDPRESS_DB_USER: root
      WORDPRESS_DB_PASSWORD: 123456
      WORDPRESS_DB_NAME: wordpress
    networks:
      - wordpress-bridge

# 存储卷
volumes:
  wordpress-db-data:

# 网络
networks:
  wordpress-bridge:
    driver: bridge

说明:

1. 在旧版本中,version 可能会有 2 这些情况,建议我们的都用 3,兼容性更强,注意需要引号。

2. 注意关键字的单数和复数的使用,如果是复数,说明该值是列表,那么值前面就需要横线 -

3. 配置中的环境变量都是来源于该镜像的官方文档。

4. 为了项目分开,我们一般都会选择不通的项目创建不同的单独的网络环境用于区分。

5. 顶级的 volumes 和 networks 其实都类似于声明的作用。

当然还有一些其它的关键字,但是一般很少用,可以自己去了解,类似 depends_on 这种。

启动:

docker-compose -f docker-compose.yml up

结果如图:

使用 -f 指定配置文件,up 启动,但是是前台启动,意味着 ctrl + c 就能停止容器,适用于调试阶段。最后加个 -d 参数就可以后台运行。

访问测试:

除此之外,该命令的使用方法其实和 docker 类似,可以通过 help 查看用法:

docker-compose -f docker-compose.yml --help

结果如图:

其中主要的包含:ps(查看定义的所有容器),stop(停止所有定义的容器),start,up,down(停止并删除),当然也可以使用 rm 删除。

docker compose 负载均衡

项目还是以之前的 Flask redis 为例:

https://www.cnblogs.com/Dy1an/p/12362971.html

配置 docker-compose.yml 如下:

version: "3"

# 容器
services:
  redis-demo:
    image: redis
    networks:
      - flask-bridge
  
  flask-demo:
    build:
      context: .
      dockerfile: Dockerfile
    environment:
      REDIS_HOST: redis-demo
    networks:
      - flask-bridge

  loadblance-demo:
    image: dockercloud/haproxy
    links:
      - flask-demo
    ports:
      - 8000:80
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - flask-bridge

# 网络
networks:
  flask-bridge:
    driver: bridge

值得注意的是,我们这里 flask 并未直接指定镜像,而是使用 Dockerfile 构建的镜像。

这里也使用了一个新的容器:haproxy

此时运行容器:

docker-compose -f docker-compose.yml up

启动之后查看生成的镜像:

可以发现名字是拼接形成的,一个是目录的名字,一个是配置中指定名称。

同样的查看新增的网络:

也是如此,都不是我们直接在文件中配置的,都是经过拼接而来。

当然,这并不能满足标题提到的负载均衡,毕竟 flask 默认只运行了一个容器,此时我们停止容器再度重新运行:

docker-compose -f docker-compose.yml up --scale flask-demo=3 -d

通过 up 后面的 --scale 参数指定配置文件中的某个容器运行多少个实例。

查看容器运行情况:

此时访问测试:

再访问:

这也就会发现会在三个容器之间不通的切换,以此来实现了负载均衡。

原文地址:https://www.cnblogs.com/Dy1an/p/12371406.html