Help us understand the problem. What is going on with this article?

Dockerを学ぶなら

More than 5 years have passed since last update.

何故コンテナなのか

http://www.publickey1.jp/blog/14/google20.html

コンテナとはなにか

Dockerを学ぶ前に、まずコンテナとは何か?VMと違って何が嬉しいのかを知ると良い。

まず、コンテナの具体例としてはDocker以前からあった、LXC (Linux Containers) というものがあるので、それを説明した以下のページがわかりやすい。

Linuxコンテナ(LXC)の基礎をまとめ直す - CTC教育サービス

コンテナ型仮想化は、技術的には
「ユーザー空間を分離して、それぞれが見えるプロセス、ファイル、ネットワーク、CPU/メモリ/デバイスなどのリソースを制限する」
ということをしていることを理解すると早い気がする。

Dockerと以前からあるコンテナLXCとの違いは何か

この上でStackOverflowで聞かれた"What does Docker add to just plain LXC?"
を日本語訳したうえに、より深い解説を書いてくれている以下の記事を読むと違いがわかる

http://qiita.com/Surgo/items/709a07d68c6eafbad267

色々書いているが、Dockerは、イメージをどのプラットフォームでも同一に動くようにした上で、バージョニングや共有など、ソフトフェアに置けるgit/githubのインフラ版といえるようなエコシステムを提供しているというのが大きいように感じられる。

実際、Docker Hub ( https://hub.docker.com/ ) というのが存在し、こういったregistryの存在が前提になっている。
参考:Working with Docker Hub

Dockerを触ってみる

ここまで来たら、とりあえずDockr触ってみよう。
ドキュメントはDockerの本家サイトが色々充実している。

Webで

まず、触ってみるなら、以下のページならWeb上で動かした感を出しながら学ぶことが出来る

https://www.docker.com/tryit/

ここでは、イメージを元にコンテナを立ち上げ、新たなイメージを作成して、それを保存、Docker Hubにプッシュと言った一連の流れを体験でき、イメージを元にサービスを立ち上げるというコンテナの概念が理解できるはず。

手元で

大体わかったら、実際自分のマシンにインストールしてみると良い。以下のドキュメントは、インストールしてHello worldするところぐらいまでを各プラットフォームごとに取り扱っている。

https://docs.docker.com/installation/

ベストプラクティス

インストールまでしたら、後はユーザーズガイドを見たり、Exampleページから自分が構築したいものをDockerで立てれば良いと思う。

この時、Dockerでは、「1コンテナ1アプリ」など、ポータブル性を保つための様々なベストプラクティスが存在するので、とりあえずはそれを知っておくとよい。

Dockerfileのベストプラクティス
http://docs.docker.com/articles/dockerfile_best-practices/
http://crosbymichael.com/dockerfile-best-practices.html

以下上のリンクの内容を適当にまとめておく。

全般

  • 出来る限り、すぐ止められ、すぐ立ち上げられるようにする
  • イメージに必要のないファイルやディレクトリは.docerignoreに入れる
  • 必要なものだけミニマムに入れる
  • 1コンテナ1プロセス。複数プロセスはcontainer linkingでつなぐ
  • コンテナレイヤを深くしすぎない
  • 複数行に渡るパラメータをアルファベット順にソートする
  • ビルドキャッシュの仕組みを理解し、うまく使おう

FROM

基本的にはDockerオフィシャルのものをベースとして使用しよう。
Linuxの基盤としてはDebian Imageがミニマルでオススメ。

RUN

以下のように書くのがオススメ

RUN apt-get update && apt-get install -y \
    aufs-tools \
    automake \
    btrfs-tools \
    build-essential \
    curl \
    dpkg-sig \
    git \
    iptables \
    libapparmor-dev \
    libcap-dev \
    libsqlite3-dev \
    lxc=1.0* \
    mercurial \
    parallel \
    reprepro \
    ruby1.9.1 \
    ruby1.9.1-dev \
    s3cmd=1.1.0*
  • 改行し、アルファベット順に書くことで、読みやすくし、重複を防ぐ
  • RUN apt-get updateだけの行はキャッシュの問題を引き起こすため作ってはいけない。RUN apt-get update & apt-get install ...とやる
  • RUN apt-get upgradeはやってはいけない。既に存在するfooをアップデートしたい場合apt-get install -y fooとやれば良い
  • バージョン指定する(e.g., package-foo=1.3.*)のもオススメ

EXPOSE

ポートを公開するときは、公開するサービスの一般的なポートを指定する。例えばApatcheなら80番だし、MongoDBなら27017番である。
実際に外部からつなぐときは別のポート番号にマッピングすることができるので、あえてわかりにくいポートにする必要は全くない。

ENV

それぞれのアプリが簡単に動かせるようにPATHを正しくセットする。
例えばnginxならENV PATH /usr/local/nginx/bin:$PATHとすることで、CMD ["nginx"]と呼ぶだけでnginxが起動するようにできる。

その他、必須の環境変数を指定しておくと良い。(e.g. PGDATA)

その他に知っておくべきこと

Docker User Guideは以下の様な構成になっている

  1. Getting Started with Docker Hub
  2. Dockerizing Applications: A "Hello world"
  3. Working with Containers
  4. Working with Docker Images
  5. Linking Containers Together
  6. Managing Data in Containers
  7. Working with Docker Hub
  8. Docker Compose
  9. Docker Machine
  10. Docker Swarm

チュートリアルやベストプラクティスを学んでいたら、2.-4.ぐらいまでは理解しているはず。

後は、
Docker ImageのGitHub的な存在の1., 7.のDocker Hub
コンテナ間をつなぐ5.のLink (ポートで通信するように設計すれば使わないけれど)
コンテナを捨ててもデータを失わないようにするための6.のVolumeを学んでおくとよい。

8., 9., 10. の Docker Compose, Machine, Swarm は最近発表された。

Docker Composeは、元Figなだけあり、複数のDockerコンテナを同時にたてる時に十分使える。

AWSなどの土台となるOSを立てるDocker Machineとクラスタを構成するDocker Swarm。期待はもてるがまだBetaなのでもう少し見守りたいところ。

awakia
検索とか推薦とかやってきたエンジニア。早稲田の山名研出身。大学院の頃、論文を書こうとしない僕を見かねた教授に、北京のMSRAに追放されるが3ヶ月後無事帰還。 大学を卒業後、エンジニアのブラックホールとの別名を持つGoogleに吸収されそうになるが1年2ヶ月後無事生還。 現在は、Wantedly(https://www.wantedly.com/ )の4番目のエージェントとして救出活動に専念。
http://awakia-n.hatenablog.com/
wantedly
「シゴトでココロオドル」ためのビジネスSNS「Wantedly」の開発・運営をしています。
https://wantedlyinc.com/ja/presentations
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした