在 centos 上安裝 docker 引擎
預計閱讀時間:11分鐘
要在 centos 上開始使用 docker engine,請確定 滿足先決條件,然後 安裝 docker。
要安裝 docker 引擎,您需要 centos 7 或 8 的維護版本。不支援或測試存檔版本。
該<code>centos-extras</code>庫必須啟用。預設情況下啟用此存儲庫,但如果您已禁用它,則需要 重新啟用它。
<code>overlay2</code>推薦使用存儲驅動。
舊版本的 docker 被稱為<code>docker</code>或<code>docker-engine</code>。如果安裝了這些,請解除安裝它們以及相關的依賴項。
如果<code>yum</code>報告沒有安裝這些軟體包,那也沒關系。
的内容<code>/var/lib/docker/</code>,包括圖像、容器、卷和網絡,将被保留。docker 引擎包現在被稱為<code>docker-ce</code>.
您可以根據需要以不同方式安裝 docker engine:
大多數使用者 設定 docker 的存儲庫并從中安裝,以便于安裝和更新任務。這是推薦的方法。
一些使用者下載下傳 rpm 包并 手動安裝并完全手動管理更新。這在諸如在無法通路網際網路的氣隙系統上安裝 docker 等情況下非常有用。
在測試和開發環境中,一些使用者選擇使用自動化的 便捷腳本來安裝 docker。
在新主機上首次安裝 docker engine 之前,您需要設定 docker 存儲庫。之後,您可以從存儲庫安裝和更新 docker。
安裝<code>yum-utils</code>包(提供<code>yum-config-manager</code> 實用程式)并設定穩定存儲庫。
可選:啟用夜間或測試存儲庫。 這些存儲庫包含在<code>docker.repo</code>上面的檔案中,但預設情況下是禁用的。您可以在穩定存儲庫旁邊啟用它們。以下指令啟用夜間存儲庫。
要啟用測試通道,請運作以下指令:
您可以通過運作帶有标志的指令來禁用夜間或測試存儲庫 。要重新啟用它,請使用該标志。以下指令禁用夜間存儲庫。<code>yum-config-manager</code><code>--disable</code><code>--enable</code>
了解nightly和test頻道。
安裝最新版本的 docker engine 和 containerd,或者進入下一步安裝特定版本:
<code>$ sudo yum install docker-ce docker-ce-cli containerd.io</code>
如果提示接受 gpg 密鑰,請驗證指紋是否比對<code>060a 61c5 1b55 8a7f 742b 77aa c52f eb6b 621e 9f35</code>,如果比對 ,請接受。
有多個 docker 存儲庫?
如果您啟用了多個 docker 存儲庫,則在<code>yum install</code>或 <code>yum update</code>指令中未指定版本的情況下安裝或更新始終會安裝可能的最高版本,這可能不适合您的穩定性需求。
此指令會安裝 docker,但不會啟動 docker。它還會建立一個 <code>docker</code>組,但是,預設情況下它不會向該組添加任何使用者。
要安裝特定版本的 docker engine,請在 repo 中列出可用版本,然後選擇并安裝:
一種。列出并排序您的存儲庫中可用的版本。此示例按版本号對結果進行排序,從高到低,并被截斷:
<code>$ yum list docker-ce --showduplicates | sort -r docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable</code>
傳回的清單取決于啟用了哪些存儲庫,并且特定于您的 centos 版本(<code>.el7</code>在本示例中由字尾表示)。
灣 通過完全限定的包名稱安裝特定版本,即包名稱 ( <code>docker-ce</code>) 加上從第一個冒号 ( <code>:</code>)開始的版本字元串(第 2 列),直到第一個連字元,由連字元 ( <code>-</code>)分隔。例如,<code>docker-ce-18.09.1</code>。
<code>$ sudo yum install docker-ce-<version_string> docker-ce-cli-<version_string> containerd.io</code>
啟動 docker。
<code>$ sudo systemctl start docker</code>
通過運作<code>hello-world</code> 映像驗證 docker engine 是否已正确安裝。
<code>$ sudo docker run hello-world</code>
此指令下載下傳測試映像并在容器中運作它。當容器運作時,它會列印一條消息并退出。
這将安裝并運作 docker 引擎。使用<code>sudo</code>運作泊塢窗指令。繼續linux postinstall以允許非特權使用者運作 docker 指令和其他可選配置步驟。
要更新 docker engine,請按照安裝說明進行操作,選擇要安裝的新版本。
如果您無法使用 docker 的存儲庫來安裝 docker,您可以下載下傳該<code>.rpm</code>版本的 檔案并手動安裝。每次要更新 docker engine 時都需要下載下傳一個新檔案。
前往https://download.docker.com/linux/centos/ 并選擇您的 centos 版本。然後浏覽<code>x86_64/stable/packages/</code> 并下載下傳<code>.rpm</code>要安裝的 docker 版本的檔案。
筆記
要安裝每晚或測試(預釋出)包,<code>stable</code>請将上述 url 中的單詞更改為<code>nightly</code>或<code>test</code>。 了解nightly和test頻道。
安裝 docker engine,将下面的路徑更改為您下載下傳 docker 包的路徑。
<code>$ sudo yum install /path/to/package.rpm</code>
docker 已安裝但未啟動。該<code>docker</code>組被建立,但沒有使用者添加到組。
這将安裝并運作 docker 引擎。使用<code>sudo</code>運作泊塢窗指令。繼續linux 的安裝後步驟以允許非特權使用者運作 docker 指令和其他可選配置步驟。
要更新 docker engine,請下載下傳更新的封包件并重複 安裝過程,使用<code>yum -y upgrade</code> 代替<code>yum -y install</code>,并指向新檔案。
docker 在get.docker.com 上提供了一個友善的腳本,可以快速且非互動式地将 docker 安裝到開發環境中。不建議将便捷腳本用于生産環境,但可以用作示例來建立适合您需求的配置腳本。另請參閱使用存儲庫安裝 步驟以了解使用軟體包存儲庫進行安裝的安裝步驟。該腳本的源代碼是開源的,可以docker-install在 github 上的 存儲庫中找到。
在本地運作之前,請務必檢查從 internet 下載下傳的腳本。在安裝之前,讓自己熟悉便利腳本的潛在風險和限制:
腳本需要root
或sudo
特權才能運作。
該腳本會嘗試檢測您的 linux 發行版和版本并為您配置包管理系統,并且不允許您自定義大多數安裝參數。
該腳本無需确認即可安裝依賴項和建議。這可能會安裝大量軟體包,具體取決于主機的目前配置。
預設情況下,該腳本會安裝 docker、containerd 和 runc 的最新穩定版本。使用此腳本配置機器時,可能會導緻 docker 的主要版本意外更新。在部署到生産系統之前,始終在測試環境中測試(主要)更新。
該腳本并非旨在更新現有的 docker 安裝。使用腳本更新現有安裝時,依賴項可能不會更新到預期版本,進而導緻使用過時的版本。
提示:運作前預覽腳本步驟 您可以運作帶有<code>dry_run=1</code>選項的腳本以了解腳本在安裝過程中将執行的步驟:
此示例從get.docker.com下載下傳腳本 并運作它以在 linux 上安裝 docker 的最新穩定版本:
安裝了 docker。該<code>docker</code>服務在基于 debian 的發行版上自動啟動。在<code>rpm</code>基于發行版的發行版上,例如 centos、fedora、rhel 或 sles,您需要使用适當的<code>systemctl</code>or<code>service</code>指令手動啟動它。如消息所示,預設情況下,非 root 使用者無法運作 docker 指令。
以非特權使用者身份使用 docker,還是以無根模式安裝? 安裝腳本需要<code>root</code>或<code>sudo</code>具有安裝和使用 docker 的權限。如果要授予非 root 使用者通路 docker 的權限,請參閱 linux 的安裝後步驟。docker 也可以在沒有<code>root</code>特權的情況下安裝,或配置為在無根模式下運作。有關在無根模式下運作 docker 的說明,請參閱以 非 root 使用者身份運作 docker 守護程序(無根模式)。
docker 還在test.docker.com 上提供了一個友善的腳本,用于在 linux 上安裝 docker 的預釋出版本。此腳本等效于 中的腳本<code>get.docker.com</code>,但會配置您的包管理器以啟用我們包存儲庫中的“測試”通道,其中包括 docker 的穩定版和預釋出版(測試版、候選釋出版)。使用此腳本可以提前通路新版本,并在它們穩定釋出之前在測試環境中對其進行評估。
要從“測試”頻道在 linux 上安裝最新版本的 docker,請運作:
如果您使用便利腳本安裝 docker,則應直接使用您的包管理器更新 docker。重新運作便利腳本沒有任何好處,如果它嘗試重新添加已經添加到主機的存儲庫,它可能會導緻問題。
解除安裝 docker engine、cli 和 containerd 包:
<code>$ sudo yum remove docker-ce docker-ce-cli containerd.io</code>
主機上的映像、容器、卷或自定義配置檔案不會自動删除。删除所有鏡像、容器和卷:
<code>$ sudo rm -rf /var/lib/docker $ sudo rm -rf /var/lib/containerd</code>
您必須手動删除任何已編輯的配置檔案。
linux 的安裝後步驟
預計閱讀時間:15分鐘
本節包含用于配置 linux 主機以更好地與 docker 配合使用的可選過程。
docker 守護程序綁定到 unix 套接字而不是 tcp 端口。預設情況下,unix 套接字歸使用者所有<code>root</code>,其他使用者隻能使用<code>sudo</code>. docker 守護程序始終以<code>root</code>使用者身份運作。
如果您不想在<code>docker</code>指令前加上<code>sudo</code>,請建立一個名為的 unix 組<code>docker</code>并向其中添加使用者。當 docker 守護程序啟動時,它會建立一個可由<code>docker</code>組成員通路的 unix 套接字。
警告 該<code>docker</code>組授予與<code>root</code> 使用者等效的權限。有關這如何影響系統安全性的詳細資訊,請參閱 docker 守護程序攻擊面。 注意: 要在沒有 root 權限的情況下運作 docker,請參閱 以非 root 使用者身份運作 docker 守護程式(無根模式)。
要建立<code>docker</code>組并添加您的使用者:
建立<code>docker</code>組。
<code>$ sudo groupadd docker</code>
将您的使用者添加到<code>docker</code>組中。
<code>$ sudo usermod -ag docker $user</code>
登出并重新登入,以便重新評估您的組成員身份。
如果在虛拟機上進行測試,可能需要重新啟動虛拟機以使更改生效。
在桌面 linux 環境(如 x windows)上,完全登出會話,然後重新登入。
在 linux 上,您還可以運作以下指令來激活對組的更改:
<code>$ newgrp docker</code>
驗證您是否可以在<code>docker</code>沒有<code>sudo</code>.
<code>$ docker run hello-world</code>
如果您<code>sudo</code>在将使用者添加到<code>docker</code>組之前最初運作 docker cli 指令,您可能會看到以下錯誤,這表明您的<code>~/.docker/</code>目錄由于<code>sudo</code>指令而使用不正确的權限建立。
<code>warning: error loading config file: /home/user/.docker/config.json - stat /home/user/.docker/config.json: permission denied</code>
要解決此問題,請删除<code>~/.docker/</code>目錄(它會自動重新建立,但所有自定義設定都将丢失),或使用以下指令更改其所有權和權限:
<code>$ sudo chown "$user":"$user" /home/"$user"/.docker -r $ sudo chmod g+rwx "$home/.docker" -r</code>
大多數目前的 linux 發行版(rhel、centos、fedora、debian、ubuntu 16.04 及更高版本)用于systemd管理系統啟動時啟動的服務。在 debian 和 ubuntu 上,docker 服務預設配置為在啟動時啟動。要在引導時為其他發行版自動啟動 docker 和 containerd,請使用以下指令:
要禁用此行為,請<code>disable</code>改用。
如果您需要添加 http 代理,為 docker 運作時檔案設定不同的目錄或分區,或進行其他自定義,請參閱 自定義 systemd docker 守護程式選項。
有關不同存儲引擎的資訊,請參閱 存儲驅動程式。預設存儲引擎和支援的存儲引擎清單取決于主機的 linux 發行版和可用的核心驅動程式。
docker 提供了通過一系列日志驅動程式從主機上運作的所有容器收集和檢視日志資料的功能。預設日志驅動程式<code>json-file</code>将日志資料寫入主機檔案系統上的 json 格式檔案。随着時間的推移,這些日志檔案的大小會擴大,進而可能導緻磁盤資源耗盡。
要緩解此類問題,請配置<code>json-file</code>日志驅動程式以啟用日志輪換,使用 替代日志驅動程式( 例如 預設執行日志輪換的“本地”日志驅動程式),或使用将日志發送到遠端日志記錄聚合器的日志記錄驅動程式。
預設情況下,docker 守護程序偵聽 unix 套接字上的連接配接以接受來自本地用戶端的請求。通過将 docker 配置為偵聽 ip 位址和端口以及 unix 套接字,可以允許 docker 接受來自遠端主機的請求。有關此配置選項的更多詳細資訊,請檢視docker cli 參考文章的“将docker綁定到另一個主機/端口或 unix 套接字”部分。
保護您的連接配接 在配置 docker 以接受來自遠端主機的連接配接之前,了解将 docker 開放到網絡的安全含義至關重要。如果不采取措施保護連接配接,遠端非 root 使用者就有可能在主機上獲得 root 通路權限。有關如何使用 tls 證書來保護此連接配接的更多資訊,請檢視有關 如何保護 docker 守護程序套接字的文章。
<code>docker.service</code> 對于使用 systemd 的 linux 發行版,例如 redhat、centos、ubuntu 和 sles 的最新版本,可以使用systemd 單元檔案來配置 docker 以接受遠端連接配接,或者使用<code>daemon.json</code>推薦用于不使用 systemd 的 linux 發行版的檔案。
systemd 與 daemon.json 将 docker 配置為同時使用<code>systemd</code>單元檔案和<code>daemon.json</code> 檔案來偵聽連接配接會導緻沖突,進而阻止 docker 啟動。
使用該指令在文本編輯器中<code>sudo systemctl edit docker.service</code>打開覆寫檔案<code>docker.service</code>。
添加或修改以下幾行,替換您自己的值。
<code>[service] execstart= execstart=/usr/bin/dockerd -h fd:// -h tcp://127.0.0.1:2375</code>
儲存檔案。
重新加載<code>systemctl</code>配置。
<code>$ sudo systemctl daemon-reload</code>
重新開機 docker。
<code>$ sudo systemctl restart docker.service</code>
通過檢視<code>netstat</code>以确認<code>dockerd</code>正在偵聽配置的端口的輸出來檢查更改是否得到遵守。
<code>$ sudo netstat -lntp | grep dockerd tcp 0 0 127.0.0.1:2375 0.0.0.0:* listen 3758/dockerd</code>
設定連接配接到unix套接字的<code>hosts</code>數組<code>/etc/docker/daemon.json</code>和ip位址,如下:
<code>{ "hosts": ["unix:///var/run/docker.sock", "tcp://127.0.0.1:2375"] }</code>
要在 docker 守護程式上啟用 ipv6,請參閱 啟用 ipv6 支援。
如果您的核心版本低于 3.10 或缺少某些子產品,docker 将無法正常運作。要檢查核心相容性,您可以下載下傳并運作check-config.sh 腳本。
該腳本僅适用于 linux,不适用于 macos。
如果您看到如下錯誤,則您的 docker 用戶端可能被配置為連接配接到不同主機上的 docker 守護程式,而該主機可能無法通路。
要檢視您的用戶端配置為連接配接到哪個主機,請檢查<code>docker_host</code>您環境中變量的值。
如果此指令傳回一個值,則 docker 用戶端将設定為連接配接到在該主機上運作的 docker 守護程式。如果未設定,則 docker 用戶端将設定為連接配接到在本地主機上運作的 docker 守護程式。如果設定錯誤,請使用以下指令取消設定:
您可能需要在檔案中編輯環境,例如<code>~/.bashrc</code>或 <code>~/.profile</code>以防止<code>docker_host</code>錯誤設定變量。
如果<code>docker_host</code>按預期設定,請驗證 docker 守護程式是否正在遠端主機上運作,并且防火牆或網絡中斷未阻止您進行連接配接。
如果使用手動配置你的網絡<code>systemd-network</code>有<code>systemd</code> 219或更高版本,docker容器可能無法通路您的網絡。從<code>systemd</code>版本 220開始,給定網絡 ( <code>net.ipv4.conf.<interface>.forwarding</code>)的轉發設定預設為off。此設定可防止 ip 轉發。它還與 docker<code>net.ipv4.conf.all.forwarding</code>在容器内啟用設定的行為相沖突。
要在 rhel、centos 或 fedora 上解決此問題,請<code><interface>.network</code> 在<code>/usr/lib/systemd/network/</code>docker 主機(例如:)上編輯檔案<code>/usr/lib/systemd/network/80-container-host0.network</code>并在該<code>[network]</code>部分中添加以下塊。
此配置允許按預期從容器轉發 ip。
使用 gui 的 linux 系統通常運作一個網絡管理器,它使用<code>dnsmasq</code>在環回位址(例如<code>127.0.0.1</code>或 ) 上運作的 執行個體<code>127.0.1.1</code>來緩存 dns 請求,并将此條目添加到 <code>/etc/resolv.conf</code>. 該<code>dnsmasq</code>服務可加快 dns 查找速度并提供 dhcp 服務。此配置不擁有自己的網絡命名空間的碼頭勞工容器内工作,因為多克爾容器做出決議回環如位址<code>127.0.0.1</code>到 自身,這是很不可能的運作在自己的回送位址的dns伺服器。
如果泊塢窗檢測中引用沒有dns伺服器<code>/etc/resolv.conf</code>是一個全功能的dns伺服器,下面的警告出現和碼頭勞工使用由谷歌在提供的公共dns伺服器<code>8.8.8.8</code>和<code>8.8.4.4</code>dns解析。
如果您看到此警告,請首先檢查您是否使用<code>dnsmasq</code>:
如果您的容器需要解析網絡内部的主機,則公共名稱伺服器是不夠的。你有兩個選擇:
您可以指定一個 dns 伺服器供 docker 使用,或者
您可以dnsmasq
在 networkmanager 中禁用。如果您這樣做,networkmanager 會将您真正的 dns 名稱伺服器添加到/etc/resolv.conf
,但您将失去dnsmasq
.
您隻需要使用這些方法之一。
配置檔案的預設位置是<code>/etc/docker/daemon.json</code>. 您可以使用<code>--config-file</code> 守護程式标志更改配置檔案的位置。下面的文檔假設配置檔案位于<code>/etc/docker/daemon.json</code>.
建立或編輯docker守護程序配置檔案,預設為 <code>/etc/docker/daemon.json</code>file,控制docker守護程序配置。
<code>$ sudo nano /etc/docker/daemon.json</code>
添加<code>dns</code>具有一個或多個 ip 位址作為值的鍵。如果檔案已有内容,您隻需添加或編輯該<code>dns</code>行。
<code>{ "dns": ["8.8.8.8", "8.8.4.4"] }</code>
如果您的内部 dns 伺服器無法解析公共 ip 位址,請至少包含一個可以解析的 dns 伺服器,以便您可以連接配接到 docker hub 并且您的容器可以解析 internet 域名。
儲存并關閉檔案。
重新啟動 docker 守護程序。
<code>$ sudo service docker restart</code>
通過嘗試拉取鏡像來驗證 docker 是否可以解析外部 ip 位址:
<code>$ docker pull hello-world</code>
如有必要,請驗證 docker 容器是否可以通過 ping 來解析内部主機名。
<code>$ docker run --rm -it alpine ping -c4 <my_internal_host> ping google.com (192.168.1.2): 56 data bytes 64 bytes from 192.168.1.2: seq=0 ttl=41 time=7.597 ms 64 bytes from 192.168.1.2: seq=1 ttl=41 time=7.635 ms 64 bytes from 192.168.1.2: seq=2 ttl=41 time=7.660 ms 64 bytes from 192.168.1.2: seq=3 ttl=41 time=7.677 ms</code>
如果您不想更改 docker 守護程式的配置以使用特定 ip 位址,請按照這些說明<code>dnsmasq</code>在 networkmanager 中禁用。
編輯<code>/etc/networkmanager/networkmanager.conf</code>檔案。
通過<code>dns=dnsmasq</code>在行<code>#</code>的開頭添加一個字元來注釋掉該行。
<code># dns=dnsmasq</code>
重新啟動 networkmanager 和 docker。作為替代方案,您可以重新啟動系統。
<code>$ sudo systemctl restart network-manager $ sudo systemctl restart docker</code>
要<code>dnsmasq</code>在 rhel、centos 或 fedora 上禁用:
禁用<code>dnsmasq</code>服務:
<code>$ sudo systemctl stop dnsmasq $ sudo systemctl disable dnsmasq</code>
使用red hat 文檔手動配置 dns 伺服器 。
如果您在運作 docker 的同一主機上運作防火牆,并且希望從另一台主機通路 docker remote api 并且啟用了遠端通路,則需要配置防火牆以允許 docker 端口上的傳入連接配接,預設為<code>2376</code>if tls 加密傳輸已啟用或<code>2375</code> 以其他方式啟用。
兩種常見的防火牆守護程序是 ufw(uncomplicated firewall)(常用于 ubuntu 系統)和firewalld(常用于基于 rpm 的系統)。請參閱您的作業系統和防火牆的文檔,但以下資訊可能會幫助您入門。這些選項相當寬松,您可能希望使用不同的配置來更多地鎖定您的系統。
ufw:<code>default_forward_policy="accept"</code>在您的配置中設定。
firewalld:将類似于以下内容的規則添加到您的政策中(一種用于傳入請求,一種用于傳出請求)。確定接口名稱和鍊名稱正确。
<code><direct> [ <rule ipv="ipv6" table="filter" chain="forward_direct" priority="0"> -i zt0 -j accept </rule> ] [ <rule ipv="ipv6" table="filter" chain="forward_direct" priority="0"> -o zt0 -j accept </rule> ] </direct></code>
在 ubuntu 或 debian 主機上,使用映像時,您可能會看到類似于以下内容的消息。
在基于 rpm 的系統上不會發生此警告,預設情況下啟用這些功能。
如果您不需要這些功能,則可以忽略警告。您可以按照這些說明在 ubuntu 或 debian 上啟用這些功能。即使 docker 沒有運作,記憶體和交換計算也會産生大約 1% 的總可用記憶體開銷和 10% 的整體性能下降。
以具有<code>sudo</code>特權的使用者身份登入 ubuntu 或 debian 主機。
編輯<code>/etc/default/grub</code>檔案。添加或編輯該<code>grub_cmdline_linux</code>行以添加以下兩個鍵值對:
<code>grub_cmdline_linux="cgroup_enable=memory swapaccount=1"</code>
更新 grub。<code>$ sudo update-grub</code>如果您的 grub 配置檔案的文法不正确,則會發生錯誤。在這種情況下,重複步驟 2 和 3。更改在系統重新啟動時生效。開始教程如果您已經運作指令開始學習本教程,那麼恭喜您!如果沒有,請打開指令提示符或 bash 視窗,然後運作以下指令:<code>$ docker run -d -p 80:80 docker/getting-started</code>您會注意到使用了一些标志。以下是有關它們的更多資訊:
-d
- 以分離模式運作容器(在背景)
-p 80:80
- 将主機的 80 端口映射到容器中的 80 端口
docker/getting-started
- 要使用的圖像
提示
您可以組合單個字元标志來縮短完整指令。例如,上面的指令可以寫成:
現在你已經運作了一個容器,什麼是容器?簡單地說,容器隻是你機器上的另一個程序,它與主機上的所有其他程序隔離開來。這種隔離利用了核心命名空間和 cgroups,這些特性已經在 linux 中存在了很長時間。docker 一直緻力于使這些功能易于使用且易于使用。
從頭開始建立容器 如果您想了解容器是如何從頭開始建構的,aqua security 的 liz rice 有一個精彩的演講,其中她在 go 中從頭開始建立了一個容器。雖然她制作了一個簡單的容器,但本次演講并未涉及網絡、為檔案系統使用圖像等。但是,它可以深入了解事物的運作方式。
運作容器時,它使用隔離的檔案系統。此自定義檔案系統由容器映像提供。由于鏡像包含容器的檔案系統,它必須包含運作應用程式所需的一切——所有依賴項、配置、腳本、二進制檔案等。鏡像還包含容器的其他配置,例如環境變量、要運作的預設指令、和其他中繼資料。
稍後我們将深入研究圖像,涵蓋分層、最佳實踐等主題。