承接上篇文章:小白学Docker之基础篇,自学网站来源于https://docs.docker.com/get-startedhtml
系列文章:node
Compose是一个编排和运行多容器Docker应用的工具,主要是经过一个YAML文件进行服务配置。python
使用Compose主要有三步:web
docker-compose.yml
来组装各个应用docker-compose up
命令来运行整个应用一个基本的docker-compose.yml
可能长这个样子:redis
version: '3' services: web: build: . ports: - "5000:5000" volumes: - .:/code - logvolume01:/var/log links: - redis redis: image: redis volumes: logvolume01: {}
> mkdir composetest > cd composetest
> vim app.py
app.py的内容为:docker
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)
> vim requirements.txt
内容为:shell
flask redis
> vim Dockerfile
Dockerfile的内容为:flask
# 拉取python镜像 FROM python:3.4-alpine # 拷贝当前目录到/code ADD . /code # 设置工做目录 WORKDIR /code # 使用pip安装依赖 RUN pip install -r requirements.txt # 启动脚本 CMD ["python", "app.py"]
> vim docker-compose.yml
内容为:vim
version: '3' services: web: build: . ports: - "5000:5000" redis: image: "redis:alpine"
web服务采用本地的Dockerfile
进行构建,使用ports进行端口映射;redis服务直接默认从Docker Hub拉取镜像浏览器
运行命令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
Docker Swarm
、Docker Machine
与Docker Compose
号称Docker三剑客,Swarm
和Machine
将在以后的章节讲到,这里先作示例
这里的镜像在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: 若是运行不成功,能够暂时用个人镜像
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端口(好吧,我这里有点晕)
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和容器。
# Take the app down with docker stack rm: docker stack rm getstartedlab # Take down the swarm. docker swarm leave --force