Linux中國

Linux 下的 Docker 入門教程

面向初學者的 Docker 基本命令指南。

這篇詳細的 Docker 教程覆蓋了核心的 Docker 命令,比如,如何創建新容器、運行容器、刪除容器等。另外,這篇教程也解釋了如何從已有的容器構建你自己的 Docker 鏡像,如何移除容器和鏡像。言歸正傳,現在開始 Docker 的基本用法。

Docker 安裝步驟

大多數現代 Linux 操作系統都可以安裝 Docker。如果還沒安裝過 Docker,請參考下面的步驟:

什麼是 Docker 鏡像和 Docker 容器?

在開始 Docker 之前,我先說明一下 Docker 鏡像和 Docker 容器是什麼。

Docker 鏡像是一個描述容器如何運行的的文件,Docker 容器是 Docker 鏡像在運行或被終止時的一個階段。

容器和主機上的其他文件是隔離的。

當我們運行一個 Docker 容器的時候,它會使用一個被隔離出來的文件系統,這個文件系統是由一個 Docker 鏡像提供的。Docker 鏡像包含了運行應用程序所需要的一切東西 - 所有的依賴、配置、腳本、二進位文件等等。

鏡像也包含容器所需要的其他配置項,比如說環境變數、默認運行的命令,以及其他元數據。

Linux 下的 Docker 入門

下面的所有步驟都已在 Ubuntu 22.04、20.04 以及 18.04 LTS 伺服器版本中測試通過。後續小節中提供的步驟對於所有 Linux 平台都是通用的。比如,在基於 RHEL 的系統中(比如 AlmaLinux)可以運行相同的命令。

1、搜索 Docker 鏡像

我們可以從叫做 Docker hub 的 Docker 官方庫獲得鏡像,或者我們也可以製作自己的鏡像。

有些人可能不清楚,Docker hub 是一個線上的中心化倉庫,Docker 用戶們在上面構建、測試、然後保存他們的 Docker 鏡像。Docker hub 有數以萬計的 Docker 鏡像,而且這個數字還在每天增長。

