前の記事では、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 を入れる
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 社のリポジトリ(=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回のコマンドで、次のことが起きています。
- パソコンに
hello-worldのイメージ(レシピ)がないので、Docker Hub から取ってくる - イメージからコンテナ(1皿)を作り、
kaito-helloという名前をつけて動かす - メッセージを表示して、コンテナは止まる
- 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-helloIMAGE 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)のアドレスをダミーに置き換えたものです。
止めて、消します。コンテナを消しても、イメージ(レシピ)は残ります。
- 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-hellokaito-web はなくなり、STEP 1 の kaito-hello だけが残っています(後片づけで消します)。
-p 8080:80 のように 127.0.0.1: を書かないと、コンテナはすべての出入り口(0.0.0.0)で待ち受け(=プログラムが、決まったポートで通信が来るのを待っている状態)ます。VPS では、インターネットのだれからでも見られる状態になります。しかも Docker は、ufw(=Debian・Ubuntu で使える、ファイアウォールをかんたんに設定するための道具)のルールより先に通信を通してしまうことがあり、「ufw で閉じたはずなのに見えていた」ということが起こります。この記事では試しません。サーバーでは 127.0.0.1: をつけ、外から見せたいときは、HTTPS(=通信を暗号化し、証明書で相手が本物かも確かめる HTTP)の設定やログイン画面を整えてからにしましょう。
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 になっています。
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 PORTScompose 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:ポート/ の結果】ここに貼る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時間動かします。
次に読む記事
関連する記事
- n8nとは?最初のワークフローを1本つくる:Docker で動かす n8n を、先に触ってみたい方に
- Cursorを快適に動かすためのマシン要件まとめ【AI使うなら特に必見】:Docker を動かすパソコンのメモリや性能が気になる方に
- 自動化スタック総覧|GAS・n8n・Python・Notionの使い分け:Docker で何を動かすと便利かを考えたい方に