以上为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
可以查看得到上述选项。