返回文章列表

Ubuntu 安裝 Docker 與實務操作

本文介紹如何在 Ubuntu 系統上安裝 Docker,涵蓋從系統更新、套件安裝、GPG 金鑰設定到儲存函式庫組態的完整流程。同時,文章也示範了 Docker

Web 開發 系統管理

在 Ubuntu 環境下安裝 Docker,首先需更新系統套件並安裝必要的相依套件,例如 apt-transport-https、ca-certificates、curl 和 software-properties-common。完成後,需匯入 Docker 的 GPG 金鑰,確保安裝套件的來源安全可靠。接著,將 Docker 的儲存函式庫新增到 APT 來源清單中,以便系統可以找到 Docker 的安裝套件。更新 APT 套件索引後,即可安裝 Docker CE 版本。安裝完成後,透過 docker --version 指令驗證安裝是否成功,並確認版本資訊。後續操作包含使用 docker search 指令搜尋 Docker Hub 上的映像檔,例如搜尋 MySQL 相關的映像檔,並可使用篩選條件精確查詢。找到需要的映像檔後,使用 docker pull 指令下載至本地,例如下載 MySQL 最新版本。docker images 指令則可以檢視本機已下載的映像檔列表,包含標籤、ID 和大小等資訊。docker rmi 指令則用於移除不需要的映像檔,釋放磁碟空間。執行映像檔則使用 docker run 指令,可以設定互動模式、分配終端機等選項,並在容器中執行指定的指令。docker ps 指令用於檢視目前正在執行的容器,docker ps -a 則可以檢視所有容器,包括已停止的容器。docker logs 指令可以檢視容器的日誌訊息,方便除錯和監控。

在 Ubuntu 上安裝 Docker

在現代軟體開發中,Docker 已經成為不可或缺的工具之一。它能夠讓開發者將應用程式及其依賴項封裝成容器,確保應用程式在不同環境中的一致性。本文將詳細介紹如何在 Ubuntu 系統上安裝 Docker,並提供一些實務經驗與技術選型的考量。

安裝 Docker 的步驟

安裝 Docker 的過程相對簡單,但需要注意一些細節。以下是詳細步驟:

更新系統並安裝必要的套件

首先,我們需要更新系統並安裝一些必要的套件:

sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

新增 Docker 的 GPG 金鑰

為了確保下載的 Docker 套件是來自官方的,我們需要新增 Docker 的 GPG 金鑰:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

新增 Docker 儲存函式庫

接著,我們需要新增 Docker 的儲存函式庫到 APT 來源:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

更新套件索引

更新套件索引以包含新增的 Docker 儲存函式庫:

sudo apt-get update

安裝 Docker

現在我們可以安裝 Docker 了:

sudo apt-get install docker-ce

驗證安裝

安裝完成後,我們可以使用以下命令來確認 Docker 的版本,以確保安裝成功:

docker --version

使用 Docker 搜尋命令

Docker 提供了豐富的命令來管理和操作容器。以下是一些常用的命令。

搜尋 Docker 映像檔

使用 docker search 命令可以在 Docker 註冊中心搜尋可用的映像檔。例如,搜尋 MySQL 相關的映像檔:

docker search mysql

這個命令會回傳所有包含 “mysql” 在名稱中的映像檔。如果你想要更精確地搜尋,可以使用 -s--filter 做為篩選條件。例如,搜尋獲得至少 50 顆星評價的 MySQL 映像檔:

docker search --filter stars=50 mysql

下載 Docker 映像檔

使用 docker pull 命令可以從 Docker 註冊中心下載所需的映像檔到本地機器。例如,下載 MySQL 的最新版本:

docker pull mysql:latest

如果不指定標籤(tag),這個命令會預設下載最新版本的 MySQL 映像檔。

語言風格與技術深度

在這篇文章中,玄貓結合了自己的實務經驗和技術選型考量,探討瞭如何在 Ubuntu 上安裝 Docker,並介紹了一些常用的 Docker 命令。這些命令在日常開發中非常實用,能夠幫助開發者更高效地管理和操作容器。

透過這些步驟和命令,讀者應該能夠輕鬆地在 Ubuntu 上安裝和使用 Docker,並且能夠根據實際需求進行進一步的操作和管理。希望這篇文章能夠對你有所幫助!

使用 Docker 命令來管理影像與容器

Docker 影像管理

在 Docker 中,docker images 命令用來顯示本機上所有的頂層影像。這些影像包含了它們的倉函式庫、標籤、建立日期以及虛擬大小。然而,這個命令並不會顯示中間層的影像。

docker images [options]

例如,docker images -a 會列出所有頂層影像,包括它們的詳細資訊,如下所示:

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              latest              91e54dfb1179        4 weeks ago         188.4 MB
<none>              <none>              d74508fb6632        4 weeks ago         188.4 MB
<none>              <none>              c22013c84729        4 weeks ago         188.4 MB
<none>              <none>              d3a1f33e8a5a        4 weeks ago         188.2 MB

當我們在本機上建立或構建 Docker 影像時,會產生多個中間層。每個命令的執行都會產生一個影像層,這是 Docker 輕量化和重用容器的關鍵特性之一。

