Docker 入門實作

本篇將會簡單的講述 docker 常見的開發流程,主要是給對 docker 還不太了解的讀者參考。

Docker 入門實作

開始之前如果對 Container 和 Docker 還不太了解,推薦先閱讀這篇文章 Container 基本概念介紹 (Docker)
本篇將會簡單的講述 docker 常見的開發流程,主要是給對 docker 還不太了解的讀者參考。

安裝指南 Installation Guide

在開始之前首先需要安裝 Docker。只要按著文檔走,安裝 Docker 其實非常簡單。如果是 Linux OS 的話我個人推薦 Digital Ocean 的文檔,寫得很詳細而且各式版本都有。

開發流程

在使用 Docker 時,最常見的指令 Command 有以下幾種:

  • docker build - 創建 Image
  • docker pull/push <image> - 對倉庫 Registry 推送和抓取 Image
  • docker run <image> - 根據 Image 運行 Container

而創建 Image 則是需要撰寫一個 Dockerfile 文檔。寫 Dockerfile 有很多 Best Practices,比如所建出的 Image 大小、以及 Security 相關等等。這裡我們暫時先不考慮太多,以創建簡單的 Image 為重點。

💡  下面 asciinema 影片裡的所有指令直接 highlight 用於複製貼上喔!

下面我們會創建一個簡易的軟體並包裝成 Container,跑一些常用的除錯指令,然後上傳至 Registry 等等。

創建軟體

首先我們來寫一個簡單的 count.sh,它的功用是從一數到三。如果對 Shell 語法不太熟悉也不需要擔心,這只是演示用的而已。

#!/bin/sh

# Purpose of this script is to count to 3

i="1"

while [ $i -lt 4 ]
do
  echo $i
  i=$(($i + 1))
	sleep 1
done

創建 Image

接下來我們將寫好的 application 包裝成映像檔 Image。簡單解釋一下:

FROM alpine:3

COPY count.sh .

CMD ["./count.sh"]
  • FROM alpine:3
    是指使用 Linux 發行版 alpine 的最新版本 3,這會從 Docker Hub 中抓取官方上傳好的 Linux alpine 發行版下來,相當於運行了 docker pull alpine:3 ,如果在本底已有 alpine:3 的 Image 則會直接取用。
    通常我們會稱此為 Base Image
  • COPY count.sh
    是指將上面寫好的 count.sh 複製進入 Image 裡面。
  • CMD ["./count.sh"]
    則是只默認運行 ./count.sh

這裡使用了 docker build -t ewocker/count . 來創建 Image,簡單解釋一下:

  • -t ewocker/count .
    -t => --tag 是指命名 Image 的全名為 ewocker/countewocker 是我在 Docker Hub 上面的 Repository ID, count 則是 Image 的名字。最後的 . 則是指在目前路徑 ~/Desktop/docker 運行指令。
  • 最後創建出的 Image 寫到 Successfully tagged ewocker/count:latest
    代表 Image 的全名 tag 為 ewocker/count:latest ,因為在創建時沒有給予版本,所以默認會在後面加上 latest
    簡單來說 Image tag 的組成是 <registry path>/<name>:<version>

運行 Container

在創建好 Image 後我們可以簡易的運行 Container。

這裡使用了兩種方式來運行 Container,簡單解釋一下:

  • docker run --rm ewocker/count
    --rm 是指運行結束後將 container 移除。ewocker/count 則是指根據這個 Image 來運行 container。
  • docker run --rm -it ewocker/count /bin/sh
    這是比較常見的 debug 用指令,-it 分別是 -i => --interactive-t => --tty
    簡單的說就是在運行 container 後連接一個 STDIN Shell,並用 /bin/sh 覆寫默認的 ./count.sh
    在運行後本來應該數完 1->3 就結束的 container 因為並沒有運行默認的 shellscript 而是運行了一個 shell ,所以可以在 Container 裡面運行任何指令用於 debug。簡單來說就是進入到一個 Container 裡面,在上面影片裡我們在進入到 container 裡面後運行 ls 發現 output 和在本地運行時完全不同,因為我們是在一個運行中的 linux alpine container 中運行的指令。

使用 Registry

最後我們演示如何使用 registry。

這裡主要使用 docker push ewocker/countdocker pull ewocker/count

  • docker push ewocker/count
    首先我們將 Image ewocker/count:latest 上傳至 registry,在那之前我們必須要有一個 Docker Hub 的帳號,如果還沒有創辦可以在這個 link 上先創辦一個。有了帳號後要先運行 docker login 來登入帳號。
    在影片中我們看到 The push refers to repository [docker.io/ewocker/count] 。在使用 docker push 時默認 registry 會使用 Docker Hub docker.io ,而全 repository path 則變成 docker.io/ewocker/count
  • docker pull ewocker/count
    在上傳之後,我們先用 docker image rm ewocker/count 將本地的 Image 移除來模擬在另一台電腦上原先並沒有 Image 的情況。接著運行 pull 來將 Image 抓取下來,而在那之後運行 docker image ls | grep ewocker/count 來表示 Image 已經被抓取到本地了。

結語

本篇非常簡單的講述了 docker 常見的開發流程,說到 container 雖然不有 docker,但最常見和必須知道的目前還是非 docker 莫屬。