💭

Docker入門

2023/04/21に公開

今回は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からエンジニアになるためのノウハウをブログで発信しています。
https://hinoshin-blog.com/

また、YouTubeでの動画解説も始めました。
YouTubeのvideoIDが不正ですhttps://www.youtube.com/channel/UCqaBUPxazAcXaGSNbky1y4g

インスタの発信も細々とやっています。
https://www.instagram.com/hinoshin_enginner/

興味がある方は、ぜひリンクをクリックして確認してみてください!

Discussion