注意
以下內容完全摘自Docker官方文檔,僅為學習及技術分享所用,切勿用于商業(yè)用途廓块,轉載請注明出處。
以下為正文
Dockerfile
從現在開始,我們進入Docker實踐,首先瘪松,讓我們來創(chuàng)建第一個Docker鏡像,它將啟動一個容器锨阿,容器中運行一個簡單的Python應用宵睦。
正如之前我們所學到的,Docker鏡像文件包含了您的應用程序正常運行需要的一切墅诡,包括對資源需求壳嚎、環(huán)境的要求、依賴的類庫和運行的代碼等等书斜。那么如何來定義和描述一個Docker鏡像呢诬辈,需要使用Dockerfile。
Dockerfile定義在您的容器中的運行環(huán)境荐吉,包括像網絡接口和虛擬化的磁盤驅動等硬件資源,這些資源是與您的宿主系統(tǒng)隔離開的口渔,不會對您的系統(tǒng)有作何影響样屠。Dockerfile用于構建一致的Docker鏡像,使用Docker鏡像運行Docker容器缺脉,可以讓定義在該鏡像中的應用程序無論在哪里運行痪欲,都有一致的功能。
編寫第一個Dockerfile
在一個空目錄下創(chuàng)建一個名為Dockerfile的文件攻礼,在該文件中輸入以下內容
Dockerfile
# 使用官方python鏡像作為根鏡像
FROM python:2.7-slim
# 將容器工作目錄設置為 /app
WORKDIR /app
# 將當前目錄(宿主機)中的內容全部復制到容器的 /app 目錄下
ADD . /app
# 安裝 requirements.txt 中定義好的包
RUN pip install -r requirements.txt
# 對外公開容器的80端口
EXPOSE 80
# 定義一個環(huán)境變量world
ENV NAME World
# 在容器啟動時业踢,運行 python app.py命令
CMD ["python", "app.py"]
如果您仔細閱讀上面的Dockerfile,你會發(fā)現我們還需要創(chuàng)建requirements.txt和app.py礁扮,在Dockerfile所在目錄下依次創(chuàng)建這兩個文件知举。
requirements.txt
Flask
Redis
requirements.txt中定義了容器依賴的包:Flask和Redis。Dockerfile中的RUN pip install -r requirements.txt將會讀取到requirements.txt中的內容太伊,然后安裝這些依賴包雇锡。
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}"
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來構建鏡像,運行以下命令僚焦,生成一個tag為pythonhelloworld的docker鏡像
docker build -t pythonhelloworld
這樣創(chuàng)建好的鏡像文件就存放在您本地的Docker registry(注冊中心)里锰提。
您可以運行以下命令來查看所有本地注冊中心的鏡像
docker images
運行鏡像 啟動容器
運行以下命令,將您本機的4000端口映射到docker容器的80端口
docker run -p 4000:80 pythonhelloworld
您可以通過http://localhost:4000
查看到運行的結果
也可以使用 -d 參數,將容器運行在后臺
docker run -p -d 4000:80 pythonhelloworld
可以使用 docker ps 命令立肘,查看所有運行中的docker容器進程
docker ps
CONTAINER ID IMAGE COMMAND CREATED
13f4a444f359 pythonhelloworld "python app.py" 35 seconds ago
使用docker stop <hash> 命令边坤,結束某個docker容器進程
docker stop 13f4a444f359
分享您的鏡像
現在可以將您剛剛構建的這個鏡像發(fā)布到Docker public registry上(也可以發(fā)布到其他公共registry或者私人配置的registry中),這樣無論在哪里谅年,只要在一個安裝了docker的機器上拉取這個鏡像茧痒,就可以在該機器上啟動一樣的容器。
注冊您的docker賬號
如果您還沒有docker賬號踢故,您需要首先到這里注冊一個賬號:cloud.docker.com.
然后您就可以使用login命令登錄了文黎。
docker login
發(fā)布您的鏡像
可以使用以下命令標記您的鏡像,其中username是您自己的用戶名殿较,repository是您自定義的倉庫名耸峭,tag標記是可選的,默認為latest
docker tag pythonhelloworld username/repository:tag
運行以下命令發(fā)布該鏡像
docker publish username/repository:tag
發(fā)布成功后淋纲,在任何docker機器上劳闹,運行以下命令就會自動拉取和運行該鏡像了
docker run -p 4000:80 username/repository:tag