您好,登錄后才能下訂單哦!
本篇內容介紹了“怎么用Dockerfile定義一個鏡像”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
安裝Docker,版本為1.13或者1.13之上。
給你的Docker環境一個快速的測試,確保所有的工作準備就緒:
docker run hello-world
在過去,如果你寫一個pyhton的應用,你的第一步是在你的機器上安裝python的開發環境。但是需要你的機器上的運行環境與應用程序完美適合,并且也需要匹配生產環境。
利用docker,你能移植一個便捷的python的運行庫作為鏡像,無需安裝。然后,通過構建包含python運行環境和你的應用代碼一起的鏡像,能夠確保你的代碼和運行環境完美結合并運行。
這些便捷的鏡像通過被稱作DockeFile的文件定義。
dockerfile定義了在容器內部跑什么運行環境。訪問網絡接口和磁盤驅動器等資源是在此環境中虛擬化的,與系統其余部分隔離,因此你需要將端口映射到外部世界,并明確要將哪些文件“復制”到 運行的環境。 然而,在完成這些之后,你可以預期,在此Dockerfile中定義的應用程序的構建在運行時的行為完全相同。
創建一個空的文件夾。通過cd命令進入到新創建的文件夾,創建一個文件取名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關聯了2個我們還沒有創建的文件,,即app.py和requirements.txt。下面我們來創建。
創建2個文件,requirements.txt和app.py,并且將它們放到和Dockerfile放進同一個文件夾中。這就完成了我們的應用,你可以發現用創建應用很簡單。當上面的Dockerfile構建成鏡像,app.py和requirements.txt通過Add命令加入到鏡像去了,Expose命令能夠暴露端口,可以通過http訪問。
Flask Redis
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 = "<h4>Hello {name}!</h4>" \ "<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本身),所以我們應該期望在這里嘗試使用它會失敗并產生錯誤消息。
那正是要點! 您的系統上不需要Python或任何requirements.txt文件,也不需要在您的系統上安裝或運行此映像。看起來你并沒有真正用Python和Flask建立一個環境,但是你已經擁有了。
我們已經為構建應用做好了準備。確保你對新建的文件與最高的權限。下面是通過ls命令,應該顯示以下內容:
$ ls Dockerfile app.py requirements.txt
現在運行構建命令。創建一個Docker鏡像,通過-t標記,從而使鏡像有一個友好的名字。
docker build -t friendlyhello .
你構建的鏡像在哪里?在你的機器的本地Docker鏡像注冊庫“
$ docker image ls REPOSITORY TAG IMAGE ID friendlyhello latest 326387cea398
運行應用程序,使用-p將機器的端口4000映射到容器的已發布端口80:
docker run -p 4000:80 friendlyhello
你應該在http://0.0.0.0:80看到一條消息,Python正在為你的應用程序提供服務。 但是該消息來自容器內部,它不知道將該容器的端口80映射到4000,
在瀏覽器中http://localhost:4000 可以查看網頁上顯示的顯示內容。
你也可以通過curl命令查看相同的內容:
$ curl http://localhost:4000 <h4>Hello World!</h4><b>Hostname:</b> 8fc990912a14<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>
這個4000:80的端口重映射是為了演示Dockerfile中的EXPOSE與使用docker run -p發布的內容之間的區別。 在后面的步驟中,我們只需將主機上的端口80映射到容器中的端口80并使用http:// localhost。
按CTRL+C結束進程。
現在可以讓應用程序在后端進程中運行,用detached 模式。
docker run -d -p 4000:80 friendlyhello
你可以獲取應用的容器ID,通過容器ID將應用程序停止。 容器正在后臺運行。 可以使用docker container ls命令查看縮寫的容器ID:
$ docker container ls CONTAINER ID IMAGE COMMAND CREATED 1fa4ab2cf395 friendlyhello "python app.py" 28 seconds ago
現在用docker containner stop 命令結束進程,需要用到 container id,如下:
docker container stop 1fa4ab2cf395
為了演示我們剛才創建的容器具有可移植性,我們上傳我們構建的映像并可以在其他的任何地方運行。 畢竟,當你想要將容器部署到生產環境時,弄需要知道如何推送注冊倉庫。
注冊倉庫是存儲庫的集合,而存儲庫是圖像的集合 - 有點像GitHub存儲庫,但代碼已經創建。 注冊倉庫上的帳戶可以創建許多存儲庫。 docker CLI默認使用Docker的公共注冊庫。
如果你還沒有Docker帳戶,請在網站cloud.docker.com注冊一個帳戶。 記下你的用戶名。
登錄到本地計算機上的Docker公共注冊庫。
$ docker login
將本地映像與注冊庫中的存儲庫相關聯的命令是username / repository:tag。 該標簽是可選的,但建議使用,因為它是注冊管理機構用于為Docker鏡像提供版本的機制。 為該上下文提供存儲庫并標記有意義的名稱,例如get-started:part2。 這將圖像放入啟動存儲庫并將其標記為part2。
現在,把它放在一起來標記圖像。使用你的用戶名,存儲庫和標簽名稱運行碼頭標簽圖像,以便將圖像上傳到您想要的目的地。 該命令的語法是:
docker tag image username/repository:tag
比如:
docker tag friendlyhello john/get-started:part2
運行 docker image ls 命令去查看你的新的標記的鏡像。
$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE friendlyhello latest d9e555c53008 3 minutes ago 195MB john/get-started part2 d9e555c53008 3 minutes ago 195MB python 2.7-slim 1c7128a655f6 5 days ago 183MB ...
上傳你的標記的鏡像去倉庫
docker push username/repository:tag
完成后,此上傳的結果將公開發布。 如果你登錄到Docker Hub,則可以通過其pull命令在那里看到新映像。
從現在起,你可以使用docker run并使用此命令在任何機器上運行你的應用程序:
docker run -p 4000:80 username/repository:tag
如果鏡像在本地機器沒有,docker 從倉庫中拉取。
$ docker run -p 4000:80 john/get-started:part2 Unable to find image 'john/get-started:part2' locally part2: Pulling from john/get-started 10a267c67f42: Already exists f68a39a6a5e4: Already exists 9beaffc0cf19: Already exists 3c1fe835fb6b: Already exists 4c9f1fa8fcb8: Already exists ee7d8f576a14: Already exists fbccdcced46e: Already exists Digest: sha256:0601c866aab2adcc6498200efd0f754037e909e5fd42069adeff72d1e2439068 Status: Downloaded newer image for john/get-started:part2 * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
無論docker run在哪里執行,它都會將你的鏡像以及Python和requirements.txt中的所有依賴關系一起提取出來,并運行你的代碼。 它們都在一個整潔的小包中,并且您不需要在主機上安裝任何Docker
這里列出了這個頁面的基本Docker命令,以及一些相關的命令,如果你想在繼續之前探索一下。
ocker build -t friendlyhello . # Create image using this directory's Dockerfile docker run -p 4000:80 friendlyhello # Run "friendlyname" mapping port 4000 to 80 docker run -d -p 4000:80 friendlyhello # Same thing, but in detached mode docker container ls # List all running containers docker container ls -a # List all containers, even those not running docker container stop <hash> # Gracefully stop the specified container docker container kill <hash> # Force shutdown of the specified container docker container rm <hash> # Remove specified container from this machine docker container rm $(docker container ls -a -q) # Remove all containers docker image ls -a # List all images on this machine docker image rm <image id> # Remove specified image from this machine docker image rm $(docker image ls -a -q) # Remove all images from this machine docker login # Log in this CLI session using your Docker credentials docker tag <image> username/repository:tag # Tag <image> for upload to registry docker push username/repository:tag # Upload tagged image to registry docker run username/repository:tag
“怎么用Dockerfile定義一個鏡像”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。