
本文主要谈谈关于单机 docker 在部署多个依赖的容器的时候如何把敲命令转换成配置文件形式!
docker compose
简单的了解一个概念,容器编排:
指定容器以什么顺序,什么配置,这么运行,就是容器编排。而 docker compose 就是这也一个容器编排工具,适用于单机 docker!
需要知道,docker compose 并未集成到 docker 中,需要手动下载:
找到 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 为例:
配置 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