docker管理员手册

管理员手册

1.基础
  • 自定义docker服务的配置文件路径/etc/docker/daemon.json

    1
    2
    3
    4
    5
    6
    7
    8
    # 示例配置文件
    {
    "debug": true,
    "tls": true,
    "tlscert": "/var/docker/server.pem",
    "tlskey": "/var/docker/serverkey.pem",
    "hosts": "tcp://192.168.59.3:2376"
    }
  • 查看docker日志

    1
    journalctl -u docker.service
  • 打开debug模式

    1
    2
    3
    4
    5
    6
    vim /etc/docker/daemon.json
    {
    "debug": true
    }
    $ sudo kill -SIGHUP $(pidof dockerd) # reload the dockerd
  • 强制堆栈跟踪, 但是并不会退出进程. 当dockerd没有响应的时候, 强制打印堆栈日志.

    1
    $ sudo kill -SIGUSR1 $(pidof dockerd)
  • docker上的容器开机或者dockerd重启的时候, 自动启动

    1
    2
    3
    4
    # docker run 的时候加入 --restart 参数
    # no - Container不重启
    # on-failure - container退出状态非0时重启
    # always - 始终重启
2.container启动内存参数
参数 解释
b, k, m, g 允许使用的单位
-m or –memory= 容器所能使用的最大内存数, 允许的最小值为 4m, 默认不限制
–memory-swap 容器所能使用的最大交换分区大小, 默认不限制
–memory-swappiness 允许将匿名内存页, 交换出内存分区的百分比. 可设置0 - 100, 默认继承系统的设置
–memory-reservation 允许你设置一个内存的软限制, 如果你设置了它, 它必须要小于 –memory 设置的值
–kernel-memory 容器所能使用的最大内核内存(区别于用户内存), 默认不限制
–oom-kill-disable 默认情况下,如果发生OOM,内核将会杀死容器中的进程. 开启这个参数,并且指定-m, 去禁用这个行为

–memory-swap
默认为 -1 (不限制大小)
如果设置了–memory但是没有设置此项, 则此项默认为–memory的两倍
如果同时设置了–memory和–memory-swap,则(swap大小 = memory-swap设置 - memory设置)

–kernel-memory
无限制内存,无限制内核内存: 这是默认行为
无限制内存,限制内核内存: 当所有的容器所需使用的内存大于宿主机的内存时,这样设置是适当的. 这会让其他需要更多内存的容器等待, 直到有足够的内存释放.
有限的内存,无限制的内核内存: 使用有限的内存, 无限制的内核内存.
有限的内存,有限的内核内存: 同时限制内存和内核内存,将有利于去调试那些因为内存导致的问题.如果不限制一个容器的内存和内核内存,它将在不影响其他容器和宿主机的情况下把所有内存耗尽. 否则,如果同时都加以限制, 在内核内存限制小于内存限制的时候, 内核内存溢出的情况下会引发容器内部的OOM, 如果内核内存限制大于内存限制的话, 内核限制将不会导致容器内的OOM.

3.container启动CPU参数

默认情况下, 容器不限制CPU的使用情况. 你可以通过以下开关来限制容器使用的CPU资源.
大多数用户会通过默认的 CFS调度器 去配置容器的CPU使用资源

参数 解释
–cpus= 指定可以使用多少CPU资源, 允许使用–cpus=”1.5”这种单位.详细会在下面讲到
–cpu-period= 指定调整CPU CFS调度器的重新分配周期, 默认是1秒, 期望单位为微秒, 一般不会修改此项
–cpu-quota= 指定容器在CFS调度器中的权重, –cpus = cpu-quota / cpu-period
–cpuset-cpus 指定使用哪些CPU, 0-3代表使用前4个CPU, 1,3代表使用第二和第四个CPU
–cpu-shares 设置一个大于或者小于1024的值, 以增加或减少容器的权重, 当CPU资源不足时,进行权衡.

同时, Docker提供一些选型让你能改变程序的优先级. CPU调度以及优先级都是内核级别的特性, 大多数用户不需要去改变这些默认的值, 不正确的去改变这些, 将会导致你的系统不稳定,甚至崩溃.如果你了解这些, 并且想进一步设置, 可以访问 https://docs.docker.com/engine/admin/resource_constraints/#configure-the-realtime-scheduler

