このすみノート

Webエンジニアが技術や趣味を書くブログです。

プログラマのためのDocker教科書でInfrastructure as Codeを学んだ

昨日は雪の影響で早く帰宅したので、自宅で「プログラマのためのDocker教科書」を読んでました。

プログラマのためのDocker教科書 インフラの基礎知識&コードによる環境構築の自動化

プログラマのためのDocker教科書 インフラの基礎知識&コードによる環境構築の自動化

ちなみに、本書は主にWindows向けに書かれていますが、「Docker for Mac」をインストールしてしまえば、内容を読み替えて読み進めることができます。

可搬性の強さがDockerのウリなので、Macでも問題はありませんでした!

インフラの基礎から学べる

本書のターゲットは、主にプログラマやアプリケーションエンジニアです。ここが面白いところで、普段はプログラムを書くことの多いエンジニアに向けて、執筆されています。

そのため、Dockerの学習に入る前段階として「インフラの基礎」から本書は始まります。

・・・とは言え、本書だけでインフラが学べるかと言うとそこまでではないので、一度は普通にサーバーを構築してみた方が良いかと思います。

インフラに関しては、座学よりも実際にサーバを作ってみる方が学びは多いです。そして、普通に手動でサーバを構築した後にDockerを体験すると、物凄く感動することは間違いありません。

ワンコマンドでサーバが構築されるという世界が、こんなにも快適な空間だったのかと!

まずは単体でDockerを動かす

本書は、まずはDockerで一台のサーバを構築することから始まります。しかしながら、やることは単純であり、難しくありません。

例えば、Webサーバを起動するために以下のようなDockerfileを用意します。

## Dockerfile
# CentOS7の公式イメージを利用します
FROM centos:7

# yumコマンドを実行してhttpdをインストールします
RUN yum install -y httpd

# Webサーバを起動します
ENTRYPOINT ["/usr/sbin/httpd", "-D",  "FOREGROUND"]

作成したDockerfileのあるディレクトリ上で、Dockerfileからイメージを作成して実行するだけで、サーバの起動は完了です。

# イメージを作成します
docker build -t sample:1.0 .
# イメージから実行します
docker run -d -p 8080:80 sample:1.0

docker runのdオプションはデーモン起動のため、すぐにシェルに戻ります。既にサーバは起動している状態です。

f:id:konosumi:20180124023952p:plain

pオプションにより、MacBook上の8080番ポートを、立ち上げたDockerコンテナの80番ポートに向けています。そのため、localhostの8080ポートにアクセスすると、Webサーバが起動していることが分かります。

f:id:konosumi:20180124023838p:plain

複数のDockerを効率よく管理して動かす

上記のような単体のDockerコマンドにより、何台ものDockerコンテナを立ち上げることは可能です。しかしながら、一つ一つ起動していくのは大変ですので、まとめて管理する方法があります。それが、docker-composeです。

下記はWordPressのDockerコンテナと、MySQLのDockerコンテナを一度に立ち上げる例です。なお、以下の例ではMacBook上の8080番ポート上でWordPressコンテナのHTTPアクセスを受け付け、linksによりWordPressコンテナからMySQLに接続(アクセス)できるようにしています。

## docker-compose.yml
webserver:
    image: wordpress
    ports:
        - "8080:80"
    links:
        - "dbserver:mysql"
dbserver:
    image: mysql
    environment:
        MYSQL_ROOT_PASSWORD: password

詳しい解説は本書に譲りますが、docker-compose.ymlのあるディレクトリ上で「docker-compose up」とするだけで、WordPressコンテナとMySQLコンテナが同時に立ち上がります。

f:id:konosumi:20180124024617p:plain

Web三層アーキテクチャ風に言うならば、AppサーバとDBサーバをそれぞれ立ち上げた上で、AppサーバからDBサーバへアクセスできるようにする設定を、たったこれだけのYMLファイルで実現できてしまうわけです。

凄い時代になったものです。

f:id:konosumi:20180124024748p:plain

さいごに

詳しい解説は本書を読んでいただきたいところですが、Dockerによる環境構築はすごくお手軽です。特に、ちょっと実験したい時とか、一時的に必要なサーバの構築には最適です。

サーバの立ち上げも、サーバの破棄も、わずか数コマンドで行なうことができます。それに、用意された公式のイメージだけでなく、自作でイメージを作ることも出来ます。

もちろん、通常の構築手順書を再現した、Linuxコマンドを実行しながらのサーバ構築も可能です。

本番環境で採用するためには、Kubernetesなどなど、まだまだ検討すべき事は多いのですが、まずは自分の開発環境から試してみるのが良いかと思います。

私が所属している会社では、各自の開発環境はdokcer-composeで構築しています。postgresqlコンテナや、apacheコンテナ、nginxコンテナなどが稼働中です。

Dockerは、アプリケーションエンジニアがサーバ構築を自動化することで、アプリケーションロジックの開発に集中できるというメリットがあります。「Infrastructure as Code」の全盛期がやってくることは間違いありませんので、まだ未体験の方はぜひ試してみてください。

それでは!

プログラマのためのDocker教科書 インフラの基礎知識&コードによる環境構築の自動化

プログラマのためのDocker教科書 インフラの基礎知識&コードによる環境構築の自動化