Docker初心者が開発ベースで理解するDockerfile

2020-09-01
岡野 洋平
#
Dockerfile
#
#

岡野です。

Dockerを触ったことがないエンジニアに

「Dockerってなに?」

と聞かれた時に、

こんな感じで開発ベースで伝えたらわかりやすいのではないか!

というのをまとめてみました。

この記事では開発ベースでDockerfileについての概要について説明します。

docker-compose.ymlについて詳細なDockerfileの書き方については、別記事で書けたらいいなと思います。

耳にするDockerの噂

初めてDockerを勉強しようとした時、有識者やWebから得るDockerの概要は、ほぼ以下のものではないでしょうか。

  • コンテナだよ。
  • ファイルベースで環境つくれるんだよ。
  • 便利なんだよ。

ふむふむ。なるほど。と理解したはずでも、いざ実案件で開発になったとき上記の知識だけでは、なかなか辛いものがあると思います。

今回はDockerを触ったことがないエンジニアさん向けに、開発ベースでDockerfileを説明してみたいと思います。

よくあるDockerを利用するプロジェクトファイル群

├── Gemfile
├── Gemfile.lock
├── Guardfile
├── README.md
├── README.rdoc
├── Rakefile
├── app
├── bin
├── config
├── db
├── doc
├── Dockerfile
├── docker-compose.yml
├── gems
├── lib
├── log
├── public
├── script
├── spec
├── tmp
└── vendor

上記はRailsプロジェクト構成の第一階層までを記載しています。

「今回の案件ではDocker使ってるから」

と言われ、git checkout してみたらこんな感じではないでしょうか。

いますね。Dockerfileが。

こいつは一体、何者なのでしょうか。

Dockerfileとはなんなのか

まずはDockerfileについてです。

Dockerfileで出来る事を、あえて公式から引用せず、自分が知っていることだけ書いてみたいと思います。

  • OSが起動できる。
  • 起動したOSでコマンドを実行できる。
  • 起動したOSとファイルのやりとりが出来る。

出来る事しては、VirtualBoxvagrantと似ているのではないでしょうか。

ただ、劇的に違うポイントはVirtualBoxvagrantのイメージファイルよりも遥かに軽量というところです。

VirtualBoxやvagrantと異なり、設定しないとDBとかの情報は保持できませんが、テキスト形式のファイルということで、プロジェクト構成に含めてgit管理する事が容易です。

それでは少しだけDockerfileの中身を見てみましょう。

1 FROM mysql:8.0.15

2 ENV TZ=Asia/Tokyo \
    MYSQL_ROOT_PASSWORD=password

3 COPY ./docker/mysql/my.cnf /etc/mysql/conf.d/my.cnf

4 WORKDIR /docker-entrypoint-initdb.d

