如何在Ubuntu 22.04上安装并使用Docker

介紹

Docker 是一個簡化應用程式處理管理的應用程式,它運行在 容器 中。容器讓您在資源隔離的進程中運行應用程式。它們類似於虛擬機,但容器更具可移植性,更節省資源,並更依賴於主機操作系統。

有關 Docker 容器不同組件的詳細介紹,請查看 Docker 生態系統:常見組件介紹

在本教程中,您將在 Ubuntu 22.04 上安裝和使用 Docker 社區版(CE)。您將安裝 Docker 本身,使用容器和映像,並將映像推送到 Docker 存儲庫。

使用 DigitalOcean 應用平台 簡化應用程式部署。在幾分鐘內直接從 GitHub 部署。

先決條件

要完成本教程,您需要以下工具:

  • 一台Ubuntu 22.04服务器通过Ubuntu 22.04初始服务器设置指南进行设置,包括一个sudoroot用户和一个防火墙。
  • 如果您希望创建自己的镜像并将其推送到Docker Hub,则需要一个Docker Hub帐户,如步骤7和8所示。

第1步 — 安装Docker

官方Ubuntu存储库中提供的Docker安装包可能不是最新版本。为了确保我们获得最新版本,我们将从官方Docker存储库安装Docker。为此,我们将添加新的软件包来源,将Docker的GPG密钥添加到系统中以确保下载是有效的,然后安装软件包。

首先,更新您现有的软件包列表:

  1. sudo apt update

接下来,安装几个先决条件软件包,让apt能够通过HTTPS使用软件包:

  1. sudo apt install apt-transport-https ca-certificates curl software-properties-common

然后将官方Docker存储库的GPG密钥添加到您的系统中:

  1. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

将Docker存储库添加到APT源:

  1. echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

再次更新您现有的软件包列表以使添加生效:

  1. sudo apt update

确保您将要安装的软件来自Docker存储库而不是默认的Ubuntu存储库:

  1. apt-cache policy docker-ce

您将看到类似于此的输出,尽管Docker的版本号可能不同:

Output of apt-cache policy docker-ce
docker-ce:
  Installed: (none)
  Candidate: 5:20.10.14~3-0~ubuntu-jammy
  Version table:
     5:20.10.14~3-0~ubuntu-jammy 500
        500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
     5:20.10.13~3-0~ubuntu-jammy 500
        500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages

請注意,docker-ce 尚未安裝,但安裝候選項來自 Docker 庫對於 Ubuntu 22.04(jammy)。

最後,安裝 Docker:

  1. sudo apt install docker-ce

現在應該已經安裝了 Docker,啟動了守護程序,並啟用了在啟動時自動啟動的進程。檢查它是否正在運行:

  1. sudo systemctl status docker

輸出應該類似於以下內容,顯示服務處於活動狀態並正在運行:

Output
● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2022-04-01 21:30:25 UTC; 22s ago TriggeredBy: ● docker.socket Docs: https://docs.docker.com Main PID: 7854 (dockerd) Tasks: 7 Memory: 38.3M CPU: 340ms CGroup: /system.slice/docker.service └─7854 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

現在安裝 Docker 不僅提供 Docker 服務(守護程序),還提供了docker 命令行實用程序,或稱 Docker 客戶端。我們將在本教程的後續部分探索如何使用 docker 命令。

步驟 2 — 執行 Docker 命令無需 Sudo(可選)

預設情況下,docker 命令僅能由 root 使用者或位於 docker 群組中的使用者執行,該群組在 Docker 安裝過程中會自動創建。如果嘗試在未加上 sudo 前綴或不屬於 docker 群組的使用者中運行 docker 命令,將會得到以下輸出:

Output
docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?. See 'docker run --help'.

如果您希望在運行 docker 命令時避免輸入 sudo,請將您的用戶名添加到 docker 群組中:

  1. sudo usermod -aG docker ${USER}

應用新的群組成員資格,登出伺服器並重新登入,或輸入以下命令:

  1. su - ${USER}

您將被提示輸入您的使用者密碼以繼續。

確認您的使用者現在已被加入docker群組,請輸入:

  1. groups
Output
sammy sudo docker

如果您需要將一個不是您所登入的使用者添加到docker群組中,請明確聲明該使用者名稱:

  1. sudo usermod -aG docker username

本文的其餘部分假設您以docker群組的使用者身份執行docker命令。如果您選擇不這樣做,請在命令前加上sudo