Docker RMI 命令

docker rmi 命令用來從本機移除指定的影像:

docker rmi [options] image [image, image...]

例如,以下命令會移除 MySQL 影像及其所有相關層:

docker rmi mysql

Docker Run 命令

當我們下載(pull)了一個影像後,接下來的步驟是執行(run)這個影像。docker run 命令就是用來做這件事的:

docker run [options] image:tag [command, args]

這個命令會啟動一個容器,並且容器擁有自己的檔案系統、埠口和 IP 地址。我們還可以在 docker run 命令中新增各種選項和引數。

此圖示展示了使用 docker pull 下載最新 MySQL 影像的過程

內容解密:
  • 開始:指的是開始執行 docker pull mysql 命令。
  • 執行 docker pull mysql:使用者在終端機中輸入 docker pull mysql 命令。
  • 下載 MySQL 中間層:Docker 從倉函式庫中下載 MySQL 的各個中間層影像。
  • 驗證影像:下載完成後,Docker 會對這些中間層進行驗證,確保它們的完整性。
  • 完成:當所有中間層都成功下載並驗證後,整個過程完成。

以下是一些常見的 docker run 命令選項:

  • -i:互動模式,保持 STDIN 活動。
  • -t:分配一個偽終端(tty)。
  • -d:在背景模式下執行容器。

例如,我們可以使用以下命令來提取最新的 Ubuntu 暴露並執行它:

docker pull ubuntu:latest

這個命令會從 Docker Hub 提取最新版本的 Ubuntu 映像到本地主機。

此圖示展示了使用 docker run 執行 Ubuntu 暴露的過程

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Ubuntu 安裝 Docker 與實務操作

package "Docker 架構" {
    actor "開發者" as dev

    package "Docker Engine" {
        component [Docker Daemon] as daemon
        component [Docker CLI] as cli
        component [REST API] as api
    }

    package "容器運行時" {
        component [containerd] as containerd
        component [runc] as runc
    }

    package "儲存" {
        database [Images] as images
        database [Volumes] as volumes
        database [Networks] as networks
    }

    cloud "Registry" as registry
}

dev --> cli : 命令操作
cli --> api : API 呼叫
api --> daemon : 處理請求
daemon --> containerd : 容器管理
containerd --> runc : 執行容器
daemon --> images : 映像檔管理
daemon --> registry : 拉取/推送
daemon --> volumes : 資料持久化
daemon --> networks : 網路配置

@enduml
內容解密:
  • 開始:指的是開始執行 docker pull ubuntu:latest 命令。
  • 執行 docker pull ubuntu:latest:使用者在終端機中輸入 docker pull ubuntu:latest 命令。
  • 下載 Ubuntu 中間層:Docker 從倉函式庫中下載 Ubuntu 的各個中間層影像。
  • 驗證影像:下載完成後,Docker 會對這些中間層進行驗證,確保它們的完整性。
  • 完成:當所有中間層都成功下載並驗證後,整個過程完成。

在實務應用中,我們常常需要根據具體需求來選擇不同的 Docker 命令選項。例如,當我們需要讓容器在背景執行時,可以使用 -d 標誌;當我們需要與容器進行互動時,可以使用 -i -t 標誌。

技術選型考量與未來趨勢預測

在選擇 Docker 作為容器化解決方案時,玄貓認為以下幾點需要特別注意:

  • 軟體版本控制:Docker 的多層架構使得軟體版本控制變得更加靈活和簡單。
  • 隔離性與安全性:Docker 提供了強大的隔離性和安全性保障,適合用於多租戶環境。
  • 可攜性與重用性:Docker 暴露可以輕鬆地在不同環境之間遷移和重用。

未來隨著雲端運算和微服務架構的普及,Docker 和相關技術將變得更加重要。預計會有更多企業採用 Docker 作為其基礎設施的一部分,進一步推動 DevOps 和持續交付(CD)實踐。

問答環節

問題:如何確保 Docker 暴露的安全性?

回答: 在使用 Docker 暴露時,應該採取以下措施來提升安全性:

  1. 最小化許可權:只賦予暴露所需的最小許可權。
  2. 定期更新:定期更新暴露及其基礎映像以修補已知漏洞。
  3. 網路隔離:使用網路隔離技術如 VPC 和子網來限制暴露之間的通訊。
  4. 監控和稽核:佈署監控和稽核工具來檢測異常活動。

問題:如何最佳化 Docker 暴露的效能?

回答: 最佳化 Docker 暴露效能的方法包括:

  1. 減少映像大小:只包含必要的檔案和依賴項。
  2. 使用多階段構建:減少映像大小並提高構建速度。
  3. 調整資源限制:根據應用需求調整 CPU 和記憶體限制。
  4. 最佳化儲存:使用高效儲存駕駛程式如 OverlayFS 或 AUFS。

Docker 基本命令

在這篇文章中,玄貓將為大家介紹一些 Docker 的基本命令,並結合具體案例來說明如何在本地主機上執行 Ubuntu 作業系統,以及如何管理和檢視 Docker 容器的狀態。

執行 Ubuntu 容器