5 COPY ./sql/*.sql /.

※ 通常のDockerfileは行の先頭に番号はありません。

  1. 使用するDocker Imageファイルを指定しています。ここではmysqlのイメージを指定しています。このmysqlはどこからきたのかというと、Docker Hub というDocker Imageが登録された外部リポジトリからDLされてきます。使用したいソフトウェアのDocker Imageを探してFROMに指定することができます。ちろん、自分でつくったDocker Imageを指定することもできます。
  2. 環境変数を設定しています。MySQLのDocker Imageを使用していますが、中身はLinuxベースのOSであるalpine上にインストールされたMySQLです。MySQLの動作に必要な環境変数を設定しています。
  3. MySQLの設定ファイルをローカルからコピーしています。デフォルトの設定ではなくカスタマイズした設定が必要な場合、ローカルにカスタマイズした設定ファイルを準備し、Docker Imageにコピーします。
  4. Docker Image上のカレントディレクトリを変更します。個人的に、忘れがちではあるが大切な命令と思っています。
  5. ローカルから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を生成
$ docker build ./ -t mysql
  • mysqlというタグのDocker Imageからdev-mysqlという名前のDockerContainer生成&実行する。
$ docker run --name dev-mysql mysql

これでMySQLのDockerが実行されました。

Railsプロジェクトの接続先DBがで起動されたDockerのMySQLを指定していれば、Docker起動Railse起動 とするだけで、自分だけのDB環境をもった十分な開発環境が準備できます。

最後に

Dockerfileは開発ベースでを使用することはありますが、リリース/運用で使用することは今の所ないです。

リリース/運用ではDockerを利用したkubernetesを使用することが殆どです。そのうち記事にしたいと思います。

岡野です。

Dockerを触ったことがないエンジニアに

「Dockerってなに?」

と聞かれた時に、

こんな感じで開発ベースで伝えたらわかりやすいのではないか!

というのをまとめてみました。

この記事では開発ベースでDockerfileについての概要について説明します。

docker-compose.ymlについて詳細なDockerfileの書き方については、別記事で書けたらいいなと思います。

耳にするDockerの噂

初めてDockerを勉強しようとした時、有識者やWebから得るDockerの概要は、ほぼ以下のものではないでしょうか。

  • コンテナだよ。
  • ファイルベースで環境つくれるんだよ。
  • 便利なんだよ。

ふむふむ。なるほど。と理解したはずでも、いざ実案件で開発になったとき上記の知識だけでは、なかなか辛いものがあると思います。

今回はDockerを触ったことがないエンジニアさん向けに、開発ベースでDockerfileを説明してみたいと思います。

よくあるDockerを利用するプロジェクトファイル群

├── Gemfile
├── Gemfile.lock
├── Guardfile
├── README.md
├── README.rdoc
├── Rakefile
├── app
├── bin
├── config
├── db
├── doc
├── Dockerfile
├── docker-compose.yml
├── gems
├── lib
├── log
├── public
├── script
├── spec
├── tmp
└── vendor

上記はRailsプロジェクト構成の第一階層までを記載しています。

「今回の案件ではDocker使ってるから」

と言われ、git checkout してみたらこんな感じではないでしょうか。

いますね。Dockerfileが。

こいつは一体、何者なのでしょうか。

Dockerfileとはなんなのか

まずはDockerfileについてです。

Dockerfileで出来る事を、あえて公式から引用せず、自分が知っていることだけ書いてみたいと思います。

  • OSが起動できる。
  • 起動したOSでコマンドを実行できる。
  • 起動したOSとファイルのやりとりが出来る。

出来る事しては、VirtualBoxvagrantと似ているのではないでしょうか。

ただ、劇的に違うポイントはVirtualBoxvagrantのイメージファイルよりも遥かに軽量というところです。

VirtualBoxやvagrantと異なり、設定しないとDBとかの情報は保持できませんが、テキスト形式のファイルということで、プロジェクト構成に含めてgit管理する事が容易です。

それでは少しだけDockerfileの中身を見てみましょう。

1 FROM mysql:8.0.15

2 ENV TZ=Asia/Tokyo \
    MYSQL_ROOT_PASSWORD=password

3 COPY ./docker/mysql/my.cnf /etc/mysql/conf.d/my.cnf

4 WORKDIR /docker-entrypoint-initdb.d

5 COPY ./sql/*.sql /.

※ 通常のDockerfileは行の先頭に番号はありません。

  1. 使用するDocker Imageファイルを指定しています。ここではmysqlのイメージを指定しています。このmysqlはどこからきたのかというと、Docker Hub というDocker Imageが登録された外部リポジトリからDLされてきます。使用したいソフトウェアのDocker Imageを探してFROMに指定することができます。ちろん、自分でつくったDocker Imageを指定することもできます。
  2. 環境変数を設定しています。MySQLのDocker Imageを使用していますが、中身はLinuxベースのOSであるalpine上にインストールされたMySQLです。MySQLの動作に必要な環境変数を設定しています。
  3. MySQLの設定ファイルをローカルからコピーしています。デフォルトの設定ではなくカスタマイズした設定が必要な場合、ローカルにカスタマイズした設定ファイルを準備し、Docker Imageにコピーします。
  4. Docker Image上のカレントディレクトリを変更します。個人的に、忘れがちではあるが大切な命令と思っています。
  5. ローカルから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を生成
$ docker build ./ -t mysql
  • mysqlというタグのDocker Imageからdev-mysqlという名前のDockerContainer生成&実行する。
$ docker run --name dev-mysql mysql

これでMySQLのDockerが実行されました。

Railsプロジェクトの接続先DBがで起動されたDockerのMySQLを指定していれば、Docker起動Railse起動 とするだけで、自分だけのDB環境をもった十分な開発環境が準備できます。

最後に

Dockerfileは開発ベースでを使用することはありますが、リリース/運用で使用することは今の所ないです。

リリース/運用ではDockerを利用したkubernetesを使用することが殆どです。そのうち記事にしたいと思います。

株式会社グランドリームでは、AWSを駆使した開発からUI/UXデザインまで、Webアプリケーションに関するすべての要望に応えます。
まずは一度お気軽にご相談ください。

お問い合わせはこちら