Docker入門
今回はDockerについて解説していきます。
今となってはDockerは必須のツールとなっているので、ぜひこの機会に身につけていきましょう。
Dockerとは
Dockerを使うことで、コンテナという実行環境を使えるようになります。
コンテナは、実行環境を他のプロセスから隔離し、その中でアプリケーションを動作させる技術です。
またコンテナを用いることで、異なるホストでも同じ構成の環境を簡単に構築することができます。
Dockerfileというファイルにコンテナの内容が記述されるので、どのような環境が作られるのかそのファイルを見れば明らかなのも利点です。
さらに、そのDockerfileをビルドするだけで環境構築が完了するので、かなり簡単に環境構築することができます。
つまり、Dockerとは環境構築を楽にしてくれるツールと言うわけです。
Dockerの3つの要素
Dockerには主に次の3つの要素があります。
- Dockerfile: イメージの構成を記述したテキストファイル
- イメージ: Dockerfileからビルドされるテンプレートファイル
- コンテナ: Dockerイメージから作成される独立した実行環境
つまり、DockerfileからDocker imageを作り、Docker imageからコンテナを作るというフローになります。
それぞれの要素について具体的に解説していきます。
Dockerfile
Dockerfileは、イメージの構成を記述したテキストファイルになります。
要は、このDockerfileがコンテナ環境の設計図となるわけです。
Dockerfileは次のような内容になります。
FROM ruby:2.7.6
COPY Gemfile .
RUN bundle install
このファイルを使うことで、Rubyを使用できるコンテナを作成するためのイメージを作ることができます。
それぞれのコマンドの意味は次の通りです。
コマンド | 意味 |
---|---|
FROM | ベースとなるイメージを記述 |
COPY | host上にあるファイルをコンテナ上にコピーする |
RUN | コマンドを実行する |
FROMでは、Docker hub上にあるイメージを記述するのが一般的です。
Docker hubには様々な言語やOSに対応したイメージがあるので、自分で作る必要がありません。
そして、この3つのコマンドごとにイメージレイヤーが作られます。
イメージレイヤーは少ないほどイメージが軽量になるので、本当は&&で繋いでRUNを1つにまとめる方が良いです。
ただ、レイヤーごとにキャッシュが保存されるので、最初にDockerfileを作る際は細かくRUNを分けた方がファイルの作成がスムーズになります。
また、もう1つCMDコマンドというものをも紹介します。
このコマンドでコンテナのデフォルトのコマンドを指定することができます。
原則 dockerfileの最後に記述し、1つしか書くことはできません。
似たようなコマンドで、ENTRY POINTというものもあります。
次の例を見てみてください。
FROM node:16-alpine
COPY . .
RUN yarn --frozen-lockfile && yarn build
ENTRYPOINT [ "yarn" ]
このコンテナの実行時にstartのコマンドを渡した場合は、yarn start
が実行されることになります。
逆にCOMMANDでデフォルトのコマンドを指定した場合、そのコマンドは置き換えが可能となります。
つまり、コンテナ実行時にnodeのコマンドを渡した場合、node
が実行されまさす。
逆に先ほどのファイルでnodeコマンドを渡しても、yarn node
が実行されてエラーになります。
また、WORKDIRでコマンドを実行するパスを選択でき、ENVで環境変数を設定することもできます。
イメージ
イメージを作成するには、docker hubからイメージをpullしてくるか、dockerfileをビルドして作るかになります。
そして、実務ではdockerfileを記述するのが一般的です。
docker build .
でdockerfileのあるパス名を指定すれば、ビルドが実行されます。
-tオプションでイメージに名前をつけることもできます。
docker build -t test-container .
そして、作られたイメージはdocker images
コマンドで一覧を見ることができます。
また、docker rmi
でイメージを削除することもできます。
コンテナ
コンテナはイメージから作ることができます。
docker run image名
でコンテナが作られます。
ちなみに、指定したイメージ名がローカルにない場合、docker hubからimageをpullしてきます。
また、docker runコマンドはコンテナの作成だけではなく、コマンドの実行もされます。
つまり、docker create(コンテナの作成)と、docker start(コンテナの実行)の両方が実行されています。
そして、docker psで起動中のコンテナの一覧を、docker ps -a で停止中のコンテナも合わせた一覧を見ることができます。
また、docker rmコマンドでコンテナを削除することができます。
docker run時のコマンド
docker run
コマンドは様々なオプションを指定することもできます。
- -it 綺麗な表示でインタラクティブな操作が可能になる
- -d でコンテナをバックグランドで動かせる
- -v ホストのファイルをコンテナ上にマウントできる
- -u ユーザー権限などを設定できる
- -p ホストのportからコンテナのportに繋ぐことができる
- --name コンテナに名前をつけることができる
- --env 環境変数の指定が可能
これらはよく使うオプションなので、覚えておきましょう。
ちなみに、dockerfileでも環境変数の指定ができたじゃんと思うかもですが、そちらで指定せずにコンテナの実行時に指定することで、コンテナに合わせた環境変数を指定することができます。
コンテナのライフサイクル
色々とコマンドが出てきてややこしく感じたと思うので、表にまとめると次の通りになります。
コマンド | 意味 |
---|---|
build | イメージを作成 |
create | コンテナを作成 |
start | コンテナを実行 |
run | create + start |
stop | コンテナの停止 |
restart | コンテナの再起動 |
また、docker system prune
で停止しているコンテナと使われていないイメージを全て削除することができます。
Docker compose
最後に、docker-composeについて解説します。
このツールを使うことで、run時のコマンドを毎回打たなくて良くなったり、複数のコンテナを統合させることができます。
次がファイルの例となります。
version: '3'
services:
frontend:
build:
context: .
ports:
- "3000:3000"
volumes:
- ./app:/app
environment:
- WATCHPACK_POLLING=true
command: sh -c "npm run dev"
versionでdocker-composeのバージョンを指定します。
servicesの下にそれぞれのアプリケーションを記述していきます。
例えば、frontend,backend,dbそれぞれのコンテナの設定をここで記述することができます。
buildはdockerfileを使うこともできますし、imagesをpullしてきて使うこともできます。
あとは、run時に指定していたオプションなどを記述すれば終わりです。
また、コンテナ全てでネットワークを共通化させることもできたり、ビルドの順番を指定できたりするので便利です。
コマンド
docker-composeのコマンドは次の通りです。
コマンド | 対応するdockerコマンド |
---|---|
build | build |
up | run |
ps | ps |
down | stop + rm |
また、docker compose up --build
でイメージをビルドして、コンテナの作成までやってくれる便利なコマンドもあるので、覚えておきましょう。
まとめ
今回はDockerについて解説してきました。
Web業界では必須のツールなので、ぜひこの機会に身につけましょう。
宣伝
0からエンジニアになるためのノウハウをブログで発信しています。
また、YouTubeでの動画解説も始めました。
YouTubeのvideoIDが不正ですインスタの発信も細々とやっています。
興味がある方は、ぜひリンクをクリックして確認してみてください!
Discussion