4.让容器一直运行

默认情况下, 当Docker守护进程关闭了, 他会关闭所有运行的容器. 当你的Docker版本大于1.12之后, 你可以进行配置让守护进程不可用的时候, 容器依然正常运行. 这个选项将减少由于守护进程崩溃,有计划的维护或升级Docker带来的影响时间.

这个选项暂时不支持Windows上的Docker, 但是支持Linux上的Windows容器.

1
2
3
4
5
6
vim /etc/docker/daemon.json
{
"live-restore": true
}
$ sudo kill -SIGHUP $(pidof dockerd) # reload the dockerd

或者启动Docker的时候加入这个参数

1
bash $ sudo dockerd --live-restore

  • 此在线修复的功能, 可以允许你平滑地升级你的Docker. 但是当你跨大版本升级的时候. 例如1.21.1到1.13.2版本, 守护进程可能不能修复与容器之间的链接, Docker将不能接管这些旧版本的容器. 但是也不会关闭他们. 这意味着你需要手动重启这些容器来重新接管.
  • 在线修复功能只能在配置文件不变的情况下, 如果守护进程在关闭和启动之后, 使用的不同的配置项, 这个选项将可能失效.
  • 一个长时间不在线的Docker守护进程, 会影响运行中容器. 因为容器在运行的时候会把日志写进一个 FIFO的日志队列中去, 让Docker守护进程去消费.如果Docker不能去消费这些输出, 日志队列将会填满,然后阻塞容器的日志写入, 直到有空间继续写入.默认日志队列的大小为64K.你可以重启Docker来清空这个队列.又或者更改这个队列的大小/proc/sys/fs/pipe-max-size.
5.HTTP/HTTPS proxy

你几乎可以通过daemon.json来配置所有的配置项, 除了HTTP proxy等特殊项.
比如你可以通过配置文件指定Docker存放镜像文件,容器和逻辑卷分区的目录.

1
2
3
4
{
"graph": "/mnt/docker-data",
"storage-driver": "overlay"
}

但是如果你想配置一些特殊项,比如容器的HTTP proxy配置, 你必须得这么做:
Docker守护进程使用HTTP_PROXY, HTTPS_PROXY,和 NO_PROXY 环境变量去配置HTTP代理的行为.

1.创建目录

1
$ mkdir -p /etc/systemd/system/docker.service.d

2.创建对应配置文件/etc/systemd/system/docker.service.d/http-proxy.conf

1
2
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80/"

还有https的,如果需要的话/etc/systemd/system/docker.service.d/https-proxy.conf

1
2
[Service]
Environment="HTTPS_PROXY=https://proxy.example.com:443/"

3.假如你拥有一个内部私有仓库, 而你不想这些连接使用http_proxy, 可以特别指定

1
2
3
4
5
vim /etc/systemd/system/docker.service.d/http-proxy.conf
Environment="HTTP_PROXY=http://proxy.example.com:80/" "NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com"
vim /etc/systemd/system/docker.service.d/https-proxy.conf
Environment="HTTPS_PROXY=https://proxy.example.com:443/" "NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com"

4.重新加载systemd配置

1
$ sudo systemctl daemon-reload

5.重启docker

1
$ sudo systemctl restart docker

6.检查

1
2
3
4
5
$ systemctl show --property=Environment docker
Environment=HTTP_PROXY=http://proxy.example.com:80/
# 或者
$ systemctl show --property=Environment docker
Environment=HTTPS_PROXY=https://proxy.example.com:443/

6.创建私有仓库

1.指定--registry-mirror来启动你docker服务

1
2
3
4
5
6
7
8
sudo docker --registry-mirror=http://<my-docker-mirror-host> -d
#举个栗子
sudo docker --registry-mirror=http://10.0.0.2:5000 -d
#或者
vim /etc/docker/daemon.json
{
"registry-mirror": "http://127.0.0.1:5000"
}

2.启动自己的私有仓库

1
2
3
4
5
sudo docker run -p 5000:5000 \
-e STANDALONE=false \
-e MIRROR_SOURCE=https://registry-1.docker.io \
-e MIRROR_SOURCE_INDEX=https://index.docker.io \
registry