這篇文章補充了一個網絡研討會系列,介紹如何在雲端部署和管理容器化工作負載。該系列涵蓋了容器的基礎知識,包括容器的生命週期管理、部署多容器應用程序、縮放工作負載以及了解Kubernetes,並且強調了運行有狀態應用程序的最佳實踐。
本教程包含了系列中第一個會話“容器入門”中涉及的概念和命令。
介紹
Docker是一個用於部署和管理容器化應用的平台。由於容器提供的靈活性,它們在開發人員、管理員和devops工程師中非常受歡迎。
Docker有三個基本組件:
- Docker引擎
- Docker工具
- Docker註冊表
Docker引擎提供了管理容器的核心功能。它與底层的Linux操作系統接口,以暴露簡單的API來處理容器的生命週期。
Docker工具是一套命令行工具,用於與Docker引擎暴露的API進行通信。它們用於運行容器、創建新映像、配置存儲和網絡,以及执行許多其他影響容器生命週期的操作。
Docker Registry 是存放容器映像的地方。每個映像可以有多個版本,通過獨特的標籤來識別。用戶從註冊表拉取現有的映像,並將新映像推送到註冊表中。Docker Hub 是一個由 Docker, Inc. 管理的主機註冊表。您也可以在自己的環境中運行一個註冊表,將映像就更近於引擎。
在這個教程的最後,您將已在 DigitalOcean Droplet 上安装 Docker,管理容器,工作情况映像,添加持久化,並設定私人註冊表。
先決條件
要跟進這個教程,您需要:
- 一個依照 Ubuntu 16.04 初始服務設定教程 设定的 Ubuntu 16.04 Droplet,包括一個 sudo 非根用戶和防火墙。
-
一個 Docker Hub 帳戶。這份 Docker Hub 概述 將幫助您開始。
預設情況下,docker
命令需要 root 權限。然而,您可以通過將 docker
作為 docker 群組中的用戶運行,而不使用 sudo
前綴來執行命令。
要以此方式配置您的 Droplet,請運行命令 sudo usermod -aG docker ${USER}
。這將添加當前用戶到 docker
群組中。然後,運行命令 su - ${USER}
以應用新的群組成員資格。
本教學預期您的伺服器已配置為運行 docker
命令而不使用 sudo
前綴。
步驟 1 — 安裝 Docker
在 SSH 進入 Droplet 後,運行以下命令以刪除可能已安裝的任何現有的 docker 相關包,然後從官方存儲庫安裝 Docker:
安裝 Docker 後,使用以下命令驗證安裝:
上面的命令顯示了在環境中部署的Docker引擎的詳細信息。下面的命令驗證Docker工具是否正確安裝和配置。它應該打印Docker引擎和工具的版本。
##第二步:启动容器
Docker容器從现有的映像啟動,這些映像存储在 Registry 中。映像可以是私有或公共的。私有 Registry 需要用戶身份認證才能拉取映像。public 映像可以被任何人访问。
要搜索一個名稱為 hello-world
的映像,執行以下命令:
可能有多个映像匹配名称 hello-world
。選擇星星最多的一个,这表示该映像的人气。
使用以下命令检查本地环境中可用的映像:
由於我們還沒有啟動任何容器,所以不会有任何映像。現在我们可以下载映像并在本地运行:
如果我們不執行 docker run
而不拉取映像,Docker 引擎會在執行容器之前先拉取映像。再次執行 docker images
將會發現我們已經有 hello-world
映像可用於本地。
讓我們啟動一個更有意義的container:Apache Web服務器。
您可能會注意到传递給 docker run
命令的附加选项。這裡是這些開關的解釋:
- 以下為將上述內容翻譯為傳統中文的結果:
-p
— 这告訴Docker引擎在主機端口80
暴露容器的端口80
。因為Apache Listen在端口80
,我們需要暴露它為主機端口。 --name
— 这个参数给运行中的容器分配一个名称。如果我们忽略这个选项,Docker引擎将会随机分配一个名称。-d
— 这个选项指示Docker引擎以 detached模式运行容器。如果没有这个选项,容器将在前台运行,阻塞shell。通过将容器推入后台,我们可以继续使用shell,同时容器仍在运行。
要验证我们的容器确实在后台运行,可以使用以下命令:
输出显示名为web
的容器正在运行,端口80
映射为主机端口80
。
现在访问Web服务器:
使用以下命令停止并删除运行中的容器:
再次运行docker ps
确认容器已终止。
第3步 — 在容器中添加存储
容器是短暂的,这意味着存储在容器中的任何数据将在容器终止后丢失。要使数据持续到容器生命周期之外,我们需要将卷附加到容器上。卷是主机文件系统中的目录。
首先,在宿主机上创建一个新目录:
现在,使用以下命令启动容器,并附加上一个新的参数来挂载 htdocs
目录,将其指向 Apache 服务器的文档根目录:
该 -v
参数将容器内的 htdocs
目录映射到宿主机的文件系统中。在此目录中进行的任何更改都将同时在两个位置可见。
从容器内部运行以下命令以访问该目录:
此命令将您的终端连接到容器的交互式shell中。您应该看到自己现在位于容器内。
导航到 htdocs
文件夹并创建一个简单的 HTML 文件。最后,退出shell返回到宿主:
执行 curl localhost
命令再次显示Web服务器正在返回我们创建的页面。
我们可以不仅从宿主访问这个文件,还可以对其进行修改:
再次运行 curl localhost
确认Web服务器正在返回从宿主创建的最新页面。
使用以下命令终止容器(-f
强制Docker在不停止的情况下终止):
步驟 4 — 建立影像
除了從註冊表中運行現有的影像外,我們還可以創建自己的影像並將其存儲在註冊表中。
您可以使用現有的容器建立新影像。對容器所做的更改首先被提交,然後將影像標記並推送到註冊表。
讓我們再次啟動 httpd
容器並修改默認文件:
容器現在正在運行自定義的 index.html
。您可以使用 curl localhost
進行驗證。
在我們提交更改過的容器之前,停止它是一個好主意。停止後,我們將運行提交命令:
使用 docker images
命令確認影像的創建。它顯示了我們剛剛建立的 doweb
影像。
要標記並將此影像存儲在 Docker Hub 中,運行以下命令將您的影像推送到公共註冊表:
您可以通过在瀏覽器或命令行中搜索 Docker Hub 來驗證新影像。
步驟 5 — 啟動私有註冊表
可以将 registry 运行在私有环境中以保持图像的安全性。这也减少了 Docker Engine 与镜像存储库之间的延迟。
Docker 注册表可用作可以像其他容器一样启动的容器。由于注册表中存储了多个映像,因此将其附加到存储卷中是一个好主意。
注意,该容器已以端口 5000
暴露并使用主机文件系统上的 /registry
目录映射。您可以执行 docker ps
命令来验证容器是否正在运行。
现在,我们可以将本地映像标记为私有仓库。首先,从 Docker Hub 拉取 busybox
容器,然后对其进行标记。
前面的命令确认了 busybox
容器现在被标记为 localhost:5000
,所以现在可以将它推送到私有注册中心。
将映像推送到本地注册中心后,让我们尝试删除环境中的映像,然后从注册中心拉取它。
我们已经完成了整个循环:拉取映像、标记它、将其推送到本地注册中心,最后从注册中心拉取它。
可能会有这样的情况,即您想在专用主机上运行私有注册中心。运行在不同机器上的 Docker Engine 将与远程注册中心通信以拉取和推送映像。
由於 Registry 並未加密,我们需要修改 Docker Engine 的配置以允許存取不安全的 Registry。要進行這項作業,編輯位於 /etc/docker/daemon.json
的檔案。如果該檔案不存在,請手动创建。
在檔案中加入以下內容:
{
"insecure-registries" : ["REMOTE_REGISTRY_HOST:5000"]
}
將 REMOTE_REGISTRY_HOST
替换為远程 Registry 的主机名或 IP 位址。 restart Docker Engine 以確保配置變更已生效。
## 結論
本教程幫助您開始使用 Docker。它涵盖了基本概念,包括安装、容器管理、映像管理、存储和私有 Registry。接下来的會话和文章 將會在這一系列中繼續協助您深入瞭解 Docker 的應用。
Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-docker