D o c k e r コ ン テ ナ の ラ イ フ サ イ ク ル プロセス commit build ローカル Docker Hub pull start rm commit run stop down 停止中コンテナ 起動中コンテナ コンテナ破棄 (compose up) ←ここの中身を 確認しました
は 怖 く な い 0 3 . D o c k e r f i l e の 読 み 方 実行環境に必要なものってなんだと思いますか? WebサーバーならApacheとかNginXとか… gitやVimもあった方が便利 PHPを動かしたいなら、PHPそのものと関連パッケージ 上記のパッケージを管理する、パッケージ管理システムも要りますね DBならDBMSが必要 『ホストPCとコンテナ内のファイルシステムは別』ということは、エディタで書いた ソースや設定ファイルをコンテナ内にコピーしてやる必要もあります
は 怖 く な い 実行環境に必要なものってなんだと思いますか? WebサーバーならApache gitやVimもあった方が便利 PHPを動かしたいなら、PHPそのものと関連ライブラリ ↑ このライブラリを管理する、パッケージ管理システムも要りますね DBならDBMSが必要 『ホストPCとコンテナ内のファイルシステムは別』ということは、エディタで書いた ソースや設定ファイルをコンテナ内にコピーしてやる必要もあります これらをいい感じにまとめて書いている 指示書です 0 3 . D o c k e r f i l e の 読 み 方
読 ん で み よ う 今回の研修に使用するPHPコンテナの例 FROM:ベースにするイメージの指定 一から全部必要なものを書き出すのは大変なので、 定番の環境はdocker hubに定番のイメージがあることが多いです (公式のイメージを積極的に利用しましょう) COPY:ホストからコンテナ内にファイルをコピー 左の例では、php.iniなどの設定ファイルをコピーしています RUN:指定したコマンドを実行する aptやyarmなどパッケージを取ってくるためのパッケージ管理ツールで 必要なライブラリに更新をかけたり、インストールすることが多いで す WORKDIR:ワークディレクトリ(カレントディレクトリ)を指定 他によく使うもの VOLUME:コンテナで作成したデータをホストのファイルシステムを マウントしてデータを置く (コンテナ内の変更がホストにも反映されるディレクトリを指定) 0 3 . D o c k e r f i l e の 読 み 方 --from=composerはマルチステージビルドです 公式のcomposerイメージから、composerを取ってきています 手元で/api/docker/php/Dockerfileを開きながら聞いてください
(eth0:veth1peer) (eth0:veth2peer) 仮想NIC Dockerホスト 経路2が使える ドメインの指定にコンテナ名が使える コンテナのIPアドレスは(固定化の設定を入れなければ)コンテナ起動するたびに変わります host.docker.internalは、コンテナ→ホストの指定であることを覚えておきましょう(dockerでちょっと古い資料を 漁っていると目にします) appからdbへの接続がうまくいかない…時はどういう経路をたどっているか確認しましょう コンテナ間通信をしたい時の通信の経路 経路1:コンテナ1→ホストマシン→コンテナ2 経路2:コンテナ1→コンテナ2 ブリッジネットワークがあると ポイント 0 4 . d o c k e r c o m p o s e
p o s e . y m l の 中 身 手元で/api/docker-compose.ymlを開きながら聞いてください 今回の研修に使用するAPI側のdocker-compose.ymlの例 services: 各コンテナの定義 build: dokcerイメージをビルドする際の設定 dokcerfile:dockerfileのパス image:でdocker hub上にあるイメージ名を指定することも可能 context: ビルド時に起点とするディレクトリ dockerfile内で相対パスでCOPY等書いているとき、これ記載しておくと書きやすいときがあります (デフォルトではDockerfileがあるディレクトリが起点になるので、構造が複雑な時は注意しましょう) volumes Dockerfileの所で説明したvolumeと同じです。ホスト、コンテナ間でファイル共有(コンテナが破棄されて も永続化)できるところを指定しています 書き方は、ホスト側パス:コンテナ側パス ports ポートの指定 environment 環境変数の設定 0 4 . d o c k e r c o m p o s e
stop docker ps -a docker compose down docker compose build (イメージが存在しない時、docker compose upしたときに自動でbuildが走ります) 単体コンテナの時 docker build (Dockerfileのあるパスやdockerhubのイメージ名) docker images ハ ン ズ オ ン : p a r t 3 基 本 操 作 0 4 . d o c k e r c o m p o s e
アドレスを持つ) none(ネットワーク接続無) 説明は長くなるので割愛しますが、気になる人は下記を読んでみてください https://qiita.com/TsutomuNakamura/items/ed046ee21caca4a2ffd9 0 4 . d o c k e r c o m p o s e
以下に今、対象のネットワークに繋がっているコンテナの一覧があります 同じネットワーク内にないと、ドメイン名をコンテナ名にしたコンテナ間通信ができないの で、注意しましょう 今回はフロントとAPIにdocker-compose.ymlが分かれています 片方のdocker-compose.ymlファイルからネットワークの記述をコメントアウトし、 docker-compose down→upでコンテナを作り直して、別のネットワークに置きましょう 例えば、フロント側のネットワークの記述を消したとき、APIコンテナ内でフロントのコンテ ナに向けて「curl」を叩いた時の結果はどう変わるでしょうか? ハンズオン:part3 ネットワーク 0 4 . d o c k e r c o m p o s e
mysql -hdb -uuser -p DB名 mysql -hapi_db_1 -uuser -p DB名 mysql -h{コンテナID} -uuser -p DB名 mysql -h{プライベートIPアドレス} -uuser -p DB名 ハンズオン:part3 ネットワーク 0 4 . d o c k e r c o m p o s e ※プライベートIPアドレスは、 docker network inspect {NETWORK ID or ネットワーク名} で確認しましょう
コンテナに入り、testというディレクトリが見えないのを確認しましょう docker-composeのvolumes:に一行足してみます - ./test/:/コンテナのルートディレクトリ/test/ docker compose down→ upでコンテナを作り直すと、 /testが見えるようになっているのを確認しましょう 0 4 . d o c k e r c o m p o s e
ポートの指定が個人で違う場合は、環境変数に切り出したり、docker-compose.override.ymlを利用し ましょう チームで共有しているファイル(dockerfileやdocker-compose.yml)に手を加えたいときは、レビュ ーを通しチーム全体で変えるようにしましょう 0 5 . D o c k e r の ベ ス ト プ ラ ク テ ィ ス