你可以從命令行通過 `docker search 命令搜索任意 Docker 鏡像。

比如要搜索基於 Alpine Linux 的 Docker 鏡像,運行:

$ sudo docker search alpine

輸出結果:

Search Docker Images

搜索基於 Ubuntu 的鏡像,運行:

$ sudo docker search ubuntu

你還可以搜索其他任意的應用,比如 Nginx,像下面這樣:

$ sudo docker search nginx

Docker hub 有各種各樣的鏡像。你能在 Docker hub 上找到各種已構建好的 Docker 鏡像,比如說操作系統、應用,或者多個應用的合體(比如 LAMP 棧)。

如果你找的東西不在上面,你還可以構建一個鏡像,然後通過 Docker hub 向其他人開放,或者只是自己用。

2、下載 Docker 鏡像

從終端運行下面的命令可以下載 Ubuntu OS 的 Docker 鏡像:

$ sudo docker pull ubuntu

上面的這個命令會從 Docker hub 下載最新的 Ubuntu 鏡像。

輸出結果:

Using default tag: latest
latest: Pulling from library/ubuntu
405f018f9d1d: Pull complete
Digest: sha256:b6b83d3c331794420340093eb706a6f152d9c1fa51b262d9bf34594887c2c7ac
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

你也可以用下面的命令下載指定版本的 Ubuntu 鏡像:

$ sudo docker pull ubuntu:20.04

Docker 允許我們下載任何鏡像,並且在那個鏡像上創建容器,這些操作與主機的操作系統無關。

比如要下載 Alpine 系統的鏡像,運行:

$ sudo docker pull alpine

Download Docker Images

3、列出 Docker 鏡像

所有已下載的 Docker 鏡像都保存在 /var/lib/docker 路徑下。

要查看所有已下載的 Docker 鏡像,運行:

$ sudo docker images

輸出結果:

REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       latest    27941809078c   3 weeks ago   77.8MB
ubuntu       20.04     20fffa419e3a   3 weeks ago   72.8MB
alpine       latest    e66264b98777   5 weeks ago   5.52MB

List Docker Images

從上面可以看出來,我已經下載了三個 Docker 鏡像 - Ubuntu latest、Ubuntu 20.04 和 Alpine Linux。

現在,我們看一下接下來如何從下載的鏡像啟動或者運行容器。

4、運行 Docker 容器

有兩種方法我們可以啟動一個容器 - 使用 Docker 鏡像的 標籤 TAG 或者 鏡像 ID Image ID

標籤指的是一個特定的鏡像快照, 鏡像 ID Image ID 是那個鏡像對應的唯一識別碼。

可以查看下面這個截圖:

Docker Image Tag and ID

從上面的解脫可以看到,標籤是 latest20.04

  • 27941809078c 是 Ubuntu latest 的 Docker 鏡像的鏡像 ID,
  • 20fffa419e3a 是 Ubuntu 20.04 的 Docker 鏡像的鏡像 ID,
  • e66264b98777 是 Alpine latest 的 Docker 鏡像的鏡像 ID。
4.1、使用標籤運行容器

下載選擇好的 Docker 鏡像後,運行下面的命令來啟動 Docker 容器,並且通過它的標籤進行連接。

$ sudo docker run -t -i ubuntu:latest /bin/bash

或者,

$ sudo docker run -it ubuntu:latest /bin/bash

這裡,

  • -t:在 Ubuntu 容器內分配一個偽終端。
  • -i:通過從容器獲取一個標準輸入(STDIN),允許我們創建一個可交互的連接。
  • ubuntu:latest:標籤為 latest 的 Ubuntu Docker 鏡像。
  • /bin/bash:新容器的 BASH shell。這個是可選項。如果你不加 shell 的話,會分配默認的 shell 給容器。

啟動容器後,會自動進入容器的 shell(命令行):

Run Containers Using Tag

基於最新 Ubuntu 鏡像的容器現在已經啟動了。所有的新容器都會被賦予一個名字和唯一的 ID。從上面的輸出可以看到,那個 Ubuntu 容器的 ID 是 2f2a5b826762。一會兒我們會看到從哪找到容器的名字。

現在就可以在容器裡面工作了。當你完成容器內的工作後,你可以回到主機操作系統的終端(在我這個例子中,操作系統是 Ubuntu 22.04 LTS)而不需要關掉容器(客戶機)。

4.2、從運行中的容器中脫離

使用 CTRL+P 然後 CTRL+Q 就可以從運行中的容器脫離(不需要關閉)。

現在,你就回到了你原來的主機的終端窗口。請注意,容器還在後台運行中,我們並沒有關掉它。

4.3、使用鏡像 ID 運行容器

另一種啟動容器並且連接進去的方式是通過使用鏡像 ID,像下面這樣:

$ sudo docker run -it 20fffa419e3a /bin/bash

這裡,

  • 20fffa419e3a - 鏡像 ID

CTRL+P 然後 CTRL+Q 可以從當前容器中脫離回到主機系統的終端。我們只是從容器中脫離,但是沒有讓它停止。容器仍然在後台運行中。

4.4. 在脫離模式中運行容器

在前面的小結中,我們啟動了一個容器並且立刻連接了進去。然後當容器中的工作結束後,我們從容器中脫離了出來。

你也可以在脫離模式(不需要自動連接進去)中啟動容器。

在後台運行一個容器,輸入命令:

$ sudo docker run -it -d alpine:latest

輸出結果:

d74f2ceb5f3ad2dbddb0b26e372adb14efff91e75e7763418dbd12d1d227129d

上面輸出結果的前 12 字元代表的是容器的 ID。

通過 docker ps 命令,你可以驗證容器是否在運行:

$ sudo docker ps
CONTAINER ID   IMAGE           COMMAND     CREATED         STATUS         PORTS     NAMES
d74f2ceb5f3a   alpine:latest   "/bin/sh"   3 seconds ago   Up 2 seconds             zen_pascal

Run Containers In Background

從上面個的輸出結果中可以看到,我們創建了一個 Alpine 容器,但是還沒有連接進去。

如果你想連接進去,很簡單,運行:

$ sudo docker attach d74f2ceb5f3a

5、查看運行中的容器

查看運行中的容器,運行下面的命令:

$ sudo docker ps

輸出結果:

CONTAINER ID   IMAGE           COMMAND       CREATED          STATUS          PORTS     NAMES
f7e04eed577e   20fffa419e3a    "/bin/bash"   6 minutes ago    Up 6 minutes              brave_mclean
2f2a5b826762   ubuntu:latest   "/bin/bash"   18 minutes ago   Up 18 minutes             hungry_leavitt

View Running Containers

這裡,

  • f7e04eed577e 是由鏡像 2f2a5b826762 創建的 Ubuntu 容器的 ID。並且,brave_mclean 是這個容器的名字。
  • 2f2a5b826762 是由鏡像 「ubuntu:latest」 創建的 Ubuntu 容器的 ID。並且,hungry_leavitt 是這個容器的名字。

當一個新容器被創建後,會賦給它一個唯一的 ID 和名字,這樣我們就能通過它的 ID 和名字來連接它。

注意:請注意容器 ID 和 Docker 鏡像 ID 是不同的

列出所有可用的(運行或者停止)容器,運行:

$ sudo docker ps -a

6、從運行中的容器脫離或連接

首先,通過 docker ps 命令找到容器的 ID。

$ sudo docker ps

然後,運行 docker attach 命令連接到運行中的容器。

$ sudo docker attach <container-id>

比如像下面這樣,我要連接到 ID 為 f7e04eed577e 的容器:

$ sudo docker attach f7e04eed577e

你也可以通過使用它的名字連接到一個容器。

$ sudo docker attach brave_mclean

現在你就登錄到這個容器了。

想要從容器脫離,只要按 CTRL+P 然後 CTRL+Q

7、啟動、重啟、暫停和終止容器

你可以使用容器的名字或 ID 來啟動,重啟,暫停或者終止一個 Docker 容器。

首先,通過 docker ps -a 命令找到容器的名字或 ID。

Find Container ID And Name

現在,通過使用 docker start 命令,加上名字或 ID,你可以啟動一個容器,像下面這樣:

$ sudo docker start modest_cray
$ sudo docker start 10615254bb45

用空格隔開,就可以啟動多個容器,像下面這樣:

$ sudo docker start 24b5ee8c3d3a 56faac6d20ad d74f2ceb5f3a

優雅的重啟一個運行中的容器,運行:

$ sudo docker start 10615254bb45

暫停一個運行中的容器:

$ sudo docker pause 10615254bb45

把暫停的容器恢復過來:

$ sudo docker unpause 10615254bb45

直到其它容器都停止前,阻塞一個容器:

$ sudo docker wait 10615254bb45

我們可以很容易地通過使用它的名字或 ID 來終止一個容器。如果你已經在容器的 shell 里了,只需要運行下面的命令就可以非常簡單的終止:

# exit

你也可以使用下面的命令從 Docker 的主機系統中終止(關閉容器)容器:

$ sudo docker stop 10615254bb45

用空格隔開,你可以退出多個容器,像下面這樣。

$ sudo docker stop 35b5ee8c3d3a 10615254bb45

在退出容器之後,通過列出所有容器的命令來確保它確實被終止了:

$ sudo docker ps

8、強行關閉 Docker 容器

docker stop 命令可以非常優雅的關掉運行中的容器。有時候,你可能卡在一個沒有響應的容器,或者你想強制關掉容器。

通過給一個運行中的容器發送 SIGKILL 來強行關閉容器,運行:

$ sudo docker kill 10615254bb45

9、在關閉容器後自動刪除他們

也許你想測試一個容器,然後當你完成在容器中的工作就把它刪掉。如果是這樣,通過使用 --rm 標籤在關閉後自動刪掉容器:

$ sudo docker run -it --rm debian:latest

當你從容器中退出,它會自動被刪掉。

Automatically Delete Containers

從上面的結果可以看到,我先創建了一個新的 Debian 容器。當我退出這個容器的時候,它就被自動刪掉了。docker ps -a 命令的輸出結果顯示,Debian 容器現在不存在。

10、給容器命名

如果你再看一下之前命令的輸出結果,當你啟動一個容器的時候,每個容器都被賦予了一個隨機的名字。如果你不命名你的容器,Docker 會自動替你給他們命名。

現在看一下下面的例子:

$ sudo docker run -it -d alpine:latest
2af79e97a825c91bf374b4862b9e7c22fc22acd1598005e8bea3439805ec335d
$ sudo docker run -it -d alpine:latest
80b53b7e661d33696b65c78267fc3f067b6100799c925910db4721963e3fae0a
$ sudo docker ps
CONTAINER ID   IMAGE           COMMAND     CREATED         STATUS         PORTS     NAMES
80b53b7e661d   alpine:latest   "/bin/sh"   3 seconds ago   Up 2 seconds             bold_margulis
2af79e97a825   alpine:latest   "/bin/sh"   6 seconds ago   Up 5 seconds             recursing_taussig

從上面的結果可以看到,儘管我用同一個 Docker 鏡像創建了兩個容器,它們獲得了不同的 ID 和名字。

如果你想給容器賦一個不變的名字,使用 --name 標籤,像下面這樣:

$ sudo docker run -it -d --name ostechnix_alpine alpine:latest

上面的命令會在脫離模式中創建一個叫做 ostechnix_alpine 的新容器。

我們看一下當前運行的容器列表:

$ sudo docker ps

輸出結果:

CONTAINER ID   IMAGE           COMMAND     CREATED         STATUS         PORTS     NAMES
397111fac537   alpine:latest   "/bin/sh"   2 seconds ago   Up 2 seconds             ostechnix_alpine
80b53b7e661d   alpine:latest   "/bin/sh"   7 minutes ago   Up 7 minutes             bold_margulis
2af79e97a825   alpine:latest   "/bin/sh"   7 minutes ago   Up 7 minutes             recursing_taussig

Assign Name To Containers

注意到上面輸出結果中的第一個容器的名字了嗎?對了,我們給這個容器分配了一個自定義的名字(也就是 ostechnix_alpine)。

給容器分配自定義的名字可以給我們帶來其他好處。只要看一下容器的名字,我們就能很容易的確定那個容器裡面安裝了什麼。

11、構建自定義 Docker 鏡像

Docker 不僅僅是下載和使用已存在的容器。你也可以創建自己的自定義 Docker 鏡像。

現在我們開始一個 Ubuntu 容器:

$ sudo docker run -it ubuntu:latest

現在,你會進入到容器的 shell。

然後,在容器中,你可以安裝任何的軟體或者做你想做的事情。

比如,我們在容器中安裝 Apache Web 伺服器。

# apt update
# apt install apache2

相似地,在容器中,可以根據自己的需要安裝和測試軟體。

完成以後,從容器脫離(不要退出)回到主機系統的 shell。不要終止或者關閉容器。使用 CTRL+P 然後 CTRL+Q 從容器中脫離,這樣不會關閉容器。

在你的 Docker 主機的終端,運行下面的命令來找到容器 ID:

$ sudo docker ps

最後,創建一個當前運行中的容器的 Docker 鏡像,使用命令:

$ sudo docker commit 377e6d77ebb5 ostechnix/ubuntu_apache

輸出結果:

sha256:bc5e5f95ca592a3585fda2c5a40ec30c98e292046ef70390a2c3b7863cc6f7c1

這裡,

  • 377e6d77ebb5 – Ubuntu 容器的 ID。
  • ostechnix – 創建容器的用戶的名字。
  • ubuntu_apache – 用戶 ostechnix 創建的 Docker 鏡像的名字。

現在我們查看一下新的 Docker 鏡像是否被創建了,使用下面的命令:

$ sudo docker images

輸出結果:

ostechnix/ubuntu_apache

Build Custom Docker Images

從上面給的結果中可以看到,從運行中的容器創建的新 Docker 鏡像已經在我們的 Docker 主機系統中了。

現在你就可以從這個新的 Docker 鏡像創建行容器了,用之前的命令:

$ sudo docker run -it ostechnix/ubuntu_apache

12、移除容器

當你在 Docker 容器中完成所有開發後,如果你不需要它們了,你可以刪掉它們。

為此,首先我們需要終止(關閉)運行中的容器。

用這個命令來看一下運行中的容器:

$ sudo docker ps

輸出結果:

CONTAINER ID   IMAGE           COMMAND   CREATED         STATUS         PORTS     NAMES
377e6d77ebb5   ubuntu:latest   "bash"    7 minutes ago   Up 7 minutes             elegant_beaver

通過使用它的 ID 來終止運行中的容器:

$ sudo docker stop 377e6d77ebb5

現在,使用這個命令刪除容器:

$ sudo docker rm 377e6d77ebb5

同樣,如果不再需要所有的容器,關閉並刪除它們。

一個一個的刪除多個容器會是一項繁瑣的工作。所以,我們可以把所有停止的容器一次性刪掉,運行:

$ sudo docker container prune

Y 然後回車鍵,這些容器就被刪掉了。

WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
397111fac5374921b974721ee646b2d5fbae61ca9c6e8b90fbf47952f382a46b
80b53b7e661d33696b65c78267fc3f067b6100799c925910db4721963e3fae0a
[...]
Total reclaimed space: 176B

Delete Containers

這個命令只有在最新版中有效。

使用下面的命令來驗證是否所有容器都被刪除了:

$ sudo docker ps -a

如果看不到任何結果,說明所有容器被刪掉了。

13、刪除 Docker 鏡像

記住,在刪除所有鏡像之前,首先要刪掉所有從那些鏡像創建的容器。

當你刪掉容器後,你可以刪掉你不需要的 Docker 鏡像。

列出所有下載的 Docker 鏡像:

$ sudo docker images

輸出結果:

REPOSITORY                TAG       IMAGE ID       CREATED          SIZE
ostechnix/ubuntu_apache   latest    bc5e5f95ca59   14 minutes ago   229MB
debian                    latest    d2780094a226   11 days ago      124MB
ubuntu                    latest    27941809078c   3 weeks ago      77.8MB
ubuntu                    20.04     20fffa419e3a   3 weeks ago      72.8MB
alpine                    latest    e66264b98777   5 weeks ago      5.52MB

從上面可以看到,在我們的主機上有 5 個 Docker 鏡像。

通過使用鏡像 ID 來刪掉它們:

$ sudo docker rmi ce5aa74a48f1

輸出結果:

Untagged: ostechnix/ubuntu_apache:latest
Deleted: sha256:bc5e5f95ca592a3585fda2c5a40ec30c98e292046ef70390a2c3b7863cc6f7c1
Deleted: sha256:a8e4797160a2b2d33d8bd1bd67e008260c022b3a53fbcc198b2b74d9eae5961d

同樣,刪除其他所有 Docker 鏡像。

刪掉所有未運行的容器、所有鏡像、構建的緩存、所有網路,運行:

$ sudo docker system prune -a

使用這個命令的時候要注意,它會刪掉所有沒有使用的容器、網路、鏡像(包括 掛起 dangling 未使用 unreferenced 的)

Delete Everything In Docker

默認情況下,即使當前沒有容器在使用 磁碟卷 volumes ,為防止重要數據被刪除,磁碟卷也不會被刪除。

如果你想刪掉所有東西,包括分配的卷,使用 --volumes 標籤。

$ sudo docker system prune -a --volumes

Docker 問題匯總

如果 Docker 鏡像正在被運行或停止的容器使用,Docker 不會允許你刪除這些鏡像。

比如,當我嘗試從一個以前的 Ubuntu 伺服器上刪除 ID 為 b72889fa879c 的 Docker 鏡像。我會得到下面的錯誤:

Error response from daemon: conflict: unable to delete b72889fa879c (must be forced) - image is being used by stopped container dde4dd285377

這是因為你想刪除的 Docker 鏡像正在被另一個容器使用。

所以,我們先查看一下運行中的容器,使用命令:

$ sudo docker ps

輸出結果:

Show running docker containers

噢,沒有運行中的容器。

我們在看一下所有的容器(運行和停止的),用這個命令:

$ sudo docker ps -a

輸出結果:

Show running and stopped docker containers

可以看到,仍然有停止的容器在使用其中一個 Docker 鏡像。所以,我們先把所有容器刪掉。

比如:

$ sudo docker rm 12e892156219

類似地,向上面那樣,用對應容器的 ID 將它們都刪除。

當把所有容器刪掉後,移除掉 Docker 鏡像。

比如:

$ sudo docker rmi b72889fa879c

就這麼簡單。現在確認是否還有其他 Docker 鏡像在主機上,使用命令:

$ sudo docker images

你現在應該不再有任何 docker 鏡像了。

總結

在這篇全面的 Docker 入門教程中,我們解釋了 Docker 的基本操作,比如創建、運行、搜索、刪除容器,還有從 Docker 鏡像構建你自己的容器。同時,我們也解釋了如何在不需要 Docker 容器和鏡像的時候刪除它們。

希望你現在對 Docker 的使用 有一個基本的了解。

更多細節,請參考這篇教程最下面的官方資源鏈接,或者在下面的評論區進行評論。

相關資料

via: https://ostechnix.com/getting-started-with-docker/

作者:sk 選題:lkxed 譯者:MCGA 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    5 Comments

    1. 350fairfax nordvpn code
      I truly love your blog.. Excellent colors & theme.
      Did you make this web site yourself? Please reply back as
      I’m wanting to create my very own blog and would like to learn where you got this from
      or just what the theme is named. Appreciate it!

    2. Wow that was unusual. I just wrote an very long comment
      but after I clicked submit my comment didn’t appear.
      Grrrr… well I’m not writing all that over again. Anyway,
      just wanted to say fantastic blog!

      My webpage – nordvpn coupons inspiresensation (t.co)

    3. I love what you guys tend to be up too. Such clever work and
      coverage! Keep up the good works guys I’ve incorporated you
      guys to my own blogroll.

      My webpage nordvpn coupons inspiresensation (cfg.me)

    4. Your mode of explaining everything in this paragraph is in fact good, every one be capable of without
      difficulty understand it, Thanks a lot.

      Feel free to visit my blog nordvpn coupons inspiresensation – ur.link

    5. An impressive share! I have just forwarded this onto
      a friend who has been conducting a little research
      on this. And he actually ordered me dinner because I stumbled
      upon it for him… lol. So allow me to reword this…. Thank YOU for the meal!!

      But yeah, thanks for spending some time to talk about this topic here
      on your blog.

      Look into my website: nordvpn coupons inspiresensation

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    這個站點使用 Akismet 來減少垃圾評論。了解你的評論數據如何被處理

    More in:Linux中國