docker采用CS架构,dockerd是管理后台进程,默认的配置文件为/etc/docker/daemon.json(--config-file可以指定非默认位置)。

一个完整的daemon.json示例参考:https://docs.docker.com/engine/reference/commandline/dockerd//#daemon-configuration-file

通过此文件可修改docker0的默认IP及bridge(Customize the docker0 bridge):

{
"bip": "192.168.1.5/24",
"fixed-cidr": "192.168.1.5/25",
"fixed-cidr-v6": "2001:db8::/64",
"mtu": 1500,
"default-gateway": "10.20.1.1",
"default-gateway-v6": "2001:db8:abcd::89",
"dns": ["10.20.1.2","10.20.1.3"]
}

几乎可以通过daemon.json配置所有docker daemon特性, 除了HTTP proxy

HTTP/HTTPS proxy

The Docker daemon uses the HTTP_PROXY, HTTPS_PROXY, and NO_PROXY environmental variables in its start-up environment to configure HTTP or HTTPS proxy behavior. You cannot configure these environment variables using the daemon.json file.

Proxy相关配置参考:https://docs.docker.com/config/daemon/systemd/

systemd管理

一般dockerd启动采用systemd管理:

[Service]
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

其中-H fd://如何理解呢?

When you start the Docker daemon, -H fd:// will tell Docker that the service is being started by Systemd and will use socket activation. systemd will then create the target socket and pass it to the Docker daemon to use. This is described in introduction to Systemd and in introduction to socket activation. The blogs are pretty long but really worth reading, here's a short summary of key points for understanding this question:

  • Systemd is a new init system intended to replace traditional SysV init system. One of its key features is faster init process.
  • Socket activation is one of the technologies used in Systemd to speed up service initialization
  • To receive requests, the service needs a socket to listen on. Take Docker as an example, it needs a unix domain socket like /var/run/docker.sock or a TCP socket. Of course these sockets needs something to create them and most of the time it is the service itself at start time.
  • With socket activation, SystemD will create these sockets and listen to them for services, and pass these sockets to service with exec when the service is started. One benefit is that client requests can be queued in the socket buffer once the socket is successfully created, even before the related service is started.
  • The socket info for a certain service used by Systemd is in socket unit file, for Docker it's [docker.socket][3] with content:
[Unit]
Description=Docker Socket for the API
PartOf=docker.service [Socket]
ListenStream=/var/run/docker.sock
SocketMode=
SocketUser=root
SocketGroup=docker [Install]
WantedBy=sockets.target

Let's see how the whole thing works. I have the files docker.socket and docker.service under /etc/systemd/system. The ExecStart line for docker.service is:

ExecStart=/usr/bin/dockerd -H fd://

1)Stop Docker service: systemctl stop docker

$> ps aux | grep 'docker' # the `grep` itself in the output is ignored
$> lsof -Ua | grep 'docker'
$>

No docker process is running, and no docker.sock

2)Execute systemctl start docker.socket:

$> systemctl start docker.socket
$> ps aux | grep 'docker'
$> lsof -Ua | grep 'docker'
systemd root 27u unix 0xffff880036da6000 0t0 /var/run/docker.sock

After start docker.socket, we can see that there's still no docker process running, but the socket /var/run/docker.sock has been created, and it belongs to the process systemd.

(Off-Topic: Actually the socket is ready to receive requests now, even though docker is not running yet. systemd will start docker.service at the moment the first request comes, passing the already created sockets to Docker. This is so-called on-demand auto-spawning)

3)Start docker.service

$> systemctl start docker.service
$> ps aux | grep 'docker'
root 0.0 1.8 ? Ssl : : /usr/bin/dockerd -H fd://
<....>

As you can tell Docker is now running. Let's go one step back and try to execute /usr/bin/dockerd -H fd:// manually from terminal:

$> /usr/bin/dockerd -H fd://
FATA[] no sockets found via socket activation: make sure the service was started by systemd

Now you see the difference; when you use -H fd://, docker will expect the socket to be passed by its parent process rather than creating it by itself. When it's started by Systemd, Systemd will do the job, but when you manually start it on terminal, you don't do the job so the docker daemon process failed and aborted. This is the code of how docker process fd:// when docker daemon starts, you can have a look if you're interested.

参考:

1. https://stackoverflow.com/questions/43303507/what-does-fd-mean-exactly-in-dockerd-h-fd

2. https://docs.docker.com/engine/reference/commandline/dockerd//#daemon-configuration-file

3. https://docs.docker.com/config/daemon/systemd/

4.  Docker 如何自定义默认网桥 docker0

