在 Ubuntu 上精通 Docker:實戰部署指南

如果您正在尋找有關在Ubuntu上安裝Docker的信息,那麼您來到了正確的地方。不僅如此,作為一個額外的好處,本教程還將教您如何運行基本的Docker命令來運行和管理容器。

通過使用Visual Studio(VS)Code的方便功能,您還將學習如何提升您的SSH技能。讓我們開始吧!

相關資源: 在Linux世界中的Windows用戶:VS Code和遠程SSH

先決條件

如果您想一步一步地跟著進行,請確保您擁有以下內容:

  • A fresh install of Ubuntu Server LTS with SSH Enabled (This guide will be using Ubuntu Server LTS 20.04.1)
  • A Windows Machine with VSCode installed (This guide will be using Visual Studio Code 1.52.1)
  • 已安裝並連接到Ubuntu Server LTS的VSCode官方SSH擴展

在Ubuntu上安裝Docker

首先,在Ubuntu上安裝Docker。在這一點上,本教程假設您正在本地的Windows計算機上打開VS Code,通過SSH連接到您的Ubuntu Server。在使用VS Code和SSH的最新文章中學習如何設置這個方便的環境。

在下面的示例中,VSCode通過SSH與Ubuntu遠程連接,將home文件夾(在本例中為/home/homelab)作為工作區打開:

VSCode when SSHed into a Ubuntu Machine

在Ubuntu Server上安裝Docker的實際過程只需要兩個命令。Ubuntu將Docker作為一個安裝選項提供在Ubuntu中預設的軟體包管理器中,稱為apt

在VS Code的SSH終端視窗中,運行以下兩個命令來安裝Docker:

sudo apt update -y
sudo apt install docker.io -y

在安裝Ubuntu Server時,你可能被提供了將Docker安裝為snap的選項。如果你這樣做了,首先運行sudo snap remove docker來移除snap軟體包

你可以在下面的動畫中觀看Docker的安裝過程:

The Installation Process for Docker on Ubuntu

Ubuntu很好地自動啟用並設置了開機啟動服務,所以你可以開始使用Docker了!

在Ubuntu上創建並運行Docker容器

現在你已經安裝了Docker,你可以用它做什麼呢?讓我們從創建一個Docker容器開始。這個教程將設置一個靜態網頁伺服器作為一個Docker容器的良好範例。在本節中,你將:

  • Docker Hub映像庫中設置一個新的容器來運行HTTP服務
  • 使用端口映射將容器內的HTTP端口映射到你的Ubuntu主機上
  • 設置綁定掛載以將容器內的重要數據映射到你的Ubuntu主機上
  • 設置容器的持久性,即使重新啟動

如果上述步驟中有任何一個聽起來讓您困惑,不用擔心,我們會逐步解釋每一個步驟,以幫助您理解整個過程。

下載Docker映像

首先,您需要問的問題是,這個容器將從哪裡來?讓我們來看一下Docker Hub。

A large part of Docker is understanding image repositories. Rather than being distributed like packages, services in Docker get distributed as Docker Images.

A Docker Image is a snapshot of the software that the publisher wants to distribute and the entire filing system! This is analogous to creating .wim image of Windows.

這個文件系統的捕捉使Docker如此受歡迎:軟件與整個操作環境一起捕捉。這樣做可以消除不同服務器環境之間引入的問題。

最受歡迎(也是默認的)的圖像庫之一是Docker Hub,也被稱為官方Docker庫。圖像庫是您可以下載成千上萬個預先創建的Docker映像以運行為容器的地方。

由於本教程正在設置一個靜態網絡服務器,所以您需要下載一個網絡服務器映像。目前最受歡迎的兩個網絡服務器是Apache httpdNginx,但為了改變一下並可能向您介紹一個新的網絡服務器,讓我們使用一個叫做Caddy的網絡服務器。

Caddy是一個以簡單性而聞名的網絡服務器。許多有效的服務器配置可以使用文件中的一行部署。簡單就是好,也可以作為一個很好的基本示例。

  1. 首先,您需要找到Docker映像。在Windows机器上,导航到https://hub.docker.com
  2. 在页面的左上角进行搜索。您应该会看到类似以下的页面:
Searching for caddy on the Docker Hub

A benefit (and downside) of Docker Hub is that anyone, even you, can create and upload Docker Images to the site.

您必须小心确保所选择的映像来自可信的来源。任何人都可以选择在映像中放置恶意软件并将其上传到Docker Hub。

3. 记下映像的名称。在上面的屏幕截图中,名称是精确的。您将需要此名称来在下一步中指定映像名称。

