LinuxでDocker入門|イメージ・コンテナ・composeの基本【初心者向け】

前の記事では、journalctl でログを見て、エラーの原因を探しました。今回は Docker(ドッカー)を学びます。Lv4 の最後に VPS で n8n を動かすとき、Docker を使います。

私が n8n を初めてサーバーに入れようとしたときは、Node.js のバージョンを合わせるところでつまずき、ほかのソフトと取り合いになって、パソコンの中がぐちゃぐちゃになりました。Docker を使ってみたら、コマンド1つで動き、いらなくなったらきれいに消せる。「もっと早く知りたかった」と思いました。

この記事では、自分のパソコンで、Web サーバー(nginx)を Docker で動かし、compose で設定をファイルにまとめるところまで試します。外には公開せず、自分のパソコンの中からだけ見られる形で練習します。

💡
この記事でわかること
  • イメージ・コンテナ(=アプリと、動かすのに必要なものをひとまとめにした箱)・compose のちがい
  • Debian に Docker を入れる方法
  • docker run・ps・logs・stop・rm の使い方
  • -p 127.0.0.1:8080:80 の意味と、外に公開しない書き方
  • compose.yaml で設定をファイルにまとめる方法
🔰
この記事の前提
  • ポートと localhost(127.0.0.1)の意味がわかる
  • curl で Web ページを確かめられる
  • sudo apt install と systemctl status を使える

まだの方は、前の記事「Linuxのログの見方|journalctlと/var/logでエラーの原因を探す【初心者向け】」と、Lv4 のネットワークの記事から読むのがおすすめです。

💡
用語メモ
  • root:Linux の管理者ユーザー(ユーザー番号 0)。何でもできるので、ふだんの作業では使いません。いちばん上のディレクトリ「/(ルート)」とは別のものです
  • VPS:大きな物理サーバーを区切って作った、自分専用の仮想サーバーを、月額などで借りられるサービス。root 権限で自由に設定できます
  • n8n:画面上で「ノード」というブロックをつないで、自動化の流れ(ワークフロー)を作れるツール。自分のサーバーでも動かせます
  • ポート:1台のコンピューターの中で、どのサービスにつなぐかを分ける番号(0〜65535)。建物の部屋番号のようなもので、SSH は 22、HTTPS は 443 がよく使われます

用語で迷ったら、連載のまとめ記事の「よく出てくる用語ミニ辞典」でも確かめられます。


結論:イメージは「料理のレシピ」、コンテナは「できた料理」

ことば たとえ 例
イメージ レシピと材料のセット(何度でも使える) nginx・hello-world
コンテナ レシピから作った1皿(動いている本体) kaito-web
-p 127.0.0.1:8080:80 自分のパソコンの 8080 番を、コンテナの 80 番につなぐ 自分からだけ見られる
compose(compose.yaml) 注文票。どの料理をどう出すかをまとめて書く docker compose up -d

Docker のしくみ

準備:Docker を入れる

Debian の公式のパッケージ(=ソフトをインストールしやすいように、ひとまとめにしたもの)から入れます。docker.io が Docker 本体、docker-compose が compose の機能です。

  • 1
  • 2
  • 3
  • 4
sudo apt update
sudo apt install docker.io docker-compose
docker --version
docker compose version

🖥️
この記事の出力例について

ここから先の出力例は、Debian 13での実行例です(ユーザー名 kaito・パソコン名 demo のダミー環境)。UbuntuやWSL(=Windows の中で Linux を動かせる、Microsoft のしくみ)では、表示が少し違うことがあります。

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
kaito@demo:~/linux-practice$ sudo apt update
Get:1 http://deb.debian.org/debian trixie InRelease [140 kB]
Get:2 http://deb.debian.org/debian trixie-updates InRelease [47.3 kB]
Get:3 http://deb.debian.org/debian-security trixie-security InRelease [43.4 kB]
Fetched 231 kB in 0s (3144 kB/s)
All packages are up to date.
kaito@demo:~/linux-practice$ sudo apt install docker.io docker-compose
Installing:
  docker-compose  docker.io

Installing dependencies:
  apparmor       gettext-base         libnet1                    libsort-naturally-perl  runc
  containerd     libcompel1           libnl-3-200                libterm-readkey-perl    tini
  criu           libintl-perl         libproc-processtable-perl  needrestart
  docker-buildx  libintl-xs-perl      libprotobuf-c1             python3-protobuf
  docker-cli     libmodule-find-perl  libprotobuf32t64           python3-pycriu

