Dockerに再入門して修了した(つもり)
はじめに
Dockerは2015年くらいに一度学んだけど、使わなさ過ぎて完全に忘れました。
最近KubernetesがDocker標準のコンテナオーケストレーションツールとしてDockerに同梱されたり、 自分自身、そろそろ新しいアーキテクチャの探求もしたいな~ってことで再入門してみることにしました。
教材(昔やったヤツをもう1度)
Docker実践入門――Linuxコンテナ技術の基礎から応用まで (Software Design plus) 大型本 – 2015/9/26
Docker本体については、インストール方法以外は陳腐化してなかったように思います。
Kubernetesの部分は激しく変わっているのでこの本で補うのは厳しいです。
途中から公式だけ見るようになりました。
インストール方法
Vagrantfileに組み込んだので、手元のPCにVagrantが入っていれば、
centos7のbox(box名:centos7.2)が入っていればvagrant upを打つだけでDockerで遊ぶ環境は手に入ります。
基本的な動き方
- dockerコマンド自体はdockerデーモンに要求を投げるクライアント的な位置づけ。
なので、docker versionとか打つとClient(コマンド側)とServer(デーモン側)でそれぞれバージョンが出てくる。 - dockerビルド時に作成される中間イメージは、イメージの差分が保存されているだけのため、容量が問題にならないように配慮されている。
リポジトリにpushしてもこの構造は維持された状態でリポジトリ上に上がる。 - コンテナ(再)起動時は、内部の仮想NICのIPアドレスは新しくなる。
コンテナライフサイクル
- 最初に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周りやってます。
運用周りについて、本気出して考えていきたさあるので、そっち暫くやってます。