【備忘録】Dockerの基本的な使い方とDockerfileの記載方法

# 挨拶
初めましての方は初めまして、けこです。
最近仕事も落ち着いて業後に色々勉強をしているのですが、わかっているつもりだったDockerの使い方やミスしてたなーということがあったので勉強記録及び備忘録としてまとめさせていただきます。

※本当に基本的な内容です。Dockerのインストールなんかは他の方の記事を見てね。

# Dockerについて
今やエンジニアなら知らない人を探す方が珍しいくらい有名なソフトウェアですね。

4年前なら何それ美味しいの？と言えましたが、人気が広がり今やAWSやGCPなどのクラウドプラットフォームもコンテナイメージを用いたデプロイをサポートしたサービスを展開している人気ソフトウェアです。

私はAWSにしか明るくないので詳しくは語れませんが、AWSだけでも
- AWS ECS
- AWS EKR
- AWS ECR

といったコンテナ管理サービスやそれらと連携する

- AWS AppRunner
- AWS Lightsail
- AWS App2Container

等のサービスを展開しており、もちろんAWS Lambda等の主力サービスでも利用可能なためますます価値が高まっていると言えます。
残念ながら企業利用は有料となってしまい個人での開発か少人数での開発でしか無料で利用することはできなくなり、lima等の代替ツールへの移行を進める動きもありますが、以前人気のあるツールです。

参考
https://aws.amazon.com/jp/containers/?nc1=f_cc

## もうちょっと詳しく
Dockerといえば
- Dockerfileとbuildコマンドによるコンテナイメージのビルド
- runコマンドによるコンテナイメージの実行
- execコマンドによる実行中のコンテナへのアタッチ
- commitコマンドによる新規イメージの作成

単体で使う場合はこのあたりが主な利用方法であとはDockerfileを共有して他人と同じ環境を作ったり、コンテナイメージをtarで固めて配布したりといった用途で利用します。

本記事ではこれらの基本的な利用方法についての記事となります。

### Dockerfileとコンテナイメージの関係性
Dockerfileはコンテナイメージを作るための設定を記載したファイルです。
ベースイメージとしてDocker Hubに登録されているイメージから任意のイメージを1つ選びRUNコマンドによるビルド時コマンドとCMDコマンドによるイメージ起動時コマンドを記載することでカスタマイズされたコンテナイメージを作成するために使います。
![qiita-dockerfile.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123137/cb73ea32-298a-a5a8-ac9f-0e74c8b7f6be.png)
Rails環境を作る場合はこんな感じ、rubyのベースイメージにyarnやnodeを足してrailsサーバが動作する環境を作るという流れ。
MySQLを足せばデータベースが利用できるサーバができるしgitを入れればバージョン管理もできます。まさに拡張性の鬼です。

#### Dockerfileの記述方法について
Dockerfileはもちろん記述方法が決まっており、さまざまな記述ができますがベストプラクティスをまとめたページが公式から出ています。
https://docs.docker.jp/develop/develop-images/dockerfile_best-practices.html

最初の方はこのページとRUNコマンドとCMDコマンドの使い方辺りを参考に進めていきましょう。
```Rails環境を作る場合のサンプルDockerfile
FROM ruby:latest

# Node
RUN curl -sL https://deb.nodesource.com/setup_16.x | bash -
RUN apt-get install -y nodejs

# Yarn
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt update && apt install -y yarn

# Rails
RUN gem install rails
```
Rails環境を作るだけならこのようなDockerfileで実現可能です。
```Dockerコマンド
docker build -t my-rails-image .
docker run -it --rm my-rails-image rails new my-project
```
操作に必要なコマンドはこんな感じ。ビルドでコンテナイメージを作ってrunで実行、簡単ですね。（RUNとrunがごっちゃになるのは少し嫌）
このサンプルDockerfileは見た目重視なのでベストプラクティスに則った方法ではありませんが、可読性と効率の天秤は開発者に委ねられています。

### Dockerイメージの配布方法とメリットデメリット
Dockerイメージには複数の公開方法があります。代表的な方法は以下、
1. Dockerfileを共有
2. コンテナイメージをsaveコマンドで保存しtarアーカイブする
3. DockerHubに公開する

これら3つの方法が主流な方法のようです、これらの配布方法にはメリットとデメリットがあるので目的に応じて使い分けましょう。

#### Dockerfileを共有する方法
この方法ではGitHubなどを使ってDockerfileを共有してイメージを間接的に配布します。
メリットはファイルが軽いこと、コード管理ができること。
デメリットはパッケージの更新に合わせてメンテナンスが必要になる場合があることです。

メリットはシンプルなので説明なし、デメリットの方はたとえばパッケージを配布するリポジトリが変更されリンクが切れてしまった場合に存在しないパッケージを取得しようとしてエラーを吐いてしまうことがあります。
この方法は短期間のコンテナイメージを利用する際に最適です。

#### コンテナイメージをsaveコマンドで保存しtarアーカイブする
この方法ではビルド済みのコンテナイメージをsaveコマンドでファイルに固めてしまい、tarアーカイブで圧縮するという方法です。
メリットはリンク切れの心配をしなくて良いこと（ほぼ確実に動くイメージが作れる）。
デメリットは比較的ファイルサイズが大きいこと、コード管理ができないことです。
この方法は先ほどとは反対に、長期間コンテナイメージを利用する際に最適です。

#### DockerHubに公開する
2番とあまり変わりませんね、こちらは。Docker公式のイメージを保存再配布可能なリポジトリがアカウントに紐づけられているので個人利用なら使ってみても良いのではないでしょうか。

### 結論
以上の3つの方法を開発メンバーの理解度やプロジェクトの目的に応じて使い分けていくのが良い方法とされているようです。
NAS等でコンテナイメージを管理しつつ、構成を変えた場合はDockerfileを編集してコード管理サービスにデプロイしてバックアップとして取っておくというのも良いと思います。

今回はこの辺で終了です。また気力が湧いたら勉強内容を書いていこうと思うので気に入ったらまたみてください！それでは！