網絡研讨会系列:開始使用容器

這篇文章補充了一個網絡研討會系列,介紹如何在雲端部署和管理容器化工作負載。該系列涵蓋了容器的基礎知識,包括容器的生命週期管理、部署多容器應用程序、縮放工作負載以及了解Kubernetes,並且強調了運行有狀態應用程序的最佳實踐。

本教程包含了系列中第一個會話“容器入門”中涉及的概念和命令。

介紹

Docker是一個用於部署和管理容器化應用的平台。由於容器提供的靈活性,它們在開發人員、管理員和devops工程師中非常受歡迎。

Docker有三個基本組件:

  • Docker引擎
  • Docker工具
  • Docker註冊表

Docker引擎提供了管理容器的核心功能。它與底层的Linux操作系統接口,以暴露簡單的API來處理容器的生命週期。

Docker工具是一套命令行工具,用於與Docker引擎暴露的API進行通信。它們用於運行容器、創建新映像、配置存儲和網絡,以及执行許多其他影響容器生命週期的操作。

Docker Registry 是存放容器映像的地方。每個映像可以有多個版本,通過獨特的標籤來識別。用戶從註冊表拉取現有的映像,並將新映像推送到註冊表中。Docker Hub 是一個由 Docker, Inc. 管理的主機註冊表。您也可以在自己的環境中運行一個註冊表,將映像就更近於引擎。

在這個教程的最後,您將已在 DigitalOcean Droplet 上安装 Docker,管理容器,工作情况映像,添加持久化,並設定私人註冊表。

先決條件

要跟進這個教程,您需要:

預設情況下,docker 命令需要 root 權限。然而,您可以通過將 docker 作為 docker 群組中的用戶運行,而不使用 sudo 前綴來執行命令。

要以此方式配置您的 Droplet,請運行命令 sudo usermod -aG docker ${USER}。這將添加當前用戶到 docker 群組中。然後,運行命令 su - ${USER} 以應用新的群組成員資格。

本教學預期您的伺服器已配置為運行 docker 命令而不使用 sudo 前綴。

步驟 1 — 安裝 Docker

在 SSH 進入 Droplet 後,運行以下命令以刪除可能已安裝的任何現有的 docker 相關包,然後從官方存儲庫安裝 Docker:

  1. sudo apt-get remove docker docker-engine docker.io
  2. sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
  3. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  4. sudo apt-key fingerprint 0EBFCD88
  5. sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  6. sudo apt-get update
  7. sudo apt-get install -y docker-ce

安裝 Docker 後,使用以下命令驗證安裝:

  1. docker info

上面的命令顯示了在環境中部署的Docker引擎的詳細信息。下面的命令驗證Docker工具是否正確安裝和配置。它應該打印Docker引擎和工具的版本。

  1. docker version

##第二步:启动容器

Docker容器從现有的映像啟動,這些映像存储在 Registry 中。映像可以是私有或公共的。私有 Registry 需要用戶身份認證才能拉取映像。public 映像可以被任何人访问。

要搜索一個名稱為 hello-world 的映像,執行以下命令:

  1. docker search hello-world

可能有多个映像匹配名称 hello-world。選擇星星最多的一个,这表示该映像的人气。

使用以下命令检查本地环境中可用的映像:

  1. docker images

由於我們還沒有啟動任何容器,所以不会有任何映像。現在我们可以下载映像并在本地运行:

  1. docker pull hello-world
  2. docker run hello-world

如果我們不執行 docker run 而不拉取映像,Docker 引擎會在執行容器之前先拉取映像。再次執行 docker images 將會發現我們已經有 hello-world 映像可用於本地。

讓我們啟動一個更有意義的container:Apache Web服務器。

  1. docker run -p 80:80 --name web -d httpd

您可能會注意到传递給 docker run 命令的附加选项。這裡是這些開關的解釋:

  • 以下為將上述內容翻譯為傳統中文的結果:

    -p — 这告訴Docker引擎在主機端口80暴露容器的端口80。因為Apache Listen在端口80,我們需要暴露它為主機端口。

  • --name — 这个参数给运行中的容器分配一个名称。如果我们忽略这个选项,Docker引擎将会随机分配一个名称。
  • -d — 这个选项指示Docker引擎以 detached模式运行容器。如果没有这个选项,容器将在前台运行,阻塞shell。通过将容器推入后台,我们可以继续使用shell,同时容器仍在运行。

要验证我们的容器确实在后台运行,可以使用以下命令:

  1. docker ps

输出显示名为web的容器正在运行,端口80映射为主机端口80

现在访问Web服务器:

  1. curl localhost

使用以下命令停止并删除运行中的容器:

  1. docker stop web
  2. docker rm web

