.. include:: ../../sumaccess.rst ============== Docker安装 ============== Docker是一个轻量级虚拟化技术,它具备传统虚拟机无可比拟的优势。它更简易的安装和使用方式、更快的速度、服务集成与开发流程自动化,都使Docker被广大技术爱好者青睐。 支持安装的平台 =============== Desktop ------------- +----------------------------------------------------+----------------+ | Platform | x86_64 / amd64 | +====================================================+================+ | `Docker Desktop for Mac | |image5| | | (macOS) `__ | | +----------------------------------------------------+----------------+ | `Docker Desktop for | |image6| | | Windows `__ | | +----------------------------------------------------+----------------+ .. |image5| image:: ../image/green-check.svg :target: https://docs.docker.com/docker-for-mac/install/ .. |image6| image:: ../image/green-check.svg :target: https://docs.docker.com/docker-for-windows/install/ Server ---------- 安装Docker有如下要求: - Docker只支持64位CPU架构的计算机,目前不支持32位CPU; - 建议系统的Linux内核版本为3.10及以上; - Linux内核需开启cgroups和namespace功能; +-----------------+----------------+-----------+-----------------+ | Platform | x86_64 / amd64 | ARM | ARM64 / AARCH64 | +=================+================+===========+=================+ | `CentOS `__ | | | | +-----------------+----------------+-----------+-----------------+ | `Debian `__ | | | | +-----------------+----------------+-----------+-----------------+ | `Fedora `__ | | | | +-----------------+----------------+-----------+-----------------+ | Raspbian_ | | |image32| | |image33| | +-----------------+----------------+-----------+-----------------+ | `Ubuntu `__ | | | | +-----------------+----------------+-----------+-----------------+ .. |image25| image:: ../image/green-check.svg :target: https://docs.docker.com/engine/install/centos/ .. |image26| image:: ../image/green-check.svg :target: https://docs.docker.com/engine/install/centos/ .. |image27| image:: ../image/green-check.svg :target: https://docs.docker.com/engine/install/debian/ .. |image28| image:: ../image/green-check.svg :target: https://docs.docker.com/engine/install/debian/ .. |image29| image:: ../image/green-check.svg :target: https://docs.docker.com/engine/install/debian/ .. |image30| image:: ../image/green-check.svg :target: https://docs.docker.com/engine/install/fedora/ .. |image31| image:: ../image/green-check.svg :target: https://docs.docker.com/engine/install/fedora/ .. |image32| image:: ../image/green-check.svg :target: https://docs.docker.com/engine/install/debian/ .. |image33| image:: ../image/green-check.svg :target: https://docs.docker.com/engine/install/debian/ .. |image34| image:: ../image/green-check.svg :target: https://docs.docker.com/engine/install/ubuntu/ .. |image35| image:: ../image/green-check.svg :target: https://docs.docker.com/engine/install/ubuntu/ .. |image36| image:: ../image/green-check.svg :target: https://docs.docker.com/engine/install/ubuntu/ .. _Raspbian: https://docs.docker.com/engine/install/debian/ 安装Docker ================== Windwos安装Docker ------------------- 直接参考官方教程即可,这里不单独展开描述 Desktop安装方式: https://docs.docker.com/docker-for-windows/install/ CentOS安装Docker ------------------ 卸载旧版本 +++++++++++++++ .. code-block:: bash :linenos: :caption: uninstall old docker version :name: uninstall old docker version $ sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine 配置Docker的yum下载源 ++++++++++++++++++++++ .. code-block:: bash :linenos: :caption: add docker yum repo :name: add docker yum repo $ sudo yum install -y yum-utils $ sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo 安装Docker容器引擎 +++++++++++++++++++++ .. code-block:: bash :linenos: :caption: install docker engine :name: install docker engine :emphasize-lines: 1 $ sudo yum install docker-ce docker-ce-cli containerd.io 检查是否安装成功 .. code-block:: bash :linenos: :caption: check if successd :name: check if successd :emphasize-lines: 3-6 $ yum list docker-ce --showduplicates | sort -r docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable 生产环境Docker优化 ===================== `在实际使用过程中,仍然需要一些额外的参数配置来保证你的Docker更更加稳定`\ Docker镜像仓库加速器 ------------------------- 对于Docker官方镜像仓库Registry,没有仓库镜像加速,寸步难行。 镜像仓库加速器Registry Mirrors,是国内对官方Registry的”镜像(mirror)”,当拉取image时,Docker Daemon先去 Registry Mirrors 拉取镜像,如果没找到镜像,Registry Mirrors找官方Registry拉去镜像,然后再返回给本地。 .. figure:: ../image/registry_mirror.png :width: 480px :alt: 镜像加速 :align: center Registry Mirror设置 针对Docker客户端版本大于 1.10.0 的用户,您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器 .. code-block:: bash :linenos: :caption: Docker镜像加速 :name: Docker镜像加速 :emphasize-lines: 4 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://you-correct-address.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker Docker daemon重载 ------------------------ 默认情况下,当 Docker守护进程终止时,它将关闭正在运行的容器。您可以配置守护程序,以便容器在守护程序不可用时保持运行。 此功能称为live-restore。live-restore选项有助于减少由于守护进程崩溃、计划中断或升级而导致的容器停机时间。 在工作中,假如修改了docker的配置而需要重新加载docker守护进程,导致docker容器重启,业务会中断一会,尤其是在生产环境,存在一定的风险。 这种情况下,可以启用live-restore功能,以在守护进程不可用时使容器保持活动状态。 将配置添加到守护进程配置,即docker-daemon.json,如下 .. code-block:: bash :linenos: :caption: Docker守护进程重载 :name: Docker守护进程重载 :emphasize-lines: 6 $ cat /etc/docker/daemon.json { "debug": false, "registry-mirrors": ["https://you-correct-address.mirror.aliyuncs.com"], "live-restore": true } 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 .. code:: $ 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配置 .. code-block:: bash :linenos: :caption: Docker Logging Driver :name: Docker Logging Driver :emphasize-lines: 7-12 $ cat /etc/docker/daemon.json { "debug": false, "registry-mirrors": ["https://you-correct-address.mirror.aliyuncs.com"], "live-restore": true, "log-driver": "json-file", "log-level": "warn", "log-opts": { "max-file": "10", "max-size": "100m" } } 开启iptable转发 ----------------- `iptable forward转发实现docker -p 功能共局域网内其他主机访问` Linux系统缺省并没有打开IP转发功能,要确认IP转发功能的状态,可以查看/proc文件系统,使用下面命令 .. code:: $ 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。 .. WARNING:: 上面的命令并没有保存对IP转发配置的更改,下次系统启动时仍会使用原来的值, 要想永久修改IP转发,需要修改/etc/sysctl.conf文件,修 改下面一行的值: `net.ipv4.ip_forward = 1` 修改后可以重启系统来使修改生效,也可以执行下面的命令来使修改生效: .. code:: sysctl -p /etc/sysctl.conf 进行了上面的配置后,IP转发功能就永久使能了。 当然,我们也可以通过控制Docker Daemon配置文件来实现 .. code-block:: bash :linenos: :caption: Docker iptables forwarding :name: Docker iptables forwarding :emphasize-lines: 13 $ cat /etc/docker/daemon.json { "debug": false, "registry-mirrors": ["https://you-correct-address.mirror.aliyuncs.com"], "live-restore": true, "log-driver": "json-file", "log-level": "warn", "log-opts": { "max-file": "10", "max-size": "100m" }, "ip-forward": true } 实验下 首先关闭iptable转发 .. code:: bash $ sysctl -w net.ipv4.ip_forward=0 $ cat /proc/sys/net/ipv4/ip_forward 0 启动测试容器访问其他主机上的服务: .. code:: bash $ 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 .. code:: bash $ systemctl restart docker # 配置如上的Docker daemon.json文件 再次测试 .. code:: bash $ 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 .. code:: bash $ cat /proc/sys/net/ipv4/ip_forward 1 其他可选配置 ------------------ .. code-block:: bash :linenos: :caption: Docker daemon.json :name: Docker daemon.json :emphasize-lines: 14-17 $ cat /etc/docker/daemon.json { "debug": false, "registry-mirrors": ["https://you-correct-address.mirror.aliyuncs.com"], "live-restore": true, "log-driver": "json-file", "log-level": "warn", "log-opts": { "max-file": "10", "max-size": "100m" }, "ip-forward": true, "ip-masq": false, "iptables": false, "ipv6": false, "selinux-enabled": false } - ``ip-masq`` : 关闭网桥上的IP地址开启IP伪装(masquerading) - ``iptables`` : 关闭iptables 规则 - ``ipv6`` : 关闭IPV6网络 - ``selinux-enabled`` : 关闭SeLinux,如开启SELinux SELinux尚不支持BTRFS储存驱动 容器磁盘使用限制 ---------------------- overlay2.size是在 17.07.0-ce 中引入的: Add overlay2.size daemon storage-opt 2 首先,将默认的/var/lib/docker设置为一块单独的设备,可以用fdisk磁盘划分,也可以直接挂载一块已有的空白块设备,并且保证这块设备的文件系统为XFS格式,具体过程不在赘述 假设块设备为/dev/sdb .. code:: bash $ 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 .. code-block:: bash :linenos: :emphasize-lines: 14-18 $ cat /etc/docker/daemon.json { "insecure-registries": [ ...... ], "registry-mirrors": [ "https://xxxxxx.mirror.aliyuncs.com" ], "log-opts": { "max-size": "100m", "max-file": "1" }, "ip-forward": true, "storage-driver": "overlay2", "storage-opts": [ "overlay2.override_kernel_check=true", "overlay2.size=1G" ], "ip-masq": false, "iptables": false, "ipv6": false, "selinux-enabled": false } 启动并进入测试容器,查看限制 .. code-block:: bash :linenos: :emphasize-lines: 4 $ docker run --rm -it ubuntu /bin/bash root@4385da9fb7bc:/# df -h Filesystem Size Used Avail Use% Mounted on overlay 1.0G 8.0K 1.0G 1% / tmpfs 64M 0 64M 0% /dev tmpfs 32G 0 32G 0% /sys/fs/cgroup shm 64M 0 64M 0% /dev/shm /dev/sdb 100G 5.7G 95G 6% /etc/hosts tmpfs 32G 0 32G 0% /proc/acpi tmpfs 32G 0 32G 0% /proc/scsi tmpfs 32G 0 32G 0% /sys/firmware .. caution:: Docker daemon运行中所在的工作目录,默认为/var/lib/docker。若该目录不存在,则会创建,并赋予0700权限 在生产环境,强烈建议将/var/lib/docker用单独的块存储来挂载。 .. include:: ../../comment.rst