岡野です。
Dockerを触ったことがないエンジニアに
「Dockerってなに?」
と聞かれた時に、
こんな感じで開発ベースで伝えたらわかりやすいのではないか!
というのをまとめてみました。
この記事では開発ベースでDockerfileについての概要について説明します。
docker-compose.ymlについて、詳細なDockerfileの書き方については、別記事で書けたらいいなと思います。
耳にするDockerの噂
初めてDockerを勉強しようとした時、有識者やWebから得るDockerの概要は、ほぼ以下のものではないでしょうか。
- コンテナだよ。
- ファイルベースで環境つくれるんだよ。
- 便利なんだよ。
ふむふむ。なるほど。と理解したはずでも、いざ実案件で開発になったとき上記の知識だけでは、なかなか辛いものがあると思います。
今回はDockerを触ったことがないエンジニアさん向けに、開発ベースでDockerfileを説明してみたいと思います。
よくあるDockerを利用するプロジェクトファイル群
上記はRailsプロジェクト構成の第一階層までを記載しています。
「今回の案件ではDocker使ってるから」
と言われ、git checkout してみたらこんな感じではないでしょうか。
いますね。Dockerfileが。
こいつは一体、何者なのでしょうか。
Dockerfileとはなんなのか
まずはDockerfileについてです。
Dockerfileで出来る事を、あえて公式から引用せず、自分が知っていることだけ書いてみたいと思います。
- OSが起動できる。
- 起動したOSでコマンドを実行できる。
- 起動したOSとファイルのやりとりが出来る。
出来る事しては、VirtualBox
やvagrant
と似ているのではないでしょうか。
ただ、劇的に違うポイントはVirtualBox
やvagrant
のイメージファイルよりも遥かに軽量というところです。
VirtualBoxやvagrantと異なり、設定しないとDBとかの情報は保持できませんが、テキスト形式のファイルということで、プロジェクト構成に含めてgit管理する事が容易です。
それでは少しだけDockerfileの中身を見てみましょう。
※ 通常のDockerfileは行の先頭に番号はありません。
- 使用するDocker Imageファイルを指定しています。ここではmysqlのイメージを指定しています。このmysqlはどこからきたのかというと、Docker Hub というDocker Imageが登録された外部リポジトリからDLされてきます。使用したいソフトウェアのDocker Imageを探してFROMに指定することができます。ちろん、自分でつくったDocker Imageを指定することもできます。
- 環境変数を設定しています。MySQLのDocker Imageを使用していますが、中身はLinuxベースのOSであるalpine上にインストールされたMySQLです。MySQLの動作に必要な環境変数を設定しています。
- MySQLの設定ファイルをローカルからコピーしています。デフォルトの設定ではなくカスタマイズした設定が必要な場合、ローカルにカスタマイズした設定ファイルを準備し、Docker Imageにコピーします。
- Docker Image上のカレントディレクトリを変更します。個人的に、忘れがちではあるが大切な命令と思っています。
- ローカルからSQLファイルをDocker Imageにコピーします。MySQLのDocker Imageの仕様として、docker-entrypoint-initdb.dにSQLファイルを配置すると、起動時に自動的に配置されたSQLファイルが実行されます。
Dockerfileが含まれるプロジェクトファイル群があるPCにDocker自体をインストールすれば、上記DockerfileからDocker Imageが生成でき、生成したDocker ImageからDockerContainerの生成/起動が可能です。以下のコマンドがDockerfile実行までのコマンドになります。
- DockerfileをもとにmysqlというタグのDocker Imageを生成
- mysqlというタグのDocker Imageからdev-mysqlという名前のDockerContainer生成&実行する。
これでMySQLのDockerが実行されました。
Railsプロジェクトの接続先DBがで起動されたDockerのMySQLを指定していれば、Docker起動
→ Railse起動
とするだけで、自分だけのDB環境をもった十分な開発環境が準備できます。
最後に
Dockerfileは開発ベースでを使用することはありますが、リリース/運用で使用することは今の所ないです。
リリース/運用ではDockerを利用したkubernetesを使用することが殆どです。そのうち記事にしたいと思います。