ESC

Start typing to search across invoices, services, domains, tickets, and more...

Search... Ctrl+K
Linuxサーバー

Docker と Docker Compose のインストール方法(Debian・Ubuntu・Rocky Linux・AlmaLinux)

7 ステップ 12 分で読めます 25 回閲覧 0
目次

この記事では、Docker 公式リポジトリを使って Linux サーバーにDocker と Docker Compose をインストールする方法を、Debian/Ubuntu と Rocky Linux/AlmaLinux に分けて解説します。インストール後の設定、最初のコンテナ起動、レジストリミラー、そして Docker がファイアウォールを素通りしてポートを公開してしまう問題への対処までまとめています。IMIDC の VPS・専用サーバー(64 ビット OS、root 権限)が対象です。

ステップ1:Docker インストール前に古いパッケージを削除

ディストリビューション標準の 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

ステップ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 互換 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

ステップ4:Docker の起動とインストール後の設定

自動起動を有効にし、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

ステップ5:Docker Compose で最初のコンテナを起動

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

ステップ6:Docker レジストリミラーとログサイズの設定

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
daemon.json は正しい JSON である必要があり、余分なカンマ 1 つで 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 チェーンで接続元を制限します。

# 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 は docker-compose-plugin で入る V2 プラグインで、書式はほぼ互換です。新規プロジェクトでは V2 を使いましょう。

ファイアウォールを再読み込みしたらコンテナが通信できなくなった

firewalld のリロードや iptables のフラッシュで Docker の NAT ルールが消えています。systemctl restart docker を実行すればルールが再作成されます。

上記の手順で解決しない場合は、サポートチケットを送信して IMIDC の 24 時間 365 日対応テクニカルサポートへご連絡ください。サーバー IP、OS バージョン、実行したコマンド、エラー全文を添えていただくと、より迅速に調査できます。

この回答はお役に立ちましたか?

関連チュートリアル