Ubuntu 26.04 に Docker をインストールする方法(Docker Compose 付き)

Ubuntu 26.04 サーバーに Docker の公式リポジトリを追加して Docker Engine と Docker Compose をインストールし、sudo なしで docker コマンドを使う設定、Compose によるコンテ…

Ubuntu 26.04Docker 29.9x86_64約 17 分

検証済みのドキュメントです

クラウドサーバーを作成し、このドキュメントのコマンドを最初から最後までそのまま実行して確認したドキュメントです。

OS
Ubuntu 26.04.1 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 26.04 サーバーに Docker の公式リポジトリを追加して Docker Engine と Docker Compose をインストールし、sudo なしで docker コマンドを使う設定、Compose によるコンテナの実行、Docker が公開したポートが ufw ファイアウォールを通らない問題とその防ぎ方、削除する方法までまとめます。

1. 準備するもの

  • Ubuntu 26.04 LTS サーバー 1 台(メモリ 1GB 以上を推奨)
  • sudo 権限のある一般ユーザー アカウントでの SSH 接続
  • 外部からの接続を確認する PC(ファイアウォールの確認手順で使用)

サーバーがない場合は、DigitalOcean のいちばん小さい Droplet(1 vCPU・1GB)を作成してください。この Droplet でも Docker をインストールしてコンテナを実行するには十分です。この文書の手順はすべて、Droplet(1 vCPU・メモリ 1GB・SSD 25GB・Ubuntu 26.04・シンガポール)でサーバーを作成し、sudo 権限のある一般ユーザー アカウントで確認しました。

2. インストールするパッケージを確認

Ubuntu 26.04 の標準リポジトリにも Docker のパッケージ(docker.io)があります。

apt-cache policy docker.io | head -3
docker.io:
  Installed: (none)
  Candidate: 29.1.3-0ubuntu4.1

この文書では、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; done

3. Docker の公式リポジトリを追加

リポジトリの追加に必要なツールをインストールします。ほとんどはすでにインストールされています。

sudo apt update
sudo apt install -y ca-certificates curl

Docker リポジトリの署名鍵をダウンロードして保存します。署名鍵は、ダウンロードするパッケージが 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 26.04 は resolute です。

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
EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: resolute
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc

パッケージ一覧を更新し、インストールされるバージョンを確認します。Candidate が Docker リポジトリのバージョンなら正常です。

sudo apt update
apt-cache policy docker-ce | head -3
docker-ce:
  Installed: (none)
  Candidate: 5:29.9.0-1~ubuntu.26.04~resolute

4. 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 --version
Docker version 29.9.0, build f415da8
docker compose version
Docker Compose version v5.6.0
docker buildx version
github.com/docker/buildx v0.38.0 0dbe87f36ed472fe36b6796c3f70b4210a731fc5

5. サービスの状態を確認

インストールが終わると Docker サービスが自動で起動し、サーバーを再起動しても自動で実行されるように登録されます。

sudo systemctl status docker --no-pager | head -3
● docker.service - Docker Application Container Engine
     Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: enabled)
     Active: active (running) since Tue 2026-10-13 02:10:42 UTC; 7s ago

docker とコンテナ ランタイムの containerd が、どちらも自動起動に登録されているか確認します。

systemctl is-enabled docker containerd
enabled
enabled

テスト用イメージ hello-world をダウンロードして実行します。次のメッセージが表示されれば Docker は正常です。

sudo docker run hello-world
Hello 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-world
permission 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 が表示されれば完了です。

groups
devuser sudo users docker
docker run hello-world | head -3

Hello from Docker!
This message shows that your installation appears to be working correctly.

ここまでに実行したコンテナの一覧です。-a は実行が終わったコンテナも表示するという意味です。

docker ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED                  STATUS                              PORTS     NAMES
fa271ecfc516   hello-world   "/hello"   Less than a second ago   Exited (0) Less than a second ago             happy_shockley
3664a25b0cce   hello-world   "/hello"   4 seconds ago            Exited (0) 3 seconds ago                      unruffled_payne

7. 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 ps
NAME                  IMAGE        COMMAND                  SERVICE   CREATED        STATUS        PORTS
hello-compose-web-1   nginx:1.29   "/docker-entrypoint.…"   web       1 second ago   Up 1 second   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp
curl -s http://localhost:8080 | grep -o "<title>.*</title>"
<title>Welcome to nginx!</title>

8. ファイアウォール(ufw)と Docker のポート

ufw ファイアウォールを有効にし、SSH だけを許可します。ファイアウォールを有効にする前に、必ず SSH を先に許可してください。SSH を許可せずにファイアウォールを有効にすると、サーバーへの接続が切れます。--force は、確認なしでファイアウォールを有効にするオプションです。

sudo ufw allow OpenSSH
Rules updated
Rules updated (v6)
sudo ufw --force enable
Firewall is active and enabled on system startup
sudo ufw status
Status: 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 8080
DNAT       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.yaml
services:
  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 Started

8080 番ポートは 127.0.0.1 でだけ開いていて、サーバー内からはそのまま接続できます。

sudo ss -tlnp | grep 8080
LISTEN 0      4096       127.0.0.1:8080      0.0.0.0:*    users:(("docker-proxy",pid=5645,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:8080
curl: (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 Removed

Docker のパッケージとデータをすべて削除します。イメージ、コンテナ、ボリュームがすべて削除されるので、必要なデータは先にバックアップしてください。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/containerd

3 の手順で追加したリポジトリと署名鍵も削除し、パッケージ一覧を更新します。

sudo rm /etc/apt/sources.list.d/docker.sources /etc/apt/keyrings/docker.asc
sudo apt update

Docker のパッケージが残っていないか確認します。0 と表示されれば、すべて削除されています。

dpkg -l | grep -c -E "docker|containerd"
0

実際に試してみる

サーバーがなければ、以下のサービスで数分あれば Ubuntu サーバーを作れます。 このドキュメントは DigitalOcean で検証しました。