1. 程式人生 > >Docker 客戶端和守護進程

Docker 客戶端和守護進程

處理 輸出 掛載文件系統 構圖 stdin idg emd 自動 add

技術分享圖片

以上為Docker的C/S架構圖,從中摘取出Docker 的客戶端與守護進程的關系如下:

技術分享圖片

  • Docker Host 宿主機:

    進行docker操作的虛擬機

    • Docker daemon 守護進程:

      負責各種各樣的docker操作的核心程序,比如下載或者運行一個docker容器

  • Client 客戶端:

    我們通過Client與Docker daemon進行交互,將docker builddcoker pulldocker 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用戶

  1. $ sudo groupadd docker
  2. $ sudo gpasswd -a ${USER} docker
  3. $ sudo service docker restart
  4. 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 客戶端和守護進程