Alibaba Cloud Linux 4 安装docker 并运用docker【持续更新........】
# 移除错误的仓库配置
sudo rm -f /etc/yum.repos.d/docker-ce*.repo
# 为 Alibaba Cloud Linux 4 添加正确的仓库
# 使用 el8 而不是 el7,因为 Alibaba Cloud Linux 4 对应 RHEL 8
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 修正仓库配置中的版本号
sudo sed -i 's/$releasever/8/g' /etc/yum.repos.d/docker-ce.repo
# 清理并刷新缓存
sudo yum clean all
sudo yum makecache
# 现在安装 Docker
sudo yum install -y docker-ce docker-ce-cli containerd.io
这样说明完成了。
使用命令重启docker:
sudo systemctl restart docker
systemctl status
这个命令是查看系统运行正常否,进入了分页显示模式。按 q
键就可以退出并返回命令行。
# 查看 Docker 服务是否正常运行
sudo systemctl status docker --no-pager
配置远程访问:
使用 TLS 认证(安全推荐)
生成 TLS 证书
# 创建证书目录
sudo mkdir -p /etc/docker/ssl
cd /etc/docker/ssl
#1-1 生成 CA 私钥和证书
openssl genrsa -aes256 -out ca-key.pem 4096
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
生成CA私钥和证书,需要添加密码。4~1024位的
#1-2 生成服务器私钥
openssl genrsa -out server-key.pem 4096
# 1-3生成服务器证书签名请求 (CSR)
openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr
#1-4 创建证书扩展配置文件
echo subjectAltName = DNS:$HOST,IP:0.0.0.0,IP:127.0.0.1,IP:your-server-ip >> extfile.cnf
echo extendedKeyUsage = serverAuth >> extfile.cnf
# 1-5生成服务器证书
cd /etc/docker/ssl && openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
替换 $HOST:将 $HOST 替换为您的服务器 IP 地址或域名
your-server-ip:服务器的IP
注意:这个地方是第一个服务器的docker的SSL证书,是为生成portainer而定制,当生成好后,可以用portainer时,必须要用文件来处理这些。
对于生产环境,建议使用脚本管理:
1、创建 generate-cert.sh 脚本
2、将域名列表放在脚本开头的数组变量中
3、需要添加域名时,只需修改数组内容
4、运行脚本重新生成证书
生成客户端私钥时,需要提供CA填写的密码!
以上1-5可以COPY成一条。
sudo mkdir -p /etc/docker/ssl
cd /etc/docker/ssl
openssl genrsa -aes256 -out ca-key.pem 4096
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr
cd /etc/docker/ssl
echo subjectAltName = DNS:$HOST,IP:0.0.0.0,IP:127.0.0.1,IP:your-server-ip >> extfile.cnf
echo extendedKeyUsage = serverAuth >> extfile.cnf
cd /etc/docker/ssl && openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
//------------------------------------------
#清理临时文件
rm -v client.csr server.csr extfile.cnf extfile-client.cnf
#设置证书权限
sudo chmod 600 /etc/docker/ssl/*.pem
sudo chmod 644 /etc/docker/ssl/*.pem 2>/dev/null || true
sudo chown root:root /etc/docker/ssl/*.pem
证书文件的路径或权限问题。,路径检查
ls -l
# 检查所有证书文件
sudo ls -la /etc/docker/ssl/
# 应该有以下文件:
# ca.pem # CA 证书
# ca-key.pem # CA 私钥
# server-cert.pem # 服务器证书
# server-key.pem # 服务器私钥
# cert.pem # 客户端证书
# key.pem # 客户端私钥
如果以上的任何一类缺少,都不能https访问
# 检查证书文件是否有效
sudo openssl x509 -in /etc/docker/ssl/ca.pem -text -noout
sudo openssl x509 -in /etc/docker/ssl/server-cert.pem -text -noout
sudo openssl rsa -in /etc/docker/ssl/server-key.pem -check -noout
3、#生成pem密钥文件后,执行
#在 /etc/docker/daemon.json 中配置:
sudo mkdir -p /etc/docker
sudo cat > /etc/docker/daemon.json << EOF
{
"tls": true,
"tlscacert": "/etc/docker/ssl/ca.pem",
"tlscert": "/etc/docker/ssl/server-cert.pem",
"tlskey": "/etc/docker/ssl/server-key.pem",
"tlsverify": true
}
EOF
# 使用 systemd 来配置 hosts 参数,避免冲突
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo tee /etc/systemd/system/docker.service.d/override.conf > /dev/null << 'EOF'
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2376
EOF
#验证文件是否创建成功
sudo ls -la /etc/docker/daemon.json
sudo cat /etc/docker/daemon.json
这个地方3只能分两步来操作,否则会docker启动不了。
如果同时开放则这样写
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo tee /etc/systemd/system/docker.service.d/override.conf > /dev/null << 'EOF'
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 -H tcp://0.0.0.0:2376
EOF
如果创建成功,则要重启docker
#重启#查看是否重启成功
sudo systemctl daemon-reload
sudo systemctl start docker
-------三个命令不能同时处理,先重启,然后查看
sudo systemctl status docker --no-pager
# 测试本地 socket 连接(传统方式)
docker ps
# 测试本地 TCP 连接
docker -H tcp://localhost:2375 ps
# 测试使用环境变量
export DOCKER_HOST=tcp://localhost:2375
docker ps
unset DOCKER_HOST
# 检查防火墙是否开放了 2375 端口
sudo firewall-cmd --list-ports | grep 2375
sudo firewall-cmd --list-all | grep 2375
然后开始部署Portainer
部署 Portainer(推荐)
# 根据地域使用对应的加速器地址
# 通用地址:https://<你的账号代码>.mirror.aliyuncs.com
获取阿里云专属镜像加速器地址的正确方法
方法一:通过阿里云控制台获取(推荐)
-
登录阿里云控制台 → 容器镜像服务 → 镜像工具 → 镜像加速器
-
页面会显示你的专属加速器地址,格式如:https://abc1234.mirror.aliyuncs.com
再配置
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://dhog5ljb.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
这个是配置镜像加速器。然后再测试这个镜像服务。
curl -I --connect-timeout 10 http://mirrors.aliyun.com/
curl -I --connect-timeout 10 https://dhog5ljb.mirror.aliyuncs.com
======================================================================================================================================
# 设置正确的权限
sudo chmod 600 /etc/docker/ssl/*.pem
sudo chmod 644 /etc/docker/ssl/ca.pem
sudo chmod 644 /etc/docker/ssl/server-cert.pem
sudo chmod 644 /etc/docker/ssl/cert.pem
# 检查文件所有权
sudo chown root:root /etc/docker/ssl/*.pem
检查完文件的权限后,验证证书的有效性
# 检查证书文件是否有效
sudo openssl x509 -in /etc/docker/ssl/ca.pem -text -noout
sudo openssl x509 -in /etc/docker/ssl/server-cert.pem -text -noout
sudo openssl rsa -in /etc/docker/ssl/server-key.pem -check -noout
验证为OK后,当前配置可能有冲突,让我们使用更安全的配置方式
修改 daemon.json 配置
# 停止 Docker
sudo systemctl stop docker
# 创建修正后的配置
sudo tee /etc/docker/daemon.json > /dev/null << 'EOF'
{
"tls": true,
"tlscacert": "/etc/docker/ssl/ca.pem",
"tlscert": "/etc/docker/ssl/server-cert.pem",
"tlskey": "/etc/docker/ssl/server-key.pem",
"tlsverify": true
}
EOF
# 使用 systemd 来配置 hosts 参数,避免冲突
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo tee /etc/systemd/system/docker.service.d/override.conf > /dev/null << 'EOF'
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2376
EOF
这个地方注意:
[Service] ExecStart= ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2376 EOF
SB的编辑器,不允许修改这个地方的内容。所以COPY这个命令时,这个地方要修改为2375
# 重新加载并启动
sudo systemctl daemon-reload
sudo systemctl start docker
sudo systemctl status docker --no-pager
然后开始部署Portainer
部署 Portainer(推荐)
# 根据地域使用对应的加速器地址
# 通用地址:https://<你的账号代码>.mirror.aliyuncs.com
首先要测试DNS有没有安装成功,
获取阿里云专属镜像加速器地址的正确方法
方法一:通过阿里云控制台获取(推荐)
-
登录阿里云控制台 → 容器镜像服务 → 镜像工具 → 镜像加速器
-
页面会显示你的专属加速器地址,格式如:https://abc1234.mirror.aliyuncs.com
再配置
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://dhog5ljb.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
这个是配置镜像加速器。然后再测试这个镜像服务。
# 测试阿里云镜像服务
curl -I --connect-timeout 10 http://mirrors.aliyun.com/
curl -I --connect-timeout 10 https://dhog5ljb.mirror.aliyuncs.com
测试基本网络连通,
返回200,说明连通没问题。
接下来安装prontainer-data
# 使用标准方式安装 Portainer
echo "=== 安装 Portainer ==="
# 创建数据卷
docker volume create portainer_data
# 拉取并运行 Portainer
docker pull portainer/portainer-ce:latest
docker run -d \
--name portainer \
-p 8000:8000 \
-p 9000:9000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
--restart unless-stopped \
portainer/portainer-ce:latest
# 检查状态
sleep 5
docker ps | grep portainer && echo "✓ Portainer 启动成功" || echo "✗ Portainer 启动失败"
Portainer 启动成功后,你可以开始使用这个强大的 Docker 管理工具了
# 获取 ECS 公网 IP
PUBLIC_IP=$(curl -s http://checkip.amazonaws.com)
echo "访问地址: http://$PUBLIC_IP:9000"
然后在安全组中,打开9000,8000端口。云服务器ECS-》安全组-》9000,8000打开
然后web访问
# 使用环境变量强制设置中文(最可靠的方法)
docker stop portainer
docker rm portainer
# 重新安装并强制中文
docker run -d \
--name portainer \
-p 9000:9000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
-e PORTAINER_UI_LANGUAGE=zh-cn \
--restart unless-stopped \
portainer/portainer-ce:latest
echo "重新安装完成,现在应该是中文界面了"
echo "访问: http://你的ECSIP:9000"
也可以直接找github来升级,升级命令如下:
#!/bin/bash
echo "=== 通过 GitHub Release 升级 Portainer 2.11 → 2.33.2 ==="
# 颜色定义
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'
echo -e "${YELLOW}1. 创建备份...${NC}"
docker stop portainer 2>/dev/null
BACKUP_FILE="portainer_backup_$(date +%Y%m%d_%H%M%S).tar.gz"
docker run --rm -v portainer_data:/source -v $(pwd):/backup alpine \
tar czf /backup/$BACKUP_FILE -C /source ./
echo -e "${GREEN}✅ 备份完成: $BACKUP_FILE${NC}"
echo -e "${YELLOW}2. 下载 GitHub Release 2.33.2...${NC}"
cd /tmp
rm -rf portainer-2.33.2* portainer/
# 方法1: 直接下载二进制文件
if wget https://github.com/portainer/portainer/releases/download/2.33.2/portainer-2.33.2-linux-amd64.tar.gz; then
echo -e "${GREEN}✅ 下载成功${NC}"
tar xzf portainer-2.33.2-linux-amd64.tar.gz
cd portainer
else
echo -e "${RED}❌ 直接下载失败,尝试备用方案...${NC}"
# 备用方案:使用 Docker 镜像
docker pull portainer/portainer-ce:2.33.2
if [ $? -eq 0 ]; then
echo -e "${GREEN}✅ 使用 Docker 镜像成功${NC}"
docker run -d --name portainer -p 9000:9000 -p 9443:9443 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data --restart unless-stopped \
portainer/portainer-ce:2.33.2
echo -e "${GREEN}🎉 升级完成!访问: http://你的ECSIP:9000${NC}"
exit 0
else
echo -e "${RED}❌ 所有下载方式都失败${NC}"
exit 1
fi
fi
echo -e "${YELLOW}3. 验证下载的文件...${NC}"
if [ -f "portainer" ]; then
echo -e "${GREEN}✅ 找到 portainer 二进制文件${NC}"
chmod +x portainer
./portainer --version || echo "无法获取版本信息"
else
echo -e "${RED}❌ 未找到 portainer 二进制文件${NC}"
ls -la
exit 1
fi
echo -e "${YELLOW}4. 创建自定义 Docker 镜像...${NC}"
cat > Dockerfile << 'EOF'
FROM alpine:latest
RUN apk add --no-cache ca-certificates
COPY portainer /portainer
VOLUME /data
EXPOSE 9000 9443
ENTRYPOINT ["/portainer"]
CMD ["--data", "/data", "--no-auth"]
EOF
docker build -t portainer-custom:2.33.2 .
echo -e "${YELLOW}5. 启动新版本...${NC}"
docker stop portainer 2>/dev/null
docker rm portainer 2>/dev/null
docker run -d \
--name portainer \
-p 9000:9000 \
-p 9443:9443 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
--restart unless-stopped \
portainer-custom:2.33.2
echo -e "${YELLOW}6. 等待启动...${NC}"
sleep 20
echo -e "${YELLOW}7. 验证升级...${NC}"
if docker ps | grep -q portainer; then
echo -e "${GREEN}✅ Portainer 2.33.2 启动成功${NC}"
echo -e "${GREEN}📍 访问地址: http://你的ECSIP:9000${NC}"
echo -e "${GREEN}🔐 HTTPS地址: https://你的ECSIP:9443${NC}"
# 检查日志
docker logs portainer --tail 5
else
echo -e "${RED}❌ 启动失败${NC}"
docker logs portainer
fi
echo -e "${GREEN}=== 升级完成 ===${NC}"