- 参考書籍
- 参考サイト集
- サーバは遠隔操作できるPC
- 動作環境
- カーネルとは
- イメージとは
- Docker Hubとは
- Dockerfileでイメージ作成
- コンテナのライフサイクル
- マウント(ホストとコンテナ接続)
- dockerコマンドの文法
- デーモンとは
- コンテナと通信する
- container同士の仮想ネットワーク
- ファイルコピー(コンテナ⇔ホスト)
- コンテナ内でbashを使う(コンテナ内部に入る)
- Docker compose(一括命令)
参考書籍
めちゃくちゃわかりやすくて感動した。
Linux系の用語解説もあってよかった。
サポートサイト(AWSでのDocker構築あり)
https://book.mynavi.jp/supportsite/detail/9784839972745.html
参考サイト集
Dockerで環境構築する時はここを見ながらやる。
docker-compose.ymlの参考サイト
日本語公式がある!
docs.docker.jp
Dockerfileの参考サイト
こちらも公式
docs.docker.jp
Dockerコマンド一覧の参考サイト
公式!
docs.docker.jp
Docker Network(コンテナ間通信)の参考サイト
久しぶりにdocker-compose.yml書くと忘れてしまうのがnetwork。
networkに所属していればコンテナ名だけで通信可能。
Dockerの仕組み
仮想化を知るには、仮想化ではないとは何かを知るべきだ【Dockerコンテナ・グレートジャーニー①】 #container - Qiita
Dev Container参考サイト
メチャクチャ便利だが、まだ紹介記事が少ない。
DockerとVsCodeをインストールすれば、あとはyml・Dockerfile・devcontainer.jsonだけで環境構築できてしまう。流行ってほしい!
サーバは遠隔操作できるPC
Dockerではないんだけど、この本を読んでサーバに対するイメージが変わったのでメモ。
何となくサーバには苦手意識というか、得体のしれないものという感覚があった。
でも、家で使っているPCと大して変わらないのだ。
PCに入っているOS(LinuxOS)が違うのと、サーバ用のソフト(ApatcheやNginx)がインスコされているってだけなのよね。
ほんでサーバに置いてあるファイルにインターネット経由でアクセスできる。
大体のサーバソフトはhtdocsディレクトリというのが公開用ディレクトリ。
ここにHTMLやCSSなどを置く。
Dockerのコンテナも大雑把に言えば1つのPCとみなせる。
なのでコンテナにApatcheを入れればWebサーバに、DBを入れればDBサーバに、Ubuntuを入れればGUI操作できる普通のPCみたいに扱えるのかな?
動作環境
LinuxOSの上でしか動かせない。
なぜならコンテナの中にLinuxOSぽいものがあり、コンテナ外のLinuxOSのカーネルとやり取りするから。
コンテナ内もLinuxOS対応ソフトしか使えない。
つまりLinuxマシンの中に、さらに隔離されたLinux環境を作る。
今回はWindows11のWSL2を使用。
カーネルとは
カーネルとはLinuxOSの核の部分。
周辺部分がディストリビューション。UbuntuやRedHat、CentOsなど。
ディストリビューション(Red Hat系とDebian系)
・RedHat系
Red Hat Enterprise Linux
CentOS
Fedora
イメージとは
CD/DVD等のインストールファイルみたいなもの。
イメージからコンテナが作られる。
Docker Hubとは
イメージの配布サイト。
OSっぽいもの + Apatche + MySQLみたいなよくある開発環境が色々配布されている。
Dockerfileでイメージ作成
Dockerfileはイメージ作成用のコマンドが記述されたファイルのこと。
dockerfileコマンドというのが用意されている。
Dockerfileのファイル名は拡張子なしで「Dockerfile」
・Dockerfileの記述例
FROM イメージ名
COPY コピー元 コピー先
下記は、Apatcheのイメージ利用する。
index.htmlをコンテナ内の/usr/local/apatche2/htdocs/にコピーする↓
FROM httpd COPY index.html /usr/local/apatche2/htdocs/
・Dockerfileからイメージをビルド
docker build -t コンテナ名 Dockerfileのパス
コンテナのライフサイクル
下記の一連の流れがライフサイクル。
コンテナを 作る→起動する→停止する→破棄する→作る→
コンテナ内のソフトをアップデートすることはせず、コンテナ破棄して新しいのを作り直すのが一般的らしい。
バンバン作っては破棄を繰り返すものだそうで。
マウント(ホストとコンテナ接続)
コンテナ外部、つまりホストマシンの保存領域とコンテナを接続することをマウントと言う。
マウントしておけばコンテナ内のデータをホストに保存できる。
開発だとソースファイルなどは全てマウントして外部に保存しておく。
コンテナを破棄してもマウントしたデータは無事。
マウント対象の保存領域のことをボリュームという。
マウントはDocker用語ではなくて、取り付けるという意味で、USBメモリを接続することもマウント。
ボリュームマウント・バインドマウント
ボリュームマウントはDocker Engineが管理している領域内にボリュームを作成して保存する。
手軽に扱えるが、直接操作しづらい。
バインドマウントはホストマシンのディレクトリやファイルに保存する。
普通のファイルと同じように扱えるので、頻繁に編集したいファイルはここに置く。
docker volume create ボリューム名(ボリュームマウント) docker run (省略) -v ホストの記憶領域パス:コンテナの記憶領域パス(バインドマウント)
dockerコマンドの文法
peguinという名前のコンテナを起動。
docker 上位コマンド 副コマンド 対象名 docker container run penguin
※containerを省略して「run penguin」でもOK
・container:上位コマンド(12種類)
対象の種類
・run:副コマンド
動詞
・penguin:対象(名前)
目的語
オプションと引数
penguinというコンテナをバックグラウンドで(オプション)モード1(引数)で起動。
docker container run -d peguin --mode=1
・-d:オプション
オプションはコマンドに対して、細かい設定をするもの。
オプションはまとめて書ける。
-d -i -tをまとめて-dit。
・mode=1:引数
対象に持たせたい値を書く。
文字コードの指定やポート番号指定など。
docker run
docker runは以下3つをまとめて実行してくれる。
docker image pull
docker container create
docer container start
デーモンとは
UNIXやLinuxで動くプログラムで、常に裏で動き続けるもののこと。
メーラーデーモンとか。
コンテナと通信する
デフォルトではコンテナは外部との通信ができない。
そのため、外部通信可能なコンテナを作成する。
apa000ex2という名前のApatche入りコンテナを、ポート番号8080(ホスト)から80(コンテナ内のApatche)へ接続できるようにして作成。
docker run --name apa000ex2 -d -p 8080:80 httpd
・httpd:Apatcheのイメージ
どんな感じで通信するのか
container内のApatcheはポート80で通信を待機している。
しかし、未設定だとコンテナは通信を受け付けない。
そのため、ホストマシン(ポート番号は8080でなくても良い)からポート80番で通信しますよと設定する。
container同士の仮想ネットワーク
異なるcontainerを接続する仮想ネットワークを作る。
docker network create ネットワーク名
↓作ったネットワークに接続するコンテナを作成する
docker run --name test_container --net ネットワーク名
ファイルコピー(コンテナ⇔ホスト)
docker cp ホスト側パス コンテナ名:コンテナ側パス(ホストからコンテナ) docker cp コンテナ名:コンテナ側パス ホスト側パス(コンテナからホスト)
コンテナ内でbashを使う(コンテナ内部に入る)
docker execでbash使用モードに入る。
exitでbash使用モードを終了する。
docker exec -it コンテナ名 /bin/bash echo "Hello World!" exit
Docker compose(一括命令)
構築に関わるコマンド文を定義ファイルに書き込んで、一括実行する。
拡張子はyaml yml
ファイル名は「docker-compose.yml」
Docker composeは1つのフォルダに1つしか置かない。複数置きたいときはフォルダ分ける。
YAML Ain't Markup Language。YAMLはマークアップ言語ではないの略らしい。
Dockerfileはイメージを作るもの。Docker composeは命令の集合。
docker-comose.ymlの記述例
version: "3" services: mysql000ex11: image: mysql:5.7 networks: - wordpress000net1 volumes: - mysql000vol11:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: myrootpass MYSQL_DATABASE: wordpress000db MYSQL_USER: wordpress000kun MYSQL_PASSWORD: wkunpass wordpress000ex12: depends_on: - mysql000ex11 image: wordpress networks: - wordpress000net1 volumes: - wordpress000vol12:/var/www/html ports: - 8085:80 restart: always environment: WORDPRESS_DB_HOST: mysql000ex11 WORDPRESS_DB_NAME: wordpress000db WORDPRESS_DB_USER: wordpress000kun WORDPRESS_DB_PASSWORD: wkunpass networks: wordpress000net1: volumes: mysql000vol11: wordpress000vol12:
Docker Composeのコマンド
docker compose -f yamlファイルのパス up -d (コンテナ作成&起動) docker compose -f yamlファイルのパス down (コンテナ破棄。ボリュームとイメージは残る)