練習自己寫 Dockerfile 很好的機會

實務上我們會直接使用 .NET Core 2.1 的 microsoft/netcore Docker image,但我們也可以使用 Ubuntu 18.04 為基底,自行撰寫 Dockerfile,練習建立包含 .NET Core 2.1 的 Docker image。

Version


macOS High Sierra 10.13.4
Docker for Mac 18.03-ce-mac65 (24312)
Ubuntu 18.04
.NET Core 2.1

建立 Dockerfile


Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
FROM ubuntu

# Install Linux library dependency
RUN apt-get update
RUN apt-get install -y wget apt-transport-https gpg

# Install microsoft.gpg
RUN wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.asc.gpg
RUN mv microsoft.asc.gpg /etc/apt/trusted.gpg.d/
RUN wget -q https://packages.microsoft.com/config/ubuntu/18.04/prod.list
RUN mv prod.list /etc/apt/sources.list.d/microsoft-prod.list
RUN chown root:root /etc/apt/trusted.gpg.d/microsoft.asc.gpg
RUN chown root:root /etc/apt/sources.list.d/microsoft-prod.list

# Install .NET Core SDK
RUN apt-get update
RUN apt-get install -y dotnet-sdk-2.1

# Display Greeting
CMD [ "echo", "Ubuntu 18.04 LTS with .NET Core 2.1"]

根據 .NET Core 官方文件 Install .NET Core SDK on Linux Ubuntu 18.04,若要在 Ubuntu 18.04 安裝 .NET Core 2.1,必須依照這些步驟。

將這些步驟改寫在 Dockerfile 內。

第 1 行

1
FROM ubuntu

根據最新版 ubuntu 為基底 image。

第 3 行

1
2
3
# Install Linux library dependency
RUN apt-get update
RUN apt-get install -y wget apt-transport-https gpg

根據官網的 Install .NET Core SDK on Linux Ubuntu 18.04 所描述,若要在 Ubuntu 18.04 安裝 .NET Core,在 Ubuntu 還必須安裝以下 dependency:

  • wget
  • apt-transport-https
  • gpg

第 7 行

1
2
3
4
5
6
7
# Install microsoft.gpg
RUN wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.asc.gpg
RUN mv microsoft.asc.gpg /etc/apt/trusted.gpg.d/
RUN wget -q https://packages.microsoft.com/config/ubuntu/18.04/prod.list
RUN mv prod.list /etc/apt/sources.list.d/microsoft-prod.list
RUN chown root:root /etc/apt/trusted.gpg.d/microsoft.asc.gpg
RUN chown root:root /etc/apt/sources.list.d/microsoft-prod.list

根據官網的 Install .NET Core SDK on Linux Ubuntu 18.04 所描述,要安裝 .NET Core SDK 前,必須先將 microsoft.gpg 裝好。

15 行

1
2
3
# Install .NET Core SDK
RUN apt-get update
RUN apt-get install -y dotnet-sdk-2.1.3

所有的 dependency 與 microsoft.gpg 都裝好後,就可以正式安裝 .NET Core SDK 了。

19 行

1
2
# Display Greeting
CMD [ "echo", "Ubuntu 18.04 LTS with .NET Core 2.1"]

成為 container 後,最後執行 echo Ubuntu 18.04 LTS with .NET Core 2.1

core000

建立自己的 Image


1
~/UbuntuCore $ docker build -t myubuntu .

進入 Dockerfile 所在的目錄,使用 docker build 建立自己的 image。

  • -t : Docker image 的名稱
  • . : 將目前目錄的 Dockerfile 建立成 image

core001

1
$ docker images

docker build 的確幫我們建立了新的 myubuntu image。

core002

建立且執行 Container


1
$ docker run --rm myubuntu

使用 docker run 執行 myubuntu image。

  • –rm:執行完 container 後立即刪除,避免日後還要手動刪除 container

core005

顯示剛剛在 DockerfileCMD [ "cat", "Ubuntu 18.04 LTS with .NET Core 2.1"]

顯示 Ubuntu 版本


1
$ docker run --rm myubuntu cat /etc/lsb-release

使用 docker run 執行剛剛建立的 image,並執行 cat /etc/lsb-release 顯示 Ubuntu 版本。

core003

顯示 .NET Core 版本


1
$ docker run --rm myubuntu dotnet --info

使用 docker run 執行剛剛建立的 image,並執行 dotnet --info 顯示 .NET Core 版本。

core004

Conclusion


  • 以前使用 VM 時,若要自建 VM,最後會 export 出一大包 image,除了很佔空間外,還無法 git 版控;但若改用 Dockerfile 後,由於都是文字檔,檔案非常小,也可以很輕鬆 git 版控
  • 實務上雖然會直接使用 microsoft/dotnet Docker image,不過藉由此方式練習寫 Dockerfile 也很不錯,畢竟實務上會有很多機會要自己建立 Dockerfile

Sample Code


完整的範例可以在我的 GitHub 上找到

Reference


.NET Core, Install .NET Core SDK on Linux Ubuntu 18.04