DMM.comの、一番深くておもしろいトコロ。

【Docker入門】17新卒DMMGAMESプラットフォームエンジニアによるDocker基礎

【Docker入門】17新卒DMMGAMESプラットフォームエンジニアによるDocker基礎

f:id:dmminside:20180306105354p:plain

1. はじめに

こんにちは!DMMGAMESのプラットフォーム開発本部に所属してる、17新卒エンジニアの岡崎です。

大学時代は、「箸の先の匂いによる味覚操作」を研究テーマに、日夜研究室にこもっていました。深夜0時に帰る毎日でしたが、最近は定時で上がって17卒の同期でたまに開催される技術勉強会などに参加できていて、とても充実した日々を過ごしています。

さて、今回は私がDMMGAMESのプラットフォーム開発本部に配属されてから日常的に使用している技術であるDockerについて、これまでにDockerで行ってきた業務から、その基礎までを解説します!

この記事を通して、DMMGAMESのプラットフォームの裏側に興味のある学生の皆様に少しでもDMMGAMESの仕事を知ってもらい、また、Dockerを触ってみてなんとなくでも感覚をつかんでもらえれば嬉しいです。

2.配属後初めての仕事で使ったDockerについて

Dockerとはコンテナ型の仮想化環境を提供するオープンソースソフトウェアで、DMMGAMESではローカル環境の構築に使われています。私がDMMGAMESで初めて受け持った仕事も、このDockerを使ったローカル環境の整備でした。DMMGAMESでは、ローカル環境という、皆様が利用している環境からは独立した環境を開発者のPCに構築し、その中で開発を進めることにしています。

しかしながら、配属時の私はDockerに対して「最近流行っている仮想化技術」程度の認識しかなく、ほぼ何もわかりませんでした。当初はまた深夜0時に帰る生活が始まるんじゃないのかな~と思っていましたが、周りの先輩エンジニアや同期のコミュニティによるサポートがあり、無理なく進めることができました。

ここからは、その初めての業務を通して学んだ仮想化技術とDockerについて詳しくご紹介します。

3.仮想化技術はどうして必要なのか?

まず、何のためにDockerのような仮想化技術を使うのか、その必要性から解説します。

何か新しいアプリやサービスをいきなり本番環境で動かしてしまうと、予期しないエラーでDMMの全サービスが止まってしまう可能性があります。
DMMの全サービスが一度に止まってしまうと、何十万人というユーザーに影響を与えかねないため、ぶっつけ本番でサービスをリリースすることはありません。

 

そのため、開発を進める際には、エラーが起こっても他に影響が出さずにテストができるようにローカル環境を用意しておくのです。


ローカル環境は本番環境とまったく同じように動作しなければテストの意味がないので、本番環境を再現するためにDockerのような仮想化技術が使用されます。

 

4. Dockerはデータ容量が少なく済むからすごく良い!

Dockerの何がそんなに良いのでしょうか。

 

まず、ローカル環境の構築に使用される代表的な仮想化技術は大きく分けて二種類あります。

一つは、Oracle VM Virtual BoxやVMWare Playerなどに代表されるホスト型と、Dockerに代表されるコンテナ型の二つです。

 

ホスト型の仮想化技術は、ホストOS(WindowsやMac OSなど)に入れた仮想化ソフトの上でゲストOS(Linuxなど)を作動させるのに対し、コンテナ型仮想化はOS上にコンテナ管理ソフトウェア(例えばDocker)を作動させて、その上にコンテナと呼ばれる論理的な区画を作り、その中でアプリケーションを動かします。 

f:id:dmminside:20180306105831p:plain

OSの上でさらにまたOSを動かすには、それだけで多くのリソースを必要とします。 しかし、コンテナ型仮想化では、同じOSを利用するコンテナであればリソースを共有することができるので、容量を節約することができます。そして、Dockerはコンテナ型仮想化を手軽に扱えるソフトウェアなので、Dockerを使用することで容量を抑えたローカル環境の構築が可能となるのです。

5. Docker入門ーDockerを触ってみようー

