docker-compose使用
docker-compose对单主机Docker容器集群快速编排,时下热门的k8s用于管理整个集群Docker容器。
docker启动的是单独的container,一个应用可能依赖多个服务,compose是用于运行和管理多个容器化的工具。
下面演示如何快速搭建flask网站,显示站点访问人数,通过redis存储访客计数。
一. 安装
linux上的docker-compose需单独安装,docker-compose依赖python3环境。
yum install -y python3
pip install docker-compose
二. 创建工程
$ mkdir mytest
$ cd mytest
$ tree .
$ ll
total 16
-rw-r--r-- 1 root root 298 Jan 1 12:13 app.py
-rw-r--r-- 1 root root 125 Jan 1 12:07 docker-compose.yml
-rw-r--r-- 1 root root 415 Jan 1 12:08 Dockerfile
Dockerfile 构建镜像:
FROM python:3.7-alpine
ADD . /code
WORKDIR /code
RUN pip install -r flask redis
CMD ["python", "app.py"]
在python3.4 镜像下构建应用,会报错:Fatal Python error: getentropy() failed。解决方法:指定v3.7
docker-compose.yml 定义服务:
version: '2'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
redis:
image: "redis:alpine"
配置定义了redis 和 web这两个服务,挂载当前的源码文件(app.py)至容器 /code 目录下。
三. 启动容器
$ docker-compose up
-d 后台启动
控制台显示网络出错:
ERROR: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network
该错误显示ipv4地址重叠冲突了,无法分配有效的ip。网上给的解决方案是Docker 默认支持 30 个不同的自定义 bridge 网络,如果超过这个限制,就会提示上面的错误。需通过以下命令清除无用的网络。
docker network ls
docker network prune
问题仍然没有解决。我的网络只有4个,看来不是这个问题引起的。
$ route
192.168.0.0 9.134.112.1 255.255.0.0 UG 0 0 0 eth1
192.168.10.0 0.0.0.0 255.255.255.0 U 0 0 0 docker0
查看路由表,这两个地址的确重叠了,删除192.168.0.0 路由,问题解决。
route del -net 192.168.0.0 netmask 255.255.0.0
四. 演示wordpress
手动搭建wordpress 环境比较繁琐,需要安装mysql,apache,php,wordpress安装包等。用compose 几秒钟就搞定了,简直是测试人员的福音。
docker-compose.yml
version: '3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "5000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
volumes:
db_data:
运行容器,就是这么顺滑 。。。