Start typing to search across invoices, services, domains, tickets, and more...
この記事では、Docker 公式リポジトリを使って Linux サーバーにDocker と Docker Compose をインストールする方法を、Debian/Ubuntu と Rocky Linux/AlmaLinux に分けて解説します。インストール後の設定、最初のコンテナ起動、レジストリミラー、そして Docker がファイアウォールを素通りしてポートを公開してしまう問題への対処までまとめています。IMIDC の VPS・専用サーバー(64 ビット OS、root 権限)が対象です。
ディストリビューション標準の docker.io や podman-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
公式リポジトリはディストリ版より新しく、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
RHEL 互換 OS では 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
自動起動を有効にし、hello-world で動作を確認します。一般ユーザーで sudo なしに 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
Compose V2 のコマンドは 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
IMIDC の香港・日本・韓国などのサーバーからは通常 Docker Hub に直接アクセスでき、ミラーはほとんど不要です。pull が遅い場合は、信頼できるミラーを daemon.json に設定します(registry-mirrors は Docker Hub にのみ有効)。あわせてログサイズの上限を設定し、ディスクの圧迫を防ぎましょう。匿名 pull には回数制限があるため、頻繁に pull する場合は 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
journalctl -u docker -n 50 で原因を確認します。Docker はポート公開のために独自の iptables/nftables ルールを追加し、それは ufw のルールより先に評価されます。そのため ufw で 8080 を許可していなくても、-p 8080:80 で公開したポートはインターネットから到達可能です。基本は 127.0.0.1 にバインドして Nginx 経由で公開し、どうしても直接公開する場合は DOCKER-USER チェーンで接続元を制限します。
# 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
-p 3306:3306 のようにインターネットへ公開しないでください。不正侵入やランサム被害の典型的な原因です。ユーザーが docker グループに入っていないか、追加後に再ログインしていません。id で確認して SSH に再接続するか、root または sudo で実行してください。
ハイフン付きの docker-compose は開発終了した V1 の単体ツールです。docker compose は docker-compose-plugin で入る V2 プラグインで、書式はほぼ互換です。新規プロジェクトでは V2 を使いましょう。
firewalld のリロードや iptables のフラッシュで Docker の NAT ルールが消えています。systemctl restart docker を実行すればルールが再作成されます。
上記の手順で解決しない場合は、サポートチケットを送信して IMIDC の 24 時間 365 日対応テクニカルサポートへご連絡ください。サーバー IP、OS バージョン、実行したコマンド、エラー全文を添えていただくと、より迅速に調査できます。