背景是這樣:
有一個python寫的web服務,希望打包到容器中,通過容器去啟動。
參考了網上各種文檔,都感到說的不清不楚,實際操作過程中,又遇到了不少的坑,這里摸索OK后記錄一下。
docker的安裝和部署此處不再贅述。以下從docker安裝完成后開始講。
首先,我們寫一個demo,使用了python的flask框架,文件名為 app.py 。
我們的目的是,將這個代碼以服務的形式,打包到docker鏡像中。
from flask import Flask app=Flask(__name__) @app.route('/') def hello(): return 'hello world' if __name__=='__main__': app.run(host='0.0.0.0',debug=True,port='7777')
本地路徑如下圖
可以看到,最外層目錄是 mydocker ,內部是bdtools,app.py就放置在最內層。
首先,requirements.txt的內容如下圖,這為了安裝python依賴包:
然后我們開始編寫Dockerfile
FROM python:3.8
# 拉取一個基礎鏡像,基於python3.8
MAINTAINER BH8ANK
# 維護者信息
ADD ./bdtools/ /code/bdtools/
# 將你的項目文件放到docker容器中的/code/bdtools文件夾,這里code是在根目錄的,與/root /opt等在一個目錄
# 這里的路徑,可以自定義設置,主要是為了方便對項目進行管理
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
# 設置容器時間,有的容器時區與我們的時區不同,可能會帶來麻煩
ENV LANG C.UTF-8
# 設置語言為utf-8
WORKDIR /code/bdtools
# 設置工作目錄,也就是下面執行 ENTRYPOINT 后面命令的路徑
RUN /usr/local/bin/pip3 install -r requirements.txt
# 根據requirement.txt下載好依賴包
EXPOSE 7777
# EXPOSE 指令是聲明運行時容器提供服務端口,這只是一個聲明,在運行時並不會因為這個聲明應用就會開啟這個端口的服務。
# 此處填寫7777,是因為我們上面的app.py提供的web服務就需要使用7777端口
ENTRYPOINT ["python3","app.py"]
Dockerfile編寫完成后,我們就可以構建鏡像了。
使用命令
docker build -t new Dockerfile
意思是,使用當前路徑下的DockerFile進行構建,鏡像名稱為new
如上圖,看到最后一行Successfully就表示構建成功了。圖中紅色部分報錯是pip包版本不是最新的告警,不影響構建過程,可以忽略。
現在,我們可以查看一下鏡像情況
使用命令
docker images
如上圖,鏡像已經構建出來了。
那么,開始啟動容器。
執行命令
docker run -p 3333:7777 -dit d7d7df1b3dd5
這里需要說明一下:
1,-p參數,注意是小寫,3333,表示宿主機的端口,7777表示容器內部的端口。
整條參數的意思是:將容器內的端口7777,映射到宿主機的3333端口。
如果我們需要從宿主機外部訪問這個容器服務,只需要訪問3333端口即可。
2,-dit ,這個參數我們只說-d,就是后台運行的意思。整行命令最后的那一串字符串,其實是上面構建出的鏡像ID.
執行效果如下:
此刻,容器即已啟動了。
我們可以通過命令查看容器的運行情況
docker ps -a
此處,我們一般關注的是容器ID、STATUS和PORTS,可以看到,容器的端口7777已經映射到宿主機的3333端口。
那么,我們如何進入到容器內部呢?
可以使用命令
docker exec -it 容器ID /bin/bash
需要注意,是容器ID,不是鏡像ID
執行效果如上圖,可以看到,命令行提示符已經到了容器內部。
那么,我們還需要確認一下,這個python服務到底啟動了沒有。
我們首先可以在宿主機查看端口占用情況
此外,也可以在本地PC瀏覽器,去訪問宿主機的3333端口即可。如下圖
綜上,我們已經完成了從鏡像制作到服務部署的全部流程。
此外,還有個別常用的docker相關的管理命令也一並貼上來
# 刪除鏡像 docker rmi 鏡像ID # 刪除容器 docker rm 容器ID # 殺容器,會將運行中的容器停下來 docker kill 容器ID # 啟動容器,並將進入容器中的bash命令行 docker run -it 鏡像ID /bin/bash
【完】