https://blog.csdn.net/omaidb/article/details/120393850
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实验功能
# "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"
]
常见的问题是/etc/docker/daemon.json
配置错误
查看日志: journalctl -u docker
有些情况下,我们生产环境需要拉取海外的镜像源,但是拉取镜像时会超时.这时候需要给docker配置代理.
# 安装epel源
yum -y install epel-release
# 安装privoxy(将socks5转换成http)
yum install privoxy -y
# 开启privoxy服务
systemctl enable --now privoxy
有预算的直接上HK
机器,无墙。
# 编辑privoxy主配置文件
vim /etc/privoxy/config
修改配置内容
加上如下配置,注意最后的点号。
forward-socks5
的 DNS 解析会在远程服务器上进行
,而 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
# 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"
# 重载服务
systemctl daemon-reload
# 重启docker服务
systemctl restart docker
# 查看docker服务加载的配置
systemctl show --property=Environment docker
# 拉取海外镜像测试
docker pull gcr.io/google-containers/ubuntu:14.04
参考地址: https://zhuanlan.zhihu.com/p/414473668
官方文档: https://docs.docker.com/config/daemon/systemd/#httphttps-proxy
另外如果需要使用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"
# 重载服务
systemctl daemon-reload
# 重启docker服务
systemctl restart docker
# 查看docker服务加载的配置
systemctl show --property=Environment 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
24个Docker 常见问题处理技巧