検証済みのドキュメントです
クラウドサーバーを作成し、このドキュメントのコマンドを最初から最後までそのまま実行して確認したドキュメントです。
- OS
- Ubuntu 22.04.5 LTS · x86_64
- インストールしたバージョン
- Docker 29.9.0 (docker-ce), Docker Compose 5.6.0, buildx 0.38.0, containerd 2.4.1
- テストサーバー
- DigitalOcean · 1 vCPU / 1 GB RAM / 25 GB SSD (s-1vcpu-1gb, sgp1)
- 最終確認
- 2026-10-13
このドキュメントにはアフィリエイトリンクが含まれています。リンクから登録するとコードサンドが手数料を受け取ることがありますが、内容や評価には影響しません。
Ubuntu 22.04 サーバーに Docker の公式リポジトリを追加して Docker Engine と Docker Compose をインストールし、sudo なしで docker コマンドを使う設定、Compose によるコンテナの実行、Docker が公開したポートが ufw ファイアウォールを通らない問題とその防ぎ方、削除する方法までまとめます。
1. 準備するもの
- Ubuntu 22.04 LTS サーバー 1 台(メモリ 1GB 以上を推奨)
sudo権限のある一般ユーザー アカウントでの SSH 接続- 外部からの接続を確認する PC(ファイアウォールの確認手順で使用)
サーバーがない場合は、DigitalOcean のいちばん小さい Droplet(1 vCPU・1GB)を作成してください。この Droplet でも Docker をインストールしてコンテナを実行するには十分です。この文書の手順はすべて、Droplet(1 vCPU・メモリ 1GB・SSD 25GB・Ubuntu 22.04・シンガポール)でサーバーを作成し、sudo 権限のある一般ユーザー アカウントで確認しました。
2. インストールするパッケージを確認
Ubuntu 22.04 の標準リポジトリにも Docker のパッケージ(docker.io)があります。
apt-cache policy docker.io | head -3docker.io:
Installed: (none)
Candidate: 29.1.3-0ubuntu3~22.04.2この文書では、Docker が自ら配布している公式リポジトリの docker-ce をインストールします。Docker の公式ドキュメントが案内している方法で、新しいバージョンが出るとすぐに入手できます。Docker Compose も docker compose コマンドとして一緒にインストールされます。
標準リポジトリのパッケージやほかのコンテナ ツールがすでにインストールされていると競合することがあるため、削除します。インストールされていないパッケージは Package 'docker.io' is not installed, so not removed のように表示されて飛ばされるので、初めてインストールするサーバーでもそのまま実行して構いません。
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt remove -y $pkg; done3. Docker の公式リポジトリを追加
リポジトリの追加に必要なツールをインストールします。ほとんどはすでにインストールされています。
sudo apt update
sudo apt install -y ca-certificates curlDocker リポジトリの署名鍵をダウンロードして保存します。署名鍵は、ダウンロードするパッケージが Docker によって作られたものかを確認するために使います。-m 0755 はフォルダーの権限を、a+r はすべてのユーザーが鍵ファイルを読めるようにするという意味です。
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.ascリポジトリのアドレスを登録します。Suites の行のコマンドは、サーバーの Ubuntu のコード名に置き換わります。Ubuntu 22.04 は jammy です。
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOFTypes: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: jammy
Components: stable
Signed-By: /etc/apt/keyrings/docker.ascパッケージ一覧を更新し、インストールされるバージョンを確認します。Candidate が Docker リポジトリのバージョンなら正常です。
sudo apt updateapt-cache policy docker-ce | head -3docker-ce:
Installed: (none)
Candidate: 5:29.9.0-1~ubuntu.22.04~jammy4. Docker をインストール
Docker Engine(docker-ce)、コマンドライン ツール(docker-ce-cli)、コンテナ ランタイム(containerd.io)、イメージのビルド ツール(docker-buildx-plugin)、Docker Compose(docker-compose-plugin)をまとめてインストールします。
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginインストールされたバージョンを確認します。
docker --versionDocker version 29.9.0, build f415da8docker compose versionDocker Compose version v5.6.0docker buildx versiongithub.com/docker/buildx v0.38.0 0dbe87f36ed472fe36b6796c3f70b4210a731fc55. サービスの状態を確認
インストールが終わると Docker サービスが自動で起動し、サーバーを再起動しても自動で実行されるように登録されます。
sudo systemctl status docker --no-pager | head -3● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2026-10-13 02:15:35 UTC; 9s agodocker とコンテナ ランタイムの containerd が、どちらも自動起動に登録されているか確認します。
systemctl is-enabled docker containerdenabled
enabledテスト用イメージ hello-world をダウンロードして実行します。次のメッセージが表示されれば Docker は正常です。
sudo docker run hello-worldHello from Docker!
This message shows that your installation appears to be working correctly.6. sudo なしで docker コマンドを使う
今は sudo なしで実行すると次のエラーが出ます。docker コマンドは Docker サービスの接続ファイル(/var/run/docker.sock)を使いますが、このファイルは root と docker グループしか使えないためです。
docker run hello-worldpermission denied while trying to connect to the docker API at unix:///var/run/docker.sock現在のユーザーを docker グループに追加します。-aG は既存のグループはそのままでグループを追加するという意味で、$USER は今ログインしているユーザー名です。
sudo usermod -aG docker $USERグループの変更は、ログインし直すと反映されます。SSH 接続を切ってもう一度接続し、確認します。グループ一覧に docker が表示されれば完了です。
groupsdevuser sudo dockerdocker run hello-world | head -3
Hello from Docker!
This message shows that your installation appears to be working correctly.ここまでに実行したコンテナの一覧です。-a は実行が終わったコンテナも表示するという意味です。
docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0590eaaddfa5 hello-world "/hello" 1 second ago Exited (0) Less than a second ago sweet_banach
19e77a86a647 hello-world "/hello" 5 seconds ago Exited (0) 4 seconds ago gifted_wu7. Docker Compose でコンテナを実行
Docker Compose は docker compose(スペース区切り)で実行します。以前の docker-compose(ハイフン)コマンドはインストールされません。ほかの記事の docker-compose up は docker compose up に置き換えて実行してください。
Web サーバー nginx を実行する compose.yaml ファイルを作ります。"8080:80" は、サーバーの 8080 番ポートをコンテナの 80 番ポートにつなぐという意味です。
mkdir ~/hello-compose && cd ~/hello-compose
cat > compose.yaml <<EOF
services:
web:
image: nginx:1.29
ports:
- "8080:80"
EOFコンテナを起動します。-d は、ターミナルを占有せずにバックグラウンドで実行するという意味です。初回は nginx イメージをダウンロードする行がいくつも表示され、最後に次の行が表示されます。
docker compose up -d Container hello-compose-web-1 Creating
Container hello-compose-web-1 Created
Container hello-compose-web-1 Starting
Container hello-compose-web-1 Startedコンテナの状態を確認し、サーバー内から接続してみます。Welcome to nginx! と表示されれば正常です。
docker compose psNAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
hello-compose-web-1 nginx:1.29 "/docker-entrypoint.…" web 3 seconds ago Up 1 second 0.0.0.0:8080->80/tcp, [::]:8080->80/tcpcurl -s http://localhost:8080 | grep -o "<title>.*</title>"<title>Welcome to nginx!</title>8. ファイアウォール(ufw)と Docker のポート
ufw ファイアウォールを有効にし、SSH だけを許可します。ファイアウォールを有効にする前に、必ず SSH を先に許可してください。SSH を許可せずにファイアウォールを有効にすると、サーバーへの接続が切れます。--force は、確認なしでファイアウォールを有効にするオプションです。
sudo ufw allow OpenSSHRules updated
Rules updated (v6)sudo ufw --force enableFirewall is active and enabled on system startupsudo ufw statusStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)ファイアウォールには 8080 番ポートのルールがありません。それでも、ほかの PC からサーバーの 8080 番ポートに接続すると nginx の画面がそのまま開きます。203.0.113.20 はサーバーの IP に置き換えてください。
curl -sS --max-time 10 http://203.0.113.20:8080 | grep -o "<title>.*</title>"<title>Welcome to nginx!</title>Docker はポートを公開するときに Linux のファイアウォール(iptables)へ直接ルールを追加し、そのルールが ufw のルールより先に適用されるためです。Docker が 8080 番ポート用に追加したルールは、次のコマンドで確認できます。
sudo iptables -t nat -L DOCKER -n | grep 8080DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 to:172.18.0.2:80サーバー内からだけ接続できればよいサービスは、ポートの前に 127.0.0.1: を付けて、サーバー自身のアドレスだけにつなぎます。sed -i はファイルの内容を書き換えてすぐに保存するコマンドです。ファイルを変更してから docker compose up -d をもう一度実行すると、新しい設定でコンテナが作り直されます。
sed -i 's/"8080:80"/"127.0.0.1:8080:80"/' compose.yaml
cat compose.yamlservices:
web:
image: nginx:1.29
ports:
- "127.0.0.1:8080:80"docker compose up -d Container hello-compose-web-1 Recreate
Container hello-compose-web-1 Recreated
Container hello-compose-web-1 Starting
Container hello-compose-web-1 Started8080 番ポートは 127.0.0.1 でだけ開いていて、サーバー内からはそのまま接続できます。
sudo ss -tlnp | grep 8080LISTEN 0 4096 127.0.0.1:8080 0.0.0.0:* users:(("docker-proxy",pid=5816,fd=8))curl -s http://localhost:8080 | grep -o "<title>.*</title>"<title>Welcome to nginx!</title>ほかの PC からもう一度接続すると、今度は接続できません。
curl -sS --max-time 10 http://203.0.113.20:8080curl: (28) Connection timed out after 10005 milliseconds外部に公開する必要がある Web サービスでは、Nginx のような Web サーバーを前に置き、コンテナのポートは 127.0.0.1 だけにつなぐ方法をおすすめします。
9. トラブルシューティング
permission denied while trying to connect to the docker API at unix:///var/run/docker.sock
現在のユーザーが docker グループに入っていないという意味です。6 の手順のように sudo usermod -aG docker $USER を実行してから、SSH 接続を切ってもう一度接続してください。接続し直すまでグループの変更は反映されません。groups で docker が表示されるか確認してください。
docker-compose: command not found
この文書の方法でインストールした場合、Compose は docker compose(スペース区切り)コマンドで実行します。docker-compose up -d の代わりに docker compose up -d を実行してください。
ufw で遮断したのに、コンテナのポートに外部から接続できる
Docker が iptables に直接追加したルールが、ufw より先に適用されるためです。8 の手順のように、compose.yaml のポートを "127.0.0.1:8080:80" の形に変えて、サーバー内からだけ接続できるようにしてください。
10. 削除する
まず、実行中のコンテナを停止して削除します。docker compose down は、compose.yaml で作ったコンテナとネットワークを削除します。
cd ~/hello-compose
docker compose down Container hello-compose-web-1 Stopping
Container hello-compose-web-1 Stopped
Container hello-compose-web-1 Removing
Container hello-compose-web-1 Removed
Network hello-compose_default Removing
Network hello-compose_default RemovedDocker のパッケージとデータをすべて削除します。イメージ、コンテナ、ボリュームがすべて削除されるので、必要なデータは先にバックアップしてください。docker-ce-rootless-extras は、Docker のインストール時に一緒にインストールされたパッケージです。
sudo apt purge -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
sudo rm -rf /var/lib/docker /var/lib/containerd3 の手順で追加したリポジトリと署名鍵も削除し、パッケージ一覧を更新します。
sudo rm /etc/apt/sources.list.d/docker.sources /etc/apt/keyrings/docker.asc
sudo apt updateDocker のパッケージが残っていないか確認します。0 と表示されれば、すべて削除されています。
dpkg -l | grep -c -E "docker|containerd"0実際に試してみる
サーバーがなければ、以下のサービスで数分あれば Ubuntu サーバーを作れます。 このドキュメントは DigitalOcean で検証しました。
このドキュメントは役に立ちましたか? 間違いや変わった点があればお知らせください。
内容の修正を依頼