dockerd启动配置_修改IP和systemd管理的更多相关文章

  1. Ubuntu配置和修改IP地址

    Ubuntu配置和修改IP地址 1.修改配置文件/etc/network/interfacesroot@ubuntu:~# sudo gedit /etc/network/interfaces 添加以 ...

  2. Linux基础二(修改ip地址、修改网关、修改DNS服务器、重新启动网络配置)

    网络的初始化 .ip地址的修改(临时生效) 使用ifconfig命令 ifconfig 网卡名 ip地址 netmask 子网掩码 [root@localhost /]# ifconfig eth1 ...

  3. Ubuntu下配置修改IP地址

    一.使用命令设置Ubuntu IP地址 1.修改配置文件blacklist.conf禁用IPV6:sudo vi /etc/modprobe.d/blacklist.conf 2.在文档最后添加 bl ...

  4. SpringBoot(十):读取application.yml下配置参数信息,java -jar启动时项目修改参数

    读取application.yml下配置参数信息 在application.yml文件内容 my: remote-address: 192.168.1.1 yarn: weburl: http://1 ...

  5. Docker(十七)-修改Docker容器启动配置参数

    有时候,我们创建容器时忘了添加参数 --restart=always ,当 Docker 重启时,容器未能自动启动, 现在要添加该参数怎么办呢,方法有二: 1.Docker 命令修改 docker c ...

  6. 修改Linux的基本配置(修改主机名修改ip地址安装JDK/Tomcat/MySQL等等)

    (一)基本操作修改 修改主机名 vi /etc/sysconfig/network NETWORKING=yes HOSTNAME=server1.itcast.cn 修改ip地址 vi /etc/s ...

  7. 修改Docker容器启动配置参数

    有时候,我们创建容器时忘了添加参数 --restart=always ,当 Docker 重启时,容器未能自动启动, 现在要添加该参数怎么办呢,方法有二: 1.Docker 命令修改 docker c ...

  8. 大数据学习之路—环境配置——IP设置(虚拟机修改Ip的内在原因及实现)

    一.IP原理 关于IP我的理解, (1)主要去理解IP地址的作用,IP地址包括网络相关部分和主机的相关部分.即:用一段特殊的数据,来标识网络特征和主机的特征. 至于具体的技术实现,日后可以慢慢体会和了 ...

  9. 【转】kali配置--修改IP和DNS

    修改IP地址 1 编辑文件 nano /etc/network/interfaces 2 在选择静态IP或DHCP,编辑文件内容并保存退出 (1)静态IP: ``` #Loop回环地址 auto lo ...

随机推荐

  1. sql语句(一)— —判断是否有这条数据的优化

    今天发现一个业务上的存储过程写的不够完善,和老板反应后,老板说你来完善吧,我:苦瓜脸~.说实话,我对SQL语句的熟练程度真的是不提也罢[捂脸],大概的判断流程我知道,但是真的让我自己写,还真得上网查查 ...

  2. 用户体验—微软Edge浏览器

    我现在使用的浏览器是win10自带的Edge浏览器 用户界面: 首先整体界面的话是清晰,一目了然,而且记住用户选择: 1.微软必应搜索的主题分类明确,查询简洁方便.查询语句简单: 2 .信息覆盖程度非 ...

  3. MySql主键不区分大小写问题、查询不区分大小写问题

    一.问题一:MySql默认主键不区分大小写 实例: -- 创建混合类型 create table PlainText( Content nvarchar(50) , primary key(Conte ...

  4. BZOJ2268 : Wormly

    考虑头部,一定是能向前就向前,因此是最左边的腿往右$b-1$个位置. 头部移动之后,腿部就要相应地移动到区间内最靠右的$l$个$1$之上. 若头部和腿部都不能移动,检查是否到达终点即可. 用前缀和以及 ...

  5. PAT Basic 1001

    1001 害死人不偿命的(3n+1)猜想 (15 分) 卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把 (3n+1) 砍掉一半.这样一直反复 ...

  6. ionic2 (真正)修改应用图标和启动画面

    今天在用ionic2 的ionic resources生成新的icon和splash,生成后安装,应用图标和启动画面依然没变化... 不知道大家有没有被坑过,今天被坑了一下午,终于找到了办法: 解决方 ...

  7. Intellij IDEA使用Docker插件部署应用

    1.安装Docker插件 配置Docker Api,在API URL中填入api的地址,记得Docker后台程序启动是要配置 -H tcp://0.0.0.0:2375 开放远程地址端口,注意这里的i ...

  8. fzu1062 洗牌问题(思路模拟)

    http://acm.fzu.edu.cn/problem.php?pid=1062 一开始想暴力找规律,没看出来..然后开始推,推测根据1再次返回第一个的时候顺序也复原,然后想以此推导出一个规律公式 ...

  9. MUI学习03-弹出菜单(弹出列表)

    弹出菜单HTML代码如下: <div class="mui-content"> <!--弹出列表-----------start--> <button ...

  10. jQuery 学习(1)——认识jQuery

    1.下载 下载地址:http://jquery.com/download/ jquery-3.2.1.js——用于开发和学习(229K) jquery-3.2.1.min.js——用于项目和产品(31 ...