description |
---|
很多安装包括官方脚本感觉不全面,缺少一些安装前设置和例如场景的补全脚本设置,这里讲下安装步骤 |
从前面的 namespace 各项技术来看是很早出现在 Linux 的,但是实际上近几年才有大规模的基于它的应用开发导致这些内核技术的发展,所以安装docker建议使用各个较新的发行版 Linux 和使用较新的 docker 版本。
建议使用 ubuntu16+,centos 的话进来不要使用低版本特别 7.2 坑非常多,7.4 坑不多但是也有坑,尽量7系列的最新系统。这里我是写的 centos 的安装,同时也推荐使用年份命名版本的 docker
环境设置(对 NetworkManager 熟悉的话可以不关闭它):
systemctl disable --now firewalld NetworkManager
# 不关闭 NetworkManager 的话执行下面的
# ---------------------------------
cat> /etc/NetworkManager/conf.d/k8s.conf << 'EOF'
[keyfile]
unmanaged-devices=interface-name:cali*;interface-name:tunl*;interface-name:vxlan.calico;interface-name:flannel*;interface-name:veth*;interface-name:cni0;interface-name:docker0
EOF
systemctl restart NetworkManager
#-------------------------------------
setenforce 0
sed -ri '/^[^#]*SELINUX=/s#=.+$#=disabled#' /etc/selinux/config
如果是图形界面 Linux 安装了 dnsmasq 的话可能 dns server 会被设置为 127.0.0.1,这会导致容器无法解析域名,建议关闭它
systemctl disable --now dnsmasq
默认的 limit 数值很小,我们得设置下 ulimt 的值,改/etc/security/limits.conf
或者/etc/security/limits.d/
下子配置文件,例如目录下新建一个低优先级的 21-custom.conf
cat > /etc/security/limits.d/21-custom.conf<<EOF
* soft nproc 131072
* hard nproc 131072
* soft nofile 131072
* hard nofile 131072
root soft nproc 131072
root hard nproc 131072
root soft nofile 131072
root hard nofile 131072
EOF
默认下系统的 User namespaces 是没开的,需要我们手动开启
grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
设置下系统内核参数
cat<<EOF > /etc/sysctl.d/docker.conf
# 要求iptables对bridge的数据进行处理
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1
# 开启转发
net.ipv4.ip_forward = 1
net.ipv4.conf.default.forwarding=1
EOF
sysctl --system
reboot 让内核设置生效
reboot
使用官方检查脚本检查下环境是否需要要求:
curl -s https://raw.githubusercontent.com/docker/docker/master/contrib/check-config.sh | bash
使用官方脚本安装,阿里和 azure 的 docker-ce.repo
文件里都是从官方源同步过来的,这个文件里地址还是指向官方,所以我们得加个sed修改下再执行
export VERSION=20.10
curl -fsSL "https://get.docker.com/" | \
sed -r '/add-repo \$yum_repo/a sed -i "s#https://download.docker.com#http://mirrors.aliyun.com/docker-ce#" /etc/yum.repos.d/docker-*.repo ' | \
bash -s -- --mirror Aliyun
配置 docker,默认 docker0 的段是172.17.0.1/16
,如果和 vpc 或者局域网冲突可以修改下。另外 docker 存储目录如果是 nas 挂载的在 overlay2 存储下起不来。
mkdir -p /etc/docker/
cat>/etc/docker/daemon.json<<EOF
{
"data-root": "/var/lib/docker",
"bip": "172.17.0.1/16",
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": [
"https://fz5yth0r.mirror.aliyuncs.com",
"https://dockerhub.mirrors.nwafu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://reg-mirror.qiniu.com"
],
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
EOF
存储驱动建议使用现在的 overlay2,以前的 devicemapper 坑非常多不建议在低版本 centos/redhat 上使用
- 防止 FORWARD 的 DROP 策略影响转发,给 docker daemon 添加下列参数修正,当然暴力点也可以
iptables -P FORWARD ACCEPT
mkdir -p /etc/systemd/system/docker.service.d/
cat>/etc/systemd/system/docker.service.d/10-docker.conf<<EOF
[Service]
ExecStartPre=/bin/bash -c 'test -d /var/run/docker.sock && rmdir /var/run/docker.sock || true'
ExecStartPost=/sbin/iptables --wait -I FORWARD -s 0.0.0.0/0 -j ACCEPT
ExecStopPost=/bin/bash -c '/sbin/iptables --wait -D FORWARD -s 0.0.0.0/0 -j ACCEPT &> /dev/null || :'
ExecStartPost=/sbin/iptables --wait -I INPUT -i cni0 -j ACCEPT
ExecStopPost=/bin/bash -c '/sbin/iptables --wait -D INPUT -i cni0 -j ACCEPT &> /dev/null || :'
EOF
设置 docker 补全脚本并启动 docker
yum install -y epel-release bash-completion
cp /usr/share/bash-completion/completions/docker /etc/bash_completion.d/
systemctl enable --now docker
如果 docker 启动失败删掉配置文件下面的这行内容,然后删掉 docker 默认存储目录/var/lib/docker
后再重启,这个原因在于根分区是lvm的时候很大几率出现,原因没去关注过
"storage-driver": "overlay2",
可以 run 个 nginx 容器测试下访问:
docker run -d --name test --rm -p 81:80 nginx:alpine
访问宿主机的 81 端口,如果有云主机的话安全组放行下端口。如果不能访问:
docker inspect nginx | grep IPAddress
,curl 下这个ip,如果是 No route to host
, 或者curl localhost:81
报错curl: (56) Recv failure: Connection reset by peer
。尝试开下混杂模式后再试试:
ip link set docker0 promisc on
# 固化下
mkdir -p /etc/systemd/system/docker.service.d/
cat>>/etc/systemd/system/docker.service.d/10-docker.conf<<EOF
ExecStartPre=/bin/bash -c 'ip link set docker0 promisc on'
EOF