一、基础环境配置

1. 禁用操作系统交换分区

1.1 禁用 swap 交换分区

[root@localhost ~]# swapoff -a

1.2 永久禁用 swap 交换分区

禁用系统启动自动挂载swap分区

[root@localhost ~]# sed -ri 's/.*swap.*/#&/' /etc/fstab

1.3 检查配置

[root@localhost ~]# cat /etc/fstab
/dev/mapper/cl-root     /                       xfs     defaults        0 0
UUID=6cf7f17e-04a4-4296-ab20-557e7447bd98 /boot                   ext4    defaults        1 2
UUID=8F29-961F          /boot/efi               vfat    umask=0077,shortname=winnt 0 2
#/dev/mapper/cl-swap     swap                    swap    defaults        0 0

swap这行被注释即可。

2. 更换国内阿里云 YUM 源

2.1 备份原 YUM 源

[root@localhost ~]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

2.2 下载新的YUM源文件

CentOS-Base.repo 到 /etc/yum.repos.d/

[root@localhost ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

2.3 更新YUM文件地址(可选操作)

在非阿里云服务器上替换源中的地址

[root@localhost ~]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo

2.4  运行命令生成缓存

[root@localhost ~]# yum makecache

3 更新epel源

3.1 备份

[root@localhost ~]# mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup
[root@localhost ~]# mv /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.backup

3.2 下载

下载epel保存至/etc/yum.repos.d/

[root@localhost ~]# curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

4 关闭SELinux

4.1 查看SELinux配置

[root@localhost ~]# cat /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

4.2 关闭并永久禁用

# 立即关闭
[root@localhost ~]# setenforce 0
# 永久关闭
[root@localhost ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
[root@localhost ~]# sed -i 's/^SELINUX=.*$/SELINUX=disabled/g' /etc/selinux/config

4.3 检查配置

[root@localhost ~]# cat /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

查看当前"SELINUX"的状态是"disabled",表示已经禁用。

5.  配置时间同步

设置系统时间为中国时区,并启动NTP时间同步服务。

5.1 使用yum安装ntp

[root@localhost ~]# yum install -y ntp

5.2 设置ntpd服务开机启动

[root@localhost ~]# systemctl enable ntpd

5.3 更改时区

[root@localhost ~]# timedatectl set-timezone Asia/Shanghai

5.4  开启 ntp 同步

[root@localhost ~]# timedatectl set-ntp yes

5.5 修改配置文件

```bash  [root@localhost ~]# vim /etc/ntp.conf

server 192.170.1.26 iburst prefer server ntp.aliyun.com iburst


### 5.6 启动ntpd服务

```bash
[root@localhost ~]# systemctl start ntpd

5.7  时间手动校正

[root@localhost ~]# ntpq -p

5.8 查看时间服务状态

[root@localhost ~]#  timedatectl status
      Local time: Wed 2021-03-24 19:44:30 CST
  Universal time: Wed 2021-03-24 11:44:30 UTC
        RTC time: Wed 2021-03-24 11:44:29
       Time zone: Asia/Shanghai (CST, +0800)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a

6.时间设置

echo "Asia/Shanghai">/etc/timezone

7.常用软件安装

yum install -y wget lrzsz zip unzip tree vim net-tools telnet rsync

二、docker运行环境安装配置

1. 安装docker基础依赖

[root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

错误处理:GPG check FAILED yum 命令后添加 --nogpgcheck

2. docker-ce 安装配置

2.1 添加 docker-ce yum源

[root@localhost ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

2.2  安装 docker

[root@localhost ~]# yum install -y docker-ce docker-cli

2.3   启动docker服务,并查看服务状态

[root@localhost ~]# systemctl start docker
[root@localhost ~]# docker info
Client:
 Debug Mode: false

Server:
 Containers: 11
  Running: 11
  Paused: 0
  Stopped: 0
 Images: 6
 Server Version: 19.03.12
 Storage Driver: overlay2
  Backing Filesystem: xfs
  Supports d_type: true
  Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd
 init version: fec3683
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 3.10.0-1062.18.1.el7.x86_64
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 2
 Total Memory: 15.51GiB
 Name: manage.com
 ID: UOCC:3JCO:PDH4:A53O:PTUC:6HWL:6FUI:TJWZ:ZGTH:JOZE:P4GK:SDS6
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Registry Mirrors:
  https://hub-mirror.c.163.com/
  https://mirror.baidubce.com/
 Live Restore Enabled: false

2.4 设置docker服务开机启动

[root@localhost ~]# systemctl enable docker

3. docker-compose 安装配置

3.1 下载docker-compose可执行程序

[root@localhost ~]# curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

可以访问https://github.com/docker/compose/releases查找所需docker-compose的版本,相应版本号即可。

3.2 赋予可执行权限

[root@localhost ~]# chmod +x /usr/local/bin/docker-compose

3.3 创建软链接

[root@localhost ~]# ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

3.4 查看是否成功

[root@localhost ~]# docker-compose -v
docker-compose version 1.29.2, build 4092ae5d

至此,docker及docker-compose环境配置结束。

通过以上步骤即可完成在 CentOS7 操作系统上完成docker及docker-compose环境的配置,之后即可进行镜像的下载以及服务的部署了。

3.5 防火墙配置

[!warning] 需要把Docker的默认桥接网络配置为firewalld重启后自动恢复,否则重启防火墙后导致容器内容无法解析容器名的问题。因为firewalld重启后会清除iptables规则,导致Docker默认桥接网络无法正常工作。

firewall-cmd --permanent --zone=trusted --add-interface=docker0
firewall-cmd --reload

[!tip]

Docker Swarm 环境 在firewalld中为Docker添加必要的端口和协议

bash firewall-cmd --permanent --zone=trusted --add-port=2376/tcp firewall-cmd --permanent --zone=trusted --add-port=2377/tcp firewall-cmd --permanent --zone=trusted --add-port=7946/tcp firewall-cmd --permanent --zone=trusted --add-port=7946/udp firewall-cmd --permanent --zone=trusted --add-port=4789/udp firewall-cmd --reload

三、Docker 参数配置

参数配置文件默认路径 /etc/docker/daemon.json

1. 参数详解

1.1  registry-mirrors

{
  "registry-mirrors": []
}

参数配置的是Docker registry的镜像网站,由于国内访问docker hub有时会因为网络等其他原因到时访问失败的情况,所以配置一个国内的镜像网站能够加速Docker image的下载。

1.2 dns

{
  "dns": []
}

Docker内置了一个DNS Server,它用来做两件事情:

  • 解析docker network里的容器或Service的IP地址
  • 把解析不了的交给外部DNS Server解析(dns参数设定的地址)

默认情况下,dns参数值为Google DNS nameserver:8.8.8.8和8.8.4.4。我们得改成国内的DNS地址,比如:阿里DNS: 223.5.5.5 和 223.6.6.6 。

1.3 log-driver

Log driver是Docker用来接收来自容器内部stdout/stderr的日志的模块,Docker默认的log driver是JSON File logging driver。这里只讲json-file的配置,其他的请查阅相关文档。

json-file会将容器日志存储在docker host machine的/var/lib/docker/containers/<container id>/<container id>-json.log(需要root权限才能够读),既然日志是存在磁盘上的,那么就要磁盘消耗的问题。下面介绍两个关键参数:

  • max-size,单个日志文件最大尺寸,当日志文件超过此尺寸时会滚动,即不再往这个文件里写,而是写到一个新的文件里。默认值是-1,代表无限。
  • max-files,最多保留多少个日志文件。默认值是1。

具体参数的设置,根据自己实际磁盘空间以及需要保存日志范围来进行合理设置。

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-files":"5"
  }
}

1.4 storage-driver

Docker推荐使用overlay2作为Storage driver。你可以通过docker info | grep Storage来确认一下当前使用的是什么:

$ docker info | grep 'Storage'
Storage Driver: overlay2

如果结果不是overlay2,那你就需要配置一下了:

{
  "storage-driver": "overlay2"
}

1.5 mtu

MTU是一个很容易被忽略的参数,Docker默认的MTU是1500,这也是大多数网卡的MTU值。但是!在虚拟化环境下,docker host machine网卡的MTU可能不是1500,比如在openstack创建的虚拟的网卡的MTU是1450:

$ ip link
1: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether fa:16:3e:71:09:f5 brd ff:ff:ff:ff:ff:ff

当Docker网络的MTU比docker host machine网卡MTU大的时候可能会发生:

  1. 容器外出通信失败
  2. 影响网络性能

所以将Docker网络MTU设置成和host machine网卡保持一致就行了,比如:

{
  "mtu": 1450
}

重启docker.service服务后,验证:

$ ip link
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
    link/ether 02:42:6b:de:95:71 brd ff:ff:ff:ff:ff:ff

注意到docker0的MTU还是1500,不用惊慌,创建一个容器再观察就变成1450了(下面的veth是容器的虚拟网卡设备):

$ docker run -itd --name busybox --rm busybox
$ ip link
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP mode DEFAULT group default
    link/ether 02:42:6b:de:95:71 brd ff:ff:ff:ff:ff:ff
268: vethdf32b1b@if267: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master docker0 state UP mode DEFAULT group default
    link/ether 1a:d3:8a:3e:d3:dd brd ff:ff:ff:ff:ff:ff link-netnsid 2

在到容器里看看它的网卡,MTU也是1450:

$ docker exec busybox ip link
267: eth0@if268: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff

2. 参考参数模板

# 添加配置,注意一定要修改data-root目录,否在会将磁盘空间占满,默认路径是/var/lib
# 未避免修改路径导致其他问题,我们这里选择软链接的方式。
# 在有足够空间的目录中创建存储目录,我们这里选择 /data/docker
[root@localhost ~]# mkdir -p /opt/docker
[root@localhost ~]# mkdir -p /home/docker
[root@localhost ~]# chmod -R 764 /opt/docker
[root@localhost ~]# chmod -R 764 /home/docker
[root@localhost ~]# ln -s /home/docker /var/lib

# 参考参数配置
[root@localhost ~]# cat << EOF > /etc/docker/daemon.json
{  "registry-mirrors": [
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "https://almtd3fa.mirror.aliyuncs.com",
    "https://docker.mirrors.ustc.edu.cn"
  ],
 "dns": ["223.5.5.5", "223.6.6.6"],
 "exec-opts": ["native.cgroupdriver=systemd"],
 "max-concurrent-downloads": 10,
 "max-concurrent-uploads": 5,
 "log-opts": {
    "max-size": "100m",
    "max-file": "5"
    },
    "live-restore": true
}
EOF
# 重启服务
[root@localhost ~]# systemctl daemon-reload && systemctl restart docker

四、常见问题处理

问题1: 解决 docker 只监听ipv6问题

# 1.编辑引导文件, 添加 ipv6.disable=1 
[root@localhost ~]# vim /etc/default/grub
...
GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1  ..."
...

# 2.重新生成引导文件
[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg

# 3.重启系统
[root@localhost ~]# reboot

问题2:时间同步设置不生效

# 1)先停掉ntpd
systemctl stop ntpd
# 2) 执行时间同步调整时间
ntpd -gq
# 3)再启动ntpd服务
systemctl start ntpd

问题3:docker数据目录迁移

问题描述

实际生产环境中大家可能会经常发现/var/lib/docker目录随着docker环境运行时间及容器的增加,会逐渐占用大量目录,在前期如更没有做很好的系统目录规划,很容易导致系统根分区被占满,此时就需要进行docker数据目录的迁移。

解决方案

将正在运行的docker路径下的内容拷贝到准备迁移的目录,强烈推荐使用mv或rsync命令,cp会丢失文件目录权限,可能会引起无法预测的问题。

Tips:

  1. 如用cp命令,先不要处理原有docker数据目录,复制时候切忌使用arp参数,否则会导致部分容器无法启动。
  2. 如执行cp未带arp参数,原有docker目录有已删除时,当发现容器无法正常启动,此时需要删除镜像和容器,重新导入镜像和启动容器。如是数据库的容器此时问题就麻烦了。
  3. 如对当前操作没有把握,切忌先在模拟环境中验证操作后再在生产环境中执行。
#1)关闭docker服务
systemctl stop docker

#2)迁移docker数据目录
# 方法一:
cp -arp /var/lib/docker /opt/
#方法二:
mv /opt/docker /data/basic-data

#方法三:
yum install rsync -y
rsync -avz /var/lib/docker /data/basic-data

#3)修改docker数据目录
vim /etc/docker/daemon.json 
{  "registry-mirrors": [
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "https://almtd3fa.mirror.aliyuncs.com",
    "https://docker.mirrors.ustc.edu.cn"
  ],
 "dns": ["223.5.5.5", "223.6.6.6"],
 "storage-driver": "overlay2",
 "max-concurrent-downloads": 10,
 "log-driver": "json-file",
 "max-concurrent-uploads": 5,
 "log-opts": {
    "max-size": "10m",
    "max-file": "5"
    },
    "live-restore": true
}

#4)启动docker服务
systemctl start docker

问题4:域名设置方法

方法一:创建容器时指定DNS

#docker-compose
dns:
  - 8.8.8.8
  - 8.8.4.4

方法二:默认方式

使用默认的方式,会自动加载宿主机的/etc/resolv.conf内容到到容器 但修改宿主机的/etc/resolv.conf文件,不会同步更新到容器里的/etc/resolv.conf;

方法三:显示挂载

修改宿主机时使用echo,因为使用vi会改变inode,修改后并不会相应变化到容器

#映射文件
"/etc/resolv.conf:/etc/resolv.conf"
#通过echo的方式修改宿主机文件
echo "nameserver 8.8.8.8" >> /etc/resolv.conf

方法四:设置docker启动配置

#vi /etc/docker/daemon.json,增加配置:
"dns" : ["114.114.114.114","8.8.8.8"]

五、参考文献

https://docs.docker.com/engine/reference/commandline/dockerd/

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