Centos7安装docker

Centos7安装docker

    • 配置Centos7的国内yum源及扩展源
    • 安装用于k8s集群的docker和buildkit
      • docker配置参数
    • docker服务无法启动的排查方案
    • 配置http代理访问docker海外镜像源
      • 安装privoxy
      • 编辑privoxy配置文件
      • 配置docker使用http代理
      • 重启docker服务
      • 验证配置是否成功
      • 拉取海外镜像测试
    • 配置socks5代理访问docker海外镜像
      • 配置docker使用socks5代理
      • 重启docker服务
      • 验证配置是否成功
      • ansible配置docker代理
      • 拉取海外镜像测试
    • docker常见问题

系统版本声明: Cetnos7

配置Centos7的国内yum源及扩展源

https://blog.csdn.net/omaidb/article/details/120393850


安装用于k8s集群的docker和buildkit

Docker-CE官方安装文档:https://docs.docker.com/engine/install/centos/

#!/usr/bin/env bash
# 定义版本
buildkit_VERSION=0.11.4
# 1.配置时间
set_time_service() {
    # 设置时区为上海
    timedatectl set-timezone Asia/Shanghai

    # 将硬件时钟调整为与本地时钟一致, 0 为设置为 UTC 时间
    timedatectl set-local-rtc 0

    # 重启时间服务依赖的服务
    systemctl restart rsyslog
    systemctl restart crond

    # 同步时间
    systemctl enable --now chronyd

    # 将时间写入到硬件
    hwclock -w

    # 查看时间同步是否成功
    chronyc sources -n
}

# 2.永久禁用swap
set_swapoff() {
    swapoff -a
    sed -ri 's/.*swap.*/#&/' /etc/fstab
    echo '禁用swap'
}

# 3.禁用firewalld防火墙和iptables防火墙邮件服务postfix
disable_firewall_selinux() {
    systemctl disable --now firewalld
    ## 禁用iptables前要先安装iptables服务
    yum install -y iptables-services
    systemctl disable --now iptables
    ## 清空现有的所有iptables策略
    iptables -F
    # 禁用邮件服务
    systemctl disable --now postfix

    echo '禁用防火墙和邮件服务'

    # 禁用selinux
    sed -ri 's#(SELINUX=).*#\1disabled#' /etc/selinux/config
    setenforce 0
    echo '禁用selinux'
}

# 4.配置内核参数
config_kernel() {
    # 在os启动时加载内核br_netfilter网桥过滤模块
    cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
ip_conntrack
EOF

    # 加载Overlay 文件系统模块
    ## 文件系统层叠技术,允许将多个文件系统层以只读的方式合并挂载,创建一个统一的虚拟文件系统
    modprobe overlay
    # 现在加载br_netfilter网桥过滤模块
    modprobe br_netfilter
    # 加载连接跟踪模块
    modprobe ip_conntrack

    echo '加载加载br_netfilter网桥过滤模块'

    cat <<EOF >/etc/sysctl.d/k8s.conf
# 在ip6tables链中过滤IPv6包
net.bridge.bridge-nf-call-ip6tables = 1
# 是否在iptables链中过滤IPv4包
net.bridge.bridge-nf-call-iptables = 1
# netfilter防火墙内核模块最大跟踪连接数
net.netfilter.nf_conntrack_max = 2310720

# 加大允许开启的线程数量
vm.max_map_count = 262144

# 系统中可同时打开的最大文件数目
fs.file-max = 52706963

# 单个进程可分配的最大文件数
fs.nr_open = 52706963

# 加大允许开启的线程数量
vm.max_map_count = 262144

# 同一用户同时可以添加的watch数目
## 默认值8192
fs.inotify.max_user_watches = 524288

# 防止容器数量增加导致fs.inotify.max_user_instances超过限制
# 默认128
fs.inotify.max_user_instances = 8192

# 关闭OOM
vm.panic_on_oom = 1

# 自动释放cache防止oom
vm.overcommit_memory = 1

# 禁用用swap
vm.swappiness = 0

# 开启内核开启数据包转发
## 1为开启;0为关闭
net.ipv4.ip_forward = 1
EOF

    # 使sysctl生效
    sysctl --system
    echo '开启配置k8s内核参数'
}

# 5.配置ipvs功能
config_lvs() {
    yum install -y ipset ipvsadm conntrack libseccomp

    ## 添加需要加载的模块写入脚本文件
    cat <<EOF >/etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
## 高版本内核nf_conntrack_ipv4被nf_conntrack替换了
# modprobe -- nf_conntrack_ipv4
modprobe -- nf_conntrack
EOF

    ## 为脚本添加执行权限
    chmod +x /etc/sysconfig/modules/ipvs.modules

    ## 执行脚本
    /bin/bash /etc/sysconfig/modules/ipvs.modules

    ## 查看对应模块是否加载
    lsmod | grep -e ip_vs -e nf_conntrack
}

