承接上篇文章: 小白学 Docker 之基础篇, 自学网站来源于 https://docs.docker.com/get-started
概念
Compose 是一个编排和运行多容器 Docker 应用的工具, 主要是通过一个 YAML 文件进行服务配置
使用 Compose 主要有三步:
在每个应用环境中配置一个 Dockerfile, 定义单个应用的镜像
使用 docker-compose.yml 来组装各个应用
运行 docker-compose up 命令来运行整个应用
一个基本的 docker-compose.yml 可能长这个样子:
- version: '3'
- services:
- web:
- build: .
- ports:
- - "5000:5000"
- volumes:
- - .:/code
- - logvolume01:/var/log
- links:
- - redis
- redis:
- image: redis
- volumes:
- logvolume01: {}
基本案例
1. 编写 web 服务器脚本以及依赖
创建示例文件夹
- > mkdir composetest
- > cd composetest
编写服务器脚本
> vim app.py
app.py 的内容为:
- import time
- import redis
- from flask import Flask
- app = Flask(__name__)
- cache = redis.Redis(host='redis', port=6379)
- def get_hit_count():
- retries = 5
- while True:
- try:
- return cache.incr('hits')
- except redis.exceptions.ConnectionError as exc:
- if retries == 0:
- raise exc
- retries -= 1
- time.sleep(0.5)
- @app.route('/')
- def hello():
- count = get_hit_count()
- return 'Hello World! I have been seen {} times.\n'.format(count)
- if __name__ == "__main__":
- app.run(host="0.0.0.0", debug=True)
创建依赖文件 requirements.txt
> vim requirements.txt
内容为:
flask redis
2. 创建一个 Dockerfile, 使用 python 来运行这个脚本
> vim Dockerfile
Dockerfile 的内容为:
- # 拉取 python 镜像
- FROM python:3.4-alpine
- # 拷贝当前目录到 / code
- ADD . /code
- # 设置工作目录
- WORKDIR /code
- # 使用 pip 安装依赖
- RUN pip install -r requirements.txt
- # 启动脚本
- CMD ["python", "app.py"]
3. 编写 docker-compose.yml 来编排应用
> vim docker - compose.yml
内容为:
- version: '3'
- services:
- web:
- build: .
- ports:
- - "5000:5000"
- redis:
- image: "redis:alpine"
web 服务采用本地的 Dockerfile 进行构建, 使用 ports 进行端口映射; redis 服务直接默认从 Docker Hub 拉取镜像
4. 运行
运行命令 docker-compose up 来启动整个应用
之后在浏览器中输入
http://localhost:5000
就可以看到下面这句话:
Hello World ! I have been seen 1 times.
如果看不到, 可以尝试使用 http://0.0.0.0:5000
另外如果你使用了 Docker Machine 开启了一台本地的主机, 你可以是使用
docker - machine ip MACHINE_VM
来查看你开启的主机的 IP, 然后使用
http://MACHINE_VM_IP:5000
在浏览器中打开
另开一个终端, 输入如下命令
docker image ls
可以看到整个应用运行的容器
停止
- CTRL + C
- // or
- docker - compose down
其他命令
- # 后台运行
- docker-compose up -d
- # 查看当前运行的服务
- docker-compose ps
- # 单独运行一个服务, 例如查看 web 服务的环境
- docker-compose run web env
- # 停止服务, 如果你是使用的 docker-compose up -d 开启的服务
- docker-compose stop
- # 关闭服务并且移除容器, 加上 --volumes 可以同时移除挂载在 Redis 容器上的目录
- docker-compose down --volumes
结合 Swarms 构建负载均衡应用 (单台主机)
Docker SwarmDocker Machine 与 Docker Compose 号称 Docker 三剑客, Swarm 和 Machine 将在之后的章节讲到, 这里先做示例
制作一个 python 镜像并发布
这里的镜像在 app.py 上面略微改动了一下, 具体如下:
- from flask import Flask
- from redis import Redis, RedisError
- import os
- import socket
- # Connect to Redis
- redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)
- app = Flask(__name__)
- @app.route("/")
- def hello():
- try:
- visits = redis.incr("counter")
- except RedisError:
- visits = "<i>cannot connect to Redis, counter disabled</i>"
- html = "<h3>Hello {name}!</h3>" \
- "<b>Hostname:</b> {hostname}<br/>" \
- "<b>Visits:</b> {visits}"
- # 这里获取 hostname, 为了区分我们到底请求的是那台机器
- return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)
- if __name__ == "__main__":
- app.run(host='0.0.0.0', port=80)
Dockerfile 如下:
- FROM python:2.7-slim
- WORKDIR /app
- ADD . /app
- RUN pip install --trusted-host pypi.python.org -r requirements.txt
- EXPOSE 80
- ENV NAME World
- CMD ["python", "app.py"]
制作镜像
docker build - t friendlyhello.
给镜像打 TAG
docker tag friendlyhello rynxiao / get - started: service
发布镜像
- > docker login
- > docker push rynxiao/get-started:service
发布镜像之前需要在 Docker Hub 上注册一个账号, 打 TAG 的时候一定要用自己的用户名, 否则将会报下面的错误:
- PS F:\docker\service> docker push ryn/get-started:service
- The push refers to repository [docker.io/ryn/get-started]
- 7fd8355bf728: Preparing
- fc6ecbc8862a: Preparing
- 88afc3a14faa: Preparing
- 94b0b6f67798: Preparing
- e0c374004259: Preparing
- 56ee7573ea0f: Waiting
- cfce7a8ae632: Waiting
- denied: requested access to the resource is denied
push 成功之后就可以看到自己上传的镜像了
PS: 如果运行不成功, 可以暂时用我的镜像
编写 docker-compose.yml 文件
- version: "3"
- services:
- web:
- image: rynxiao/get-started:service
- deploy:
- replicas: 5
- resources:
- limits:
- cpus: "0.1"
- memory: 50M
- restart_policy:
- condition: on-failure
- ports:
- - "80:80"
- networks:
- - webnet
- networks:
- webnet:
docker-compose.yml 主要做了以下几件事:
拉取自己制作的镜像
运行 5 个 web 服务的实例, 限制每个服务运行 10%CPU 以及 50M 内存
失败后自动重启
端口映射
规定 web 容器以一个叫做 webnet 的负载均衡网络来共享 80 端口 (好吧, 我这里有点晕)
运行 APP
docker swarm init
关于 swarm, 将在后面会讲到, 楼主在这里也只是有一个概念 anyway, just follow at first. 总之如果这里不运行这句命令, 将会报一个
this node is not a swarm manager
的错误
运行 docker stack deploy 来部署服务, 首先给应用命名:
docker stack deploy - c docker - compose.yml getstartedlab
这样就在一台主机上运行了一个名叫 getstartedlab_web 的服务, 这个服务包括 5 个 web 容器实例 (Task), 每个实例共享 80 端口我们可以查看这个服务:
- // service
- docker service ls
- // tasks
- docker service ps getstartedlab_web
之后, 我们在浏览器中打开 http://localhost, 多刷新几次, 会看到每次的 hostname 都有变化, 和 container id 对应
如果你想增加实例数, 只需要在 docker-compose.yml 中修改 replicas 的数量, 然后直接运行
docker stack deploy - c docker - compose.yml getstartedlab
即可, 不需要摧毁 stack 和容器
关闭应用和 swarm
- # Take the app down with docker stack rm:
- docker stack rm getstartedlab
- # Take down the swarm.
- docker swarm leave --force
参考链接
- https://docs.docker.com/compose/gettingstarted/
- http://www.cnblogs.com/xishuai/p/docker-compose.html
来源: http://www.bubuko.com/infodetail-2492735.html