雲計算

Docker概述

Docker是一個用於開發,交付和運行應用程序的開放平臺。它讓你能夠將應用程序與基礎架構分離,從而可以快速交付軟件。藉助Docker,你可以以與管理應用程序相同的方式來管理基礎架構。正如它的logo所展示的,鯨魚/貨輪代表了操作系統,而集裝箱就是那些需要一個個部署的應用。在一艘貨輪上,集裝箱的作用就是將各種貨物進行標準化擺放,並且使它們相互之間不受到影響。有了集裝箱,我們就不需要專門運輸某種特定貨品的船了。我們可以把各種貨品通過集裝箱打包,然後統一放到一艘船上運輸。Docker 要做的就是把各種軟件打包成一個集裝箱(鏡像),然後發佈到任何流行的Linux機器或Windows 機器上(也可以實現虛擬化),並且其內部的沙箱機制可以確保軟件在運行的時候可以相互隔離。

安裝 Docker

Docker支持在當前各大主流平臺上安裝使用,包括CentOS、Debian、Fedora、Ubuntu等Linux平臺以及macOS、Windows等非Linux平臺。因為 Linux 是 Docker 的原生支持平臺,所以推薦你在 Linux 上使用 Docker。由於在生產環境中 CentOS 使用的較多,下文主要介紹在 CentOS 平臺下安裝和使用 Docker。

前置條件

操作系統要求

安裝 Docker,需要 CentOS 7或8的維護版本。存檔版本不支持或未經過測試。

必須啟用 centos-extras 存儲庫。 該存儲庫默認情況下處於啟用狀態,但是如果你禁用了它,則需要重新啟用。

建議使用 overlay2 存儲驅動程序。

卸載舊版本

如果你已經安裝過舊版的 Docker,可以先執行以下命令卸載舊版 Docker 以及它的依賴項。

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

如果yum報告沒有安裝這些軟件包,那就可以了。

/var/lib/docker/中的內容(包括鏡像,容器,卷和網絡)將被保留。Docker Engine 軟件包現在名為 docker-ce

安裝方法

Docker 官方提供了三種安裝方法:

  • 設置 Docker 倉庫並從中進行安裝,以簡化安裝和升級過程。這是官方推薦的安裝方法。
  • 下載RPM軟件包手動進行安裝,並完全手動管理升級。 這在無法訪問互聯網的空白系統上安裝Docker的情況下很有用。
  • 在測試和開發環境中,你還可以選擇使用自動化腳本來安裝Docker。

本文介紹通過設置 Docker 倉庫來進行安裝的方法。

設置倉庫

使用以下命令安裝yum-utils軟件包(提供yum-config-manager程序)並設置穩定的倉庫:

 sudo yum install -y yum-utils
 sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

如果在下面的安裝過程中遇到”沒有可用軟件包“錯誤,可以將倉庫地址設置為阿里雲的鏡像倉庫:

sudo yum-config-manager \

    --add-repo \

    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安裝 Docker Engine

  1. 安裝最新版本的 Docker Engine 和容器:
sudo yum install docker-ce docker-ce-cli containerd.io

在安裝過程中如果提示你接受GPG密鑰,需要驗證指紋是否與060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35匹配,如果是,選擇接受。

  1. 如果你想要安裝指定版本的 Docker,可以使用以下命令列出當前倉庫中所以可用的版本,然後選擇一個版本進行安裝:
yum list docker-ce --showduplicates | sort -r
已加載插件:fastestmirror
可安裝的軟件包
 * updates: mirrors.ustc.edu.cn
Loading mirror speeds from cached hostfile
 * extras: mirrors.ustc.edu.cn
 * epel: d2lzkl7pfhq30w.cloudfront.net
docker-ce.x86_64            3:20.10.6-3.el7                     docker-ce-stable
docker-ce.x86_64            3:20.10.5-3.el7                     docker-ce-stable
docker-ce.x86_64            3:20.10.4-3.el7                     docker-ce-stable
docker-ce.x86_64            3:20.10.3-3.el7                     docker-ce-stable
docker-ce.x86_64            3:20.10.2-3.el7                     docker-ce-stable
docker-ce.x86_64            3:20.10.1-3.el7                     docker-ce-stable
docker-ce.x86_64            3:20.10.0-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.9-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.8-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.7-3.el7                     docker-ce-stable

