Python程式撰寫好後,接下來就是要使用到Docker,建立Dockerfile讓我們的程式成為一個映像(image),使容器可以運行我們的程式。
Docker如何下載及安裝這邊就不再多做說明了,所以就開始我們的Docker之旅吧!
[Part 2-1] 建立Dockerfile
由於Dockerfile裡面,“一行指令"就等同於"一層容器"的概念,所以我們要盡可能的將指令縮減。不過我們目前如果要建立前篇Python檔案的話,只需要4個指令就可以了:
匯入基底的映像檔(image)。匯入一個python的映像檔。映像檔盡量選擇較小的來匯入(如alpine),且版本號不要使用latest。
FROM python:3.7.12-alpine
要執行的指令。我們要建立一個名為"src"的資料夾。
RUN mkdir /src
複製本地端檔案。我們將本地端的Python檔複製到映像檔裡面。
COPY app.py /src/app.py
啟動命令。運行我們python的程式碼。
CMD ["python", "./src/app.py"]
最後完整的Dockerfile程式碼如下:
FROM python:3.7.12-alpine
RUN mkdir /src
COPY app.py /src/app.py
CMD ["python", "./src/app.py"]
[Part 2-2] 建立image
我們透過"docker image build"可以來建立自己的image:
- -t, –tag: 映像檔名稱。如果要上傳到自己docker空間的話,必須要前綴自己的帳號。
- -f, –file: 要執行的"Dockerfile”。如果是其他檔名的話就會需要加上。
- 最後面的那個".“代表現在這個目錄
sudo docker image build --tag xxx/klotski-app:1.0 .
按下Enter後,就會開始執行
Sending build context to Docker daemon 117.8kB
Step 1/4 : FROM python:3.7.12-alpine
3.7.12-alpine: Pulling from library/python
a0d0a0d46f8b: Pull complete
c11246b421be: Pull complete
c5f7759615a9: Pull complete
6dc4dde3f226: Pull complete
9928d5d652ca: Pull complete
Digest: sha256:68dc2f52411f1071069a75c00029a0620d98139d638153cd33d029cf9810c8d6
Status: Downloaded newer image for python:3.7.12-alpine
---> 4d1c95b3db1c
Step 2/4 : RUN mkdir /src
---> Running in 1c8f56eceafe
Removing intermediate container 1c8f56eceafe
---> 5aaf20ec457e
Step 3/4 : COPY app.py /src/app.py
---> 44e08fdd44b8
Step 4/4 : CMD ["python", "./src/app.py"]
---> Running in 7aacbc395bd5
Removing intermediate container 7aacbc395bd5
---> f5a356f0478a
Successfully built f5a356f0478a
Successfully tagged xxx/klotski-app:1.0
建立完成後,你輸入"docker image ls”,就會看到目前你本機端映像檔的情形:
- 可以發現到,基底映像檔多大,你的映像檔的大小就是 >= 基底映像檔
REPOSITORY TAG IMAGE ID CREATED SIZE
xxx/klotski-app 1.0 f5a356f0478a 8 minutes ago 41.9MB
python 3.7.12-alpine 4d1c95b3db1c 9 days ago 41.9MB
[Part 2-3] 上傳image至Docker Hub
首先,註冊/登入Docker Hub帳號,並建立一個 Docker Repository。
在終端機使用"docker login"登入自己的帳號
$ sudo docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: xxx
Password:
WARNING! Your password will be stored unencrypted in /home/ubuntu/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
使用"docker push"將image上傳至Docker Hub
$ sudo docker push xxx/klotski-app:1.0
The push refers to repository [docker.io/xxx/klotski-app]
b4bf2a73d92d: Pushed
f45cb925e72e: Pushed
4dee49c1c4f4: Mounted from library/python
45d4d0cf56eb: Mounted from library/python
619b8ea44798: Mounted from library/python
a2f23be74558: Mounted from library/python
e2eb06d8af82: Mounted from library/python
1.0: digest: sha256:35e92127f0d6fd7c3f7ae08a0c8f8ebb80f2907b1a68f3b5da53b1c00c11ee43 size: 1783
這時,回到Docker Hub頁面,就可以看到目前image已經上傳上來了
[Part 2-4] image多架構支援
讓自己的image能夠支援多架構。我們在push至Docker Hub時,預設是只上傳當前本機的架構,而我們可以透過"buildx"來實現多架構。
先來查看目前buildx有哪些架構:(不同的作業系統可能會有所不同)
$ sudo docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS PLATFORMS
default * docker
default default running linux/amd64, linux/386
新增一個buildx,並且跟docker說要直接使用它(–use):
$ sudo docker buildx create --name mybuilder --use
mybuilder
這時,我們再使用"docker buildx ls"查看:(星星跑過去了!)
$ sudo docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS PLATFORMS
mybuilder * docker-container
mybuilder0 unix:///var/run/docker.sock inactive
default docker
default default running linux/amd64, linux/386
執行以下命令即可產生多架構image:
$ sudo docker buildx build --push --platform linux/386,linux/amd64,linux/arm/v7,linux/arm64/v8 -t xxx/klotski-app:1.0 .
Tags
Klotski Dockercomments powered by Disqus