みなさん、こんにちは。Acroquest Technology (アクロクエストテクノロジー) の横山 仁(よこやま じん)と申します。

主に仕事ではインフラ関係やDevOps推進に向けた活動などに携わっています。最近では、今回の記事の内容でもあるDockerを使うこともかなり増えてきて、他にもAnsibleであったり、CIツールのJenkinsなども使って、自動化や開発環境の整備などを主に行っています。

この度、さくらのナレッジでDockerの入門記事の連載をさせていただくことになりました。よろしくお願いします。


今回、Dockerについて、Dockerでどのようなことができるのか、どんな使い方をすると良いのかを、実際に手を動かすことを中心に、6回に分けて紹介していく予定です。前提として、Linuxの基本的な知識がある方を対象として書いていきます。

世の中が当たり前のようにDockerを使うような状況になっている中で、いざ使おうとして苦戦している人を周りでも見かけます。また、最近では、AWSやAzureなどのクラウドサービスでもDockerやコンテナ管理ツールが簡単に使えるサービスが増えてきています。ローカルやオンプレなどで動かしていたコンテナ環境を、クラウド上にデプロイすることも容易になってきています。

そのため、今後もDockerを使った開発、構築は増えてくるのではないかと思いますので、このタイミングでDockerについての良さや使い方を知っていただけるとよいと思っています。

連載の中では、以下のような内容を紹介していく予定です。

  • Dockerとはどういうものなのか
  • さくらのクラウドを使ってDockerのインストール
  • Dockerコンテナを立ち上げて操作してみる
  • Dockerイメージの作成
  • 複数のコンテナ間通信
  • ホストとコンテナとの関係(ボリューム共有やネットワーク関係など)
  • 実際使ってみた際の嵌りどころ

 

今回の第一回は、Dockerについての概要と、Dockerの実行例をいくつか紹介します。

Dockerとは何か、何が良いのか

では、Dockerとはどういうもので、具体的にどのようなことができ、何が便利なのでしょうか。

Dockerは、インフラ関係やDevOps界隈で注目されている技術の一つで、Docker社が開発している、コンテナ型の仮想環境を作成、配布、実行するためのプラットフォームです。
https://www.docker.com/what-docker

Dockerは、Linuxのコンテナ技術を使ったもので、よく仮想マシンと比較されます。VirtualBoxなどの仮想マシンでは、ホストマシン上でハイパーバイザを利用しゲストOSを動かし、その上でミドルウェアなどを動かします。それに対し、コンテナはホストマシンのカーネルを利用し、プロセスやユーザなどを隔離することで、あたかも別のマシンが動いているかのように動かすことができます。そのため、軽量で高速に起動、停止などが可能です。

VMとコンテナ比較

また、Dockerはミドルウェアのインストールや各種環境設定をコード化して管理します。

これはInfrastracture as Code(IaC)と呼ばれていて、ソフトウェア開発で実施されてきた構成管理や自動化などを、サーバーの各種設定やミドルウェアのインストールなどにも適用したものです。

これらにより、以下のような利点が生まれます。

  1. コード化されたファイルを共有することで、どこでも誰でも同じ環境が作れる。
  2. 作成した環境を配布しやすい。
  3. スクラップ&ビルドが容易にできる。

例えば、開発環境(Windows上)では動いていたけどLinuxで動かなかった、といったケースも、開発工程からDockerを活用していくことで防ぎやすくなります。そして、開発工程の中で使っていた環境をそのまま本番環境に持っていくことも可能なため、環境差分が少なく、環境による問題を減らすことができます。

作成したDockerイメージを他の人にも渡して使ってもらうことで、各自の環境のバージョンずれ防止や、開発環境準備の短縮化にもつながります。開発環境の準備で、説明不足や手順ミスで、丸一日かかったとなってしまうのはもったいないですよね。私自身も、開発環境からDockerを使っていて、新規メンバ参画時のコスト削減や、環境依存問題を減らせて、役立っています。

