Docker 客户端和守护进程

Posted onetoinf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker 客户端和守护进程相关的知识,希望对你有一定的参考价值。

技术分享图片

以上为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 客户端和守护进程的主要内容,如果未能解决你的问题,请参考以下文章

Docker 守护进程日志在哪里?

Docker的基本组成

Docker客户端与守护进程

Docker简介

Docker 学习笔记

docker组件