# 6.安装docker包
install_docker_pkg() {
    # 安装yum-utils
    yum install -y yum-utils

    # 卸载旧版docker-CE
	# uninstall_docker
	
    # 添加docker-ce源 https://docs.docker.com/engine/install/centos/
    ## docker-ce国内源--aliyun
    # yum-config-manager --add-repo=https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    ## docker-ce官方源
    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

    echo '添加docker-ce源'

    # 查看repolist中docker-ce仓库是否添加成功
    yum repolist

    yum clean all && yum makecache

    echo '刷新yum缓存'

    # 安装docker-ce
    yum -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

    echo '安装docker'
}

# 7.配置docker镜像加速和存储目录
# https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver/
config_docker() {
    # 开启docker实验功能
    # "experimental": true

    # 启用BuildKit
    # "features": {"buildkit": true}

    # docker默认使用Cgroup Driver为cgroupfs,K8S推荐使用systemd来代替cgroupfs
    ## 参考 https://v1-22.docs.kubernetes.io/zh/docs/setup/production-environment/container-runtimes/
    ##  "exec-opts": ["native.cgroupdriver=systemd"]

    # 将docker的默认存储路径由/var/lib/docker设为/data/docker
    ## docker会自动创建新路径,请勿手动创建,会有权限问题
    ## "data-root": "/data/docker"

    # 配置docker存储驱动
    # "storage-driver": "overlay2",
    # "storage-opts": ["overlay2.override_kernel_check=true"]

    # 配置国内源----自行添加
    # "registry-mirrors": ["https://isdp30x2.mirror.aliyuncs.com"]

    cat <<EOF | tee /etc/docker/daemon.json
{
    "experimental": true,
    "features": {
        "buildkit": true
    },
    "exec-opts": [
        "native.cgroupdriver=systemd"
    ]
}
EOF

    echo '配置docker镜像加速和存储目录'
}

# 8.重启docker服务
restart_docker() {
    ## 重载服务
    systemctl daemon-reload
    ## 重启docker服务
    systemctl restart docker
    # 设置docker开机自启
    systemctl enable docker

    echo '重启服务并设置开启自启动'
}

# 9.安装buildkit
install_buildkit() {
    # 下载buildkit
    ## -c 断点续传
    ## —P 下载到指定目录
    wget -c -P /usr/local/src/ https://github.com/moby/buildkit/releases/download/v$buildkit_VERSION/buildkit-v$buildkit_VERSION.linux-amd64.tar.gz
    # 创建buildkit对应目录
    mkdir -p /usr/local/containerd/

    # 解压buildkit到指定路径
    ## buildkit压缩包里有bin目录
    ls /usr/local/containerd/bin/buildkitd &>/dev/null && echo 'buildkitd已存在,请先删除旧版' && exit 1
    tar -xvf /usr/local/src/buildkit-v$buildkit_VERSION.linux-amd64.tar.gz -C /usr/local/containerd
    # 创建buildkitd软连接
    ln -s /usr/local/containerd/bin/buildkitd /usr/local/bin/buildkitd
    ln -s /usr/local/containerd/bin/buildctl /usr/local/bin/buildctl

    # 创建buildkit.socket服务文件
    cat >/usr/lib/systemd/system/buildkit.socket <<'EOF'
[Unit]
Description=BuildKit
Documentation=https://github.com/moby/buildkit

[Socket]
ListenStream=%t/buildkit/buildkitd.sock

[Install]
WantedBy=sockets.target
EOF

    # 创建buildkit.service服务文件
    cat >/usr/lib/systemd/system/buildkit.service <<'EOF'
[Unit]
Description=BuildKit
Requires=buildkit.socket
After=buildkit.socketDocumentation=https://github.com/moby/buildkit

[Service]
ExecStart=/usr/local/bin/buildkitd --oci-worker=false --containerd-worker=true

[Install]
WantedBy=multi-user.target
EOF
    # 开机自启buildkit服务
    systemctl daemon-reload
    systemctl enable --now buildkit
}