Suggested packages:
  apparmor-profiles-extra      aufs-tools      rinse        | zfsutils-linux
  apparmor-utils               btrfs-progs     rootlesskit  needrestart-session
  containernetworking-plugins  cgroupfs-mount  xfsprogs     | libnotify-bin
  docker-doc                   debootstrap     zfs-fuse     iucode-tool

Summary:
  Upgrading: 0, Installing: 24, Removing: 0, Not Upgrading: 0
  Download size: 96.7 MB
  Space needed: 409 MB / 107 GB available

Continue? [Y/n] Y
…(途中省略)…
Setting up docker.io (26.1.5+dfsg1-9+deb13u1) ...
Created symlink '/etc/systemd/system/multi-user.target.wants/docker.service' → '/usr/lib/systemd/system/docker.service'.
Created symlink '/etc/systemd/system/sockets.target.wants/docker.socket' → '/usr/lib/systemd/system/docker.socket'.
Setting up libintl-xs-perl (1.35-1) ...
Setting up criu (4.1.1-1) ...
Setting up python3-pycriu (4.1.1-1) ...
Processing triggers for man-db (2.13.1-1) ...
Processing triggers for libc-bin (2.41-12+deb13u4) ...
kaito@demo:~/linux-practice$ docker --version
Docker version 26.1.5+dfsg1, build a72d7cd
kaito@demo:~/linux-practice$ docker compose version
Docker Compose version 2.26.1-4

検証環境(Debian 13)では、Docker は最初は入っていませんでした。docker.io と docker-compose に、必要な部品(containerd・runc など)22個がいっしょに入り、合わせて24個(ダウンロード 96.7 MB)になりました。途中の長い表示は省略しています。

Debian 13 の docker-compose(2.26.1)は、新しい Compose v2 です。そのため、docker-compose(ハイフンつき)ではなく、docker compose(スペース区切り)で使えます。この記事でも docker compose の形で書いています。

💡
Docker の公式サイトの入れ方もあります

Docker の公式サイトでは、Docker 社のリポジトリ(=apt の場合は、パッケージが置いてある配布元のこと)を追加して、より新しい版を入れる方法が案内されています。VPS で n8n を動かす記事では、そちらの手順を使うこともあります。どちらでも、この記事のコマンドは同じように使えます。

Docker は、裏で動くサービス(docker)として動いています。

  • 1
systemctl is-active docker

(例)

  • 1
  • 2
kaito@demo:~$ systemctl is-active docker
active

入れただけで、Docker のサービスは自動で動きはじめています(上の Created symlink … docker.service の行が、自動起動の設定です)。

この記事では、Docker のコマンドに毎回 sudo をつけます。理由は、このあとの 🚫 で説明します。


STEP 1:hello-world で動作確認をする

  • 1
sudo docker run --name kaito-hello hello-world

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
kaito@demo:~$ sudo docker run --name kaito-hello hello-world
[sudo] password for kaito:
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
4f55086f7dd0: Pull complete
Digest: sha256:c567b231f65614688711a75f31518a064258a51d442117a3e771a3a8fdba78ef
Status: Downloaded newer image for hello-world:latest

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

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

sudo のパスワードを聞かれたら、kaito のパスワードを入れます(画面には表示されません)。

1回のコマンドで、次のことが起きています。

  1. パソコンに hello-world のイメージ(レシピ)がないので、Docker Hub から取ってくる
  2. イメージからコンテナ(1皿)を作り、kaito-hello という名前をつけて動かす
  3. メッセージを表示して、コンテナは止まる

  • 1
  • 2
sudo docker images
sudo docker ps -a

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
kaito@demo:~$ sudo docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    e2ac70e7319a   7 months ago   10.1kB
kaito@demo:~$ sudo docker ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED         STATUS                     PORTS     NAMES
c2795943dc07   hello-world   "/hello"   3 seconds ago   Exited (0) 2 seconds ago             kaito-hello

IMAGE ID や CONTAINER ID の英数字は、パソコンごとにちがいます。

docker ps は動いているコンテナだけ、-a をつけると止まっているものも表示します。


STEP 2:nginx を、自分のパソコンからだけ見られる形で動かす

