docker多容器的應用
1 ) 任務
- 使用python寫個web頁面,將數據存放於redis
- 在docker開發中,我們應該遵循每個容器只做一件事情的原則
- 在這一任務中我們使用兩個容器:一個用於運行python代碼, 另一個跑redis數據庫
2 ) 準備redis容器
- 在hub.docker.com中查閱關於redis的鏡像信息,可以找到alpine版本的
- 拉取鏡像, $
docker pull redis:alpine
- 查看拉取的鏡像信息, $
docker inspect redis:alpine
, 以下是主要信息"Volumes": { "/data": {} }, "Cmd": [ "redis-server" ], "ExposedPorts": { "6379/tcp": {} }
- 我們需要通過
-v
將/data
目錄掛載出來,映射到物理機上的目錄 - 我們創建目錄, $
mkdir /redis-data
來對應容器的redis的/data目錄 - 啓動redis容器, $
docker run -d --name redis -v /redis-data:/data redis:alpine
--name
表示給容器指定名字
3 ) 準備python頁面
- 創建一個目錄用於編寫web程序, $
mkdir myweb && cd myweb
- 編寫
app.py
程序from flask import Flask import redis app = Flask(__name__) rd = redis.Redis(host='redis', port=6379) @app.route('/') def hello(): count = rd.incr("hits") return 'Hello World! {}'.format(count) if __name__ == "__main__": app.run(host="0.0.0.0", port=5000)
4 ) 編寫Dockerfile準備構建鏡像
- 編寫
Dockerfile
, $vi Dockerfile
# FROM alpine # docker已經幫我們製作好了一個python鏡像,我們沒有必要自己製作鏡像 FROM python:alpine COPY . /code # 在redis鏡像中並不是pip3, 這裏直接使用pip RUN pip install flask redis WORKDIR /code # 將flask的5000端口暴露出來 EXPOSE 5000 # 注意CMD這裏不是python3, 使用python即可 CMD ["python", "app.py"]
- 開始構建我們的鏡像
myweb
, $docker build -t myweb .
5 ) 連接兩個鏡像進行容器間通信
- 運行我們的服務, $
docker run --rm -p 80:5000 myweb
發現報錯, 無法連接redis, 原因在於容器與容器之間沒有連接 - 再次運行我們的服務, $
docker run -d --rm --link redis -p 80:5000 myweb
--link
用於連接其他容器, 這裏我們連接的是redis容器
- 在瀏覽器訪問:服務器ip地址, 即可發現頁面上顯示
Hello World! 1
- 每刷新一次頁面,後面的值就會自增1次, 因爲它是存放在redis中的
6 ) 其他說明
- 查看docker容器, $
docker ps
可以查看到我們的兩個容器:myweb
、redis
- 當我們結束redis容器, 再次運行redis容器時發現數據還在, 原因在於redis存放數據的/data目錄掛載到了物理機的/redis-data目錄下了
- 注意以後在使用容器的時候, 如果有需要保存的數據, 先查看在容器中將數據保存的目錄, 再通過
-v
掛載映射到物理機對應的相關目錄上, 即可持久化數據了 - 如果在使用redis的時候,要停止服務,不要直接使用
docker kill
來結束 - redis是基於內存的數據庫, 有可能數據沒正常保存完, 一定先要使用
docker stop
來停止redis, 然後再進行其他操作