質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

3回答

5930閲覧

Docker開発のイメージが掴めない

sawadeeeen

総合スコア14

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

1グッド

8クリップ

投稿2018/05/08 09:47

すみません。
Docker初学者です。

Dockerfileでイメージを生成し、docker-compose.ymlファイルに記述して、その2つのファイルをチームの人に共有させることで、チームの環境開発ができるという認識で大丈夫でしょうか?

また、Dockerfileはわかってきたのですが、docker-compose.ymlにはイメージやコンテナ名以外に何を記述するものなのかがわかりません。コンテナを連携させるということを聞いたのですが、掴めません。

どうぞよろしくお願いします。

ちなみに今はLaravel5.6、php7.2,mysql5.7系の環境を作ろうと思っています。

xenbeat👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

開発イメージ

結論から書きますが、ざっくり以下のように共有して開発を進めることが多いです。
0. Dockerfileでイメージ作成
0. DockerイメージをDockerレジストリ(Docker Hub等)にプッシュ
0. プロジェクトにdocker-compose.ymlを含め、Gitリポジトリ(Github等)にプッシュ
0. Dockerfileとdocker-composeを含んだプロジェクトをGitリポジトリからプル
0. 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のportsdocker runコマンドの-pオプションに該当します。
上記は数多くのオプションの中の一例ですが、このようなオプションをdocker実行の度にコマンドで実行するのは面倒だと思いませんか?
しかも自分だけでなくみんなに実行方法を共有するとなるとなおさら面倒ですよね。

そこでDocker Composeが登場するわけです。
可読性の高いyml形式で、あらかじめ実行時のオプションを定義し、それをメンバーと共有することで、開発作業の効率化が図れるわけです。

上記の他にもdocker-composeには多くの機能がありますが、ここでは質問に対する回答にとどめさせていただきます。

投稿2018/05/08 11:00

xenbeat

総合スコア4258

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sawadeeeen

2018/05/08 12:47

回答ありがとうございます。 欲しかった質問に適切に答えていただき、Dockerにおけるチーム開発のイメージができました。 また自分の考えも整理できました。 docker実行コマンドと考え、docker-composeにも取り組んでいきたいと思います。
guest

0

また、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で出てきたオプションが盛り込まれてる事が分かります。

YAML

1version: "3" 2services: 3 mysql: 4 image: mysql 5 environment: 6 MYSQL_ROOT_PASSWORD: my-secret-pw 7 MYSQL_DATABASE: testdb 8 volumes: 9 - ./custom:/etc/mysql/conf.d 10 - ./sqlfiles:/docker-entrypoint-initdb.d 11 ports: 12 - 3306:3306 13 expose: 14 - 3306 15 networks: 16 - back 17 web: 18 image: debian 19 # 貴方のWebサーバの情報 20 depends_on: 21 - mysql 22 networks: 23 - back 24networks: 25 back:

使う時はdocker-composeコマンドを利用します。

Bash

1# コマンドの確認 2$ docker-compose 3Define and run multi-container applications with Docker. 4 5# 定義ファイルで記述したコンテナの一覧のみ表示される 6$ docker-compose ps 7 8# 定義ファイルの順番にコンテナを順次立ち上げ、-dなのでバックグラウンド扱いにする 9$ docker-compose up -d 10 11# mysqlのログを参照、-fはtailと同義(Ctrl+cで抜ける) 12$ docker-compose logs -f mysql 13 14# あ、ちょっとコンテナの中に入りたい 15$ docker-compose exec mysql bash 16 17# 終わったら停止 18$ docker-compose stop 19Stopping web_1 ... done 20Stopping mysql_1 ... done 21 22$ docker-compose rm -f 23Removing web_1 ... done 24Removing mysql_1 ... done

毎回この長ったらしいコマンド名を入力するのは疲れると思いますのでaliasでも作っておくと捗るかもしれませんね。
docker-composeの旧名はfigらしいので、aliasを作るならfigがオススメです。

コマンドの豊富さを見れば何となく分かるかと思いますが、
起動パラメータや依存コンテナが分かるということは、コンテナの立ち上げ順番を保証してくれたり、
一緒に起動や停止処理までしっかり面倒見てくれるので、様々な恩恵を受ける事ができます。
(シェルスクリプトにベタッとrunコマンドを貼り付けるだけとは大違いですね)

同僚が環境の事を質問してきたとしても、
「docker-compose.ymlを見れば全部書いてあるよ、そこから追ってみたら?」の一言で終わります。
こんな風にDockerfileと併用することでサーバの要件としても使えますので、とても便利です。是非覚えましょう。

投稿2018/05/08 11:10

編集2018/05/08 16:09
miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sawadeeeen

2018/05/08 12:51

とてもとてもわかりやすい解説ありがとうございます。 maverixzさんの回答とプラスしてとても理解できました。 また経験談や実際のコードも交えてくれたおかげで、docker-composeの重要性がわかりました。 頑張っていきたいと思います。
guest

0

そもそもLaravelならHomesteadでいいのでは。
公式が用意してる完璧な開発環境があるのにわざわざ自分で作る理由がない。

Docker使うとしてもlaradockのようなものを使う。
https://github.com/laradock/laradock

投稿2018/05/08 10:03

kawax

総合スコア10377

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sawadeeeen

2018/05/08 12:40

ありがとうございます。 Dockerの方が学んだ後で応用が効くと思い、今回はDockerを選ばせてもらいました。 Laradockの方も検討して見たいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問