Docker開発のイメージが掴めない
解決済
回答 3
投稿
- 評価
- クリップ 6
- VIEW 1,860
すみません。
Docker初学者です。
Dockerfileでイメージを生成し、docker-compose.ymlファイルに記述して、その2つのファイルをチームの人に共有させることで、チームの環境開発ができるという認識で大丈夫でしょうか?
また、Dockerfileはわかってきたのですが、docker-compose.ymlにはイメージやコンテナ名以外に何を記述するものなのかがわかりません。コンテナを連携させるということを聞いたのですが、掴めません。
どうぞよろしくお願いします。
ちなみに今はLaravel5.6、php7.2,mysql5.7系の環境を作ろうと思っています。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+3
開発イメージ
結論から書きますが、ざっくり以下のように共有して開発を進めることが多いです。
- Dockerfileでイメージ作成
- DockerイメージをDockerレジストリ(Docker Hub等)にプッシュ
- プロジェクトにdocker-compose.ymlを含め、Gitリポジトリ(Github等)にプッシュ
- Dockerfileとdocker-composeを含んだプロジェクトをGitリポジトリからプル
- docker-composeを実行(ここで2でプッシュしたイメージが自動的にプルされます)
※1,2に関しては、Dockerの基礎知識が必須な上、学習コストも低くはないので、
kawaxさんの言うようにlaradockのようなオープンソースを利用する人も多いと思います。
回答
Dockerfileでイメージを生成し、docker-compose.ymlファイルに記述して、その2つのファイルをチームの人に共有させることで、チームの環境開発ができるという認識で大丈夫でしょうか?
上記の通り、認識は合っているように思います。
Dockerfileはわかってきたのですが、docker-compose.ymlにはイメージやコンテナ名以外に何を記述するものなのかがわかりません。
前提として別にDocker Composeを使わなくても開発できます
。
それなのに、なぜDocker Composeを使って開発するかというと作業を効率化するため
です。(みんな使ってるから使ってるという人も多いと思いますが。。。)
イメージやコンテナ名以外にdocker-compose.ymlに何を記述するかというと、基本的にはdocker実行コマンドと同等の内容
です。
だからDocker Composeを使わなくても開発できるのです。
例えば、docker-composeのportsはdocker runコマンドの-pオプションに該当します。
上記は数多くのオプションの中の一例ですが、このようなオプションをdocker実行の度にコマンドで実行するのは面倒だと思いませんか?
しかも自分だけでなくみんなに実行方法を共有するとなるとなおさら面倒ですよね。
そこでDocker Composeが登場するわけです。
可読性の高いyml形式で、あらかじめ実行時のオプションを定義し、それをメンバーと共有することで、開発作業の効率化が図れるわけです。
上記の他にもdocker-composeには多くの機能がありますが、ここでは質問に対する回答にとどめさせていただきます。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+3
また、Dockerfileはわかってきたのですが、docker-compose.ymlにはイメージやコンテナ名以外に何を記述するものなのかがわかりません。コンテナを連携させるということを聞いたのですが、掴めません。
一言で言ってしまえばdocker-compose.ymlはdocker run
のパラメータを記述するファイルです。
(他にも様々な恩恵はありますが、docker run
を別ファイルに逃がす役割が最も大きいでしょう)
質問文にMySQLとありますのでMySQLサーバを見ていきましょう。
MySQL - Docker Hubに要件が色々と書いてあります。
これを元にdocker run
コマンドを作りましょう…最初からDBや各種テーブルは作成しておいたほうが良いですよね。
できました。大体こんな感じのコマンドを毎回打ち込んでください。
docker run --name mysql -v /my/custom:/etc/mysql/conf.d -v /my/sqlfiles:/docker-entrypoint-initdb.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=testdb -d mysql
……って長っ!!こんな呪文覚えきれないですよ。
続いてWebサーバのコンテナです。
コンテナ(仮想マシン)が切り離されてしまっているので、vagrantみたいにlocalhost:3306で繋ぎに行けません。
そこでDockerではdocker run
と同時にネットワークに所属して、nameで指定したコンテナにアクセスに繋ぐ事が可能です。
基本的にDocker流儀に従う場合はDBへの接続情報等は環境変数で管理するのが良いとされているので、これまた長い呪文を使って立ち上げる事になります。
ま、まぁ、一回っきりなら許せますね。
1ヶ月経過し、開発が中盤に差し掛かった所で同僚がこう話しかけてきました。
「MySQLのカラム更新したからよ。定義ファイル修正したから適用しておいてくれ」
まじかよ…折角立ち上げたMySQLのコンテナを削除して立ち上げ直しです。
1ヶ月前に打ち込んだMySQLコンテナを起動するdocker run
のコマンド、覚えていますか?
まぁ、覚えていませんよね。
じゃあシェルスクリプトにMySQLのdocker run
コマンドをベタッとコピペして…
それもいい選択肢ですが少し待って下さい。
こんな時の為に用意されているのがdocker-composeです。
さっきのdocker run
コマンドを元に、こんな感じでdocker-compose.ymlを作っておきましょう。
何となくdocker run
で出てきたオプションが盛り込まれてる事が分かります。
version: "3"
services:
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: my-secret-pw
MYSQL_DATABASE: testdb
volumes:
- ./custom:/etc/mysql/conf.d
- ./sqlfiles:/docker-entrypoint-initdb.d
ports:
- 3306:3306
expose:
- 3306
networks:
- back
web:
image: debian
# 貴方のWebサーバの情報
depends_on:
- mysql
networks:
- back
networks:
back:
使う時はdocker-composeコマンドを利用します。
# コマンドの確認
$ docker-compose
Define and run multi-container applications with Docker.
# 定義ファイルで記述したコンテナの一覧のみ表示される
$ docker-compose ps
# 定義ファイルの順番にコンテナを順次立ち上げ、-dなのでバックグラウンド扱いにする
$ docker-compose up -d
# mysqlのログを参照、-fはtailと同義(Ctrl+cで抜ける)
$ docker-compose logs -f mysql
# あ、ちょっとコンテナの中に入りたい
$ docker-compose exec mysql bash
# 終わったら停止
$ docker-compose stop
Stopping web_1 ... done
Stopping mysql_1 ... done
$ docker-compose rm -f
Removing web_1 ... done
Removing mysql_1 ... done
毎回この長ったらしいコマンド名を入力するのは疲れると思いますのでaliasでも作っておくと捗るかもしれませんね。
docker-composeの旧名はfigらしいので、aliasを作るならfigがオススメです。
コマンドの豊富さを見れば何となく分かるかと思いますが、
起動パラメータや依存コンテナが分かるということは、コンテナの立ち上げ順番を保証してくれたり、
一緒に起動や停止処理までしっかり面倒見てくれるので、様々な恩恵を受ける事ができます。
(シェルスクリプトにベタッとrunコマンドを貼り付けるだけとは大違いですね)
同僚が環境の事を質問してきたとしても、
「docker-compose.ymlを見れば全部書いてあるよ、そこから追ってみたら?」の一言で終わります。
こんな風にDockerfileと併用することでサーバの要件としても使えますので、とても便利です。是非覚えましょう。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
-1
そもそもLaravelならHomesteadでいいのでは。
公式が用意してる完璧な開発環境があるのにわざわざ自分で作る理由がない。
Docker使うとしてもlaradockのようなものを使う。
https://github.com/laradock/laradock
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 89.97%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2018/05/08 21:47
欲しかった質問に適切に答えていただき、Dockerにおけるチーム開発のイメージができました。
また自分の考えも整理できました。
docker実行コマンドと考え、docker-composeにも取り組んでいきたいと思います。