ここからは、実際にステップバイステップでDockerを触ってみましょう

Dockerのダウンロード

Get Docker | DockerからDockerをダウンロードできます。試しに触ってみるのであれば、「Docker Community Edition」がおすすめです。
Macの場合はDocker Storeからダウンロードをしてください。
ダウンロードができたら、インストーラーを起動してDockerをインストールしてください。

Dockerを使って、アスキーアートを喋らせる

試しにcowsayコマンド(アスキーアートにセリフを言わせるコマンド)を実行してみましょう。
Dockerを起動した状態でshellに以下のコマンドを入力して実行します。

docker run docker/whalesay cowsay dmm
f:id:dmminside:20180306105955p:plain

DockerのマスコットキャラクターであるMoby Dockが、”dmm”と喋ってくれるはずです。

コンテナをつかってみよう

cowsayコマンドが実行できました。コンテナについて理解を進めるために、いくつかDockerコマンドを紹介します。

docker psというコマンドを実行してみてください。このコマンドは稼働しているコンテナの一覧を確認できます。

$ docker ps

CONTAINER ID        IMAGE COMMAND             CREATED STATUS       PORTS NAMES

項目の下に何も表示されないため、稼働しているコンテナがないことがわかります。

次に、稼働/停止関係なしにすべてのコンテナを確認できるよう、docker ps コマンドに-aオプションがついたdocker ps -aコマンドを実行してください。

$ docker ps -a

CONTAINER ID        IMAGE COMMAND             CREATED STATUS       PORTS NAMES
0965808e7db5        docker/whalesay "cowsay dmm"        6 minutes ago       Exited (0) 6 minutes ago                       sleepy_beaver


6分前にcowsay dmmコマンドでdocker/whalesayというイメージが作成されたことがわかります。ここでいうイメージとは一般的な画像データ(jpeg,pngなど)ではなく、イメージファイル(CD-R等に記録されるそのままのデータのこと)を指します。

最後にdocker imagesコマンドを実行してください。このコマンドで、ダウンロードしてあるイメージの一覧が確認できます。docker/whalesayというイメージの情報を表示するはずです。

$ docker images

REPOSITORY          TAG IMAGE ID            CREATED SIZE
docker/whalesay     latest 6b362a9f73eb        2 years ago         247MB

ここまでで、docker/whalesayというクジラのイメージがダウンロードされていて、そのコンテナが停止状態になっていることがわかります。

DockerコマンドでゲストOSを稼働させる

下記のコマンドを実行してみてください。最新版のUbuntuでechoコマンドを使い、”Hello World”と返してくれるはずです。

$ docker run ubuntu:latest /bin/echo Hello World

上手くいったら、先ほど行ったのと同じ方法で現在のコンテナとイメージを確認してみましょう。
・ docker ps
・ docker ps -a
・ docker images

新しく追加されたイメージと停止したコンテナが確認できるはずです。

次に、Ubuntuコンテナを稼働したままにしてみます。次のコマンドを実行してください。

$ docker run -itd ubuntu:latest

CONTAINER IDというのは、先程docker ps -aコマンドで表示されたランダムな英数字です(私の場合は0965808e7db5)。このままdocker psコマンドを実行すると、稼動状態のUbuntuコンテナが確認できます。

表示されたUbuntuコンテナに下記コマンドを使ってshellからログインしてみます。

$ docker exec -it [CONTAINER ID] /bin/bash

上記コマンドでログインに成功したら、cat /etc/lsb-releaseというコマンドを使って情報を確認してみると良いでしょう。 確認し終わったら、exitとコマンドを入力してログアウトします。

これによってUbuntuというゲストOSをDockerで稼働させることに成功しました。

イメージとはいったい何なのか?

先ほど、イメージとは一般的な画像データではないと言いましたが、もう少し具体的に説明します。

Dockerの最大の特徴であるコンテナというものはイメージが変換されて生成されます。Dockerを使った開発の流れを表した下図を見ると、開発環境、テスト環境、本番環境共にコンテナの中身は同じです。

