1、前言
過去,如果您要開始編寫python應用程序,第一步就是把python的運行環境安裝到您的機器上,而且安裝的環境還要和線上的一致,比較麻煩。
使用docker,您可以從docker的官方registry或者其他倉庫,獲取一個可移植的python運行環境鏡像,無需安裝。然后,你可以基于這個鏡像開發你的應用程序,這樣可以確保您的應用程序,依賴項和運行時都一起運行。
2、構建一個python鏡像
2.1、為了構建您自己的鏡像,首先需要創建一個名稱為dockerfile的文件,用于定義創建鏡像并運行container所需的步驟。 dockerfile中的每條指令都會在鏡像中創建一個層級。當您更改dockerfile并重新build鏡像時,只重建那些更改的層級。與其他虛擬化技術相比,這是使鏡像輕量,小巧,快速的一個原因。
創建一個空目錄,創建一個名為dockerfile的文件,將以下內容復制并粘貼到該文件中并保存。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# use an official python runtime as a parent image from python:2.7-slim # set the working directory to /app workdir /app # copy the current directory contents into the container at /app add . /app # install any needed packages specified in requirements.txt run pip install --trusted-host pypi.python.org -r requirements.txt # make port 80 available to the world outside this container expose 80 # define environment variable env name world # run app.py when the container launches cmd [ "python" , "app.py" ] |
2.2 在與dockerfile文件同一個目錄下,創建requirements.txt和app.py文件。因為dockerfile文件的add命令,上面的兩個文件會被加到最終的鏡像中;因為expose命令,訪問容器的80端口,才可以訪問到app.py的內容,注意:這里的80端口指的是容器暴露的端口,并不是實際機器的端口。
requirements.txt
flask
redis
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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}" 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 ) |
2.3 把我們的應用打包為鏡像,要在dockerfile目錄下執行。這會創建一個docker鏡像,我們將使用-t標記它,以使鏡像有一個友好的名稱。
1
|
docker build -t friendlyhello |
3 、運行鏡像
運行應用程序,使用-p將機器的端口4000映射到容器暴露的端口80:
1
|
docker run -p 4000:80 friendlyhello |
您也可以在shell中使用curl命令來查看相同的內容。
1
2
|
$ curl http: //localhost :4000 <h3>hello world!< /h3 ><b> hostname :< /b > 8fc990912a14<br/><b>visits:< /b > <i>cannot connect to redis, counter disabled< /i > |
按crtl+c結束應用
現在讓我們在后臺運行應用程序:
1
|
docker run -d -p 4000:80 friendlyhello |
查看所有的container信息
$ docker container ls
container id image command created
1fa4ab2cf395 friendlyhello "python app.py" 28 seconds ago
現在使用docker container stop來結束進程,使用container id,如下所示:
1
|
docker container stop 1fa4ab2cf395 |
4、發布鏡像
4.1、我使用的是阿里云的docker registry,感覺應該會比較快。首先你要有一個阿里云的賬號。然后登陸進去新建一個倉庫,設置命名空間等信息。
4.2 登陸阿里云的docker registry,后續操作都需要登陸才可以執行。
1
|
sudo docker login --username=admin registry.cn-hangzhou.aliyuncs.com |
4.3 為鏡像打標,tag為可選的,如果沒有,默認為latest
格式:
1
|
docker tag image_name registry_url /namespace/repository_name :[tag] |
例如
1
|
docker tag friendlyhello registry.cn-hangzhou.aliyuncs.com /shuzhou/demo1 :latest |
查看本地的鏡像列表
1
|
docker image ls |
4.4 發布鏡像
1
|
docker push registry.cn-hangzhou.aliyuncs.com /shuzhou/demo1 :latest |
4.5 現在你可以在任何一臺機器上執行下面的命令,運行鏡像
1
|
docker run -p 4000:80 registry.cn-hangzhou.aliyuncs.com /shuzhou/demo1 :latest |
4.6 拉取鏡像
1
|
docker pull registry.cn-hangzhou.aliyuncs.com /shuzhou/demo1 :latest |
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。如果你想了解更多相關內容請查看下面相關鏈接
原文鏈接:https://blog.csdn.net/qq_34680763/article/details/79711567