3. Docker安装¶
Docker是一个轻量级虚拟化技术,它具备传统虚拟机无可比拟的优势。它更简易的安装和使用方式、更快的速度、服务集成与开发流程自动化,都使Docker被广大技术爱好者青睐。
3.2. 安装Docker¶
3.2.1. Windwos安装Docker¶
直接参考官方教程即可,这里不单独展开描述
Desktop安装方式: https://docs.docker.com/docker-for-windows/install/
3.2.2. CentOS安装Docker¶
3.2.2.1. 卸载旧版本¶
1$ sudo yum remove docker \
2 docker-client \
3 docker-client-latest \
4 docker-common \
5 docker-latest \
6 docker-latest-logrotate \
7 docker-logrotate \
8 docker-engine
3.2.2.2. 配置Docker的yum下载源¶
1$ sudo yum install -y yum-utils
2
3$ sudo yum-config-manager \
4 --add-repo \
5 https://download.docker.com/linux/centos/docker-ce.repo
3.2.2.3. 安装Docker容器引擎¶
1$ sudo yum install docker-ce docker-ce-cli containerd.io
检查是否安装成功
1$ yum list docker-ce --showduplicates | sort -r
2
3docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable
4docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable
5docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
6docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
3.3. 生产环境Docker优化¶
在实际使用过程中,仍然需要一些额外的参数配置来保证你的Docker更更加稳定
3.3.1. Docker镜像仓库加速器¶
对于Docker官方镜像仓库Registry,没有仓库镜像加速,寸步难行。
镜像仓库加速器Registry Mirrors,是国内对官方Registry的”镜像(mirror)”,当拉取image时,Docker Daemon先去 Registry Mirrors 拉取镜像,如果没找到镜像,Registry Mirrors找官方Registry拉去镜像,然后再返回给本地。
Registry Mirror设置¶
针对Docker客户端版本大于 1.10.0 的用户,您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
1 sudo mkdir -p /etc/docker
2 sudo tee /etc/docker/daemon.json <<-'EOF'
3 {
4 "registry-mirrors": ["https://you-correct-address.mirror.aliyuncs.com"]
5 }
6 EOF
7
8 sudo systemctl daemon-reload
9 sudo systemctl restart docker
3.3.2. Docker daemon重载¶
默认情况下,当 Docker守护进程终止时,它将关闭正在运行的容器。您可以配置守护程序,以便容器在守护程序不可用时保持运行。 此功能称为live-restore。live-restore选项有助于减少由于守护进程崩溃、计划中断或升级而导致的容器停机时间。
在工作中,假如修改了docker的配置而需要重新加载docker守护进程,导致docker容器重启,业务会中断一会,尤其是在生产环境,存在一定的风险。 这种情况下,可以启用live-restore功能,以在守护进程不可用时使容器保持活动状态。
将配置添加到守护进程配置,即docker-daemon.json,如下
1 $ cat /etc/docker/daemon.json
2
3 {
4 "debug": false,
5 "registry-mirrors": ["https://you-correct-address.mirror.aliyuncs.com"],
6 "live-restore": true
7 }
3.3.3. Docker Logging Driver¶
Docker拥有多种日志机制来收集容器及其内部运行的服务的日志信息,这些机制统称为logging drivers。 Docker daemon 拥有一个默认的logging driver(json-file),容器默认采用这个logging driver.
Docker处理日志的方法是 Docker daemon捕捉每一个容器进程的STDOUT和STDERR, 通过logging driver将它们输出保存在磁盘上。 然后用户就能使用docker logs 来进行查询。
这些日志跟随容器而产生的,如果删除了某个容器,相应的日志文件也会随着被删除。
Docker的默认 logging driver是 json-file
$ docker info | grep 'Logging Driver'
Logging Driver: json-file
除了 json-file 还支持很多 logging driver
驱动程序 |
描述 |
|---|---|
none |
容器没有日志可用,docker logs 什么都不返回 |
local |
日志以自定义格式存储,设计这种格式的目的是将开销降到最低。 |
syslog |
将日志消息写入 syslog 工具,syslog 守护程序必须在主机上运行。 |
journald |
将日志消息写入 journald,journald 守护程序必须在主机上运行。 |
gelf |
将日志消息写入 Graylog Extended Log Format (GELF) 终端,例如 Graylog 或 Logstash。 |
fluentd |
将日志消息写入 fluentd(forward input),fluentd 守护程序必须在主机上运行。 |
awslogs |
将日志消息写入 Amazon CloudWatch Logs。 |
splunk |
使用HTTP事件收集器将日志消息写入splunk。 |
etwlogs |
将日志消息写为 Windows 的 Event Tracing 事件,仅在Windows平台上可用。 |
gcplogs |
将日志消息写入 Google Cloud Platform (GCP) Logging。 |
logentries |
将日志消息写入 Rapid7 Logentries。 |
json-file |
日志格式化为 JSON,这是 Docker 默认的日志驱动程序。 |
none 是 disable 容器日志功能
syslog 和 journald 是linux上的两种日志管理服务
awslogs,splunk 和 gcplogs 是第三方日志托管服务
gelf 和 fluentd 是两种开源的日志管理方案
这里暂时演示默认的json-file配置
1$ cat /etc/docker/daemon.json
2
3{
4 "debug": false,
5 "registry-mirrors": ["https://you-correct-address.mirror.aliyuncs.com"],
6 "live-restore": true,
7 "log-driver": "json-file",
8 "log-level": "warn",
9 "log-opts": {
10 "max-file": "10",
11 "max-size": "100m"
12 }
13}
3.3.4. 开启iptable转发¶
iptable forward转发实现docker -p 功能共局域网内其他主机访问
Linux系统缺省并没有打开IP转发功能,要确认IP转发功能的状态,可以查看/proc文件系统,使用下面命令
$ cat /proc/sys/net/ipv4/ip_forward
0
如果上述文件中的值为0,说明禁止进行IP转发
如果是1,则说明IP转发功能已经打开
- 要想打开IP转发功能,可以直接修改上述文件: echo 1 > /proc/sys/net/ipv4/ip_forward
把文件的内容由0修改为1。禁用IP转发则把1改为0。
警告
上面的命令并没有保存对IP转发配置的更改,下次系统启动时仍会使用原来的值,
要想永久修改IP转发,需要修改/etc/sysctl.conf文件,修 改下面一行的值: net.ipv4.ip_forward = 1
修改后可以重启系统来使修改生效,也可以执行下面的命令来使修改生效:
sysctl -p /etc/sysctl.conf
进行了上面的配置后,IP转发功能就永久使能了。
当然,我们也可以通过控制Docker Daemon配置文件来实现
1$ cat /etc/docker/daemon.json
2
3{
4 "debug": false,
5 "registry-mirrors": ["https://you-correct-address.mirror.aliyuncs.com"],
6 "live-restore": true,
7 "log-driver": "json-file",
8 "log-level": "warn",
9 "log-opts": {
10 "max-file": "10",
11 "max-size": "100m"
12 },
13 "ip-forward": true
14}
实验下
首先关闭iptable转发
$ sysctl -w net.ipv4.ip_forward=0 $ cat /proc/sys/net/ipv4/ip_forward 0启动测试容器访问其他主机上的服务:
$ docker run -it --rm nginx:1.14-alpine ping image.test.com WARNING: IPv4 forwarding is disabled. Networking will not work. ping: bad address 'image.test.com'配置好/etc/docker/daemon.json后重启Docker
$ systemctl restart docker # 配置如上的Docker daemon.json文件再次测试
$ docker run -it --rm nginx:1.14-alpine ping image.test.com PING image.test.com (10.2.3.4): 56 data bytes 64 bytes from 10.2.3.4: seq=0 ttl=63 time=0.381 ms 64 bytes from 10.2.3.4: seq=1 ttl=63 time=0.274 ms ^C --- image.test.com ping statistics ---查看ip_forward
$ cat /proc/sys/net/ipv4/ip_forward 1
3.3.5. 其他可选配置¶
1$ cat /etc/docker/daemon.json
2
3{
4 "debug": false,
5 "registry-mirrors": ["https://you-correct-address.mirror.aliyuncs.com"],
6 "live-restore": true,
7 "log-driver": "json-file",
8 "log-level": "warn",
9 "log-opts": {
10 "max-file": "10",
11 "max-size": "100m"
12 },
13 "ip-forward": true,
14 "ip-masq": false,
15 "iptables": false,
16 "ipv6": false,
17 "selinux-enabled": false
18}
ip-masq: 关闭网桥上的IP地址开启IP伪装(masquerading)iptables: 关闭iptables 规则ipv6: 关闭IPV6网络selinux-enabled: 关闭SeLinux,如开启SELinux SELinux尚不支持BTRFS储存驱动
3.3.6. 容器磁盘使用限制¶
overlay2.size是在 17.07.0-ce 中引入的: Add overlay2.size daemon storage-opt 2
首先,将默认的/var/lib/docker设置为一块单独的设备,可以用fdisk磁盘划分,也可以直接挂载一块已有的空白块设备,并且保证这块设备的文件系统为XFS格式,具体过程不在赘述
假设块设备为/dev/sdb
$ lsblk|grep sdb
sdb 8:16 0 100G 0 disk
$ blkid /dev/sdb # 查看uuid
/dev/sdb: UUID="cc5933d9-4d94-479f-beed-ecff6c483893" TYPE="xfs"
$ vim /etc/fstab # 加入下面这行
UUID=cc5933d9-4d94-479f-beed-ecff6c483893 /var/lib/docker xfs rw,pquota 0 0 # uuid与上面保持一致
$ mount -a # 挂载块设备到指定目录
$ cat /proc/mounts |grep sdb # 确认挂载
/dev/sdb /var/lib/docker xfs rw,relatime,attr2,inode64,prjquota 0 0
然后修改docker的daemon.json文件并重启docker
1$ cat /etc/docker/daemon.json
2 {
3 "insecure-registries": [
4 ......
5 ],
6 "registry-mirrors": [
7 "https://xxxxxx.mirror.aliyuncs.com"
8 ],
9 "log-opts": {
10 "max-size": "100m",
11 "max-file": "1"
12 },
13 "ip-forward": true,
14 "storage-driver": "overlay2",
15 "storage-opts": [
16 "overlay2.override_kernel_check=true",
17 "overlay2.size=1G"
18 ],
19 "ip-masq": false,
20 "iptables": false,
21 "ipv6": false,
22 "selinux-enabled": false
23 }
启动并进入测试容器,查看限制
1 $ docker run --rm -it ubuntu /bin/bash
2 root@4385da9fb7bc:/# df -h
3 Filesystem Size Used Avail Use% Mounted on
4 overlay 1.0G 8.0K 1.0G 1% /
5 tmpfs 64M 0 64M 0% /dev
6 tmpfs 32G 0 32G 0% /sys/fs/cgroup
7 shm 64M 0 64M 0% /dev/shm
8 /dev/sdb 100G 5.7G 95G 6% /etc/hosts
9 tmpfs 32G 0 32G 0% /proc/acpi
10 tmpfs 32G 0 32G 0% /proc/scsi
11 tmpfs 32G 0 32G 0% /sys/firmware
小心
Docker daemon运行中所在的工作目录,默认为/var/lib/docker。若该目录不存在,则会创建,并赋予0700权限
在生产环境,强烈建议将/var/lib/docker用单独的块存储来挂载。