docker從零開始(二)容器初體驗
使用定義容器 Dockerfile
Dockerfile
定義容器內所需要的環境。對網絡接口和磁盤驅動器等資源的訪問在此環境中進行虛擬化,該環境與系統的其他部分隔離,因此您需要將端口映射到外部世界,並具體說明要“復制”到哪些文件哪個環境。但是,在執行此操作之後,您可以預期Dockerfile
在此處定義的應用程序的構建 在其他任何地方運行執行效果都是相同的,實現了一次構建,處處運行。
Dockerfile
創建一個空目錄,創建一個名為的文件Dockerfile
,將以下內容復制並粘貼到該文件中,然後保存。
# 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 EXPOSE80 # Define environment variable ENV NAME World # Run app.py when the container launches CMD ["python", "app.py"]
Dockerfile 裏用到兩個文件我們還尚未創建,一個requirements.txt (python軟件安裝依賴包列表文件) app.py 使用flask框架寫的一個 程序
requirements.txt
Flask
Redis
app.py
from flask import Flask from redis importRedis, 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)
說明:現在我們看到pip install -r requirements.txt
為Python安裝Flask和Redis庫,應用程序打印環境變量NAME
,以及調用的輸出socket.gethostname()
。最後,因為Redis沒有運行(因為我們只安裝了Python庫,而不是Redis本身),我們應該打印失敗信息。
構建應用程序
我們準備構建應用程序。確保您仍處於新目錄的頂層。這是ls
應該顯示的內容:
$ ls Dockerfile app.py requirements.txt
現在運行build命令。這會創建一個Docker鏡像,我們將使用-t
它來標記,因此它具有友好的名稱。
docker build -t friendlyhello .
你的鏡像在哪裏?它位於您機器的本地Docker鏡像註冊表中:
$ docker image ls REPOSITORY TAG IMAGE ID friendlyhello latest 326387cea398
運行該應用程序
運行應用程序,使用以下方法將計算機的端口4000映射到容器的已發布端口80 -p
:
$ docker run -p 4000:80 friendlyhello
現在讓我們以分離模式在後臺運行應用程序:
docker run -d -p 4000:80 friendlyhello a8a005836f01968b4aec14cbd03c149a4db68f9d3fdc48306d8a950ca15f5ac3
分享你的鏡像
為了演示我們剛剛創建的內容的可移植性,讓我們上傳我們構建的圖像並在其他地方運行它。畢竟,當您想要將容器部署到生產環境時,您需要知道如何推送到註冊表。
註冊表是存儲庫的集合,存儲庫是圖像的集合 - 類似於GitHub存儲庫,除了代碼已經構建。註冊表上的帳戶可以創建許多存儲庫。
使用您的Docker ID登錄
如果您沒有Docker帳戶,請在hub.docker.com上註冊一個帳戶 。記下您的用戶名。
登錄本地計算機上的Docker公共註冊表。
$ docker login
標記圖像
將本地映像與註冊表上的存儲庫相關聯的表示法是 username/repository:tag
。標簽是可選的,但建議使用,因為它是註冊管理機構用來為Docker鏡像提供版本的機制。為上下文提供存儲庫和標記有意義的名稱,例如get-started:part2
。這會將圖像放入get-started
存儲庫並將其標記為part2
。
現在,把它們放在一起來標記圖像。docker tag image
使用您的用戶名,存儲庫和標記名稱運行,以便將圖像上載到所需的目標位置。該命令的語法是:
docker tag image username/repository:tag
例如:
docker tag friendlyhello benjamin77/image:part2
將標記的圖像上傳到存儲庫:
docker push benjamin77/benjamin77/image:part2
docker從零開始(二)容器初體驗