Web サーバーの nginx を、コンテナで動かします。

  • 1
  • 2
sudo docker run -d --name kaito-web -p 127.0.0.1:8080:80 nginx
sudo docker ps

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
kaito@demo:~$ sudo docker run -d --name kaito-web -p 127.0.0.1:8080:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
6fc242d221a6: Pull complete
a071113ac575: Pull complete
9f604dae09b2: Pull complete
6e2ab1f3ef4e: Pull complete
c139fe92686d: Pull complete
d322f1bf41d8: Pull complete
a670537bed70: Pull complete
Digest: sha256:5ab5b0b01097420873a3f3330f44248e34a3c2a3e8d5ee30658aeae8cb7435da
Status: Downloaded newer image for nginx:latest
5321f513acabc1ad5d1deb16254d041a9edde8a959d6464009e59ccf40bf9562
kaito@demo:~$ sudo docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED        STATUS        PORTS                    NAMES
5321f513acab   nginx     "/docker-entrypoint.…"   1 second ago   Up 1 second   127.0.0.1:8080->80/tcp   kaito-web

最後の長い英数字が、作られたコンテナの ID です。docker ps では、その先頭の12文字が表示されます。

部分 意味
-d 裏で動かしつづける(ターミナルを占領しない)
--name kaito-web コンテナに名前をつける
-p 127.0.0.1:8080:80 パソコンの 127.0.0.1 の 8080 番 → コンテナの 80 番
nginx 使うイメージの名前

  • 1
  • 2
  • 3
curl -I http://localhost:8080/
ss -tln | grep 8080
sudo docker logs kaito-web

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
kaito@demo:~$ curl -I http://localhost:8080/
HTTP/1.1 200 OK
Server: nginx/1.31.8
Date: Sat, 31 Oct 2026 18:50:46 GMT
Content-Type: text/html
Content-Length: 896
Last-Modified: Wed, 21 Oct 2026 14:24:51 GMT
Connection: keep-alive
ETag: "6ad8cb33-380"
Accept-Ranges: bytes
kaito@demo:~$ ss -tln | grep 8080
LISTEN 0      4096       127.0.0.1:8080       0.0.0.0:*
kaito@demo:~$ sudo docker logs kaito-web
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2026/10/31 18:50:43 [notice] 1#1: using the "epoll" event method
2026/10/31 18:50:43 [notice] 1#1: nginx/1.31.8
2026/10/31 18:50:43 [notice] 1#1: built by gcc 14.2.0 (Debian 14.2.0-19)
2026/10/31 18:50:43 [notice] 1#1: OS: Linux 6.12.94+
2026/10/31 18:50:43 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1073741816:1073741816
2026/10/31 18:50:43 [notice] 1#1: start worker processes
2026/10/31 18:50:43 [notice] 1#1: start worker process 29
2026/10/31 18:50:43 [notice] 1#1: start worker process 30
2026/10/31 18:50:43 [notice] 1#1: start worker process 31
2026/10/31 18:50:43 [notice] 1#1: start worker process 32
2026/10/31 18:50:43 [notice] 1#1: start worker process 33
2026/10/31 18:50:43 [notice] 1#1: start worker process 34
2026/10/31 18:50:43 [notice] 1#1: start worker process 35
2026/10/31 18:50:43 [notice] 1#1: start worker process 36
192.168.100.1 - - [31/Oct/2026:18:50:46 +0000] "HEAD / HTTP/1.1" 200 0 "-" "curl/8.14.1" "-"

ss の結果が 127.0.0.1:8080 だけなので、このパソコンの中からしか見られないことがわかります。docker logs の時刻と Date: は、世界標準時(UTC・GMT)で表示されます。最後の行が、さっきの curl -I のアクセスの記録です。行の先頭の 192.168.100.1 は、Docker の中の通り道(docker0)のアドレスをダミーに置き換えたものです。

Debian 13での実行画面

止めて、消します。コンテナを消しても、イメージ(レシピ)は残ります。

  • 1
  • 2
  • 3
sudo docker stop kaito-web
sudo docker rm kaito-web
sudo docker ps -a

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
kaito@demo:~$ sudo docker stop kaito-web
kaito-web
kaito@demo:~$ sudo docker rm kaito-web
kaito-web
kaito@demo:~$ sudo docker ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED          STATUS                      PORTS     NAMES
c2795943dc07   hello-world   "/hello"   17 seconds ago   Exited (0) 16 seconds ago             kaito-hello