# 安装docker完整版
full_install_docker() {
    # 1.配置时间
    set_time_service
    # 2.永久禁用swap
    set_swapoff
    # 3.禁用防火墙和SElinux
    disable_firewall_selinux
    # 4.配置内核参数
    config_kernel
    # 5.配置ipvs功能
    config_lvs
    # 6.安装docker包
    install_docker_pkg
    # 7.配置docker镜像加速和存储目录--可选
    config_docker
    # 8.重启docker服务
    restart_docker
    # 9.安装buildkit服务
    install_buildkit
}

# 卸载docker
uninstall_docker() {
    # 卸载旧版docker
    yum -y remove docker \
        docker-ce \
        docker-client \
        docker-client-latest \
        docker-common \
        docker-latest \
        docker-latest-logrotate \
        docker-logrotate \
        docker-engine

    # 卸载较新版本docker
    yum autoremove -y docker-ce \
        docker-ce-cli \
        containerd.io \
        docker-buildx-plugin \
        docker-compose-plugin \
        docker-ce-rootless-extras

    # 查看卸载完没有
    rpm -qa | grep docker

    echo '卸载docker-CE'
    # 卸载buildkit
    uninstall_buildkit
}

# 卸载buildkit
uninstall_buildkit() {
    # 删除buildkit文件
    rm -rf /usr/local/src/buildkit-v$buildkit_VERSION.linux-amd64.tar.gz
    rm -rf /usr/local/containerd/bin/buildkitd /usr/local/bin/buildkitd
    rm -rf /usr/lib/systemd/system/buildkit.socket
    rm -rf /usr/lib/systemd/system/buildkit.service
    # 停止buildkit服务
    systemctl disable --now buildkit
    systemctl daemon-reload
}

#开始菜单
function start_menu() {
    clear
    echo "========================="
    echo " 介绍:适用于CentOS7"
    echo " 作者:Miles"
    echo " 网站:https://blog.csdn.net/omaidb"
    echo "========================="
    echo "注意:本脚本只支持Centos7"
    echo "1. 安装docker"
    echo "2. 卸载docker"
    echo "0. 退出脚本"
    echo "请输入数字:"
    read -r num
    case "$num" in
    1)
        # 执行完整安装docker
        echo "开始安装docker"
        full_install_docker
        ;;
    2)
        echo "开始卸载docker"
        uninstall_docker
        ;;
    0)
        exit 1
        ;;
    *)
        clear
        echo "请输入正确数字"
        sleep 5s
        start_menu
        ;;
    esac
}

# main方法,显示菜单
start_menu

docker配置参数

    # 开启docker实验功能
    # "experimental": true

    # docker默认使用Cgroup Driver为cgroupfs,K8S推荐使用systemd来代替cgroupfs
    ## 参考 https://v1-22.docs.kubernetes.io/zh/docs/setup/production-environment/container-runtimes/
    ##  "exec-opts": ["native.cgroupdriver=systemd"]

    # 将docker的默认存储路径由/var/lib/docker设为/data/docker
    ## "data-root": "/data/docker"

    # 配置docker存储驱动
    # "storage-driver": "overlay2",
    # "storage-opts": ["overlay2.override_kernel_check=true"]

    # 配置国内源----自行添加
    # "registry-mirrors": ["https://isdp30x2.mirror.aliyuncs.com"]


# 开启实验功能
"experimental": true,
# 启用BuildKit
"features": {"buildkit": true}
# 存储配置
    "storage-opts": [
        "overlay2.override_kernel_check=true",
        # 限制每个容器存储为1G
        "overlay2.size=1G"
    ]

docker服务无法启动的排查方案

常见的问题是/etc/docker/daemon.json配置错误
查看日志: journalctl -u docker


配置http代理访问docker海外镜像源

有些情况下,我们生产环境需要拉取海外的镜像源,但是拉取镜像时会超时.这时候需要给docker配置代理.


安装privoxy

# 安装epel源
yum -y install epel-release

# 安装privoxy(将socks5转换成http)
yum install privoxy -y

# 开启privoxy服务
systemctl enable --now privoxy

编辑privoxy配置文件

有预算的直接上HK机器,无墙。

# 编辑privoxy主配置文件
vim /etc/privoxy/config

修改配置内容
加上如下配置,注意最后的点号。
forward-socks5DNS 解析会在远程服务器上进行,而 forward-socks5t却不会,这就导致使用后者访问境外网站的时候 ,国内DNS 无法解析海外网址的情况,从而也就不知道去访问哪个IP。一般来说,还是建议使用 forward-socks5
在这里插入图片描述

# 监听本地所有ip的8118端口(http)
#listen-address  0.0.0.0:8118
listen-address  127.0.0.1:8118

# 当有连接访问本地的8118端口时,通过socks5协议转发到192.168.199.11:10808端口
forward-socks5 / 192.168.199.11:10808 .

