Open17

Dockerいろいろ

shotakahashotakaha

まとめ

  • Docker Hubにあるイメージをベースにして自分用のイメージを作成する
  • ひとつのコンテナにひとつの役割を与えるのが原則
  • コンテナ同士はお互いに見えないので、コンテナ間をネットワークする
  • 複数のコンテナを使う場合はdocker composeが便利
shotakahashotakaha

確認用コマンドいろいろ

$ 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
shotakahashotakaha

WordPressがほしい

$ docker search wordpress
  • いちばん上にあるスターが多いイメージを使うことにした
  • まずDockerfiledocker-compose.ymlとかは作らずに触ってみる
shotakahashotakaha
$ cd ~/repos/sandbox/docker-wordpress/    # <- 作業用ディレクトリ
$ docker run wordpress
  • イメージを自動で取得して、コンテナが起動した
  • フォアグラウンドで起動してしまったので、ターミナルが埋め尽くされてしまった
  • バックグラウンド(--detachモード)で起動しなおす
shotakahashotakaha
$ 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)、コンテナを起動する
shotakahashotakaha
$ 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というコンテナ名でコンテナを起動した
  • 起動したコンテナの中を覗きたい
shotakahashotakaha
$ 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で環境を確認してみた
shotakahashotakaha
# 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のブラウザでアクセスしたい
  • ポート番号を指定して、コンテナを起動する
shotakahashotakaha
$ 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でアクセスできることを確認した
shotakahashotakaha
  • 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 はあった
  • 上記の変数のデフォルト値はあるのかな?
shotakahashotakaha
$ 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/ボリューム名にあることがわかる
shotakahashotakaha

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をベースにするほうがよさそう
shotakahashotakaha

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するのがよい
shotakahashotakaha

おまじない(パッケージ更新)

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)。
  • 不要なファイルは掃除する
shotakahashotakaha

USBポートを使いたい

$ docker run --device=/dev/ホスト側ポート名:/dev/ttyUSB0 -it イメージID
  • --deviceオプションで、DockerコンテナとホストPCのポートを紐づける
    • コンテナ側: /dev/ttyUSB0(なんでもいいのかもしれない?)
    • ホスト側: /dev/cu.usbserial-140(macOSの場合はこんな感じ)
  • のはずだけど、できなかった