Dockerに再入門して修了した(つもり)

はじめに

Dockerは2015年くらいに一度学んだけど、使わなさ過ぎて完全に忘れました。

最近KubernetesがDocker標準のコンテナオーケストレーションツールとしてDockerに同梱されたり、 自分自身、そろそろ新しいアーキテクチャの探求もしたいな~ってことで再入門してみることにしました。

教材(昔やったヤツをもう1度)

Docker実践入門――Linuxコンテナ技術の基礎から応用まで (Software Design plus) 大型本 – 2015/9/26

Docker本体については、インストール方法以外は陳腐化してなかったように思います。
Kubernetesの部分は激しく変わっているのでこの本で補うのは厳しいです。
途中から公式だけ見るようになりました。

インストール方法

CentOS向けにプレイブック書きました

Vagrantfileに組み込んだので、手元のPCにVagrantが入っていれば、
centos7のbox(box名:centos7.2)が入っていればvagrant upを打つだけでDockerで遊ぶ環境は手に入ります。

基本的な動き方

  • dockerコマンド自体はdockerデーモンに要求を投げるクライアント的な位置づけ。
    なので、docker versionとか打つとClient(コマンド側)とServer(デーモン側)でそれぞれバージョンが出てくる。
  • dockerビルド時に作成される中間イメージは、イメージの差分が保存されているだけのため、容量が問題にならないように配慮されている。
    リポジトリにpushしてもこの構造は維持された状態でリポジトリ上に上がる。
  • コンテナ(再)起動時は、内部の仮想NICIPアドレスは新しくなる。

コンテナライフサイクル

  • 最初にrunするが、これは作成済imageをロードする。
  • 最初以外はstart/stopでrunしたものを起動停止する(細かいオプション要らない)
  • rmするとrunしたコンテナは消える
  • rmiすると作成済imageが消える

よくあるエラーとして、rmしてないのに同じコンテナ名でrunしてエラーになる。 コンテナ名はユニークなので名前変えてrunするか、rmしないといけない。(ときどき忘れる)

Dockerfile

コンテナをビルドする定義ファイル。
割と知ってる人は知っているみたいなテクニックが横行している感。
正直あまり好きにはなれない。

Dockerfile内で使える命令

命令 説明
FROM 作成元のコンテナイメージ                      
MAINTAINER コンテナイメージ作成者
RUN 指定のコマンドを実行
ADD イメージ内にファイルを追加
ENV コマンド実行時の環境変数追加
WORKDIR コマンド実行時のカレントディレクトリ追加
EXPOSE コンテナ内のアプリが使用するポートを登録
VOULUME ディレクトリを割り当てる
CMD/ENTRYPOOINT コンテナ起動時の実行コマンド

コンテナ同士の連携方法

接続先の設定

以下のどちらかをやる

  • Dockerfile内でポートをEXPOSEする
  • docker run時に--exposeオプションでポートを指定する

接続元の設定

以下のどちらかをやる

その他

  • gitで落として直接build可能
    github上にdockerfiles作って管理している人多し。
    gistの方が合ってる気はする・・・が、検索が・・・

  • コンテナにhostディレクトリ割当可能
    偏見でしかないけど、Windowsディレクトリ使おうとするとハマりポイントになると思うから
    あくまでもLinux上でやると良さげ。
    わたしWIndows使わない&docker for windowsとかLinux上げてたと思うので基本ない?

  • コンテナ間でコンテナ上のディレクトリを共有することも可能

最後に

大体使い方判った。 中井先生の本さすがです。

アプリエンジニアだったら、Dockerfileどうこうよりも、
docker-hubというエコシスエムから必要なimageを取ってきて開発環境にちょっと組み込むとか、
新しいツールが出てきたからdocker-hubからimage取ってきて試すとかできれば、
とりあえず十分生産性に寄与できると思います。(寄与しました)

次やってること

kubernetes周りやってます。
運用周りについて、本気出して考えていきたさあるので、そっち暫くやってます。