Open17
Dockerいろいろ
Docker docs
Docker docs JP
$ docker --version
Docker version 20.10.23, build 7155243
$ docker compose version
Docker Compose version v2.15.1
まとめ
- Docker Hubにあるイメージをベースにして自分用のイメージを作成する
- ひとつのコンテナにひとつの役割を与えるのが原則
- コンテナ同士はお互いに見えないので、コンテナ間をネットワークする
- 複数のコンテナを使う場合は
docker compose
が便利
確認用コマンドいろいろ
$ docker --help
- Options / Management Commands / Commands の3セクションの使い方が表示される
- Optionsはdockerコマンド自身のオプション引数っぽい
- Management Commands(管理コマンド)とCommands(コマンド)はdocker のサブコマンド的なもの
- Management CommandsはDockerのイメージやコンテナ、ボリュームに対して操作するサブコマンド
- 末尾に
*
がついているのは(おそらく)プラグイン - たいてい
ls
のサブコマンドがあって、そのコマンドに関する一覧を取得できる
- 末尾に
$ docker ps
$ docker container ls
$ docker image ls
$ docker network ls
$ docker plugin ls
$ docker volume ls
システム情報
$ docker system df
$ docker system info
$ docker system prune
WordPressがほしい
$ docker search wordpress
- いちばん上にあるスターが多いイメージを使うことにした
- まず
Dockerfile
やdocker-compose.yml
とかは作らずに触ってみる
$ cd ~/repos/sandbox/docker-wordpress/ # <- 作業用ディレクトリ
$ docker run wordpress
- イメージを自動で取得して、コンテナが起動した
- フォアグラウンドで起動してしまったので、ターミナルが埋め尽くされてしまった
- バックグラウンド(
--detach
モード)で起動しなおす
$ docker run -d wordpress
aec11e81ea28c40351d2d1cee37b55ea118742a72e24755af18d8b074ff4ba87
- バックラウンドで起動した
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aec11e81ea28 wordpress "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 80/tcp nice_nobel
- 本当に起動しているか
docker ps
コマンドで確かめた - コンテナIDはランダムな文字列
- コンテナ名もDockerが勝手に
nice_nobel
と付けてくれた
$ docker stop nice_nobel
$ docker rm nice_nobel
- コンテナ名を指定して、コンテナを停止&削除した
- コンテナ名を指定して(
--name
)、コンテナを起動する
$ docker run -d --name my-wordpress wordpress
a1e51aa80372ff02935b9050d630c449f4938cd9dca70142019ca30cc405aa85
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1e51aa80372 wordpress "docker-entrypoint.s…" 19 seconds ago Up 18 seconds 80/tcp my-wordpress
-
my-wordpress
というコンテナ名でコンテナを起動した - 起動したコンテナの中を覗きたい
$ docker exec -it my-wordpress sh
# whoami
root
# pwd
/var/www/html
# uname -a
Linux a1e51aa80372 5.15.49-linuxkit #1 SMP PREEMPT Tue Sep 13 07:51:32 UTC 2022 aarch64 GNU/Linux
- 先ほど起動したコンテナ(
my-wordpress
)にログインしてsh
を起動する - このときのシェルは
dash
になっていた-
/bin/sh -> dash
のエイリアスになっているため -
sh
の代わりにbash
と書くとbash
になる。こっちのほうが使い慣れてるかも
-
- ログインユーザーは
root
だった - ログインしたあとのパスは
/var/www/html/
になっていた -
uname -a
で環境を確認してみた
# pwd
/var/www/html
# ls -lh
total 236K
-rw-r--r-- 1 www-data www-data 405 Feb 6 2020 index.php
-rw-r--r-- 1 www-data www-data 20K Jan 1 2022 license.txt
-rw-r--r-- 1 www-data www-data 7.3K Sep 16 22:27 readme.html
-rw-r--r-- 1 www-data www-data 7.1K Sep 16 23:13 wp-activate.php
drwxr-xr-x 9 www-data www-data 4.0K Nov 15 19:03 wp-admin
-rw-r--r-- 1 www-data www-data 351 Feb 6 2020 wp-blog-header.php
-rw-r--r-- 1 www-data www-data 2.3K Nov 9 2021 wp-comments-post.php
-rw-rw-r-- 1 www-data www-data 5.4K Mar 2 23:36 wp-config-docker.php
-rw-r--r-- 1 www-data www-data 3.0K Dec 14 2021 wp-config-sample.php
drwxr-xr-x 5 www-data www-data 4.0K Nov 15 19:03 wp-content
-rw-r--r-- 1 www-data www-data 5.5K Sep 20 15:44 wp-cron.php
drwxr-xr-x 27 www-data www-data 16K Nov 15 19:03 wp-includes
-rw-r--r-- 1 www-data www-data 2.5K Mar 19 2022 wp-links-opml.php
-rw-r--r-- 1 www-data www-data 3.9K Sep 19 08:59 wp-load.php
-rw-r--r-- 1 www-data www-data 48K Sep 19 22:26 wp-login.php
-rw-r--r-- 1 www-data www-data 8.4K Oct 17 11:06 wp-mail.php
-rw-r--r-- 1 www-data www-data 25K Sep 26 10:17 wp-settings.php
-rw-r--r-- 1 www-data www-data 34K Sep 17 00:35 wp-signup.php
-rw-r--r-- 1 www-data www-data 4.8K Oct 17 11:22 wp-trackback.php
-rw-r--r-- 1 www-data www-data 3.2K Jun 8 2020 xmlrpc.php
-
/var/www/html/
の中身を確認した - WordPressに必要なファイルがここにありそう
- これらのファイル(まずは
index.php
)にホストOSのブラウザでアクセスしたい - ポート番号を指定して、コンテナを起動する
$ docker run -d -p 8080:80 --name my-wordpress wordpress
202605b1eaf5ee2898de12e35c5fa427df3afee87aedd318e9bfc40431544848
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
202605b1eaf5 wordpress "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:8080->80/tcp my-wordpress
- ホスト側の8080ポートを、ゲスト側の80ポートにマッピングした
-
localhost:8080
でアクセスできることを確認した
-
localhost:8080
にアクセスして、WordPressを設定を試みた - WordPressを始める前に以下の情報が必要
-
データベース名
(-e WORDPRESS_DB_NAME=...
) -
データベースのユーザー名
(-e WORDPRESS_DB_USER=...
) -
データベースのパスワード
(-e WORDPRESS_DB_PASSWORD=...
) -
データベースのホスト
(-e WORDPRESS_DB_HOST=...
) -
テーブル接頭辞
(-e WORDPRESS_TABLE_PREFIX=...
)
-
- これらの情報を使って
wp-config.php
が生成される- いまの段階でコンテナ内には
wp-config.php
がなかった -
wp-config-docker.php
/wp-config-sample.php
はあった
- いまの段階でコンテナ内には
- 上記の変数のデフォルト値はあるのかな?
$ docker volume ls
DRIVER VOLUME NAME
local 9b63162f3e910ae3d18fe268433ac996bf3d49b9c835718b1edd7c641b055b54
- 何度か起動しなおしているけど、データな内部の
named volume
に保存されている - ボリューム名は自動でランダムな値が割り当てられる
$ docker volume inspect 9b63162f3e910ae3d18fe268433ac996bf3d49b9c835718b1edd7c641b055b54
[
{
"CreatedAt": "2023-03-14T05:48:35Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/9b63162f3e910ae3d18fe268433ac996bf3d49b9c835718b1edd7c641b055b54/_data",
"Name": "9b63162f3e910ae3d18fe268433ac996bf3d49b9c835718b1edd7c641b055b54",
"Options": null,
"Scope": "local"
}
]
- ボリューム名が長くて
docker volume inspect
しにくかった - ボリュームの実体はホストOSの
/var/lib/docker/volumes/ボリューム名
にあることがわかる
MySTしたい
node:21-slim
+ python3-virtualenv
$ docker image pull node:21-slim
$ docker container run -it node:21-slim
(コンテナID) # apt-get update
(コンテナID) # apt-get install --no-install-recommends python3-virtualenv
(コンテナID) # virtualenv venv
(コンテナID) # . venv/bin/activate
(コンテナID) # pip3 install mystmd
(コンテナID) # myst --version
-
node:21-slim
イメージの上にpython3-virtualenv
を乗せた
python:3.12-slim
+ npm
$ docker image pull python:3.12-slim
$ docker container run -it python:3.12-slim
(コンテナID) # apt-get update
(コンテナID) # apt-get install --no-intall-recommends npm
(コンテナID) # apt-get install --no-intall-recommends python3-virtualenv
(コンテナID) # virtualenv venv
(コンテナID) # . venv/bin/activate
(コンテナID) # pip3 install mystmd
(コンテナID) # myst --version
-
python:3.12-slim
イメージの上のnpm
を乗せた -
python3-virtualenv
も追加する必要がある - なので
node:21-slim
をベースにするほうがよさそう
Poetryしたい
$ docker image pull python:3.12-slim
$ docker container run -it python:3.12-slim
(コンテナID) # apt-get update
(コンテナID) # apt-get install --no-install-recommends python3-virtualenv
(コンテナID) # virtualenv venv
(コンテナID) # . venv/bin/activate
(コンテナID) # pip3 install poetry
(コンテナID) # poetry --version
Poetry (version 1.8.2)
-
python3-poetry
したら、少し古めのversion 1.3.2
がインストールされた - なので、仮想環境を作成し、最新版を
pip install
するのがよい
おまじない(パッケージ更新)
WORKDIR /app
RUN apt-get update \\
&& apt-get install -y --no-install-recommends \\
パッケージ名1 \\
パッケージ名2 \\
&& apt-get clean -y \\
&& rm -rf /var/lib/apt/lists/* /var/tmp/* /tmp/*
-
Debian/Ubuntu
系のイメージを使う場合の、パッケージ更新するおまじない - コンテナ内の作業ディレクトリを
/app
にする。名前はなんでもOK。ディレクトリは自動で作成される。 -
RUN
の回数はできるだけ少なくしたほうがいいので、パッケージ更新に関する部分はひとまとめにする - パッケージの更新を確認する(
apt-get update
)。apt
を使うと「スクリプト向きではないよ」警告がでるのでapt-get
する。 - パッケージを追加する。インストールの確認をすべてYesにする(
-y
)。関連する推奨パッケージはインストールしない(--no-install-recommends
)。 - 不要なファイルは掃除する
USBポートを使いたい
$ docker run --device=/dev/ホスト側ポート名:/dev/ttyUSB0 -it イメージID
-
--device
オプションで、DockerコンテナとホストPCのポートを紐づける- コンテナ側:
/dev/ttyUSB0
(なんでもいいのかもしれない?) - ホスト側:
/dev/cu.usbserial-140
(macOSの場合はこんな感じ)
- コンテナ側:
- のはずだけど、できなかった