Docker 服務的安裝配置
若服務器中已經有 docker 容器了請忽略此處配置講解(通過簡單 docker 命令能否被識別),服務器中 docker 若不存再請看如下:
-
我們決定采用 yum 安裝,先更新配置 yum 源頭(此處非必須,看情況!)
一般研發在服務器中若安裝好了 docker,一般此步操作不需要執行。
用 yum 安裝 docker 可以,或者 wget 安裝 docker 后再解壓也行
下面操作主要是更新 yum 為了安裝新版的 docker,而不是很老舊版本的 docker,然后對 yum 庫的配置
# yum 更新,過程中一切都是 [yes],這一步極其慢 yum -y update # yum 安裝幾個必要的包,其中含有設 yum 庫的命令 yum install -y yum-utils device-mapper-persistent-data lvm2 # 設置阿里倉庫 yum yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-
yum 安裝 docker-ce,因為老舊版本的才叫 docker 或 docker-engine
# 查看有哪些 docker-ce yum list docker-ce --showduplicates | sort -r # 我選擇了 18 年末的一個版本的 docker 安裝 yum install docker-ce-18.03.1.ce # 啟動 docker 服務 systemctl start docker # 將其加入開機啟動 systemctl enable docker # 想看 docker 服務是不是真起來了,通過 ps 命令,要是有列名即使沒有容器也不要緊,說明已經起來了 docker ps
-
docker 拉取鏡像替換稱國內鏡像源,使下載鏡像速度提升
# 添加鏡像源地址 vi /etc/docker/daemon.json
json 內容如下
{ "registry-mirrors" : [ "http://registry.docker-cn.com", "http://docker.mirrors.ustc.edu.cn", "http://hub-mirror.c.163.com" ], "insecure-registries" : [ "registry.docker-cn.com", "docker.mirrors.ustc.edu.cn" ], "debug" : true, "experimental" : true }
-
重啟 docker 服務
# 進程 systemctl daemon-reload # docker 服務重啟 systemctl restart docker
-
docker弄好了之后需要拉取鏡像
docker pull python:alpine3.7
等到鏡像拉取完成之后可以使用docker images
來查看
ps: 以下為實驗部分為了弄清原理,簡單的用了一個臨時的容器
docker run -it --rm python:alpine3.7 sh
使用了以上的命令之后,進入到了容器中。
先設置好PIP國內的鏡像源
mkdir $HOME/.pip/
# 利用tee命令把下面的配置寫入daemon.json
tee $HOME/.pip/pip.conf<<-'EOF'
[global]
trusted-host=mirrors.aliyun.com
index-url=https://mirrors.aliyun.com/pypi/simple
EOF
然后是設置好alpine的源,這里的意思等同是在linux服務器里面,使用yum指令拉取東西的時候會很慢,所以會對yum的鏡像源做一個配置,同理也需要對alpine容器內的包管理器做一個鏡像源的設置,alpine容器內部的包管理器是使用的apk,以下對apk鏡像源設置做一個講解
注意 : 以下的指令都是作用在容器內的
- 查看容器內部本身的鏡像源
cat /etc/apk/repositories
- 設置阿里雲的鏡像源
echo http://mirrors.ustc.edu.cn/alpine/v3.7/main > /etc/apk/repositories && \
echo http://mirrors.ustc.edu.cn/alpine/v3.7/community >> /etc/apk/repositories
3.同上文的設置yum的鏡像源一樣,改好配置之后需要重新啟動
apk update && apk upgrade
- 在容器內安裝pythonFlask的鏡像庫
python -m pip install -U flask
執行完之后這個時候可以來試一試使用flask run
來執行一下,這個時候會報一個FLASK_APP未設置的錯,這個值是一個環境變量,需要我們提前設置好之后才能用flask run
的指令來運行
以下是實驗部分
5. 在容器內創建一個test.py文件,並且寫入
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "hello world"
@app.route("/abc")
def abc():
return "hello world"
if __name__ == "__main__":
app.run()
創建完了之后如果我們直接使用python test.py就直接啟動了這個
6. Xshell另外開一個窗口,進入到這個實驗容器
docker ps
docker exec -it 容器id sh
- 用管道命令查詢
ps -ef | grep python
注意 因為你上文是采用python加執行文件的形式啟動的項目,所以這里就篩選python就可以了。
查詢完之后可以看到有一個進程以python的形式運行。
8. 使用curl指令來測試接口
curl: localhost:5000
可能curl工具沒有使用apk add curl
命令來安裝。
8. 再說說如何用flask run的指令來運行
export FLASK_APP=/test.py
然后就可以直接運行了。
可以重復執行6-7步實驗
- 以上部分就是實驗完了這個容器,這時候我們做一個鏡像,擁有這個容器內的全部功能,需要提前寫好配置文件,直接就能生成這個鏡像。
- 在
~
目錄下生成一個名字為flask的空文件夾 - 寫一個pip的配置文件
pip.conf
內容為
[global]
trusted-host=mirrors.aliyun.com
index-url=https://mirrors.aliyun.com/pypi/simple
- 創建一個
Dockerfile
文件,內容為
FROM python:alpine3.7
RUN echo http://mirrors.ustc.edu.cn/alpine/v3.7/main > /etc/apk/repositories && \
echo http://mirrors.ustc.edu.cn/alpine/v3.7/community >> /etc/apk/repositories
RUN apk update && apk upgrade
RUN mkdir /app
RUN mkdir $HOME/.pip/
COPY ./pip.conf $HOME/.pip/
RUN pip install flask
EXPOSE 5000
CMD ["flask","run"]
簡單的介紹以下上文的作用
以python:alpine3.7為基礎,疊加下面的配置,2-3行,配置鏡像源,4行重啟加載鏡像源,5行在進行內部創建app文件夾,6行 在用戶目錄下創建一個.pip文件夾,7行copy 當前linux機器下的pip.conf文件到用戶目錄下的.pip文件夾里面去,8行在鏡像內部使用pip指令安裝flask,9行 暴露容器內部的5000端口方便后續的端口映射,10行 代表啟動這個容器之后,不加任何命令他會主動去運行flask run
這條命令
4. 以上的配置文件寫好之后,運行以下指令開始構建鏡像。
docker build -t myflask:1.0 .
最后這個.
代表他會去當前目錄下的Dockerfile
去編譯
5. 到這一步就構建出來了一個和上文實驗部分功能一樣的鏡像了,唯一的差別在於,此時的鏡像中是沒有test.py的文件的,這是后生成容器的時候把linux宿主機上的文件映射過去。
- 上文構建了一個基礎的鏡像,這個時候就需要做的是生成容器
- 在
~
目錄下創建一個myapp的文件夾 - 進入到文件夾內部,創建一個test.py的文件,內容如下
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "hello world"
@app.route("/abc")
def abc():
return "hello world"
if __name__ == "__main__":
app.run()
- 開始運行,指令如下
docker run --name myapp -d -p 8080:5000 -v /root/myapp:/app -e FLASK_APP=/app/test.py myflask:1.0
對這個指令做一個解釋,--nam myapp 這里是給容器取了這么一個名字, -d 容器在后台運行, -p 8080:5000 這里是端口映射,把linux機器上的8080端口映射到容器內的5000端口上,-v 路徑映射,把linux下的/root/myapp路徑,這個路徑就是創建test.py的路徑,映射到容器的/app下,-e FLASK_APP=/app/test.py,設置環境變量,最后是鏡像的名稱加tag
這里可以用docker logs myapp
來查看日志
4. linux機器內部訪問,curl localhost:8080 發現訪問不了,是因為test.py沒有設置端口
5. 把原來的容器停止並且刪除
docker stop myapp && docker rm myapp
- 重新啟動
docker run --name myapp -d -p 8080:5000 -v /root/myapp:/app -e FLASK_APP=/app/test.py myflask:1.0 flask run -h 0.0.0.0
注意這里容器內部還是使用的flask run的方法來運行的,但是如果在啟動命令后加了flask run -h 0.0.0.0
會替代上文的Dockerfile里面配置文件最后那句CMD ["flask","run"]
8. 這樣啟動之后直接就可以在linux宿主機內使用
curl localhost:8080
來進行訪問了