修改完配置文件要重启privoxy服务

# 重启privoxy服务
systemctl restart privoxy

查看本地的8118端口是否处于监听状态

# 查看本地的8118端口是否处于监听状态
netstat -tunlp
# 或
ss -tunlp

配置docker使用http代理

# 1.创建docker服务插件目录
sudo mkdir -p /etc/systemd/system/docker.service.d

# 2.创建一个名为proxy.conf的文件
sudo touch /etc/systemd/system/docker.service.d/proxy.conf

# 3.编辑http-proxy.conf的文件
sudo vim /etc/systemd/system/docker.service.d/proxy.conf

# 4.写入内容(将代理ip和代理端口修改成你自己的)
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:8118" 
Environment="HTTPS_PROXY=http://127.0.0.1:8118" "NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com,hub-mirror.c.163.com,isdp30x2.mirror.aliyuncs.com,mirror.baidubce.com"

重启docker服务

# 重载服务
systemctl daemon-reload

# 重启docker服务
systemctl restart docker

验证配置是否成功

# 查看docker服务加载的配置
systemctl show --property=Environment docker

拉取海外镜像测试

#  拉取海外镜像测试
docker pull gcr.io/google-containers/ubuntu:14.04

配置socks5代理访问docker海外镜像

参考地址: https://zhuanlan.zhihu.com/p/414473668
官方文档: https://docs.docker.com/config/daemon/systemd/#httphttps-proxy


配置docker使用socks5代理

另外如果需要使用http代理,只需要将socks5替换成http。

https://zhuanlan.zhihu.com/p/414473668

注意要同时添加所有私有子网(例如 10.0.0.0/8)到NO_PROXY,进行免代理.

# 1.创建docker服务插件目录
sudo mkdir -p /etc/systemd/system/docker.service.d

# 2.创建一个名为proxy.conf的文件
sudo touch /etc/systemd/system/docker.service.d/proxy.conf

# 3.编辑http-proxy.conf的文件
sudo vim /etc/systemd/system/docker.service.d/proxy.conf

# 4.写入内容(将代理ip和代理端口修改成你自己的)
[Service]
Environment="HTTP_PROXY=socks5://127.0.0.1:1080"
Environment="HTTPS_PROXY=socks5://127.0.0.1:1080"  "NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com,isdp30x2.mirror.aliyuncs.com,hub-mirror.c.163.com,mirror.baidubce.com"

重启docker服务

# 重载服务
systemctl daemon-reload

# 重启docker服务
systemctl restart docker

验证配置是否成功

# 查看docker服务加载的配置
systemctl show --property=Environment docker

ansible配置docker代理

---
- hosts: all
  tasks:
    - name: 创建docker.service.d目录
      file:
        path: /etc/systemd/system/docker.service.d
        state: directory
    - name: 创建proxy.conf文件
      file:
        path: /etc/systemd/system/docker.service.d/proxy.conf
        state: touch
    - name: j2配置proxy.conf
      template:
        src: proxy.conf.j2
        dest: /etc/systemd/system/docker.service.d/proxy.conf
      notify: restart docker
  handlers:
    - name: restart docker
      systemd:
        state: restarted
        daemon_reload: yes
        name: docker

proxy.conf.j2模板文件

[Service] 
Environment="HTTP_PROXY=socks5://127.0.0.1:1080" 
Environment="HTTPS_PROXY=socks5://127.0.0.1:1080" NO_PROXY=localhost,127.0.0.1,192.168.0.0/16,10.0.0.0/8,docker-registry.somecorporation.com,isdp30x2.mirror.aliyuncs.com,hub-mirror.c.163.com,mirror.baidubce.com"

拉取海外镜像测试

[master root ~/ansible]# docker pull gcr.io/google-containers/ubuntu:14.04
14.04: Pulling from google-containers/ubuntu
a3ed95caeb02: Pull complete 
7059585c469e: Pull complete 
782c76bb9e67: Pull complete 
706514fbad74: Pull complete 
Digest: sha256:5746b3b4974d1bd3d4ddbac0373fb71b425f13583797414ffd9d8b547d241f75
Status: Downloaded newer image for gcr.io/google-containers/ubuntu:14.04
gcr.io/google-containers/ubuntu:14.04

[master root ~/ansible]# docker images
REPOSITORY                        TAG       IMAGE ID       CREATED       SIZE
gcr.io/google-containers/ubuntu   14.04     fbb59e4c2529   6 years ago   188MB

docker常见问题

24个Docker 常见问题处理技巧

你可能感兴趣的:(RHEL7,容器,docker,运维,linux)