# 什么是Docker
開源的應用容器引擎,基于go語言開發
Docker安裝采坑記
相關命令:`systemctl status docker.service`查看服務狀態
Linux的安裝后步驟 預計閱讀時間: 15分鐘 本節包含配置Linux主機以使用Docker更好地工作的可選過程。
以非root用戶身份管理Docker Docker守護程序綁定到Unix套接字而不是TCP端口。默認情況下,Unix套接字由用戶擁有,root而其他用戶只能使用它sudo。Docker守護程序始終以root用戶身份運行。
如果您不想在docker命令前加上sudo,請創建一個名為的Unix組docker并向其添加用戶。當Docker守護程序啟動時,它會創建一個可由該docker組成員訪問的Unix套接字。
警告
該docker組授予與root 用戶等效的權限。有關如何影響系統安全性的詳細信息,請參閱 Docker Daemon Attack Surface。
要創建docker組并添加您的用戶:
創建docker組。
~~~
$ sudo groupadd docker
~~~
將您的用戶添加到該docker組。
~~~
$ sudo usermod -aG docker $USER
~~~
注銷并重新登錄,以便重新評估您的組成員身份。
如果在虛擬機上進行測試,則可能需要重新啟動虛擬機才能使更改生效。
在桌面Linux環境(如X Windows)上,完全注銷會話,然后重新登錄。
驗證您是否可以運行docker命令sudo。
~~~
$ docker run hello-world
~~~
此命令下載測試映像并在容器中運行它。當容器運行時,它會打印一條信息性消息并退出。
如果sudo在將用戶添加到docker組之前最初使用Docker CLI命令,則可能會看到以下錯誤,表示~/.docker/由于sudo命令而創建的目錄的權限不正確。
~~~
WARNING: Error loading config file: /home/user/.docker/config.json -
stat /home/user/.docker/config.json: permission denied
~~~
要解決此問題,請刪除~/.docker/目錄(它會自動重新創建,但任何自定義設置都將丟失),或使用以下命令更改其所有權和權限:
~~~
$ sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
$ sudo chmod g+rwx "$HOME/.docker" -R
~~~
配置Docker以在啟動時啟動 大多數當前的Linux發行版(RHEL,CentOS,Fedora,Ubuntu 16.04及更高版本)用于systemd管理系統啟動時啟動的服務。Ubuntu 14.10及以下使用upstart。
~~~
systemd
$ sudo systemctl enable docker
~~~
要禁用此行為,請disable改用。
~~~
$ sudo systemctl disable docker
~~~
如果需要添加HTTP代理,為Docker運行時文件設置不同的目錄或分區,或進行其他自定義,請參閱 自定義systemd Docker守護程序選項。
upstart Docker自動配置為在啟動時啟動 upstart。要禁用此行為,請使用以下命令:
~~~
$ echo manual | sudo tee /etc/init/docker.override
chkconfig
$ sudo chkconfig docker on
~~~
使用其他存儲引擎 有關不同存儲引擎的信息,請參閱 存儲驅動程序。默認存儲引擎和支持的存儲引擎列表取決于主機的Linux發行版和可用的內核驅動程序。
配置Docker守護程序偵聽連接的位置 默認情況下,Docker守護程序偵聽UNIX套接字上的連接以接受來自本地客戶端的請求。通過將Docker配置為偵聽IP地址和端口以及UNIX套接字,可以允許Docker接受來自遠程主機的請求。有關此配置選項的更多詳細信息,請參閱Docker CLI參考文章中的“將Docker綁定到另一個主機/端口或unix套接字”部分。
Docker EE客戶
Docker EE客戶可以使用UCP客戶端捆綁包獲得對UCP的遠程CLI訪問。UCP客戶端捆綁包由UCP生成,并由相互TLS保護。有關更多信息,請參閱有關UCP的CLI訪問的文檔 。
保護您的連接
在配置Docker以接受來自遠程主機的連接之前,了解打開docker到網絡的安全隱患至關重要。如果不采取措施來保護連接,則遠程非root用戶可以在主機上獲得root訪問權限。有關如何使用TLS證書保護此連接的更多信息,請查看有關 如何保護Docker守護程序套接字的文章。
配置Docker以接受遠程連接可以docker.service使用systemd的Linux發行版的systemd單元文件來完成,例如RedHat,CentOS,Ubuntu和SLES的最新版本,或者daemon.json推薦用于不使用systemd的Linux發行版的文件。
systemd vs daemon.json
配置Docker以使用systemd單元文件和daemon.json 文件來偵聽連接會導致沖突,從而阻止Docker啟動。
使用systemd單元文件配置遠程訪問 使用該命令在文本編輯器中sudo systemctl edit docker.service打開覆蓋文件docker.service。
添加或修改以下行,替換您自己的值。
\[Service\] ExecStart= ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375 保存文件。
重新加載systemctl配置。
$ sudo systemctl daemon-reload 重啟Docker。
$ sudo systemctl restart docker.service 通過查看netstat確認的輸出是否dockerd正在偵聽已配置的端口來檢查更改是否得到遵守。
$ sudo netstat -lntp | grep dockerd tcp 0 0 127.0.0.1:2375 0.0.0.0:\* LISTEN 3758/dockerd 使用配置遠程訪問 daemon.json 將hosts數組設置/etc/docker/daemon.json為連接到UNIX套接字和IP地址,如下所示:
{ "hosts": \["unix:///var/run/docker.sock", "tcp://127.0.0.1:2375"\] } 重啟Docker。
通過查看netstat確認的輸出是否dockerd正在偵聽已配置的端口來檢查更改是否得到遵守。
$ sudo netstat -lntp | grep dockerd tcp 0 0 127.0.0.1:2375 0.0.0.0:\* LISTEN 3758/dockerd 在Docker守護程序上啟用IPv6 要在Docker守護程序上啟用IPv6,請參閱 啟用IPv6支持。
故障排除 內核兼容性 如果您的內核早于3.10版本或者缺少某些模塊,則Docker無法正常運行。要檢查內核兼容性,可以下載并運行該check-config.sh 腳本。
$ curl https://raw.githubusercontent.com/docker/docker/master/contrib/check-config.sh > check-config.sh
$ bash ./check-config.sh 該腳本僅適用于Linux,而不適用于macOS。
Cannot connect to the Docker daemon 如果您看到如下所示的錯誤,則可能將Docker客戶端配置為連接到其他主機上的Docker守護程序,并且該主機可能無法訪問。
Cannot connect to the Docker daemon. Is 'docker daemon' running on this host? 要查看客戶端配置連接到哪個主機,請檢查DOCKER\_HOST環境中變量的值。
$ env | grep DOCKER\_HOST 如果此命令返回值,則Docker客戶端將設置為連接到在該主機上運行的Docker守護程序。如果未設置,則Docker客戶端將設置為連接到本地主機上運行的Docker守護程序。如果設置錯誤,請使用以下命令取消設置:
$ unset DOCKER\_HOST 您可能需要在文件中編輯環境,~/.bashrc或者 ~/.profile防止DOCKER\_HOST錯誤地設置變量。
如果DOCKER\_HOST按預期設置,請驗證Docker守護程序是否在遠程主機上運行,??以及防火墻或網絡中斷是否阻止您進行連接。
IP轉發問題 如果使用手動配置你的網絡systemd-network有systemd 219或更高版本,Docker容器可能無法訪問您的網絡。從systemd版本220 開始,給定網絡(net.ipv4.conf..forwarding)的轉發設置默認為關閉。此設置可防止IP轉發。它還與Docker net.ipv4.conf.all.forwarding在容器中啟用設置的行為相沖突。
要在RHEL,CentOS或Fedora上解決此問題,請.network 在/usr/lib/systemd/network/Docker主機上編輯該文件(例如:)/usr/lib/systemd/network/80-container-host0.network并在該\[Network\]部分中添加以下塊。
\[Network\] ... IPForward=kernel
# OR
IPForward=true ... 此配置允許按預期從容器進行IP轉發。
DNS resolver found in resolv.conf and containers can't use it 使用GUI的Linux系統通常運行網絡管理器,該網絡管理器使用dnsmasq在環回地址上運行的 實例,例如127.0.0.1或 127.0.1.1緩存DNS請求,并將此條目添加到 /etc/resolv.conf。該dnsmasq服務可加速DNS查詢并提供DHCP服務。此配置不擁有自己的網絡命名空間的碼頭工人容器內工作,因為多克爾容器解決回環地址,如127.0.0.1對 自身,這是很不可能的運行在自己的回送地址的DNS服務器。
如果Docker檢測到沒有引用的DNS服務器/etc/resolv.conf是功能齊全的DNS服務器,則會出現以下警告,并且Docker使用Google提供的公共DNS服務器8.8.8.8并8.8.4.4進行DNS解析。
WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it. Using default external servers : \[8.8.8.8 8.8.4.4\] 如果您看到此警告,請先檢查您是否使用dnsmasq:
$ ps aux |grep dnsmasq 如果您的容器需要解析網絡內部的主機,則公共名稱服務器不夠用。你有兩個選擇:
您可以為Docker指定要使用的DNS服務器,或 您可以dnsmasq在NetworkManager中禁用。如果您這樣做,NetworkManager會添加您真正的DNS名稱服務器/etc/resolv.conf,但您將失去可能的好處dnsmasq。 您只需要使用這些方法之一。
為Docker指定DNS服務器 配置文件的默認位置是/etc/docker/daemon.json。您可以使用--config-file 守護程序標志更改配置文件的位置。以下文檔假定配置文件位于/etc/docker/daemon.json。
創建或編輯Docker守護程序配置文件,該/etc/docker/daemon.json文件默認為 file,它控制Docker守護程序配置。
$ sudo nano /etc/docker/daemon.json 添加dns一個或多個IP地址作為值的密鑰。如果文件包含現有內容,則只需添加或編輯該dns行。
{ "dns": \["8.8.8.8", "8.8.4.4"\] } 如果您的內部DNS服務器無法解析公共IP地址,請至少包含一個DNS服務器,以便您可以連接到Docker Hub,以便您的容器可以解析Internet域名。
保存并關閉文件。
重新啟動Docker守護程序。
$ sudo service docker restart 通過嘗試提取圖像來驗證Docker是否可以解析外部IP地址:
$ docker pull hello-world 如有必要,請驗證Docker容器是否可以通過ping它來解析內部主機名。
$ docker run --rm -it alpine ping -c4
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 禁用 DNSMASQ Ubuntu的 如果您不想更改Docker守護程序的配置以使用特定的IP地址,請按照以下說明dnsmasq在NetworkManager中禁用。
編輯/etc/NetworkManager/NetworkManager.conf文件。
通過dns=dnsmasq在行#的開頭添加一個字符來注釋掉該行。
# dns=dnsmasq
保存并關閉文件。
重新啟動NetworkManager和Docker。作為替代方案,您可以重新啟動系統。
$ sudo restart network-manager $ sudo restart docker RHEL,CentOS或Fedora 要dnsmasq在RHEL,CentOS或Fedora上禁用:
禁用該dnsmasq服務:
$ sudo service dnsmasq stop
$ sudo systemctl disable dnsmasq 使用Red Hat文檔手動配置DNS服務器 。
允許通過防火墻訪問遠程API 如果您在運行Docker的同一主機上運行防火墻并且想要從另一臺主機訪問Docker Remote API并啟用遠程訪問,則需要配置防火墻以允許Docker端口上的傳入連接,默認為2376if啟用TLS加密傳輸或2375 以其他方式啟用。
兩個常見的防火墻守護程序是 UFW(簡單防火墻)(通常用于Ubuntu系統)和firewalld(通常用于基于RPM的系統)。請參閱操作系統和防火墻的文檔,但以下信息可能有助于您入門。這些選項相當寬松,您可能希望使用不同的配置來更好地鎖定系統。
UFW:DEFAULT\_FORWARD\_POLICY="ACCEPT"在您的配置中設置。
firewalld:在策略中添加與以下類似的規則(一個用于傳入請求,另一個用于傳出請求)。確保接口名稱和鏈名稱正確。
\[\-i zt0 -j ACCEPT\] \[\-o zt0 -j ACCEPT\]Your kernel does not support cgroup swap limit capabilities 在Ubuntu或Debian主機上,使用圖像時,您可能會看到類似于以下內容的消息。
WARNING: Your kernel does not support swap limit capabilities. Limitation discarded. 在基于RPM的系統上不會發生此警告,這些系統默認啟用這些功能。
如果您不需要這些功能,則可以忽略該警告。您可以按照這些說明在Ubuntu或Debian上啟用這些功能。即使Docker未運行,內存和交換計費也會占總可用內存的1%左右,總體性能降低10%。
以具有sudo權限的用戶身份登錄Ubuntu或Debian主機。
編輯/etc/default/grub文件。添加或編輯該GRUB\_CMDLINE\_LINUX行以添加以下兩個鍵值對:
GRUB\_CMDLINE\_LINUX="cgroup\_enable=memory swapaccount=1" 保存并關閉文件。
更新GRUB。
$ sudo update-grub 如果GRUB配置文件的語法不正確,則會發生錯誤。在這種情況下,請重復步驟3和4。
重新啟動系統后,更改將生效。