kaito-web はなくなり、STEP 1 の kaito-hello だけが残っています(後片づけで消します)。

🚫
VPS で -p 8080:80 のように書かない(文章だけで説明します)

-p 8080:80 のように 127.0.0.1: を書かないと、コンテナはすべての出入り口(0.0.0.0)で待ち受け(=プログラムが、決まったポートで通信が来るのを待っている状態)ます。VPS では、インターネットのだれからでも見られる状態になります。しかも Docker は、ufw(=Debian・Ubuntu で使える、ファイアウォールをかんたんに設定するための道具)のルールより先に通信を通してしまうことがあり、「ufw で閉じたはずなのに見えていた」ということが起こります。この記事では試しません。サーバーでは 127.0.0.1: をつけ、外から見せたいときは、HTTPS(=通信を暗号化し、証明書で相手が本物かも確かめる HTTP)の設定やログイン画面を整えてからにしましょう。

🚫
docker グループに入れる・全部消すコマンドは、意味を知ってから

sudo usermod -aG docker ユーザー名 で docker グループに入ると、sudo なしで Docker を使えて便利です。ただしこれは、root とほぼ同じ力を持つことと同じです。この記事では sudo をつけて使います。また、docker system prune -a --volumes のような「まとめて消す」コマンドは、大事なデータ(ボリューム)まで消すことがあるので、この記事では使いません。


STEP 3:compose で設定をファイルにまとめる

docker run のオプションが長くなってきたら、compose でファイルにまとめます。VPS で n8n を動かすときも、この形を使います。

  • 1
  • 2
  • 3
  • 4
mkdir -p ~/linux-practice/docker-test/html
cd ~/linux-practice/docker-test
echo "<h1>kaito の compose 練習ページ</h1>" > html/index.html
nano compose.yaml

次の内容を書いて保存します。YAML はスペースの数(字下げ)に意味があるので、そろえて書きます。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
services:
  web:
    image: nginx
    container_name: kaito-compose-web
    ports:
      - "127.0.0.1:8080:80"
    volumes:
      - ./html:/usr/share/nginx/html:ro
    restart: unless-stopped

書く場所 意味
image 使うイメージ
ports -p と同じ。127.0.0.1: をつける
volumes パソコンの ./html を、コンテナの中に見せる(:ro は読み取りだけ)
restart: unless-stopped 自分で止めない限り、止まっても起動し直す

restart: unless-stopped は、パソコンを再起動したあとにも効きます。準備のところで見たとおり、Docker のサービス(docker.service)は自動起動の設定(systemd の記事の enable)になっているので、パソコンが起動すると Docker が動き出し、unless-stopped のコンテナも起動し直します。ただし、docker compose stop などで自分で止めたコンテナは、再起動したあとも止まったままです。

  • 1
  • 2
  • 3
sudo docker compose up -d
sudo docker compose ps
curl http://localhost:8080/

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
kaito@demo:~$ mkdir -p ~/linux-practice/docker-test/html
kaito@demo:~$ cd ~/linux-practice/docker-test
kaito@demo:~/linux-practice/docker-test$ echo "<h1>kaito の compose 練習ページ</h1>" > html/index.html
kaito@demo:~/linux-practice/docker-test$ nano compose.yaml
kaito@demo:~/linux-practice/docker-test$ grep -n "127.0.0.1" compose.yaml
6:      - "127.0.0.1:8080:80"
kaito@demo:~/linux-practice/docker-test$ sudo docker compose up -d
[+] Running 2/2
 ✔ Network docker-test_default  Created                                                        0.1s
 ✔ Container kaito-compose-web  Started                                                        0.0s
kaito@demo:~/linux-practice/docker-test$ sudo docker compose ps
NAME                IMAGE     COMMAND                  SERVICE   CREATED        STATUS        PORTS
kaito-compose-web   nginx     "/docker-entrypoint.…"   web       1 second ago   Up 1 second   127.0.0.1:8080->80/tcp
kaito@demo:~/linux-practice/docker-test$ curl http://localhost:8080/
<h1>kaito の compose 練習ページ</h1>

