#はじめに
##なぜやるか
あるイベントで知り合った学生に、「dockerって知ってますかw?」と聞かれたのですが、その時僕はdockerについて何も分からず、答えることができなかったので、少し調べてみることにしました。
##Dockerって?
wikipediaにはこう書いてありました
Docker(ドッカー[2])はソフトウェアコンテナ内のアプリケーションのデプロイメントを自動化するオープンソースソフトウェアである。
Linuxカーネルにおける「libcontainer」と呼ばれるLinuxコンテナ技術[3]とaufsのような特殊なファイルシステムを利用してコンテナ型の仮想化を行う[4]。VMware製品などの完全仮想化を行うハイパーバイザー型製品と比べて、ディスク使用量は少なく、インスタンス作成やインスタンス起動は速く、性能劣化がほとんどないという利点を持つ。
うーん、分からない。
まずコンテナってなに?
####結局はこういうこと
VMはハイパーバイザ型のアプリケーションを使ってホストOSの上に仮想環境を作るものです。
しかし、コンテナは1つのホストOS上で複数のアプリケーションを分離させた環境で動かすことができる技術のことです。
つまり、アプリケーションごとに異なるOSを立ち上げることで分離し、運用します。そのOS自体は非常に軽量なため、大量のコンテナを起動させることができます。
##なぜコンテナが注目されるのか
たとえば、今まで一つのサーバー上で複数のアプリケーションがホストOSのリソースを共有して使っていたとします。それらはどれかのアプリケーションが落ちてしまうと、サーバー自体の機能が果たせなくなります。
しかし、コンテナでサーバーを管理すると、ホストOSのリソースを共有することができ、さらにどれかのアプリケーションが落ちてしまっても、その他のアプリケーションには影響がないため、落ちたアプリケーションのみを再度立ち上げるだけでよくなります。
#####では実際に使ってみましょう
Dockerのインストール
###mac
brew cask install docker
をターミナルで実行します。
これでdockerはインストールができました。
入ってくるコマンドは以下の3つです。
docker # 実際にdockerを動かせる
docker-compose # 複数のコンテナを管理できる
docker-machine # Dockerホストを作成できる
今回はdocker
コマンドのみを使ってみます。
docker run -it ubuntu /bin/bash
はい、おわりです。
これでubuntuが起動でき、rootユーザでbashが動いたと思います。
ちなみに、ローカルにubuntuのdockerイメージがない場合は、自動でDocker Hubからダウンロードするため、初回起動時は時間がかかるかもしれません。
ubuntuから抜けるときはexit
を打つことで、抜けることができ、それと同時にコンテナも自動で終了します。
##次に、Dockerfileを作成し、オリジナルのイメージを作ってみましょう
任意の作業ディレクトリを作成してください。
その中にDockerfileを作成します。また、appというディレクトリも作成します。このappをホストOSとdockerとで共有したいと思います。
今回、dockerイメージはubuntuをベースにします。
FROM ubuntu
RUN useradd -g sudo test
RUN passwd -d test
RUN apt-get update
RUN apt-get install sudo
COPY app /app
USER test
CMD ["echo","docker"]
このDockerfileをビルドするときは
docker build -f {Dockerfile名} -t {REPOSITORY}:{TAG} .
少し説明を付け加えると、Dockerfile内のRUN
はbuildした時に実行されるコマンドです。
CMD
はdockerを起動するときのdocker run -it {dockerイメージ名}
をした時に実行されるコマンドです。
しかし、上記のrunのあとに/bin/bash
などの実行させたいコマンドを入力した場合は、CMDがオーバーライドされるため、/bin/bash
が実行されます。
ログインユーザを作ることについてですが、プロセスがdocker内でrootとして実行されることを防ぐためです。必ず設定しましょう。
以上です。
DockerについてのコマンドとかはDockerの備忘録に書きました。
コンテナの削除などについてはこちらの方のgistをご参考ください。
#さいごに
まだ私はdockerを勉強しはじめたばかりなので、間違っていることも多々あると思うので、ご指摘いただけるとありがたいです。