入門docker 復習(2)

コンポーネント

image

Docker Imageとは

  • Imageは環境のスナップショット
    • CentOSUbuntuやAlpineなどのOS
    • NginxやMySQLのようなソフトウェア
    • PHPRubyのようなランタイムなどの環境
  • DockerImageはDockerの公式がDockerHubというサービス上で様々なOS・ソフトウェアを公開しており、取得可能。 $ docker pull ubuntu #ubuntuを取得する
    $ docker run ruby ruby -e 'puts "Hello, Docker!" #rubyを実行し、"Hello, Docker!"を表示する
  • tagを指定することで特定のバージョンを使用することができる $ docker run python:2.7 python --version #pythonの2.7を実行し、verを表示する

dockerfile

Dockerfile

  • DockerImage(スナップショット)の作成はDockerfileを記述し、ビルドして行う。

  • ローカルにあるDockerfile確認コマンド
    $ docker images

  • Docker Image のビルド&実行
    $ docker build -t hello .
    $ docker run hello

Docker Hub へアップロード

  • ローカルで開発したイメージをステージングや本番環境で動かすにはDockerレジストリにアップロードする必要がある。
  • DockerレジストリはDockerImageを保存するための場所で、Docker版のGitHubのようなもの。

  • Docker Hubへログイン
    $ docker login

  • Docker Image の命名
    • Docker Hub にアップロードするためにはDockerHubのDockerImageの命名規則に則る必要がある。
      $ docker tag hello <USER NAME>/<IMAGE NAME>
  • Docker Imageのアップロード
    $ docker push <USER NAME>/<IMAGE NAME>
  • Docker Hub の確認
  • DockerHubにアップロードしたDockerImageの実行
    • 同名のイメージがある場合はpullできないため、事前に削除する
      $ docker pull <USER NAME>/<IMAGE NAME>
      $ docker run <USER NAME>/<IMAGE NAME>

DSL

基本的なコマンド

  • FROM
    • ベースとなるDockerImageを指定
    • Dockerイメージの上にCOPYやRUNのコマンドを重ねて作成する
    • 公式で提供されているImageを使用するのが一般的
    • ここで設定したイメージを「ベースイメージ」と呼ぶ
      FROM node
  • ENV
    • Docker内で使用する環境変数
    • Dockerの起動時にデフォルトで定義されていてほしい環境変数を定義すると良い
      ENV NODE_ENV=production
  • WORKDIR
    • Dockerfileでコマンドを実行する際に基準となるディレクトリを設定する
    • このとき存在しないディレクトリを指定すると自動的にディレクトリが作成される
    • デフォルトだと / が設定されているため、最悪の場合既存のディレクトリを上書きしてしまいコンテナが起動しなくなる
      WORKDIR /scripts
  • COPY

  • RUN

    • Docker内でコマンドを実行
    • コンテナへ依存するライブラリやパッケージのインストールやユーザーの設定などの処理を実行
      RUN npm install \ && groupadd app \ && useradd -g app app \ && chown -R app:app /scripts
  • USER
    • 作成したDockerImage起動時にログインするユーザーを指定
    • デフォルトは root が設定されているため、セキュリティリスクを回避するために別のユーザーを指定する方が良い
      USER app
  • CMD
    • Docker起動時にデフォルトで実行されるコマンドを定義
    • Dockerはここで設定したコマンドがフォアグラウンドで実行されている間が生存期間になる
    • プロセスの処理が走っている間はフォアグラウンドで実行するように記述(バックグラウンドで起動するとDockerが終了してしまう)
      CMD ["npm", "run", "start"]

よく使用されるコマンド

  • EXPOSE

    • コンテナ起動時に公開することを想定されているポートを記述
    • 他人がどのポートを使用するかわかるため、記述すると丁寧
    • コンテナ起動時に EXPOSE で指定されたポートをホスト側へ公開するには -P オプションを使用する必要がある
      EXPOSE 3000
      $ docker run -P nginx
  • VOLUME

    • Data Volumeを作成するためのコマンド
    • 永続的なデータや共有するためのデータ、更新頻度の激しいファイルを扱うために使用
    • 永続的なデータはDockerで管理することは推奨されないため、ログのような更新頻度の激しいファイルで使用すると良い
      VOLUME ["/app/log"]
  • ARGS

    • Dockerfileのビルド時に変数を使用するためのコマンド
    • ビルドの前提条件/必要情報が増えると複雑化につながるため、基本的に使用しない方が良い
      ARGS ${node_env:-production} ENV node_env
      $ docker build --build-arg node_env=development .
  • ADD

    • COPY コマンドを拡張したコマンド
    • 主に以下の3つの機能を持つ

      1. COPY と同じく指定したパスをコンテナ内へコピー
      2. URLを指定した場合、そのURLからファイルをダウンロードし、コンテナ内へコピー
      3. コピーされたパスが .tar もしくは .tar.gz の場合解凍する
    • 基本的に ADD を使うのは避け、 COPY を使うのが良い

      • ADD は「指定したファイルのコピー」・「指定したURLの取得 」・「圧縮されたファイルの解凍」と高機能な反面、Dockerfileの複雑度が増す
      • URLからファイルを取得するのはパブリックへ依存が発生し、URLの参照先が変更された際にビルド不可なDockerfileができる
      • COPY の場合機能がシンプルなため、シンプルなDockerfileの作成に繋がる
  • ENTRYPOINT

    • 指定されたコマンドを実行
    • CMDとは異なり、 docker run 時に指定したコマンドを ENTRYPOINT の引数として使用
      ENTRYPOINT ["echo"] #引数に "hello" を渡すと echo "hello" が実行される
      $ docker run <IMAGE NAME> "hello!" hello!
      $ docker run --entrypoint date <IMAGE NAME> #entrypoint は実行時のオプションで変更可能

    • 基本的に CMD を使うのが良い

      • ENTRYPOINT はDocker起動時のコマンドを強制する
      • 一般的なWebアプリケーションの場合は CMD を使用する方がユーザーにとって使いやすいDocker Image になる