grep で、ports に 127.0.0.1: がついていることを確かめてから起動しています。compose ps の PORTS も 127.0.0.1:8080->80/tcp になっています。

Debian 13での実行画面

html/index.html を書きかえると、コンテナを作り直さなくても表示が変わります。volumes でフォルダをつないでいるからです。

  • 1
  • 2
  • 3
  • 4
echo "<h1>書きかえました</h1>" > html/index.html
curl http://localhost:8080/
sudo docker compose down
sudo docker compose ps

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
kaito@demo:~/linux-practice/docker-test$ echo "<h1>書きかえました</h1>" > html/index.html
kaito@demo:~/linux-practice/docker-test$ curl http://localhost:8080/
<h1>書きかえました</h1>
kaito@demo:~/linux-practice/docker-test$ sudo docker compose down
[+] Running 2/2
 ✔ Container kaito-compose-web  Removed                                                        0.3s
 ✔ Network docker-test_default  Removed                                                        0.2s
kaito@demo:~/linux-practice/docker-test$ sudo docker compose ps
NAME      IMAGE     COMMAND   SERVICE   CREATED   STATUS    PORTS

compose down で、コンテナと、compose が作ったネットワークの両方が消えます。最後の compose ps は、見出しの行だけになりました。

💡
コンテナを消すと、中のデータも消える(データの置き場所を決める)

コンテナは「できた料理」なので、docker rm や docker compose down で消すと、コンテナの中に書きこまれたデータも一緒に消えます。n8n のワークフローやデータベースのように、残したいデータは、コンテナの外に置く必要があります。置き場所は2種類あります。

置き場所 compose での書き方 向いているもの
パソコンのフォルダ(バインドマウント) ./html:/usr/share/nginx/html 自分で中身を見たり書きかえたりするファイル(この記事の html)
Docker が管理する置き場所(名前つきボリューム) n8n_data:/home/node/.n8n のように名前で書く アプリが自分で書きこむデータ(n8n の設定やデータベース)

この記事では ./html をパソコンのフォルダに置いたので、compose down のあとも html/index.html は残っていました(後片づけで rm -r docker-test するまで)。

名前つきボリュームは、docker compose down では消えません。docker compose down -v のように -v をつけたときや、上の🚫の docker system prune -a --volumes を使ったときに消えます。次の VPS で n8n を動かす記事では、この名前つきボリュームに n8n のデータを置き、その次のバックアップの記事で、残したデータを守る方法を説明します。

🤖 詰まったらAIに聞こう:コンテナが起動しない・見られない

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
Linuxの初心者です。Dockerでコンテナを動かそうとしていますが、うまくいきません。
原因の候補と、確かめる順番を教えてください。
外に公開しない(127.0.0.1だけ)書き方のまま直したいです。

【使っているOS】例:Debian 13
【compose.yamlの中身、またはdocker runのコマンド】ここに貼る(パスワードやトークンは消す)
【sudo docker compose ps / sudo docker ps -a の結果】ここに貼る
【sudo docker logs コンテナ名 の最後の30行】ここに貼る
【curl -I http://localhost:ポート/ の結果】ここに貼る

🔒
AIに貼る前に:秘密情報やパスワードは貼らない

compose.yaml や .env(=APIキーなどの秘密の設定を書いておくファイル)には、データベースのパスワード、暗号化キー(n8n の N8N_ENCRYPTION_KEY など)、API キーを書くことがよくあります。貼る前に必ず「***」に置き換えてください。docker logs にも、メールアドレスや URL が出ることがあります。


後片づけ

