一、基础环境配置
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大的时候可能会发生:
- 容器外出通信失败
- 影响网络性能
所以将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:
- 如用cp命令,先不要处理原有docker数据目录,复制时候切忌使用arp参数,否则会导致部分容器无法启动。
- 如执行cp未带arp参数,原有docker目录有已删除时,当发现容器无法正常启动,此时需要删除镜像和容器,重新导入镜像和启动容器。如是数据库的容器此时问题就麻烦了。
- 如对当前操作没有把握,切忌先在模拟环境中验证操作后再在生产环境中执行。
#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/
评论