Docker学習記録
Dockerの大雑把な流れ
DockerはLinuxのコンテナ技術を使用している。
つまり、DockerはLinuxのOSの上に乗っているということ。
Dockerはコンテナを扱う仕組みのこと。
コンテナごとにデータやプログラムを分けることによって、「データやプログラムを隔離する」ことができる。同じプログラムを複数のシステムで使っている際に、一方のシステムの都合でプログラムのバージョンを上げてしまうと競合が起きる可能性が出てきてしまう。
環境変数とは、OS上で動くプロセスが情報を共有するために使う変数のこと。
プロセスは一つ一つのプログラムのこと。Chromeとかターミナルとかなんでも。
Docker HubはGitHubのDocker版みたいな感じ。
Docker imageを管理したり、他の人に共有したりすることができる。
基本的な用途は他の人が共有してくれているDocker imageを使用するときに使うことが多い。
Dockerのコンテナの中に環境を作り上げ、そこで作業をする。
このコンテナを全員が同じものを使うことで環境差異を排除したチーム開発環境が構築できる。
Docker imageはコンテナを作るもととなるもの(コンテナからイメージを作成するということもできる)。
このDocker imageがDocker Hub上で多数公開されている。
Docker imageは、Docker fileというテキストファイルから作成される。
Docker コマンド入門
dockerコマンドの基本順序
dockerの基本コマンドは、docker [上位コマンド(何を)] [副コマンド(どうする)] {対象}
の順で記述する。
「コマンド」にオプション、「対象」に引数をつけて、docker [上位コマンド(何を)] [副コマンド(どうする)] (オプション) {対象} (引数)
となることもある。
# dockerコマンド基本の順番
docker [上位コマンド(何を)] [副コマンド(どうする)] {対象}
docker image pull {image} # イメージを引っ張ってくる場合の例
docker container start {image} # コンテナを起動させる場合の例
# dockerコマンドにはオプション等が付く場合もある
docker [上位コマンド(何を)] [副コマンド(どうする)] _オプション_ {対象} _引数_
docker container run -d {image} --mode=1 # -dが「バックグラウンドで実行」という意味のオプション、--mode=1が「モード1で実行」という意味の引数
具体例(~系は上位コマンド)
# 独立系
docker version # Dockerのバージョンを表示(-vだと1行表示)
docker login # Docker Hubにログイン
# image系
docker pull {image} # イメージを持ってくる
docker images # Host内のイメージのリストを表示(`docker image ls`も同じ)
docker image rm {image} # イメージの削除。{image1 image2 image3}とすることで複数イメージの一括削除ができる
docker image rm {image}:{version} # バージョンを指定してイメージを削除。例:`docker image rm httpd:2.2`
# container系
docker run {image} # イメージからコンテナを作る(`docker pull`しなくてもイメージがない場合は自動でpullしてくれる)。`docker pull` + `docker create` + `docker start`の合体コマンド
docker run -it {image} bash # コンテナ起動時にbashを実行する書き方。-itはおまじない
docker run --name {container_name} {image} # コンテナ名を付けてコンテナを作成
docker run {image}:{version} # バージョンを指定して`docker run`する際のコマンド。例:`docker run httpd:2.2`
docker ps # 現在Host内にあるアクティブなコンテナを表示
docker ps -a # 現在Host内にどういうコンテナがあるのかを確認(非アクティブ含む)
docker stop {container_name} # コンテナを停止
docker rm {container_name} # コンテナを削除
# volume系
# network系
docker network create {network_name} # 仮想的なdockerネットワークを作成
docker network rm {network_name} # dockerネットワークの削除
docker network ls # dockerネットワークの一覧表示
今後の流れ
- 『きほんのきほん』読む
- 「Docker で React + TypeScript の開発環境」見ながらDocker上でReact×TS環境を作る
- 「DockerでReact環境を構築する手順」も参考に
dockerコンテナは「作っては捨てる」もの。
create(作成)
→ start(起動)
→ stop(停止)
→ rm(破棄)
のライフサイクルを取る。
コンテナ内のデータはホストOSの一部分にマウントされる。
docker run
コマンドはpull
+ create
+ start
までを一括実行。
デーモン
について
■ 「UNIXやLinux上で動くプログラムのうち、常に待ち受けして裏で動き続けるプログラムのこと(常駐プログラム)」を慣例的にデーモンと呼ぶ。
dockerで、デーモンとして動き続けるコンテナを起動する場合は、その制御をdocker側に握られてしまうので、こちら側で制御できるように明示的に「-d」や「-i」や「-t」オプションを指定して実行する。
これらのオプションは比較的よく使うので、「-dit」としてまとめて指定することができる。
- -d:バックグラウンドで実行するオプション
- -i:コンテナに操作端末(キーボード)を繋ぐオプション
- -t:特殊キーを使用可能にするオプション
これらのオプションは、どんなときでも付ければいいというわけではなく、 「一度限り実行すればいいコンテナ」 なのか 「デーモンとして動くことを目的としたコンテナ」 なのかを区別して、ケースバイケースで使い分ける必要がある。
コンテナの内部とホストOSが通信できるようにするためのオプション
複数のコンテナとホストが通信をする場合、ホスト側のポート番号を各コンテナごとにズラすようにする(逆を言えば、コンテナ側のポート番号(e.g. 80)は同じ番号で構わない)。
これをすると、Webブラウザでlocalhost:8080
と打つことで、ホストOSを経由してコンテナ内部のApache等に接続することが出来るようになる。
# コンテナ内部と通信するためのオプション
-p [ホストのポート番号]:[コンテナのポート番号]
# 具体例 (8080番は任意の数字でよい)
-p 8080:80
# 実際の使用例
docker run --name apa000ex2 -d -p 8080:80 httpd # コンテナ名を「apa000ex2」とし、バックグラウンドで実行し、ポートを8080:80に設定して、Apache(httpd)イメージからコンテナを作成
アプリとDBを各コンテナで起動させ、コンテナ同士を通信させる(docker network)
コンテナ同士を仮想的なネットワークで繋ぐ(以下イメージ)。
今回のケースは「WordPressコンテナ」と「MySQLコンテナ」間の通信。
MySQLコンテナの起動
# 本来は1行だが、見やすいように改行(区切りは「コマンド」、「オプション」、「対象」、「引数」)
docker run --name {コンテナ名}
-dit --net={ネットワーク名} -e MYSQL_ROOT_PASSWORD={MySQLのrootパスワード} -e MYSQL_DATABASE={データベース領域名} -e MYSQL_USER={MySQLのユーザー名} -e MYSQL_PASSWORD={MySQLのパスワード}
mysql
--character-set-server={文字コード} --collation-server={照合順序} --default-authentication-plugin={認証方式}
オプション解説
- --net:ネットワークを紐付けるオプション
-
-e:環境変数を設定するオプション
-
-e MYSQL_DATABASE={データベース領域名}
:データベースの実物に付ける名前 -
-e MYSQL_USER={MySQLのユーザー名}
:一般ユーザー(rootユーザーじゃない方)のユーザー名
-
WordPressコンテナの起動
# 本来は1行だが、見やすいように改行(区切りは「コマンド」、「オプション」、「対象」)
docker run --name {コンテナ名}
-dit --net={ネットワーク名} -p {ポートの設定} -e WORDPRESS_DB_HOST={データベースのコンテナ名} -e WORDPRESS_DB_NAME={データベース領域名} -e WORDPRESS_DB_USER={データベースのユーザー名} -e WORDPRESS_DB_PASSWORD={データベースのパスワード}
wordpress
オプション解説
-
-p:ポート番号の指定(e.g.
8080:80
) -
-e:環境変数を設定するオプション
-
-e WORDPRESS_DB_USER={データベースのユーザー名}
:データベースのユーザー名(勿論rootユーザーではない方の一般ユーザーのユーザー名)
-
コンテナ立ち上げからコンテナ間連携までの流れ
実際のコンテナ立ち上げから連携までのイメージは以下のような流れ。
実際にWordPressコンテナとMySQLコンテナを起動する例(docker本p.130~ 参照)
# ネットワークの作成
docker network create wordpress000net1
# MySQLコンテナの起動
docker run --name mysql000ex11 -dit --net=wordpress000net1 -e MYSQL_ROOT_PASSWORD=myrootpass -e MYSQL_DATABASE=wordpress000db -e MYSQL_USER=wordpress000kun -e MYSQL_PASSWORD=wkunpass mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
# WordPressコンテナの起動
docker run --name wordpress000ex12 -dit --net=wordpress000net1 -p 8085:80 -e WORDPRESS_DB_HOST=mysql000ex11 -e WORDPRESS_DB_NAME=wordpress000db -e WORDPRESS_DB_USER=wordpress000kun -e WORDPRESS_DB_PASSWORD=wkunpass wordpress
# コンテナの稼働確認
docker ps -a