また、クラスタ構成を構築する場合も、Dockerイメージがあれば、それを起動する名前(コンテナ名)などを変えるだけで、
複数の環境(コンテナ)を起動できるので、一から手順に沿って環境を作る作業もなくなり、クラスタ構成を構築するのも容易になります。これは、コンテナを管理するオーケストレーションツールを使うことで、より運用が楽になります。

最近では、オーケストレーションツールとしてKubernetes(https://kubernetes.io/)が注目を浴びていて、Dockerでネイティブでサポートされることになり、話題にもなりました。

さらに、コード化したもの(Dockerfile)を構成管理し、それをCIツール(JenkinsやCircleCIなど)で、ビルド(Dockerイメージの作成)、デプロイ(コンテナの起動)、環境のテスト(Serverspecなど)、画面試験(Seleniumなど)を毎日実行すれば、環境面の確認も含めて安心して開発を進められるようにもなります。このサイクルを回せると、いざ環境を構築するとなった際に「アプリを動かすのに何のパッケージが必要なの?」と慌てることも減らせて、開発・リリースサイクルも安定してくると思います。

このように、Dockerを使うことで安定した開発を進めたり、リリースサイクルの改善にも役立つので、ぜひ使ってみていただきたいと思っています。

説明ばかりでは退屈だと思いますので、実際にいくつかコマンドを実行して動かしてみます。(今回は、実行例のみで、インストールや詳細は次回以降に説明していく予定です。)

Dockerコンテナ実行例

Dockerのイメージ(仮想マシンでいうところのVMイメージ)は、Web上のDocker Hubで公開されています。そこからDockerイメージを取得してくれば、すでに必要なミドルウェアなどがインストールされた状態のDockerコンテナを起動でき、すぐに使用できます。

例として、NginxのDockerイメージを使ってWebサーバーを立ててみましょう。Dockerがインストールされた環境で以下を実行します。

docker run --name some-nginx -d -p 8080:80 nginx

このコマンドを打つだけで、

  1. Nginxがインストール済みのDockerイメージを取得
  2. 取得したDockerイメージでコンテナ起動
  3. コンテナの中でNginx起動

を実施してくれます。

あとはブラウザで「http://<IPアドレス>:8080/」を開けば、Webサーバーにアクセスできます。必要なファイルや設定を含めたDockerイメージを作っておけば、上記のコマンドくらいで、必要なWebサーバを起動することができます。

Nginx

他の例として、WordPressのコンテナを動かしてみましょう。

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql
docker run --name some-wordpress --link some-mysql:mysql -d -p 8080:80 wordpress

これでWordPress環境が起動しました。あとはブラウザで「http://<IPアドレス>:8080/」とアクセスすれば、WordPressが使えてしまいます。(以下では各種設定の画面は省略しています。)

WordPress_設定

WordPress_管理WordPress_記事

このように、数コマンドで簡単にWebサーバーや、あるアプリが動いた環境を構築できてしまいます!

ツールがインストール済みのDockerイメージはいろいろと公開されています。例えば、CIツールのJenkinsや、プロジェクト管理ツールのRedmineなどもDockerイメージとして公開されており、上記と同程度のコマンドで起動することができます。そのためDockerを使えば、ちょっと気になったツールを上記のようにすぐ使用できるので、とても便利に感じています。(公式として公開されているDockerイメージと、個人が公開しているものがあるので、どれを使うかは注意が必要です。)

上記は一般に公開されているDockerイメージを使いましたが、自分でDockerイメージを作成することができます。それを他の人にも取得してもらえば、簡単に同じ環境を作ることができるのです。

また、上記はデータベースとしてのMySQLコンテナとWordPressコンテナが分かれています。そのため、「WordPressのバージョンを上げたい」といった場合には、WordPressの新しいバージョンのコンテナをもう一つ起動し、問題なければ、古いWordPressコンテナを削除する、という段取りを踏めば、切り戻しなどもしやすいため、バージョンアップなどの対応も敷居が下がるのもよいと思ってます。

次回からは、さくらのクラウドを使用して、実際にDockerのインストールを行い、上記のように実際に各種コンテナを動かしてみる予定です。