Skip to content

Latest commit

 

History

History
298 lines (227 loc) · 9.71 KB

1.2.install-docker.md

File metadata and controls

298 lines (227 loc) · 9.71 KB
description
很多安装包括官方脚本感觉不全面,缺少一些安装前设置和例如场景的补全脚本设置,这里讲下安装步骤

安装docker

从前面的 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",

离线安装

建议先看官方文档 Install Docker Engine from binaries,我这里只简介描写下。

离线有两种方式,一种是导出离线 rpm 和 deb,这里只说 static bin 方式,官方不推荐 static bin,因为有 libcontainer 相关依赖还是需要包管理安装的。

安装分为:

  • 下载 static bin 压缩包
  • 配置 systemd 启动文件和一些配置

下载 docker static bin

去网站 https://download.docker.com/linux/static/stable/ 里的 x86_64/aarch64/ 下载对应架构的,例如现在是 docker-27.3.1.tgz

wget https://download.docker.com/linux/static/stable/$(uname -m)/docker-27.3.1.tgz
# 国内镜像站
wget https://mirrors.aliyun.com/docker-ce/linux/static/stable/$(uname -m)/docker-27.3.1.tgz

就解压到 /usr/bin/

tar zxf docker-2?.?.?.tgz --strip-component=1 -C /usr/bin/

配置相关

建议切到 root 身份,或者命令前面加 sudo,主要是增加 docker 组,和 systemd 相关配置文件。

groupadd docker

# 如果想把用户 user1 能使用 docker
usermod -aG docker user1

docker 的 systemd service 文件在 github 上有:

cat > /etc/systemd/system/docker.service << 'EOF'
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target docker.socket firewalld.service containerd.service time-set.target
Wants=network-online.target containerd.service
Requires=docker.socket

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutStartSec=0
RestartSec=2
Restart=always

# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.
# Both the old, and new location are accepted by systemd 229 and up, so using the old location
# to make them work for either version of systemd.
StartLimitBurst=3

# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.
# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make
# this option work for either version of systemd.
StartLimitInterval=60s

# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity

# Comment TasksMax if your systemd version does not support it.
# Only systemd 226 and above support this option.
TasksMax=infinity

# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes

# kill only the docker process, not all processes in the cgroup
KillMode=process
OOMScoreAdjust=-500

[Install]
WantedBy=multi-user.target
EOF

还有 docker.socket 文件:

cat > /etc/systemd/system/docker.socket << 'EOF'
[Unit]
Description=Docker Socket for the API

[Socket]
# If /var/run is not implemented as a symlink to /run, you may need to
# specify ListenStream=/var/run/docker.sock instead.
ListenStream=/run/docker.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker

[Install]
WantedBy=sockets.target
EOF

设置开机并启动:

systemctl daemon-reload
systemctl enable docker.service
systemctl start docker.service

有个注意点,包管理安装的 containerd 是有个单独 systemd 纳管的,如果 docker daemon 启动的时候连不上 containerd,就会自己 exec 拉起一个 containerd 在自己进程树下面。

测试容器

可以 run 个 nginx 容器测试下访问:

docker run -d --name nginx --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