1. 程式人生 > >docker從零開始(二)容器初體驗

docker從零開始(二)容器初體驗

osi build 技術分享 框架 log 註冊表 代碼 content doc

使用定義容器 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 EXPOSE
80 # 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 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)

說明:現在我們看到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從零開始(二)容器初體驗