Featured image of post Dockerの復習

Dockerの復習

Kubernetesを使う前にDockerで知っておいた方がいいことを復習していきます。

Dockerの復習すべき内容

Kubernetesを使う前にDockerで知っておいた方がいいことを復習していきます。

  • Dockerコンテナについて
  • Dockerfileの書き方
  • Dockerイメージのビルド
  • Dockerレジストリへのプッシュ

以上の内容を順に見ていきます。

Dockerコンテナについて

DockerコンテナはDockerイメージをもとに実行されるプロセスで、一度ビルドしたDockerイメージがあれば、どこでも同じように動作することができます。このような仕組みは、Dockerのコンセプト「Build Once, Run Anyware」に表れています。

Dockerを使用する環境として異なるOSであったり、異なるCPUプロセッサであっても動作させることができるようになっています。

Dockerコンテナは仮想マシンと異なり、ホストマシンのカーネルを利用したまま、名前空間を分離することで独立したOSのように動作させることができ、高速な起動と停止が可能となります。

Dockerコンテナの設計

Dockerコンテナを作成する時に重要なポイントは以下の4つです。

  • 1コンテナ1プロセス
  • 不変的なイメージ
  • 軽量なイメージ
  • 実行ユーザとしてrootは避ける

Dockerは複数のコンテナを組み合わせて使用する都合上、1コンテナ1プロセスになるように設計することが大切です。 また、不変的なイメージとなるようにコンテナイメージ内にソースやバイナリを可能な限り詰め込むことも重要です。そうすることで、外部からバイナリを取得する必要がなく実行結果が変わる可能性をなくすことができます。 コンテナイメージが軽量になることで、プルさせる際のイメージのダウンロード量を減らすことができ、コンテナの利点である高速な実行を加速させることができます。 権限については、コンテナ内のプロセスを実行するユーザを最小権限にすることで、セキュリティリスクを低減することができます。

Dockerfileの書き方

DockerfileはDockerイメージの設計図のようなものです。 Dockerfileを作り、ビルドできるようになると一気にコンテナの使い勝手の良さを実感することができます。

使い方のベストプラクティスは以下のドキュメントにまとめられています。

Dockerfileを書くにあたり、使うことができるコマンドがいくつかあるのですが、基本となるFROMとRUNを紹介します。

FROM

コンテナを構築する際のベースとなるイメージを指定します。 基本的な使い方は、公式のリポジトリにあるイメージを使用します。ここではubuntuのバージョン18.04を指定します。

RUN

RUNはFROMで取得したイメージよりも上にある新しいレイヤでコマンドを実行しコミットする処理です。 イメージからコンテナを構築する際に、必ず実行される処理になります。 RUNでよく使われるコマンドとしてapt-getがあるのですが、 ベストプラクティスの解説に注意事項があったので共有します。

apt-getの注意点

RUN apt-get updaate と apt-get install は常に同じ RUN命令文で連結する必要があります。 RUN命令文でapt-get update だけを使うとキャッシュ問題を引き起こし、その後のapt-get install命令が失敗します apt-get updateが先に実行されるとその結果がキャッシュされて次回以降はキャッシュを再利用します。 そのため、apt-get installを編集して新しく別のパッケージを追加した際に、updateが実行されず、古いバージョンのパッケージが利用される場合が発生します。
今回の例のように、apt-get update && apt-get installと連結するのが良いということです。

FROM ubuntu:18.04
RUN apt-get update && apt-get install -y \
    curl

Dockerfileで使うコマンド

コマンド 内容
FROM ベース・イメージを指定する
CMD コンテナ実行時の初期設定を指定する
LABEL イメージにメタデータを追加する
EXPOSE 指定したネットワークポートをコンテナリッスンする
ENV 環境変数に対して値を設定する
ADD 追加したいファイル、ディレクトリ、リモートファイルのURLを指定しイメージ上に追加する。
COPY 追加したいファイル、ディレクトリを指定しイメージ上にコピーする

Dockerイメージのビルド

追記予定

Dockerレジストリへのプッシュ

追記予定

Licensed under CC BY-NC-SA 4.0