はじめまして、私は文系学部に通っている大学4年の@sivertigoと申します。
まったくもってプログラミングは未経験ですが、あるIT企業から内定をいただいたため、ITエンジニアになるための勉強をはじめました。先輩から勉強会という形でたくさんのことを学ばせていただいているので、せっかく学んだことを忘れないよう、備忘録として残しています。
自分の理解が間違っていたらご指摘ください。。。
第一回(5/12)の勉強会ではざっくり言うと
・dockerとは何者なのかを勉強して、
・dockerを公式サイトからインストールし、
・docker machineをつかってみて
・ubuntuをdockerを使って立てて
・vimをインストールし
・rubyの簡単なコードを動かすところまで行いました。
以上が今回の記事の内容となります。
dockerとは、ひとことで言うと仮想環境を簡単に立てることができる便利ツールのようです。
正直学ぶ前まではとっつきにくい超難しいツールなんだと思ってました。
だって、コンテナとかイメージとか仮想化とか、語感からして難しそうで・・・。
実は仮想環境については少しだけ事前知識はありました。先輩(@sadayuki-matsuno)にmacbookを貸していただく前まではオラクル社が開発しているVirtual Boxを使ってwindowsからubuntuを使えるようにしてプログラミングの勉強をしようかなと考えて、試行錯誤をしておりました。
でも、自分の愛用のノートパソコンだとうまく立ち上がらず、失敗する原因もよくわからないまま全てを諦めました。笑
そんなVirtual Boxとdockerは何が違うのでしょうか。
その違いを表したイメージ図を以下のサイトに確認しました。
引用元URL:【Docker入門】コンテナ型仮想化技術Dockerを使ってみた
dockerは右のコンテナ型にあたりますが、ライブラリ、ミドルウェア、アプリをまとめて立ち上げるイメージですかね。手間がかからなさそうな印象を受けます。(あまりよくわかっていません。)
#docker利用のメリット
さて、dockerを利用するとどのようなメリットがあるのでしょうか。
docker導入のメリットについては以下のQiitaに掲載された記事がよく書かれているため、参照しました。
こちらによるとメリットは以下のとおり。
- 同一性
- カプセル化
- アプリケーション込みの環境をコンテナというカプセルに隠蔽することができる。
コンテナという単位に対するテストが可能に。
コンテナを捨てる・再生成するのが容易。
* - ポータビリティ(一貫性とも)
- 開発に使ったコンテナをCIでテストできる。
CIでテストしたコンテナをサーバーにデプロイできる。
デプロイしたコンテナをスケールできる。
- docker
実際にコンテナを作ったり、イメージを使ったり作ったりするツール。
- docker-machine
dockerが動くような仮想マシンを作って、管理するためのツールです。docker-machineコマンドを使ってdockerを実行させるサーバや仮想マシンを管理します。dockerはlinux上で動く仕様になっているため、MacやWindowsユーザーの場合、直接dockerだけをインストールしても使用することができません。linux以外のOSで動かすためにはdockerが動くための仮想マシンを立ててその上に仮想OSを立てる必要があるみたいです。
開発におけるDocker導入のメリット
特に開発環境の差異が原因で起こるエラーがなくなることが大きいメリットのような印象を受けました。これは、将来エンジニアになってから重宝するに違いないですね!勉強のやる気もグンと上がります!!
#dockerをインストールする
今回自分が使っている環境はOS X 10.10.5です。dockerをos xにインストールする方法については、公式文書を参考にしました。
https://docs.docker.com/engine/installation/mac/
これに従いながらDocker Toolboxのページに飛んで、mac用のDownloadボタンから押して素直にインストールしました。
それからiTermを開いてどうにかこうにかすると
こんなかんじの画面が開きました。(上記画像は公式サイトからの引用)これでdockerが使えるようになりました。
ためしにdocker -vとdocker-machine -vを打ってみてバージョン確認をすると、きちんと返ってきます。
これで、iTerm(bash)からdocker-machineやdockerのコマンドが打てるようになりました。
#Docker machineとDockerの違い
ここまでで、docker-machineとdockerという二種類の別のコマンドが出てきました。
その二つは何が違うんだろうと疑問に思いますよね。以下、私が初学者なりに解釈してまとめてみました。間違いがありましたらご指摘ください。
なのでdockerを使う前にdocker-machineを使う必要があります。
#Docker machineで仮想マシンをつくる
ということで、docker-machineコマンドを使ってdockerを動かすための仮想マシンを作っていきたいと思います。
まず、何も操作していない状態でdocker-machine lsコマンドを打ってみます。
そうすると、現在のdockerマシン一覧が表示されます。
docker-machine ls
ここでは自分がすでに作っていた'default'という名前の仮想マシンがありますが無視してもらって結構です。何も作成しない状態であれば、
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
とだけ表示されるはずです。ここでは、何もマシンが作成されていないことを確認しました。
次に新しくdocker machineを作成していきます。
docker-machine createのコマンドを使います。これを打ち込むと新しく仮想マシンが作成されます。ここでは仮想環境をvirtualboxを利用して構築しています。名前はなんでも良いのですが、今回は私がよく使う名前sivertigoで作っています。
docker-machine create --driver virtualbox sivertigo
これで、sivertigoという名前でマシンが作成されました。もう一度lsコマンドでマシンのリストを確認してみます。
docker-machine ls
下の方に新しく"sivertigo"という名前の仮想マシンができていますね。
ただ、作っただけではこのマシンはきちんと動いてくれません。きちんと作成した仮想マシンとホストマシンを連携させるように環境を設定しなければなりません。
docker-machine env sivertigo
これでdockerが動くときにsivertigoマシンに呼びかけるように設定するにはどうすればいいか表示されました。一番最後の行に書いてあるevalコマンドを打つことでこの4行の設定を一気に行います。
eval $(docker-machine env sivertigo)
これで環境設定は終わりです。
#Linux(ubuntu)をdockerにいれる
これで、ようやくdockerを使えるようになりました。ここからdockerを使うためにイメージをインストールしてコンテナを作っていきますが、一旦ここで初期段階ではイメージもコンテナも何もないことを確認しましょう。
docker ps #コンテナをリストで表示する
docker images #イメージをリストで表示する
以上、イメージもコンテナも何もありません。
#イメージって?コンテナって?
ここまでで、docker machineを使えるようにしただけではイメージもコンテナも何もないことを確認しました。
ここでド文系な私が思うことは一つ。
コンテナとかイメージとか言われても全く想像がつかない・・・。
ということで簡単に今回私が先輩に習ったコンテナとイメージのイメージを書いておきます。
以下ではOSのubuntuをイメージとしてコンテナを作る例を図示しています。
こんな感じであってますでしょうか。
イメージはコンテナを作るための元になるデータで、
コンテナはイメージから作られたインスタンスです。
一つのイメージから複数のコンテナを作ることができるってかんじです。
コンテナをまたイメージとして固めることもできるらしいのですが、その辺はまだ私が全く使用しておらず理解してないので割愛させていただきます。
(ちなみにどんなイメージがあるのか気になったので調べてみました。参考にどうぞ。)
docker認定イメージ一覧
#Dockerで最新のubuntuを使うには
ここからは、ubuntuのイメージをダウンロードしてきて、それをもとにコンテナを一つ作ろうと思います。
工程としては、
・ubuntuイメージをdockerにpull(ダウンロード)する
・ubuntuイメージを元にコンテナをrun(起動)する
といった感じです。
#dockerにubuntuイメージをpullする
docker pull ubuntu:latest
これでubuntuが使えるようになったはずです。
きちんとubuntuのイメージがpullされたかどうかを再度docker imagesコマンドで確認します。
docker images
これで、正常にubuntuイメージが作成されてリストに表示されていることがわかりました。
#イメージからコンテナを作成する
次は無事取得できたイメージを使ってコンテナを作成していきます。
以下のコマンドを入力することで最新のubuntuイメージを元に、"SAMPLE"という名前のコンテナが作成されます。
docker run -d -it --name SAMPLE ubuntu:latest /bin/bash
このコマンドはどういうことかというと
docker run [オプション] [--name {コンテナー名}] {イメージ名}[:{タグ名}] [コンテナーで実行するコマンド] [引数]
という中身になっています。オプションには-i``-t``-d
が使われています。
d: バックグランドで実行
i: コンテナの標準入力を開く
t: ttyを確保する
p: ポートフォワード
引用元Qiita記事:[Dockerでコンテナ作成/起動/停止/自分用Image作成](http://qiita.com/tomy103rider/items/bf4042ad2082a23f393b)
そして、コンテナを作成したことを確認するために`docker ps`でコンテナ一覧を確認します。
```このコマンドを打つ
docker ps
こんな結果になります。CONTAINER IDはテキトーに作成されるようです。
#作成したコンテナに接続して使ってみる
SAMPLEコンテナができました。
次はコンテナに接続してみます。
以下のコマンドを打つと、作成したコンテナの中に入ることができます。
docker exec -it SAMPLE /bin/bash
こんな感じでコンテナの中に入れましたか。
この中はもう既に仮想のubuntuOSで動いてるサーバーです。好き勝手いじり放題。
同じ方法で作成したコンテナであれば、ほかの人と開発環境を同じにできるので、
コードを書いたときに「あれっ、なんでそっちでは動くのにこっちでは動かないの?」なんてことがありません。
こうしてコンテナを作って作業をするメリットは実際に開発やテストをしているエンジニアにとっては言わずもがなですが、
環境の違いに気を配るなんて、IT初心者にとってはなおさら至難の技。
環境の違いによる無駄な苦労がなくなるのは本当に助かります!!最高です!!
#vimをコンテナ内でインストールしてみる
次に入ったコンテナの中でvimというエディタをインストールして使ってみたいと思います。v
Linux上で何かソフトウェアをインストールするには apt-get install ソフト名
というコマンドを使います。それに従ってコマンドを打ってみましょう。
apt-get install vim
はい、打ち込みましたがエラーがでました。
E: Unable to locate package vim
と言っています。
このエラーは以下のコマンドを打ってアップデートをすることで解消できるようです。
(なぜ解消されるのかは私自身は全く理解しておりません。どなたか教えてていただけると幸いです。)
apt-get update
apt-get install vim
こんな感じで無事にvimがインストールされたと思います。
#rubyをコンテナ内で動かしてみる
今回の勉強会でやったことの仕上げです。rubyをインストールして使ってみます。
先ほどと同様にrubyもapt-get install
を使ってインストールします。
apt-get install ruby
こんな感じでインストールが進んでいきます。完了するはずです。できたかどうか確認するために
ruby -v
を打ってみてください。
きちんと返ってきました。現時点(2016/5/18)で最新バージョンのrubyがインストールされました。
試しに自分のホームディレクトリ上にsampleディレクトリを作成し、
その中にsample.rbというファイルを作って実行してみます。
cd #ホームディレクトリに移動
ls #ホームディレクトリに何もないことを確認
mkdir sample #sampleという名前のディレクトリを作る
ls #sampleディレクトリに何もないことを確認
cd sample #sampleディレクトリに移動
vim sample.rb #sample.rbという名前のファイルをvimエディタで作成&編集する
ls #sample.rbが作成できたことを確認
ruby sample.rb #rubyでsample.rbを実行
こんな感じになるとおもいます。ちなみに、"sample.rb"の中身はこんな感じです。
#コンテナへの接続を切る
exit