Docker 客戶端和守護進程
以上為Docker的C/S架構圖,從中摘取出Docker 的客戶端與守護進程的關系如下:
Docker Host 宿主機:
進行docker操作的虛擬機
Docker daemon 守護進程:
負責各種各樣的docker操作的核心程序,比如下載或者運行一個docker容器
Client 客戶端:
我們通過Client與Docker daemon進行交互,將
docker build
、dcoker pull
、docker run
交與Docker daemon去操作。主要的有以下兩種接口:- 命令行接口 Console API,這個不多講
- 遠程接口 Remote API 支持以下內容
- RESTful 風格API
- STDIN STDOUT STDERR,因此用戶可以用自定義的程序與Docker進行交互
- 版本信息可以使用命令
docker version
進行查看
客戶端和守護進程的連接
主要以socket進行連接,有以下的三種方式:
- unix:///var/run/docker.sock
- tcp://host: port
- fd://socketfd
使用以下的命令以第一種方式連接docker.sock
nc -U /var/run/docker.sock
發起 GET 請求docker的相關信息
GET /info HTTP1.1
將返回JSON格式的數據
守護進程的配置和操作
安裝完Docker後需要確認Docker的守護進程是否運行。Docker以root權限運 行它的守護進程,來處理普通用戶無法完成的操作(如掛載文件系統)。docker程序是 Docker守護進程的客戶端程序,同樣也需要以root身份運行。
當Docker軟件包安裝完畢後,默認會立即啟動Docker守護進程。守護進程監聽 /var/run/docker.sock這個Unix套接字文件,來獲取來自客戶端的Docker請求。如果系統中存在名為docker的用戶組的話,Docker則會將該套接字文件的所有者設置為該用戶組。docker用戶組的所有用戶都可以直接運行Docker,而無需再使用 sudo 命令了。
使用非root用戶
$ sudo groupadd docker
$ sudo gpasswd -a ${USER} docker
$ sudo service docker restart
login again
前面已經提到,盡管docker用戶組方便了 Docker的使用,但它畢竟是一個安全隱患。 因為docker用戶組對Docker具有與root用戶相同的權限,所以docker用戶組中應 該只能添加那些確實需要使用Docker的用戶和程序。
- 查看守護進程的兩種方式
$ ps -ef | grep docker
在Ubuntu中,如果Docker是通過軟件包安裝的話,我們可以運行Upstart的status 命令來檢查Docker守護進程是否正在運行
$ sudo status docker
在Docker服務的生命周期中使用以下的幾種命令
sudo service docker start
sudo service docker stop
sudo service docker restart
Docker的啟動選項
docker -d [OPTIONS] 常見的方式以守護進程的方式進行
運行相關:
-D, --debug = false -e, --exec-driverynative" -g, -graph="/var/lib/docker" -icc=true -l, --log-level="info" --label=[] -p, -pidfile = "/var/mn/docker.pid"
Docker服務器連接相關:
-G, -group="docker" -H, -host=[] --tls=false --tlscacert="~/.docker/ca.pem" --tlscert="~/.docker/cert.pem" -tlskey="~/.docker/key.perrT -tlsverify=false
RemotAPI 相關:
--api-enable-cors=false
存儲相關:
-s, -storage-driver="" -selinux-enabled=false --storage-opt=[]
Registry 相關:
--insecure-registry=[] --registry-mirror=[]
網絡設置相關:
-b,-bridge="" -bip="" --fixed-cidr="" --fixed-cidr-v6="" --dns=[] --dns-search=[] -ip=0.0.0.0 -ip-forward=true -ip-masq=true --iptables=true
啟動配置文件/etc/default/docker
上述的各種參數在配置文件中進行設置
實例
修改守護進程網絡
$ sudo /usr/bin/docker -d -H tcp://0.0.0.0:2375
這條命令會將Docker守護進程綁定到宿主機上的所有網絡接口。Docker客戶端不會自動監測到網絡的變化,我們需要通過-H選項來指定服務器的地址。例如,如果把守護進程端口改成4200,那麽運行客戶端時就必須指定docker -H :4200。如果不想每次運行客戶端時都加上-H標誌,可以通過設置DOCKER HOST環境變量來省略此步驟,如
$ export DOCKER_HOST="tcp://0.0.0.0:2375"
默認情況下,Docker的客戶端-服務器通信是不經認證的。這就意味著,如果把Docker 綁定到對外公開的網絡接口上,那麽任何人都可以連接到該Docker守護進程。Docker 0.9 及更高版本提供了TLS認證。
我們也能通過-H標誌指定一個Unix套接字路徑,例如,指定unix://home/docker/docker.socket,
$ sudo /usr/bin/docker -d -H unix://home/docker/docker.sock
當然,我們也可以同時指定多個綁定地址,
$ sudo /usr/bin/docker -d -H tcp://0.0.0.0:2375 -H unix://home/ docker/docker.sock
調試相關
在啟動守護進程時,我們還可以通過在命令前指定DEBUG=1參數來輸出更詳細的信 息。目前,Docker的日誌輸出還比較少。在使用了Upstart的Ubuntu系統下,Docker守護進程生成的日誌輸出都保存在/var/log/upstart/docker.log文件中
DEBUG=1 /usr/bin/docker -d
要想讓這些改動永久生效,需要編輯啟動配置項。在Ubuntu中,我們需要編輯 /etc/default/docker 文件,並修改 D0CKER_0PTS 變量。
在 Fedora 和 Red Hat 發布版本中,則需要編輯/usr/lib/systemd/system/docker.service文件,並修改其中的ExecStart配置項。
在其他平臺中,可以通過適當的init系統來管理和更新Docker守護進程的啟動配置。
守護進程配置文件不生效
問題描述:在配置文件/etc/default/docker
添加選項 DOCKER_OPTS=" --label name=docker_whoami "
後並不會生效。
解決辦法是:打開/lib/systemd/system/docker.service
文件
添加一行
EnvironmentFile=-/etc/default/docker
-代表ignore error
並修改
ExecStart=/usr/bin/docker daemon -H fd://
改成
ExecStart=/usr/bin/docker daemon -H fd:// $DOCKER_OPTS
這樣才可以使用/etc/default/docker
裏定義的DOCKER_OPTS參數
sudo systemctl daemon-reload 重載
重載完成再進行配置文件修改與服務重啟後,生效如下:
Labels:
name=docker_whoami
通過docker info
或者ps -ef | grep docker
可以查看得到上述選項。
Docker 客戶端和守護進程