2017/04/10

Docker初心者の自分が最初に知りたかった事

最近Dockerやってます!って言いたいがために気軽に調べてみたら、
概念をおさえるまでに時間がかかったのでまとめてみました。

Dockerって何?

  • オープンソースのコンテナ管理ソフトウェア。

何がうれしいの?

軽量、高速

  • 開発のライフサイクルが早くなる。

独立したアプリ実行環境が作れる

  • ファイルシステム、CPU、メモリ等すべて独立した環境が作れる。

ポータビリティが高い

  • アプリ実行環境がパッケージングされているので、自分のローカルPC、他開発メンバーのローカルPC、データセンター上の物理サーバ、VM、クラウド等、どこでも確実に同じ環境が手軽に手に入る。

スケールアップ、ダウンが簡単に出来る

インフラ環境の構成をコードで表現できる

登場人物

  • ホストマシン
    • Dockerをインストールするマシン。Linux必須。
    • ホストマシンが各Dockerコンテナの管理を行う。
  • DockerFile
    • Docker環境を作るための設計書
  • Dockerイメージ
    • 設計書(DockerFile)を元に作られた読込専用のテンプレートイメージ
  • Dockerレジストリ
    • 作成したイメージの保管場所
  • DockerHub
    • クラウド上で公開されているホスティング型のDockerレジストリ
  • Dockerコンテナ
    • アプリケーションの実行環境。
    • 実体はDockerイメージをインスタンス化、プロセス化したもの

インストールしてみる

  • Dockerインストール
    • yum -y install epel-release
    • yum -y install docker-io
  • 起動
    • systemctl start docker

コンテナを作成してみる

  • 設計書(DockerFile)を記述
    • vi Dockerfile
  • 設計書(Dockerfile)を元にイメージテンプレート(DockerImage)作成
    • docker build -t [イメージ名] [配置ディレクトリ]
  • イメージテンプレート(DockerImage)を元にコンテナ作成
    • docker run -it イメージ名

Docker運用のポイント

コンテナは素早く柔軟にスケールできるようにするために、ユーザーデータを持たせずいつでも使い捨てられる環境を保つ。
そのために以下の方針が必要。

  • コンテナをいつでも捨てられる状態にする。(コンテナから、アプリコード、データ、ログが分離した状態)
  • コンテナはシンプルさを優先する
    • 余計なミドルウェアを入れない。
  • 1コンテナ、1プロセス
    • 例えばLAMP構成の場合は、Apache、MySQL、PHP等それぞれ単機能なコンテナを作り連携させる。
    • コンテナを増やしたり、プロセス単位で停止、起動したい時に扱いやすくするため。
  • パッケージや設定はコンテナ内に保存する
    • ミドルウェア
    • 設定ファイル
    • 一時的なキャッシュデータ
  • ユーザーデータ、永続データはコンテナ外に保存する
    • アプリケーションコード
    • ユーザーデータ
    • ログデータ
  • 外部接続用にコンテナ-Dockerサーバマシンとの設定を行う
    • 「-p」オプションでDockerサーバとコンテナでポートフォワーディングを行う
    • 「–link」オプションでコンテナ間接続の指定を行う。
  • データ格納専用のコンテナを作る
    • データ格納用のコンテナを作成し、永続データをまとめる。
  • ホストマシンの設定、導入は最低限にする
    • ホストマシン上には極力パッケージ導入や設定変更等を行わない。
    • 移植性を高めるために、コンテナ内で必要なものは、コンテナ内で用意する。
  • 変更内容はDockerfileに全て残す
    • docker commitは使わない。
  • Dockerfileのレイヤ数は最小限にする
    • レイヤはDockerfile上の実行ステップが増えるたびに容量が増える。
      テストの時はRUNを足していって、最後にステップを減らすようにお掃除すると良い。
  • .dockerignoreを使う。
    • 不要なファイルは.dockerignoreに記入しビルド対象から外す。 .gitignoreと同じイメージ。

よく使う運用コマンド

Docker本体

  • dockerバージョン確認
    • docker version
  • docker基本情報確認
    • docker info

イメージ関連

  • イメージ一覧確認
    • docker images
  • DockerHubからイメージを検索
    • docker search [キーワード]
  • DockerHubからのイメージのダウンロード
    • docker pull [レポジトリ名]
  • DockerHubへイメージをアップロード
    • docker push [レポジトリ名]
  • イメージのビルド(Dockerfile必須)
    • docker build -t イメージ名 Dockerfile配置フォルダ
  • イメージの削除
    • docker rmi イメージ名
    • 強制削除する場合は「-f」をつける。

コンテナ関連

  • コンテナの生成
    • docker run –privileged -dit docker-httpd /bin/bash
      • -d: デーモンとしてコンテナを実行
      • -it: 対話型モードで起動
      • -v: 外部ディスクのマウント設定(-v ホストディレクトリ名:ゲストディレクトリ名)
      • -p: ポートフォワーディング設定(-p ホストポート名:ゲストポート名)
        • 例)-p 10080:80ならDockerホストの10080ポートがコンテナ80ポートに連結する。
      • –rm: コンテナから自動削除
      • –privileged: コンテナに拡張権限を与える
      • –name: コンテナ名を指定
  • コンテナ削除
    • docker rm コンテナ名
    • 強制削除する場合は「-f」をつける。
    • 複数コンテナまとめて削除は「docker rm -f sudo docker ps -aq
  • コンテナ再起動
    • docker restart コンテナ名
  • Dockerコンテナへの接続
    • docker exec -it コンテナ名 /bin/bash
  • コンテナ内で稼働するプロセスの確認
    • docker top コンテナ名
  • Dockerコンテナからの切断
    • Ctrl+p -> Ctrl+q
    • 「exit」だとDockerコンテナからの切断+コンテナ停止

つまづいた所

  • Docker上でCentOS7イメージを動かすと「Failed to get D-Bus connection: Operation not permitted」メッセージが出てsystemctlコマンドがエラーになる。
    • docker run 実行時に–privilegedオプションが必要。

参考

  • Docker日本語マニュアル
    • まとまった情報が欲しいならこちら。
    • http://docs.docker.jp/pdf-download.html
  • Docker基本のおさらい
    • https://www.slideshare.net/ngzm/docker-48648898
  • 5分でわかるDockerの基本
    • http://www.ryuzee.com/contents/blog/6952
  • Dockerfile を書くベスト・プラクティス
    • http://docs.docker.jp/engine/userguide/eng-image/dockerfile_best-practice.html
  • 開発環境で使うDocker入門
    • http://dev.classmethod.jp/tool/docker/develop-with-docker/
  • 開発環境をDockerに乗せる方法とメリットを3ステップで学ぶチュートリアル
    • http://qiita.com/KeitaMoromizato/items/ae1a57fc62b41b942d71
  • Docker環境を本番で使うためのセキュリティ設定
    • http://qiita.com/muff1225/items/4edea7b039dd9f26098f