在Ubuntu上使用Docker运行容器

一旦您知道要下载的映像的名称,就可以下载它并从中创建一个容器。

从映像启动一个容器只需要一个命令。在连接到Ubuntu服务器的SSH终端中,运行以下docker run命令。

下面的命令检查本地机器上是否存在映像。如果不存在,则从Docker Hub下载映像,创建并启动容器。下面的命令使用-p开关将Ubuntu服务器的监听端口80映射到容器的端口80。这个功能称为端口映射。

sudo docker run -p 80:80 caddy

大多数Docker Hub映像遵循/的命名约定。然而,由Docker官方品牌的映像前面没有(像上面的caddy)。

運行上述命令將輸出如下內容,caddy的日誌信息將直接顯示在終端中:

Running the Caddy Docker container

你可能會注意到幾乎所有docker命令都以sudo為前綴,以便將命令強制設置為以系統管理員身份運行。默認情況下,docker服務以root身份運行,您對容器或鏡像所做的所有更改都必須以系統管理員身份進行。

現在,您已經設置好了!就是這樣。您是否很高興在Ubuntu上安裝了Docker?

現在,在Windows計算機上導航到http://<your-ip>,您應該能夠看到Caddy的首頁。下面是該首頁的截圖(本指南的IP已替換為http://homelab-docker):

The default landing page for Caddy

caddy容器現在正在運行,但您可能已經注意到了一個問題。運行該docker命令會占用您的命令行。您無法運行其他命令,如果會話結束,運行中的容器也會停止運行。讓我們通過在後台運行容器(也稱為分離容器)來解決這個問題。

在後台運行Docker容器

現在您已經有一個運行中的容器,但是您的命令行被阻塞了。您無法做其他任何事情。您需要一種更好的方式來啟動容器,即在後台像服務一樣運行它。具體步驟如下:

  1. 通過在命令行中按下control+c來停止當前容器。這應該會還原您的命令行。
  2. 現在,重新執行與之前相同的命令,只是這次加上了-d參數,如下所示。您將看到Docker會返回一個容器ID並將命令行傳回給您。
sudo docker run -d -p 80:80 caddy
Running a detached container

使用Docker命令管理後台容器

一旦您運行了一個或多個後台Docker,您需要以某種方式管理它們。Docker提供了一些不同的命令,可以使用docker container命令來進行管理。

  • sudo docker container list -a:列出所有容器(包括正在運行和停止的容器)及其狀態
  • sudo docker container stop <name>:停止指定名稱(或ID)的Docker容器
  • sudo docker container start <name>:啟動指定名稱(或ID)的Docker容器
  • sudo docker container prune:銷毀並移除所有停止的容器

您可以在下面的屏幕截圖中看到上述所有命令的使用上下文:

Managing detached containers using docker container commands

有很多其他的docker container命令可以用來查看、更改、檢查甚至遠程連接到您的服務器上的容器。您可以運行sudo docker container --help來查看它們。

即使您現在在後台運行一個包含Web服務器的容器,您仍然無法托管自己的自定義內容。目前,Caddy只能提供預設的網頁。

現在讓我們來看看如何使用Docker映像和稱為綁定掛載的概念來部署包含有意義數據的容器。

使用綁定掛載存儲容器數據

Docker的工作原理是將映像(以及它們生成的容器)視為可丟棄或瞬時的。如果Caddy軟體有更新,您不會更新服務,而是將整個映像以及生成的容器刪除,然後從頭開始使用全新的映像。

這樣做的好處是顯著的。通過不斷更新(可能)數年前的軟體,會引入軟體的不穩定性。通過每次使用全新映像,Docker為您提供穩定、可靠、(可能)經過測試的基礎。

這個概念等同於每次更新Windows應用軟體時都使用全新的Windows安裝。在Windows上這並不是一個有趣的想法,但在Docker中非常適用。

然而,可丟棄的方法論有個明顯的問題。當您當前的服務被刪除時,您不希望重要數據被丟棄。Docker使用稱為綁定掛載的概念來解決這個問題。

現在讓我們來探索如何為容器創建一個綁定掛載。

創建文件夾結構並進行整理

在使用綁定掛載之前,您需要創建一個位置來存儲這些數據。本教程將在您的用戶目錄中創建一個文件夾。要在仍然連接到Ubuntu服務器的VS Code中進行操作:

  1. 在VS Code的Explorer面板的空白区域中,右键单击并选择新建文件夹。

2. 将新文件夹命名为containers/caddy/files。

