ESC

开始输入,可搜索发票、服务、域名、工单,以及 更多...

搜索... Ctrl+K
Linux 服务器

Docker 安装教程:Debian/Ubuntu 与 Rocky/AlmaLinux 安装 Docker 和 Docker Compose

7 个步骤 11 分钟阅读 24 次阅读 0
本文目录

本文介绍如何在 Linux 服务器上安装 Docker 和 Docker Compose:使用 Docker 官方软件源,分别给出 Debian/Ubuntu 与 Rocky Linux/AlmaLinux 的命令,并演示安装后的基础配置、运行第一个容器、配置镜像加速,以及 Docker 端口绕过防火墙这一常见安全问题。适用于 IMIDC VPS 与独立服务器,需要 64 位系统和 root 权限。

步骤 1:安装 Docker 前卸载旧版本

系统自带仓库里的 docker.io、podman-docker 等包与 Docker 官方的 docker-ce 会冲突。全新系统执行时提示“未安装”属正常。已有的镜像和数据位于 /var/lib/docker,卸载这些包不会自动删除它们。

# Debian / Ubuntu: remove distro packages that conflict with Docker CE
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do apt-get remove -y $pkg; done

# Rocky Linux / AlmaLinux
dnf remove -y docker docker-client docker-client-latest docker-common docker-latest \
  docker-latest-logrotate docker-logrotate docker-engine podman runc

步骤 2:Debian/Ubuntu 用官方源安装 Docker

官方源比发行版仓库更新更及时,并且包含 docker compose 插件(Compose V2)。下面的命令通过 /etc/os-release 自动识别是 Debian 还是 Ubuntu 以及版本代号,复制粘贴即可。

apt-get update
apt-get install -y ca-certificates curl
install -m 0755 -d /etc/apt/keyrings
. /etc/os-release          # sets $ID (debian/ubuntu) and $VERSION_CODENAME
curl -fsSL https://download.docker.com/linux/$ID/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/$ID $VERSION_CODENAME stable" \
  > /etc/apt/sources.list.d/docker.list
apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

步骤 3:Rocky Linux/AlmaLinux 安装 Docker CE

RHEL 系使用 Docker 提供的 rhel 仓库,Rocky Linux 与 AlmaLinux 8/9 均可使用。首次安装时会提示导入 GPG 密钥,确认指纹来自 Docker 后输入 y。

dnf install -y dnf-plugins-core
dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

步骤 4:启动 Docker 并完成安装后配置

设置开机自启并运行 hello-world 验证。如果希望普通用户无需 sudo 使用 docker,可将其加入 docker 组;但要注意 docker 组成员实际上拥有 root 级权限,只应授予可信用户。

systemctl enable --now docker
docker version
docker compose version
docker run --rm hello-world

# Optional: allow a normal user to run docker (this is equivalent to root access)
usermod -aG docker deploy
# log out and log in again as "deploy", then test:
docker ps

步骤 5:用 Docker Compose 运行第一个容器

新版 Compose 是 docker compose(中间是空格),配置文件推荐命名为 compose.yaml。下面用 Nginx 镜像起一个网站容器,端口只绑定到 127.0.0.1,后续可再用宿主机 Nginx 反向代理并配置 HTTPS(参见“Nginx 反向代理”教程)。

mkdir -p /opt/web && cd /opt/web
cat > compose.yaml <<'EOF'
services:
  web:
    image: nginx:stable
    ports:
      - "127.0.0.1:8080:80"
    volumes:
      - ./html:/usr/share/nginx/html:ro
    restart: unless-stopped
EOF
mkdir -p html && echo "Hello from Docker" > html/index.html
docker compose up -d
docker compose ps
curl http://127.0.0.1:8080
docker compose logs -f web      # Ctrl+C to stop following

步骤 6:配置 Docker 镜像加速与日志大小

IMIDC 香港、日本、韩国等地区的服务器通常可以直接访问 Docker Hub,一般无需加速。若拉取镜像很慢,可在 daemon.json 里配置你信任的镜像站(registry-mirrors 只对 Docker Hub 生效)。同时建议限制容器日志大小,避免日志撑满磁盘。匿名拉取有频率限制,频繁拉取时请先 docker login。

mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<'EOF'
{
  "registry-mirrors": ["https://mirror.example.com"],
  "log-driver": "json-file",
  "log-opts": { "max-size": "20m", "max-file": "3" }
}
EOF
systemctl restart docker
docker info | grep -A2 "Registry Mirrors"

# Avoid anonymous Docker Hub pull limits
docker login
daemon.json 必须是合法 JSON,多一个逗号都会导致 Docker 无法启动。修改后可用 journalctl -u docker -n 50 查看报错。

步骤 7:Docker 与防火墙(iptables/ufw/firewalld)

Docker 会自己写入 iptables/nftables 规则来发布端口,这些规则优先于 ufw 的规则,所以即使 ufw 没有放行 8080,-p 8080:80 发布的端口依然能被公网访问。推荐做法是只绑定 127.0.0.1,由 Nginx 对外;如果必须对外发布,则在 DOCKER-USER 链中限制来源 IP。

# 1) Recommended: publish only on localhost and expose the app through Nginx
#    compose.yaml ->  ports: - "127.0.0.1:8080:80"

# 2) Restrict a published port in the DOCKER-USER chain
#    (only 198.51.100.20 may reach container port 8080 via eth0)
iptables -I DOCKER-USER -i eth0 -p tcp -m conntrack --ctorigdstport 8080 --ctdir ORIGINAL \
  ! -s 198.51.100.20 -j DROP
iptables -L DOCKER-USER -n --line-numbers

# 3) firewalld (Rocky/AlmaLinux): Docker adds its own "docker" zone
firewall-cmd --get-active-zones
firewall-cmd --zone=docker --list-all

# After reloading or restarting the firewall, restart Docker to rebuild its rules
systemctl restart docker
数据库(MySQL、Redis、MongoDB 等)容器切勿直接 -p 3306:3306 暴露到公网,这是服务器被入侵和勒索的常见原因。

常见问题

提示 permission denied while trying to connect to the Docker daemon socket?

当前用户不在 docker 组,或加入后没有重新登录。执行 id 确认组成员,重新登录 SSH 后再试;也可以直接用 root 或 sudo 运行。

docker-compose 和 docker compose 有什么区别?

docker-compose(带横线)是已停止维护的 V1 独立程序;docker compose 是 V2 插件,随 docker-compose-plugin 安装,命令参数基本兼容,新项目请统一使用 V2。

重启防火墙后容器无法访问网络?

重载 firewalld 或清空 iptables 会删除 Docker 写入的 NAT 规则。执行 systemctl restart docker 让 Docker 重新生成规则即可。

如果按以上步骤操作后问题仍未解决,请提交工单联系 IMIDC 7×24 技术支持,并附上服务器 IP、系统版本、执行过的命令和完整报错信息,方便工程师快速定位。

这篇文章有帮助吗?

相关教程