讓我們接下來探索docker命令。

步驟3 — 使用Docker命令

使用docker需要傳遞一系列選項和命令,然後是參數。語法如下:

  1. docker [option] [command] [arguments]

要查看所有可用的子命令,請輸入:

  1. docker

截至Docker版本20.10.14,可用子命令的完整列表包括:

Output
attach Attach local standard input, output, and error streams to a running container build Build an image from a Dockerfile commit Create a new image from a container's changes cp Copy files/folders between a container and the local filesystem create Create a new container diff Inspect changes to files or directories on a container's filesystem events Get real time events from the server exec Run a command in a running container export Export a container's filesystem as a tar archive history Show the history of an image images List images import Import the contents from a tarball to create a filesystem image info Display system-wide information inspect Return low-level information on Docker objects kill Kill one or more running containers load Load an image from a tar archive or STDIN login Log in to a Docker registry logout Log out from a Docker registry logs Fetch the logs of a container pause Pause all processes within one or more containers port List port mappings or a specific mapping for the container ps List containers pull Pull an image or a repository from a registry push Push an image or a repository to a registry rename Rename a container restart Restart one or more containers rm Remove one or more containers rmi Remove one or more images run Run a command in a new container save Save one or more images to a tar archive (streamed to STDOUT by default) search Search the Docker Hub for images start Start one or more stopped containers stats Display a live stream of container(s) resource usage statistics stop Stop one or more running containers tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE top Display the running processes of a container unpause Unpause all processes within one or more containers update Update configuration of one or more containers version Show the Docker version information wait Block until one or more containers stop, then print their exit codes

要查看特定命令可用的選項,請輸入:

  1. docker docker-subcommand --help

要查看有關Docker的系統範圍信息,請使用:

  1. docker info

讓我們探索一些這些命令。我們將從處理映像開始。

步驟 4 — 使用 Docker 映像

Docker 容器是從 Docker 映像建立的。預設情況下,Docker 從 Docker Hub 拉取這些映像,Docker Hub 是由 Docker 公司管理的 Docker 註冊表,該公司是 Docker 項目的背後開發者。任何人都可以將他們的 Docker 映像託管在 Docker Hub 上,因此大多數應用程序和 Linux 發行版的映像都將在那裡託管。

要檢查您是否可以從 Docker Hub 存取並下載映像,請輸入:

  1. docker run hello-world

輸出將指示 Docker 正確運作:

Output
Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 2db29710123e: Pull complete Digest: sha256:bfea6278a0a267fad2634554f4f0c6f31981eea41c553fdf5a83e95a41d40c38 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. ...

最初 Docker 無法在本地找到 hello-world 映像,因此它從 Docker Hub 下載了該映像,這是默認存儲庫。映像下載完成後,Docker 從該映像創建了一個容器,並且容器內的應用程序運行,顯示消息。

您可以使用 docker 命令的 search 子命令在 Docker Hub 上搜索可用的映像。例如,要搜索 Ubuntu 映像,請輸入:

  1. docker search ubuntu

該腳本將爬行 Docker Hub,並返回所有名稱與搜索字符串匹配的映像清單。在這種情況下,輸出將類似於這樣:

