离线构建Docker集群

离线安装docker集群

离线构建Docker集群

Docker安装

文章内以{}包裹为变量,请按照实际的内容替换

例如 tar -xvf {docker}.tgz 中的变量docker为具体的文件名

本文中搭建集群使用的是 Portainer

在线安装

官方文档

需要注意的是需要先卸载Docker的遗留安装(如何有的话)

CenterOS,Unbantu等不同平台的安装方式略有不同

离线安装

下载Docker

选择合适的版本下载

  1. 解压缩
tar -xvf {docker}.tgz
  1. 安装docker,无报错说明安装成功
# 拷贝文件至/usr/bin,
cp docker/* /usr/bin/
# 启动docker测试,无报错即可
dockerd
  1. 更改Docker Home与存储路径(推荐)

docker的默认路径为/var/lib/docker,比较占用系统盘空间,运行一段时间容易导致系统盘空间不足.所以需要调整docker的默认路径

有两种方法: 1修改配置文件 2 直接使用软连接,下面为方法2,比较简单

# docker启动过之后将docker目录完整迁移数据盘
mv /var/lib/docker /data/docker
# 建立软连接
ln -sf /data/docker /var/lib/docker
# 启动docker测试
dockerd
  1. 注册服务
vi /etc/systemd/system/docker.service

配置服务, 把以下内容添加到docker.service中并保存

如果出现permission denied 请确认是否有该目录的权限

需要注意参数ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
# 注释配置为开启TLS,Docker开启tcp通信必须开启tls,否则非常不安全
#ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem -H tcp://0.0.0.0:2376 -H unix://var/run/docker.sock
ExecStart=/usr/bin/dockerd -H unix://var/run/docker.sock 
ExecReload=/bin/kill -s HUP $MAINPID

LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity

TimeoutStartSec=0
# 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
# 自动重启策略
Restart=on-failure
# 重启间隔与上限
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
  1. 添加权限
chmod +x /etc/systemd/system/docker.service 
  1. 验证docker安装
systemctl daemon-reload # 重载配置
systemctl start docker # 启动docker守护进程
systemctl status docker # 查看进程状态
docker -v # 校验版本
  1. 开启docker服务自启动
systemctl enable docker

生成TLS秘钥

  1. 进入 /etc/docker 目录
cd /etc/docker
  1. 生成公私钥
openssl genrsa -aes256 -out ca-key.pem 4096 #输入密码		
  1. 创建CA证书
openssl req -new -x509 -days 3650 -key ca-key.pem -sha256 -out ca.pem
  1. 生成服务端私钥
openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN=172.16.2.155" -sha256 -new -key server-key.pem -out server.csr
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem
  1. 生成客户端公钥
openssl genrsa -out key.pem 4096
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
openssl x509 -req -days 3650 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem
  1. 删除不需要的文件
rm -v client.csr server.csr extfile.cnf extfile-client.cnf
  1. 修改权限
chmod 0400 ca-key.pem key.pem server-key.pem
chmod 0444 ca.pem server-cert.pem cert.pem
  1. 下载cert.pem,key.pem文件,同时在docker.service中放开tls配置
# ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem -H tcp://0.0.0.0:2376 -H unix://var/run/docker.sock
  1. 开启tpc端口
iptables -I INPUT -p tcp -m tcp --dport 2376 -j ACCEPT
  1. 重启docker
systemctl daemon-reload # 重载环境
systemctl restart docker # 重启docker
systemctl status docker # 检查docker全局状态

Docker-swarm配置(可选)

  1. 主节点开启swarm
# 一般默认使用2377端口做为通信端口
docker swarm init --advertise-addr $(host:2377)
# 创建后会输出work节点加入的方式, 注意保存。work节点需要使用这个唯一token加入
docker swarm join --token {token} $(host:2377)

同时开启7946于4789端口,分别用来节点通信与覆盖网络流量

  1. 子节点加入swarm集群,例如
docker swarm join --token {token} $(host:2377)

Docker离线升级

  1. 上传docker完整包并解压
tar -xvf {docker}.tgz
  1. 停止服务并完整覆盖当前安装的docker
systemctl stop docker # 停止服务
cp docker/* /usr/bin/ # 完整覆盖
  1. 启动服务验证升级情况
systemctl start docker # 启动服务
docker -v # 验证版本是否升级成功

FAQ

启动报错 could not change group /var/run/docker.sock to docker: group docker not found

解决办法

  • 分析报错原因:
    该linux系统未挂载cgroup;
  • 解决方法:
    需要先挂载cgroup;
    vim /etc/fstab
    编辑文件:在最后一行增加配置信息:
    none /sys/fs/cgroup cgroup defaults 0 0
    然后保存后退出
    然后重启 操作系统
    reboot后,挂载配置才能生效

服务器时间错误

解决办法

  • 分析报错原因

    服务器时间错误

  • 解决办法

    1.容器启动指定时区: --timezone=ZH-cn

    2.修改服务器时间

    # 确认时间
    date '+%Y-%m-%d %T'
    # 修改
    timedatectl set-time "2021-08-12 17:47:00"
    # 同步修改硬件时间
    hwclock --set --date "20210 20:23:00"
    

    同步docker容器

    docker cp /etc/localtime ${容器名称或ID}:/etc/