通過一個完全限定的軟件包名稱來(即軟件包名稱(docker-ce)加上版本字符串(第2列),從第一個冒號(:)開始,一直到第一個連字符(-)結束)安裝特定版本。例如,docker-ce-20.10.5。

sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

Docker 安裝完成後不會自動啟動。此時 docker 的組已經創建了,但是還沒有用戶添加到組中去。

啟動 Docker

使用如下命令啟動 Docker

sudo systemctl start docker

通過運行 hello world 鏡像來驗證 Docker 是否正確:

sudo docker run hello-world

這個命令會下載一個測試鏡像並在容器中運行。當容器運行時,它會打印如下消息然後退出:

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:f2266cbfc127c960fd30e76b7c792dc23b588c0db76233517e1891a4e357d519
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

安裝完成後 docker 命令默認只能以 root 用戶執行,如果想允許普通用戶執行 docker 命令,需要執行以下命令 sudo groupadd docker && sudo gpasswd -a ${USER} docker && sudo systemctl restart docker ,執行完命令後,退出當前命令行窗口並打開新的窗口即可。

卸載 Docker

  1. 使用以下命令卸載 Docker:
sudo yum remove docker-ce docker-ce-cli containerd.io
  1. 上述卸載命令不會刪除主機上的鏡像、容器、卷或自定義配置文件。要刪除所有鏡像、容器和卷,可以執行以下操作:
sudo rm -rf /var/lib/docker 
sudo rm -rf /var/lib/containerd

容器技術的雛形—chroot

chroot 是最早的容器雛形,它意味著切換根目錄,有了 chroot 就意味著我們可以把任何目錄更改為當前進程的根目錄,這與容器非常相似,那麼什麼是 chroot 呢?下面是維基百科中對 chroot 的定義:

chroot 是在 Unix 和 Linux 系統的一個操作,針對正在運作的軟件進程和它的子進程,改變它外顯的根目錄。一個運行在這個環境下,經由 chroot 設置根目錄的程序,它不能夠對這個指定根目錄之外的文件進行訪問動作,包括讀取,以及更改它的內容。

簡單來說 ,chroot 就是可以改變某進程的根目錄,使這個程序不能訪問目錄之外的其他目錄,彷彿置身於一個獨立的文件系統中一樣。下面我們通過一個實例來演示一下 chroot。

首先我們創建一個 rootfs 目錄:

[root@node01 local]# mkdir rootfs

然後使用 busybox 鏡像來創建一個系統,下面的操作你可以理解為在 rootfs 下創建了一些目錄和放置了一些二進制文件。

[root@node01 local]# cd rootfs
[root@node01 rootfs]# docker export $(docker create busybox) -o busybox.tar
[root@node01 rootfs]# tar -xf busybox.tar

執行完上面的命令後,在 rootfs 目錄下,我們會得到以下目錄和文件:

[root@node01 rootfs]# ls
bin  busybox.tar  dev  etc  home  proc  root  sys  tmp  usr  var

接下來我們通過 chroot 命令啟動一個 sh 進程,並且把 /usr/local/rootfs 作為 sh 進程的根目錄。

[root@node01 rootfs]# chroot /usr/local/rootfs/ /bin/sh
/ #

此時,我們的命令行窗口已經處於上述命令啟動的 sh 進程中了。在當前 sh 命令行窗口下,我們使用 ls 命令查看一下當前進程根目錄下的內容:

/ # /bin/ls /
bin          busybox.tar  dev          etc          home         proc         root         sys          tmp          usr          var

可以看到當前進程的根目錄已經變成了主機上的 /usr/local/rootfs 目錄。這樣就實現了當前進程與主機的隔離。至此,一個目錄隔離的容器就完成了。

但是,此時還不能稱之為一個容器,為什麼呢?你可以執行以下命令,查看一下路由信息:

/ # /bin/ip route
default via 192.168.188.2 dev ens33  metric 100
172.17.0.0/16 dev docker0 scope link  src 172.17.0.1
192.168.188.0/24 dev ens33 scope link  src 192.168.188.130  metric 100

然後新打開一個命令行,使用如下命令查看一下主機的路由信息:

[root@node01 ~]# ip route
default via 192.168.188.2 dev ens33 proto static metric 100
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
192.168.188.0/24 dev ens33 proto kernel scope link src 192.168.188.130 metric 100

可以看到網絡信息並沒有隔離,實際上進程等信息此時也並未隔離。

Leave a Reply

Your email address will not be published. Required fields are marked *