Output
NAME DESCRIPTION STARS OFFICIAL AUTOMATED ubuntu Ubuntu is a Debian-based Linux operating sys… 14048 [OK] websphere-liberty WebSphere Liberty multi-architecture images … 283 [OK] ubuntu-upstart DEPRECATED, as is Upstart (find other proces… 112 [OK] neurodebian NeuroDebian provides neuroscience research s… 88 [OK] open-liberty Open Liberty multi-architecture images based… 51 [OK] ...

官方列中,OK表示由該專案背後的公司建立和支持的圖像。一旦您確定了要使用的圖像,您可以使用pull子命令將其下載到您的電腦上。

執行以下命令將官方ubuntu圖像下載到您的電腦:

  1. docker pull ubuntu

您將看到以下輸出:

Output
Using default tag: latest latest: Pulling from library/ubuntu e0b25ef51634: Pull complete Digest: sha256:9101220a875cee98b016668342c489ff0674f247f6ca20dfc91b91c0f28581ae Status: Downloaded newer image for ubuntu:latest docker.io/library/ubuntu:latest

圖像下載完成後,您可以使用下載的圖像運行容器,方法是使用run子命令。就像您在hello-world示例中看到的那樣,如果在執行run子命令時尚未下載圖像,則Docker客戶端將首先下載圖像,然後使用它運行容器。

要查看已下載到您的電腦上的圖像,請輸入:

  1. docker images

輸出將類似於以下內容:

Output
REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu latest 1d622ef86b13 3 weeks ago 73.9MB hello-world latest bf756fb1ae65 4 months ago 13.3kB

正如您稍後在本教程中將看到的,用於運行容器的圖像可以修改並用於生成新圖像,然後可以將這些新圖像上傳(推送是技術術語)到Docker Hub或其他Docker註冊表。

讓我們更詳細地看看如何運行容器。

步驟 5 — 運行 Docker 容器

在上一步中運行的hello-world容器是一個運行並在發送測試消息後退出的示例。容器可以比那更有用,它們可以是互動式的。畢竟,它們類似於虛擬機,只是更節省資源。

舉個例子,讓我們運行一個使用最新的Ubuntu映像的容器。使用-i-t開關的組合可以讓您進入容器的互動式shell:

  1. docker run -it ubuntu

您的命令提示符應該改變以反映您現在正在容器內工作,應該呈現這種形式:

Output
root@d9b100f2f636:/#

請注意命令提示符中的容器ID。在此示例中,它是d9b100f2f636。稍後您將需要該容器ID來在需要時識別容器並將其移除。

現在您可以在容器內運行任何命令。例如,讓我們在其中更新套件數據庫。您無需使用sudo前綴,因為您是以容器內的root用戶身份操作:

  1. apt update

然後在其中安裝任何應用程序。讓我們安裝Node.js:

  1. apt install nodejs

這將從官方Ubuntu存儲庫中安裝Node.js到容器中。安裝完成後,請驗證Node.js是否已安裝:

  1. node -v

您將在終端中看到版本號:

Output
v12.22.9

您在容器內進行的任何更改僅適用於該容器。

要退出容器,請在提示符號處輸入exit

讓我們接下來看看如何管理系統上的容器。

步驟6 — 管理 Docker 容器

使用 Docker 一段時間後,您的電腦上會有許多活動(正在運行)和非活動容器。要查看活動容器,請使用:

  1. docker ps

您將看到類似以下的輸出:

Output
CONTAINER ID IMAGE COMMAND CREATED

在本教程中,您啟動了兩個容器;一個來自hello-world映像,另一個來自ubuntu映像。這兩個容器都不再運行,但仍存在於您的系統中。

要查看所有容器 — 包括活動和非活動的,運行docker ps時加上-a開關:

  1. docker ps -a

您將看到類似此的輸出:

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1c08a7a0d0e4 ubuntu "bash" About a minute ago Exited (0) 7 seconds ago dazzling_taussig 587000e49d53 hello-world "/hello" 5 minutes ago Exited (0) 5 minutes ago adoring_kowalevski

要查看您創建的最新容器,請傳遞-l開關:

  1. docker ps -l
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1c08a7a0d0e4 ubuntu "bash" 3 minutes ago Exited (0) 2 minutes ago dazzling_taussig

要啟動停止的容器,使用docker start,然後是容器 ID 或容器的名稱。讓我們啟動具有 ID 1c08a7a0d0e4 的基於 Ubuntu 的容器:

  1. docker start 1c08a7a0d0e4

容器將啟動,您可以使用docker ps來查看其狀態:

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1c08a7a0d0e4 ubuntu "bash" 6 minutes ago Up 8 seconds dazzling_taussig

要停止運行中的容器,使用docker stop,後跟容器 ID 或名稱。這次,我們將使用 Docker 分配的容器名稱,即dazzling_taussig

  1. docker stop dazzling_taussig

一旦您決定不再需要容器,請使用docker rm命令刪除它,再次使用容器ID或名稱。使用docker ps -a命令找到與hello-world映像關聯的容器的ID或名稱,然後刪除它。

  1. docker rm adoring_kowalevski

您可以使用--name開關啟動新容器並給予它名稱。您也可以使用--rm開關創建一個容器,在停止時自動刪除自己。查看docker run help命令以獲取有關這些選項和其他選項的更多信息。

容器可以轉換為映像,您可以使用它們來構建新容器。讓我們看看這是如何工作的。

第7步 —— 將容器中的更改提交為 Docker 映像

啟動 Docker 映像後,您可以像虛擬機器一樣創建、修改和刪除文件。您所做的更改僅適用於該容器。您可以啟動和停止它,但一旦使用docker rm命令銷毀它,這些更改將永遠丟失。

本節將向您展示如何將容器的狀態保存為新的 Docker 映像。

安裝 Node.js 在 Ubuntu 容器內後,您現在有一個基於映像運行的容器,但這個容器與您用來創建它的映像不同。但您可能希望稍後將這個 Node.js 容器作為新映像的基礎。

然後使用以下命令將更改提交到新的 Docker 映像實例。

  1. docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name

-m 開關用於提交消息,以幫助您和其他人了解您做了什麼更改,而 -a 用於指定作者。 container_id 是您在本教程開始交互式 Docker 會話時記錄的那個。除非您在 Docker Hub 上創建了其他存儲庫,否則 repository 通常是您的 Docker Hub 用戶名。

例如,對於用戶 sammy,容器 ID 為 d9b100f2f636,命令將是:

  1. docker commit -m "added Node.js" -a "sammy" d9b100f2f636 sammy/ubuntu-nodejs

當您提交一個映像時,新映像將保存在您計算機的本地。在本教程的後續部分,您將學習如何將映像推送到 Docker Hub 之類的 Docker 注冊表,以便其他人可以訪問它。

再次列出 Docker 映像將顯示新映像,以及從中派生的舊映像:

  1. docker images

您將看到以下輸出:

Output
REPOSITORY TAG IMAGE ID CREATED SIZE sammy/ubuntu-nodejs latest 7c1f35226ca6 7 seconds ago 179MB ...

在此示例中,ubuntu-nodejs 是新映像,它是從 Docker Hub 的現有 ubuntu 映像派生的。大小差異反映了所做的更改。在此示例中,更改是安裝了 NodeJS。所以下次您需要運行具有預安裝 NodeJS 的 Ubuntu 容器時,只需使用新映像。

您还可以从Dockerfile构建图像,这样可以自动安装软件到新图像中。不过,这超出了本教程的范围。

现在让我们分享新图像,以便其他人可以从中创建容器。

第8步 — 将 Docker 图像推送到 Docker 存储库

从现有图像创建新图像之后的下一个逻辑步骤是将其与您的一些朋友、Docker Hub上的整个世界或您可以访问的其他 Docker 注册表共享。要将图像推送到 Docker Hub 或任何其他 Docker 注册表,您必须在那里拥有帐户。

要推送您的图像,请先登录到 Docker Hub。

  1. docker login -u docker-registry-username

系统将提示您使用 Docker Hub 密码进行身份验证。如果指定了正确的密码,则身份验证应成功。

注意:如果您的 Docker 注册表用户名与您用来创建图像的本地用户名不同,您将需要使用您的注册表用户名为图像打标签。对于上一步中给出的示例,您将键入:

  1. docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs

然后,您可以使用以下命令推送您自己的图像:

  1. docker push docker-registry-username/docker-image-name

要将ubuntu-nodejs图像推送到sammy存储库,命令将是:

  1. docker push sammy/ubuntu-nodejs

该过程可能需要一些时间来完成图像的上传,但完成后,输出将如下所示:

Output
The push refers to a repository [docker.io/sammy/ubuntu-nodejs] e3fbbfb44187: Pushed 5f70bf18a086: Pushed a3b5c80a4eba: Pushed 7f18b442972b: Pushed 3ce512daaf78: Pushed 7aae4540b42d: Pushed ...

將映像推送到註冊表後,應該在您帳戶的儀表板上列出,如下圖所示。

如果推送嘗試導致此類錯誤,那麼您可能未登錄:

Output
The push refers to a repository [docker.io/sammy/ubuntu-nodejs] e3fbbfb44187: Preparing 5f70bf18a086: Preparing a3b5c80a4eba: Preparing 7f18b442972b: Preparing 3ce512daaf78: Preparing 7aae4540b42d: Waiting unauthorized: authentication required

使用docker login登錄並重複推送嘗試。然後驗證它是否存在於您的Docker Hub存儲庫頁面上。

您現在可以使用docker pull sammy/ubuntu-nodejs將映像拉到新機器並用它來運行新容器。

結論

在本教程中,您安裝了Docker,處理了映像和容器,並將修改後的映像推送到了Docker Hub。現在您已經了解了基本知識,可以在DigitalOcean社區中探索其他Docker教程

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-22-04