文件夹名称由您自定义,只要在即将使用的docker命令中正确定义即可。通过使用正斜杠,VS Code将解释为创建三个文件夹。files文件夹是caddy的子目录,caddy是containers的子目录。您不必使用这个文件夹结构,但当在同一服务器上有多个容器时,这个结构更加合理。

如果之前没有这样做,请停止并删除之前创建的所有容器:

# 停止并删除当前运行的所有容器。
# $(sudo docker ps -q) 动态获取所有正在运行的容器ID
sudo docker container stop $(sudo docker ps -q)
sudo docker container prune

您可以在下面的屏幕截图中看到此命令:

Using the VSCode Explorer Window

使用绑定挂载部署Caddy容器

现在在Ubuntu服务器上构建了文件夹结构。现在是时候创建一个带有绑定挂载的Caddy容器了。

  1. 在进行下一步之前,请确定您正在使用的容器存储持久数据的位置。这个位置因为Docker镜像的创建者和用途而异。

找到持久性数据存储的最佳方法是查看所讨论的Docker Hub镜像的文档。对于Caddy,您可以在此处找到文档:这里

The Caddy documentation on Docker Hub

2. 使用以下命令启动容器。参数-v ~/containers/caddy/files:/usr/share/caddy将冒号(~/containers/caddy/files)前面的路径映射到容器内的文件夹(/usr/share/caddy)。这与端口映射命令非常相似:只是您将文件夹映射而不是端口。这种类型的命令称为绑定挂载

# 将主机上的文件夹(冒号前面的路径)绑定到
# 容器内的 /usr/share/caddy
sudo docker run -d -p 80:80 -v ~/containers/caddy/files:/usr/share/caddy caddy

上述代码中的波浪号(~)表示主文件夹。对于本文而言,这相当于/home/homelab

3. 打开浏览器,导航回服务器的HTTP地址。您会注意到服务器现在正在提供404页面。这是因为您当前在~/containers/caddy/files中没有index.html文件。

4. 在VS Code资源管理器窗口中的Ubuntu服务器上的~/containers/caddy/files中创建一个看起来像下面这样的index.html文件:

<body><h2>hello world!</h2></body>

5. 导航到服务器的HTTP地址,并确认容器现在正在提供您的新的index.html页面。

您可以在以下动画中看到上述所有内容:

container is now serving your new index.html page.

与Docker管理命令不同,您创建的文件(如index.html)不需要管理员权限。这是因为您拥有Caddy服务器提供的内容,它们位于您的主文件夹中。

验证绑定挂载

太棒了!您不仅使用了一个全新的Docker容器,而且该容器正在为您本地保存的主文件夹中的内容提供服务!您可以通过运行以下命令来证明这一点:

  1. 停止并删除正在运行的容器。此步骤将完全删除一切,包括如果您不使用绑定挂载,则删除index.html文件。
sudo docker container stop $(sudo docker ps -q)
sudo docker container prune

2. 创建一个全新的容器。

sudo docker run -d -p 80:80 -v ~/containers/caddy/files:/usr/share/caddy caddy

3. 验证新容器是否仍然在http://<your server>地址上提供index.html文件。

创建持久化的Docker容器

A container isn’t that useful if it stops when the server reboots. By default, that’s what is going to happen if you don’t make it happen. To prevent this, let’s generate a new caddy container again but this time once that restarts when the Docker host, Ubuntu in this case, restarts.

  1. 停止并删除所有正在运行的容器。
# 停止并删除当前所有正在运行的容器
sudo docker container stop $(sudo docker ps -q)
sudo docker container prune

2. 使用--restart always参数重新启动caddy容器,将这个新容器设置为在主机重新启动时启动。有了--restart always标志,您的容器现在就像一个正常的服务一样运行:在启动时自动启动。

sudo docker run -d -p 80:80 -v ~/containers/caddy/files:/usr/share/caddy --restart always caddy

3. 重新启动服务器。

4. 现在验证新容器是否启动并在http://<your server>地址上继续提供index.html文件。

下面是应用的命令:

Setting caddy to restart on boot

繼續前進

在這個階段,您應該已經擁有一個可運作的Docker環境,並對映像和容器有基本的了解。您可以拉取、啟動、停止和進行基本的容器管理。您還成功地使用綁定掛載和端口映射創建了一個運行中的網絡服務容器。

關於Docker,還有很多內容需要涵蓋:請繼續關注這個空間,下一篇文章將介紹使用Docker Compose進行高級Docker管理。

Source:
https://adamtheautomator.com/docker-ubuntu/