再次运行docker ps确认容器已终止。

第3步 — 在容器中添加存储

容器是短暂的,这意味着存储在容器中的任何数据将在容器终止后丢失。要使数据持续到容器生命周期之外,我们需要将卷附加到容器上。卷是主机文件系统中的目录。

首先,在宿主机上创建一个新目录:

  1. mkdir htdocs

现在,使用以下命令启动容器,并附加上一个新的参数来挂载 htdocs 目录,将其指向 Apache 服务器的文档根目录:

  1. docker run -p 80:80 --name web -d -v $PWD/htdocs:/usr/local/apache2/htdocs httpd

-v 参数将容器内的 htdocs 目录映射到宿主机的文件系统中。在此目录中进行的任何更改都将同时在两个位置可见。

从容器内部运行以下命令以访问该目录:

  1. docker exec -it web /bin/bash

此命令将您的终端连接到容器的交互式shell中。您应该看到自己现在位于容器内。

导航到 htdocs 文件夹并创建一个简单的 HTML 文件。最后,退出shell返回到宿主:

  1. cd /usr/local/apache2/htdocs
  2. echo '<h1>Hello World from Container</h1>' > index.html
  3. exit

执行 curl localhost 命令再次显示Web服务器正在返回我们创建的页面。

我们可以不仅从宿主访问这个文件,还可以对其进行修改:

  1. cd htdocs
  2. cat index.html
  3. echo '<h1>Hello World from Host</h1>' | sudo tee index.html >/dev/null

再次运行 curl localhost 确认Web服务器正在返回从宿主创建的最新页面。

使用以下命令终止容器(-f 强制Docker在不停止的情况下终止):

  1. docker rm -f web

步驟 4 — 建立影像

除了從註冊表中運行現有的影像外,我們還可以創建自己的影像並將其存儲在註冊表中。

您可以使用現有的容器建立新影像。對容器所做的更改首先被提交,然後將影像標記並推送到註冊表。

讓我們再次啟動 httpd 容器並修改默認文件:

  1. docker run -p 80:80 --name web -d httpd
  2. docker exec -it web /bin/bash
  3. cd htdocs
  4. echo '<h1>Welcome to my Web Application</h1>' > index.html
  5. exit

容器現在正在運行自定義的 index.html。您可以使用 curl localhost 進行驗證。

在我們提交更改過的容器之前,停止它是一個好主意。停止後,我們將運行提交命令:

  1. docker stop web
  2. docker commit web doweb

使用 docker images 命令確認影像的創建。它顯示了我們剛剛建立的 doweb 影像。

要標記並將此影像存儲在 Docker Hub 中,運行以下命令將您的影像推送到公共註冊表:

  1. docker login
  2. docker tag your_docker_hub_username/doweb
  3. docker push your_docker_hub_username/doweb

您可以通过在瀏覽器或命令行中搜索 Docker Hub 來驗證新影像。

步驟 5 — 啟動私有註冊表

可以将 registry 运行在私有环境中以保持图像的安全性。这也减少了 Docker Engine 与镜像存储库之间的延迟。

Docker 注册表可用作可以像其他容器一样启动的容器。由于注册表中存储了多个映像,因此将其附加到存储卷中是一个好主意。

  1. docker run -d -p 5000:5000 --restart=always --name registry -v $PWD/registry:/var/lib/registry registry

注意,该容器已以端口 5000 暴露并使用主机文件系统上的 /registry 目录映射。您可以执行 docker ps 命令来验证容器是否正在运行。

现在,我们可以将本地映像标记为私有仓库。首先,从 Docker Hub 拉取 busybox 容器,然后对其进行标记。

  1. docker pull busybox
  2. docker tag busybox localhost:5000/busybox
  3. docker images

前面的命令确认了 busybox 容器现在被标记为 localhost:5000,所以现在可以将它推送到私有注册中心。

  1. docker push localhost:5000/busybox

将映像推送到本地注册中心后,让我们尝试删除环境中的映像,然后从注册中心拉取它。

  1. docker rmi -f localhost:5000/busybox
  2. docker images
  3. docker pull localhost:5000/busybox
  4. docker images

我们已经完成了整个循环:拉取映像、标记它、将其推送到本地注册中心,最后从注册中心拉取它。

可能会有这样的情况,即您想在专用主机上运行私有注册中心。运行在不同机器上的 Docker Engine 将与远程注册中心通信以拉取和推送映像。

由於 Registry 並未加密,我们需要修改 Docker Engine 的配置以允許存取不安全的 Registry。要進行這項作業,編輯位於 /etc/docker/daemon.json 的檔案。如果該檔案不存在,請手动创建。

在檔案中加入以下內容:

Editing /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