練習用のディレクトリと、取ってきたイメージを消します。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
cd ~/linux-practice
rm -r docker-test
sudo docker rm kaito-hello
sudo docker ps -a
sudo docker rmi nginx hello-world
sudo docker images
ls

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
kaito@demo:~/linux-practice/docker-test$ cd ~/linux-practice
kaito@demo:~/linux-practice$ rm -r docker-test
kaito@demo:~/linux-practice$ sudo docker rm kaito-hello
kaito-hello
kaito@demo:~/linux-practice$ sudo docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
kaito@demo:~/linux-practice$ sudo docker rmi nginx hello-world
Untagged: nginx:latest
Untagged: nginx@sha256:5ab5b0b01097420873a3f3330f44248e34a3c2a3e8d5ee30658aeae8cb7435da
Deleted: sha256:1ebe58b0003b24dba231deb1861ee48821c107d83510b8178fb448e399a024e3
Deleted: sha256:76910fd3497d129a404c300205ff99f976dc584cd3d798aa4dc489c1cf300268
Deleted: sha256:a402d79cd3265c45323514b625839f129c9511273b1f36e406a5c8025105c50a
Deleted: sha256:b3881c3c0ca6857ac7ca19756a474272d57d80d871a9dbe8bf864f531ceee06e
Deleted: sha256:2d02727a33094c38da9370f5fdf30049df0f0436da03bb02577f438566497562
Deleted: sha256:bba098225a6be5294a8fe159e7fff31bdf17491cc7c3f7438c64c411f29b1cbc
Deleted: sha256:2a7cbf9ee26104ef1fb1a769d072cb0de3c908fd89442f295c84d660c0de851f
Deleted: sha256:a5d6d345f6afa08d7c31272055746d60a838b290bfcc82c0a23e8e984d61a933
Untagged: hello-world:latest
Untagged: hello-world@sha256:c567b231f65614688711a75f31518a064258a51d442117a3e771a3a8fdba78ef
Deleted: sha256:e2ac70e7319a02c5a477f5825259bd118b94e8b02c279c67afa63adab6d8685b
Deleted: sha256:897b3f2a7c1bc2f3d02432f7892fe31c6272c521ad4d70257df624504a3238b4
kaito@demo:~/linux-practice$ sudo docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
kaito@demo:~/linux-practice$ ls
archive-test  chmod-test  edit-test  find-test  grep-test  link-test  perm-test  redirect-test

検証では、先にコンテナを消していたので、docker rmi はエラーにならずに終わりました。

docker rmi が「image is being used by stopped container」のようなエラーになったときは、そのイメージから作ったコンテナが残っています。sudo docker ps -a で表示された名前を使って sudo docker rm 名前 で消してから、もう一度 docker rmi を実行します。Docker そのものを使わない場合は、sudo apt remove docker.io docker-compose で消せます。


よくある質問

Q. sudo をつけずに docker ps と打ったら「permission denied」と表示されました。

一般ユーザーには、Docker を動かしている裏のサービスに話しかける権限がないためです。「permission denied while trying to connect to the Docker daemon socket」のような表示になります(表示は Docker のバージョンにより異なります)。この記事のとおり sudo をつけて使ってください。docker グループに入れる方法は、上の🚫の箱のとおり、root とほぼ同じ力を持つことになるので、意味を知ってから決めましょう。

Q. 「port is already allocated」と表示されて、コンテナが起動しません。

同じポート(この記事では 8080)を、ほかのコンテナかプログラムがすでに使っているという意味です。sudo docker ps で、同じポートを使うコンテナが残っていないかを確かめます。ネットワークの基本の記事の ss -tln | grep 8080 でも、待っているものを見られます。急ぐときは、127.0.0.1:8081:80 のように左側の番号だけ変えてもかまいません。

Q. WSL では、Docker Desktop と、この記事の docker.io のどちらを使えばいいですか?

Windows に Docker Desktop を入れると、WSL の中からも docker コマンドが使えるようになることがあります(Docker Desktop の設定など、環境により異なります)。この記事のように WSL の Debian の中に docker.io を入れる方法もありますが、両方を混ぜると、どちらの Docker を使っているのかわかりにくくなります。どちらか一方に決めて使いましょう。WSL で docker.io を使うときは、systemd(=Linux の起動や、サービスの起動・停止・自動起動を管理するしくみ)が動いている必要があります(systemd 入門の記事の「よくある質問」)。


まとめ

  • イメージはレシピ、コンテナはそこから作った1皿。コンテナを消してもイメージは残る
  • docker run -d --name 名前 -p 127.0.0.1:8080:80 イメージ で、自分のパソコンからだけ見られる形で動かす
  • docker ps -a・logs・stop・rm・rmi で管理する
  • compose.yaml にまとめて、docker compose up -d・down で動かす・止める
  • サーバーでは 127.0.0.1: をつける。Docker は ufw より先に通信を通すことがある
  • docker グループや「まとめて消す」コマンドは、意味を知ってから

次の記事では、ここまでの Lv4 の内容(SSH・初期設定・systemd・ログ・Docker)を使って、VPS で Python と n8n を24時間動かします。


次に読む記事


関連する記事