カテゴリー
Docker
インフラ
投稿日時
2018-02-28 19:41:27
今月はPG会で自分が担当でした。テーマはDockerについてだったので、当ブログでも簡単に紹介したいと思います。
# 1 Docker is 何?
Dockerとは、一言で言うと **「コンテナ型仮想環境提供ツール」** です。とは言ってもこれだけでは何のこっちゃと思うかもしれません。
例えば、LaravelでWebシステムの開発環境を構築することを考えてみましょう。
まず、PHPの必要なバージョンをインストールし、MySQL(もしくはPostgreSQL)をインストールし、Apache(もしくはNginx)をインストールし、Composerをインストールし、Laravelをインストールし、必要なライブラリをインストールし、・・・と結構大変ですよね。
しかもこれ、実運用する場合は本番環境にも同じことをやるんですよね。そう考えると正直なかなかしんどいものがあります。
なので、これらの環境を一まとめにしてどこからでも呼び出せたら楽ですよね。そんな発想から作られたのがDockerです。
ちなみに、どうやって一まとめにする機能を実現しているのかというと、Linuxカーネルの名前空間やリソース隔離という機能を用いて実現しています(興味のある方は調べてみてください)。
# 2 Dockerをインストールしよう
前述のとおり、Linuxカーネルの機能を用いているので、基本的にはLinux環境で動かすことになります(Docker Toolboxを使うことでWindowsやMacでも使うことは出来ます。また、AWSやAzureなどのクラウド環境でも使えます)。
インストール方法はディストリビューション(CentOS, Ubuntuなど)やバージョンによって違うので、[公式ドキュメント](https://docs.docker.com/install/)を見てやるのが確実だと思います。
ちなみに、公式ドキュメントを見るとCE版とEE版があるのがわかると思います。CE(Community Edition)が無料のバージョンで、EE(Enterprise Edition)が有料のバージョンです。
# 3 Docker Hub
次の章で説明しますが、Dockerはイメージというものがないと動かすことが出来ません。
そこで、[Docker Hub](https://hub.docker.com)というサイトからイメージと言うものを持ってくる必要があります。Docker Hubとは、GitHubのDocker版のようなもので、イメージを持っていく他にも自分が作ったImageを共有することも出来ます。なので、アカウントを作っておくことをおすすめします。
とりあえず、CentOSという単語で検索してみます。

そうすると、下のように一番最初に公式のものが出てきて、その後多くのユーザーによってプッシュされたものが出てくると思います。

取りあえず、Dockerがインストールされたという前提で
```
sudo docker pull centos
```
で一番上の公式のCentOSのものを取得してみましょう。
ちなみに、
```
sudo docker search centos
```
で、Docker Hubから検索するのと同じ結果を得ることが出来ます。
#4 DockerイメージとDockerコンテナ
Dockerには ** イメージ** と ** コンテナ**という、2つの重要な概念があります。
それぞれを一言で言うと、コンテナはOS、ミドルウェア、ライブラリなどの各種実行環境をまとめたもので、イメージはコンテナを作成して動かす元となるものです。
先程、Docker HubからCentOSの公式イメージを持ってきたと思いますが、ここで
```
sudo docker images
```
とイメージ一覧を表示するコマンドを打つと、先程持ってきたcentosがあるのがわかると思います。
#5 コンテナ操作
コンテナを作るには、
```
sudo docker run (イメージ名) (実行コマンド)
```
でイメージからコンテナを生成してコマンドを走らせます。
例えば、
```
sudo docker run centos touch test.txt
```
でcentosイメージからtest.txtファイルを作るコマンドを実行するコンテナを起動します。
ちなみに、このrunコマンドには色々オプションがあって、例えば-dでバックグラウンドでコンテナを実行、-tで端末デバイスを使う、-iでコンテナの標準入力を開く、と言った感じです。
なので、
```
sudo docker run -i -t centos /bin/bash
```
と打つとコンテナ上で通常のコマンド操作ができるようになります。
他の重要なコマンドをいくつか紹介していきます。
```
sudo docker ps
```
で今動いているコンテナの一覧を表示します。
上のコマンドで見ることが出来るCONTAINER IDで特定のコンテナに対する処理を実行することになります。
例えば、コンテナからイメージを作る場合は
```
sudo docker commit (CONTAINER ID) (イメージ名)
```
で出来ます。ちなみに、イメージ名は公式のものを除けばyk0807/laravel5というように、(作った人)/(そのイメージを表す名前)とするのが一般的です。
作ったコンテナを消す場合は
```
sudo docker rm (CONTAINER ID)
```
とします。
# 6 Dockerfile
先ほどイメージからコンテナを生成するdocker runと、コンテナからイメージを作るdocker commitというコマンドを説明しました。
実際にはその間にいろいろな作業を行うことになるのですが、それらの一連のコマンド群をまとめたスクリプトファイルが **Dockerfile** です。
スクリプトファイルと言っても、いくつかちょっとした決まりがあります。
まず最初に、FROM centosといったように、FROMの後にどのイメージが元になるかを記述します。
次に、MAINTAINER yk0807 <????@????>というように、作成者の名前とメールアドレスをMAINTAINERの後に記述します。
そこから先が実際に何を実行するかになりますが、基本的にコマンドは大文字で書きます。
よく使うのがRUN(ビルド時に実行されるもので、これでいろいろなものをインストールしたりする)とCMD(生成されたコンテナ内で実行するコマンド)で、この2つは使いこなせるようにしておきましょう。
このようにしてDockerfileを作成して、
```
sudo docker build -t (イメージ名):(タグ名) (Dockerfileの場所)
```
とすると新しいイメージを作成することが出来ます。
# 7 まとめ
ここまで色々と書いてきましたが、今回紹介した内容はほんの初歩的なことです。自分自身、Dockerについて勉強し始めてまだ1ヶ月も経っていないです(ちなみにDockerを勉強するために2月の3連休に那須塩原に1人で合宿しましたw)。
複数コンテナの管理とか、実際に作った環境を運用したりとか、色々覚えるべきことはまだ山ほどありそうです。
とはいえ、うまく使いこなせることができればインフラ環境構築の作業がだいぶ楽になる気もしています。引き続きDockerについては勉強していこうと思います。