承接上篇文章:小白學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