首先,我們來看看如何在本地主機上執行 Ubuntu 容器。以下是基本的命令:

docker run --it ubuntu sh

這個命令會在本地主機上執行一個互動式的 Ubuntu 容器,並進入到 Shell 提示符。從這裡,我們可以執行任何 Shell 命令。以下是一些簡單的操作範例:

# echo '學習 Docker'
學習 Docker
# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
# cd bin
# ls
bash   chgrp   dumpkeys   kill    mknod   openvt   sed      true     zfgrep
bunzip2   chmod   echo    kmod    mktemp   pidof   setfont   udevadm   zforce
bzcat    chown   egrep    less    mount    ping     setupcon  umount    zgrep
bzcmp    chvt    false    lessfile    mountpoint    ping6     sh        uname     zless
bzdiff    cp      fgconsole    lessecho   more       plymouth   sh.distrib    unicode_start   zmore
bzegrep    cpio    fgrep      lesskey     mt         plymouth-upstart-bridge   sleep      ypdomainname
bzexe     dash     findmnt     lesspipe     mt-gnu     ps         ss         vdir
bzfgrep    date     grep       ln          mv         pwd        stty       which
bzgrep    dd       gunzip      loadkeys    nc         rbash      su         whiptail
bzip2     df       gzexe       login       nc.openbsd readlink sync ypdomainname
bzip2recover dir gzip ls netcat rm tailf zcat
bzless dmesg hostname lsblk netstat rmdir tar zcmp
bzmore dnsdomainname ip lsmod nisdomainname run-parts tempfile zdiff
cat domainname kbd_mode mkdir open running-in-container touch zegrep

內容解密:

  • echo '學習 Docker':這個命令會在終端機上顯示「學習 Docker」這句話。
  • ls:這個命令會列出當前目錄下的所有檔案和資料夾。
  • cd bin:這個命令會將工作目錄切換到 bin 資料夾。
  • ls:再次執行 ls 命令,會列出 bin 資料夾中的檔案。

這些檔案都是系統操作所必需的基本程式。

檢視執行中的容器

接下來,我們來看看如何檢視當前執行中的 Docker 容器。使用以下命令:

docker ps [Options]

這個命令會列出所有正在執行的容器。由於每個容器只執行一個程式,因此如果沒有執行中的容器,列表會是空的。

$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c8b9770c88e9 ubuntu "sh" About an hour ago Exited (0) About an hour ago admiring_albattani

內容解密:

  • docker ps:這個命令會列出所有正在執行中的容器。
  • docker ps -a:這個命令會列出所有容器,包括那些已經停止的容器。

從輸出結果可以看到,我們之前執行的 Ubuntu 作業系統已經停止了,但還沒有被刪除。我們可以隨時重新啟動它。

檢視容器日誌

Docker 提供了一個 docker logs 命令來檢視容器的日誌檔案。以下是使用範例:

docker logs [Options] Container_ID

這個命令只適用於那些使用 JSON 日誌驅動程式的容器。例如,我們可以執行以下命令來檢視某個特定容器的日誌:


$ docker logs eded3539719c

內容解密:

  • docker logs eded3539719c:這個命令會顯示名為 eded3539719c 的容器的日誌內容。

啟動 MySQL 容器

接下來,我們來看看如何下載並建立一個 MySQL 作業系統。首先,我們需要提取最新的 MySQL 映像:


$ docker pull mysql:latest

內容解密:

  • docker pull mysql:latest:這個命令會從 Docker Hub 上提取最新版本的 MySQL 構像。
Using default tag: latest
latest: Pulling from library/mysql
ba249489d0b6: Pull complete                                                                                                                                      [1/15]
19de96c112fc: Pull complete                                                                                                                                       [2/15]
2e32b26a94ed: Pull complete                                                                                                                                       [3/15]
637386aea7a0: Pull complete                                                                                                                                       [4/15]
f40aa7fe5d68: Pull complete                                                                                                                                       [5/15]
ca21348f3728: Pull complete                                                                                                                                      [6/15]
b783bc3b44b9: Pull complete                                                                                                                                      [7/15]
f94304dc94e3: Pull complete                                                                                                                                      [8/15]
efb904a945ff: Pull complete                                                                                                                                      [9/15]
64ef882b700f: Pull complete                                                                                                                                    [10/15]
291b704c92b1: Pull complete                                                                                                                                    [11/15]
adfeb78ac4de: Pull complete                                                                                                                                    [12/15]
f27e5410cda3: Pull complete                                                                                                                                    [13/15]
ca4b92f905b9: Pull complete                                                                                                                                    [14/15]
065018fec3d7: Pull complete                                                                                                                                    [15/15]

這樣就完成了 MySQL 構像的下載。

查詢容器ID並查詢日誌

接下來我們展示如何在另一個終端機視窗中找到剛剛啟動 MySQL 的 Container ID:


$ docker ps -a

複製該 Container ID後 ,我們可以執行日誌指令:


$ docker logs eded3539719c

內容解密:

  • docker logs eded3539719c:這樣就可以顯示 Container ID 名為 eded3539719c 的 MySQL 日誌資訊。