2017/04/10
Docker初心者の自分が最初に知りたかった事
最近Dockerやってます!って言いたいがために気軽に調べてみたら、
概念をおさえるまでに時間がかかったのでまとめてみました。
Dockerって何?
- Go言語製のオープンソースのコンテナ管理ソフトウェア
- Linux Kernel3.10以上で動作
何がうれしいの?
軽量、高速
- 開発のライフサイクルが早くなる
独立したアプリ実行環境が作れる
- ファイルシステム、CPU、メモリ等すべて独立した実行環境が作れる
ポータビリティが高い
- アプリ実行環境がパッケージングされているので、自分のローカルPC、他開発メンバーのローカルPC、データセンター上の物理サーバ、VM、クラウド等、まったく同じ環境がどこでも手軽に作れる
スケールアップ、ダウンが簡単に出来る
インフラ環境の構成をコードで表現できる
登場人物
- ホストマシン
- Dockerをインストールするマシン。Linux Kernel3.10必須。
- Dockerエンジン
- ホストマシン上で動くDockerサーバ。各コンテナの管理を行う。
- DockerFile
- Dockerイメージを作るための手順書
- Dockerイメージ
- 手順書(DockerFile)を元に作られた読込専用のテンプレートイメージ
- Dockerレジストリ
- 作成したDockerイメージの保管場所
- DockerHub
- Dockerレジストリのホスティング環境を提供するSaaSサービス。
- dockerでイメージ取得を行う際のデフォルトレポジトリとなる。
- Dockerコンテナ
- アプリケーションの実行環境。
- Dockerイメージをインスタンス化、プロセス化したもの
インストールしてみる
- Dockerインストール
- $ yum -y install epel-release
- $ yum -y install docker-io
- インストール確認
- $ docker version
Client: Version: 1.12.6 API version: 1.24 Package version: docker-1.12.6-32.git88a4867.el7.centos.x86_64 Go version: go1.7.4 Git commit: 88a4867/1.12.6 Built: Mon Jul 3 16:02:02 2017 OS/Arch: linux/amd64 Cannot connect to the Docker daemon. Is the docker daemon running on this host?
- $ docker version
- 起動
- $ systemctl start docker
コンテナを作成してみる
- 設計書(DockerFile)を記述
- $ vi Dockerfile
- 設計書(Dockerfile)を元にイメージテンプレート(DockerImage)作成
- $ docker build -t [イメージ名] [配置ディレクトリ]
- イメージテンプレート(DockerImage)を元にコンテナ作成
- $ docker run -dit [イメージ名]
- コンテナ起動を確認
- $ docker ps
コンテナに接続してみる
- コンテナに接続
- $ docker exec -it [イメージ名] /bin/bash
Dockerfileの基本文法
- http://morizyun.github.io/docker/about-dockerfile-description.html
Docker運用のベストプラクティス
コンテナは素早く柔軟にスケールできるようにするために、ユーザーデータを持たせずいつでも使い捨てられる環境を保つ。
そのために以下の方針が必要。
- コンテナをいつでも捨てられる状態にする。(コンテナから、ソースコード・データ・ログが分離した状態にする)
- ホストマシンの導入・設定は最小限にする
- ホストマシン上には極力パッケージ導入や設定変更等を行わない。
- 移植性を高めるために、コンテナ内で必要なものは、コンテナ内で用意する。
- コンテナ内の導入・設定は最小限にする。余計なミドルウェアを入れない。
- 1コンテナ、1プロセス
- 例えばLAMP構成の場合は、Apache、MySQL、PHP等それぞれ単機能なコンテナを作り連携させる。
- コンテナを増やしたり、プロセス単位で停止、起動したい時に扱いやすくするため。
- パッケージや設定はコンテナ内に保存する
- ミドルウェア
- 設定ファイル
- 一時的なキャッシュデータ
- ユーザーデータ、永続データはコンテナ外に保存する
- アプリケーションコード
- ユーザーデータ
- ログデータ
- 外部接続用にコンテナ-Dockerサーバマシンとの設定を行う
- 「-P」オプションでDockerサーバとコンテナでポートフォワーディングを行う
- 「–link」オプションでコンテナ間接続の指定を行う。
- データ格納専用のコンテナを作る
- データ格納用のコンテナを作成し、永続データをまとめる。
- 変更内容はDockerfileに全て残す
- docker commitは使わない。
- Dockerfileのレイヤ数は最小限にする
- レイヤはDockerfile上の実行ステップが増えるたびに容量が増える。
テストの時はRUNを足していって、最後にステップを減らすようにお掃除すると良い。
- レイヤはDockerfile上の実行ステップが増えるたびに容量が増える。
- .dockerignoreを使う。
- 不要なファイルは.dockerignoreに記入しビルド対象から外す。 .gitignoreと同じイメージ。
Dockerfileの書き方
- MAINTAINERは入れよう
- コマンドが通らなかったらENVが通っているか確認しよう
よく使う運用コマンド
Docker本体
用途 | コマンド |
---|---|
バージョン確認 | docker version |
docker基本情報確認 | docker info |
イメージ関連
- Dockerイメージ一覧確認
- docker images
- DockerHubからイメージを検索
- docker search [キーワード]
- DockerHubからのイメージのダウンロード
- docker pull [レポジトリ名]
- DockerHubへイメージをアップロード
- docker push [レポジトリ名]
- Dockerイメージへタグ付け
- docker tag [イメージID] [DockerHubアカウント名]/[イメージ名]/[タグ名]
- イメージのビルド(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 run –privileged -dit docker-httpd /bin/bash
- コンテナ削除
- 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