f:id:dmminside:20180306110549p:plain

開発環境で構築したコンテナをイメージ化して、そのイメージをテスト環境や本番環境でコンテナとして実行することで、同じ環境を再現することができます。DMMでもクラウド環境でDockerを運用している部署やチームがあります。Dockerを利用していれば、クラウド環境への移行の敷居が下がると考えられます。

Dockerの公式イメージを利用する

$ docker pull centos

上記のコマンドは、CentOSの最新版(latest)のイメージをDocker Hubからダウンロードします。。Docker HubとはDocker公式のリポジトリサービスで、Dockerの公式イメージや有志が作ったイメージをダウンロードできます。(https://hub.docker.com/explore/

$ Docker pull centos:6.8

このようにバージョン指定することも可能です。 pullが終わったら、docker imagesコマンドを実行してダウンロードされたか確認してみましょう。

コンテナの生成

$ docker run -itd --name "aaa" -h aaa centos

上記のdocker runコマンドには

—nameでコンテナに名前をつけ、-hでホストの名前をつけるオプションを使用しています。

$ docker exec -it aaa /bin/bash
[root@aaa /]# exit #ログインできたらログアウト

# bbbというコンテナも作ってみる
$ docker run -itd --name "bbb" -h bbb centos

$ docker ps # 確認してみる

Dockerを使って二つのCentOS環境を作ることができました。ちなみに、Docker pullでイメージをダウンロードしていない状態で、docker runをしても、Docker Hubからイメージを探してコンテナを生成/実行してくれます。一番最初に叩いたcowsayのコマンドもそのようにして使用しています。

コンテナの停止・削除、イメージの削除

最後にコンテナを停止・削除するコマンドを紹介します。

$ docker stop [CONTAINER ID or CONTAINER NAME]
$ docker rm [CONTAINER ID or CONTAINER NAME]

 停止していないとコンテナは削除ができないので、注意が必要です。

すべてのコンテナを削除したい時は以下のコマンド(bash, zshの場合)を使用します。 -q オプションは便利で、IDだけを表示するオプションです。

$ docker rm $(docker ps -aq)

 イメージを消したい時は以下のコマンドです。

$ docker rmi [IMAGE ID or IMAGE NAME]

6. まだまだ知らないといけないDockerのあれこれ

今回は、Dockerの基礎的なイメージからコンテナを生成するまでを紹介しました。 Dockerには他にも様々な機能があるため、今後私がDockerについてさらに勉強していこうと思っている部分を箇条書きで以下にまとめました。

・Dockerが動く仕組み
    Linuxカーネルの理解
・Dockerfile
    インフラ設定のコード化
・Dockerのネットワーク設定
    hostsの設定とか
・Docker Compose
    複数コンテナの一元管理
・オーケストレーションや運用
    AWSでの運用など

これらを一通り網羅して習得できたら、Docker中級として続きを紹介します!

7. おわりに

いかがだったでしょうか?Dockerについて、基本的なことを紹介できたと思います。

Dockerを使ったローカル環境構築を通して、今まであまり深く理解していなかったインフラやミドルウェアへの知識を深めることができました。そのおかげで勉強会でもDocker基礎について発表をすることができました。新しい技術を習得してこのように記事やプレゼン形式で発表すると、さらに理解が深まるきっかけになるので、今後も新しいことを学んだ際には積極的に情報を発信していきたいです!

 

私の大学時代の研究内容を詳しく知りたい方はこちら

 

DMMGAMESプラットフォームエンジニアの採用情報はこちら

新卒向け

recruit.dmm-corp.com

中途向け

dmm-corp.com

DMMGAMESプラットフォームエンジニア(石川)の採用情報はこちら

dmm-corp.com

 

Credits

Docker and the Docker logo are trademarks or registered trademarks of Docker, Inc. in the United States and/or other countries. Docker, Inc. and other parties may also have trademark rights in other terms used herein.

Marks and logos of Docker
Copyright 2013-2015 Docker, Inc. All rights reserved.

Others
Copyright © DMM.com Group All Rights Reserved.