Linux 安裝 Docker 後步驟

以非root用戶身份管理Docker

Docker守護程序綁定到Unix套接字而不是TCP端口。默認狀況下,Unix套接字由用戶root擁有,而其餘用戶只能使用sudo訪問它。Docker守護程序始終以 root 用戶身份運行。
若是您不想在docker命令前加上sudo,請建立一個名爲docker的Unix組並向其添加用戶。當Docker守護程序啓動時,它會建立一個可由docker組成員訪問的Unix套接字。git

  1. 建立 docker 組
sudo groupadd docker
  1. 將用戶添加到 docker 組
sudo usermod -aG docker $USER
  1. 註銷並從新登陸,以便從新評估您的組成員身份 若是在虛擬機上進行測試,則可能須要從新啓動虛擬機才能使更改生效。 在桌面Linux環境(如X Windows)上,徹底註銷會話,而後從新登陸。github

  2. 驗證是否能夠運行docker命令sudodocker

docker run hello-world

若是在將用戶添加到docker組以前最初使用sudo運行Docker CLI命令,則可能會看到如下錯誤:json

WARNING: Error loading config file: /home/user/.docker/config.json -
stat /home/user/.docker/config.json: permission denied

這表示因爲sudo命令,您的~/.docker/目錄是使用不正確的權限建立的。 要解決此問題,請刪除~/.docker/目錄(它會自動從新建立,但任何自定義設置都將丟失),或使用如下命令更改其全部權和權限:ubuntu

sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
sudo chmod g+rwx "$HOME/.docker" -R

配置Docker以在啓動時啓動

大多數當前的Linux發行版(RHEL,CentOS,Fedora,Ubuntu 16.04及更高版本)使用systemd來管理系統啓動時啓動的服務。
systemd緩存

sudo systemctl enable docker

要禁用開機啓動改用disablebash

sudo systemctl disable docker

upstart
Docker自動配置爲使用upstart啓動時啓動。要禁用此行爲,請使用如下命令:服務器

echo manual | sudo tee /etc/init/docker.override

chkconfig網絡

chkconfig docker on
# chkconfig docker off

故障排除

內核兼容性

若是您的內核早於3.10版本或者缺乏某些模塊,則Docker沒法正常運行。要檢查內核兼容性,能夠下載並運行check-config.sh腳本。curl

curl https://raw.githubusercontent.com/docker/docker/master/contrib/check-config.sh > check-config.sh
bash ./check-config.sh

要查看客戶端配置鏈接到哪一個主機,請檢查環境中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.<interface>.forwarding)的轉發設置默認爲關閉。此設置可防止IP轉發。它還與Docker net.ipv4.conf.all.forwarding在容器中啓用設置的行爲相沖突。
要在RHEL,CentOS或Fedora上解決此問題,請<interface>.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。

  1. 建立或編輯Docker守護程序配置文件,該/etc/docker/daemon.json文件默認爲 file,它控制Docker守護程序配置。
sudo nano /etc/docker/daemon.json
  1. 添加dns一個或多個IP地址做爲值的密鑰。若是文件包含現有內容,則只需添加或編輯該dns行。
{
	"dns": ["8.8.8.8", "8.8.4.4"]
}

若是您的內部DNS服務器沒法解析公共IP地址,請至少包含一個DNS服務器,以便您能夠鏈接到Docker Hub,以便您的容器能夠解析Internet域名。
保存並關閉文件。

  1. 從新啓動Docker守護程序。
sudo service docker restart
  1. 經過嘗試提取圖像來驗證Docker是否能夠解析外部IP地址:
docker pull hello-world
  1. 若有必要,請驗證Docker容器是否能夠經過ping它來解析內部主機名。
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

禁用 DNSMASQ

ubuntu的
若是您不想更改Docker守護程序的配置以使用特定的IP地址,請按照如下說明dnsmasq在NetworkManager中禁用。

  1. 編輯/etc/NetworkManager/NetworkManager.conf文件。
  2. 經過dns=dnsmasq在行#的開頭添加一個字符來註釋掉該行。
# dns=dnsmasq

保存並關閉文件。 3. 從新啓動NetworkManager和Docker。做爲替代方案,您能夠從新啓動系統。

sudo restart network-manager
sudo restart docker

RHEL,CentOS或Fedora
要dnsmasq在RHEL,CentOS或Fedora上禁用:

  1. 禁用該dnsmasq服務:
sudo service dnsmasq stop
sudo systemctl disable dnsmasq
  1. 使用Red Hat文檔手動配置DNS服務器 。

容許經過防火牆訪問遠程API

若是您在運行Docker的同一主機上運行防火牆而且想要從另外一臺主機訪問Docker Remote API並啓用遠程訪問,則須要配置防火牆以容許Docker端口上的傳入鏈接,默認爲2376if啓用TLS加密傳輸或2375 以其餘方式啓用。
兩個常見的防火牆守護程序是 UFW(簡單防火牆)(一般用於Ubuntu系統)和firewalld(一般用於基於RPM的系統)。請參閱操做系統和防火牆的文檔,但如下信息可能有助於您入門。這些選項至關寬鬆,您可能但願使用不一樣的配置來更好地鎖定系統。

  • UFW:DEFAULT_FORWARD_POLICY="ACCEPT"在您的配置中設置。
  • firewalld:在策略中添加與如下相似的規則(一個用於傳入請求,另外一個用於傳出請求)。確保接口名稱和鏈名稱正確。
<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>
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%。

  1. 以具備sudo權限的用戶身份登陸Ubuntu或Debian主機。
  2. 編輯/etc/default/grub文件。添加或編輯該GRUB_CMDLINE_LINUX行以添加如下兩個鍵值對:
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
  1. 更新GRUB。
sudo update-grub

從新啓動系統後,更改將生效。

相關文章
相關標籤/搜索