Docker入門


社内の新人向けにDocker入門の勉強会を開催したので、備忘録も兼ねて共有

Dockerとは

  • Dockerとはコンテナ型の仮想化環境を提供するオープンソースソフトウェア(by Wikipedia)
  • ホストOSのカーネルを利用し、コンテナと呼ばれる仮想区画を構築し、その区画上でアプリケーションを可動させる
  • 従来の仮想化環境(VMWare、VirtualBox)と比べて、軽量・高速に動作させることが可能となっっている
  • Linuxカーネルを利用するため、基本的にはLinux環境を構築するために用いられる

従来の仮想化環境との違い

では、なぜDockerは従来の仮想化環境と比べて軽量・高速なのか?
大きな違いはゲストOSを必要としないことがあげられる。

従来のVirtualBoxやVMWareではアプリケーションを実行するためには、まずゲストOSを起動する必要があった。
DockerではホストOSのカーネルを共有しているため、オーバーヘッドが少なく、軽量・高速に動作することが可能となっている。

実践

とりあえずCentOS7のDockerを作成して、Hello Worldしてみます。

# Docker HubよりDockerイメージを取得する。ここではCentOS7のイメージを取得
$ docker pull centos:7
# 取得したCentOS7のイメージを利用して、コンテナを作成・起動し、「echo 'Hello, World'」を実行する
$ docker run centos:7 /bin/echo 'Hello, World!'
Hello, World!

用語説明

Dockerイメージ

コンテナ(実際の仮想環境)の雛形となるもの。OSやらアプリケーションやらを含んだテンプレート。
このイメージをベースにコンテナを作成する。

Docker Hub

公式のDockerレジストリ。
公式のDockerイメージを取得したり、自分で作成したDockerイメージを公開したりすることができる。
CentOSやUbuntuはもちろん、nginxや各種DBなどはたいてい公式イメージが公開されているので、それを利用すると楽。

Dockerfile

実際にDocker Hubに公開されているイメージだけでアプリケーションを動かすことは難しい。その場合は、Dockerfileをもとにオリジナルのイメージを作成することができる。
環境を作成するためのコマンドを列挙していくイメージ。
Docker Hubに公開されているイメージはだいたいDockerfileも公開されている。

例としてnginxのイメージを自分で作成してみる。

Dockerfile
# ベースとなるイメージを指定(docker pullと同じことをしてくれる)
FROM ubuntu:16.04

# nginxインストール
RUN apt-get update && \
    apt-get install -y nginx && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# 必要なファイルをコンテナ側にコピーする
COPY ./sample/index.html /var/www/html/index.html
COPY ./config/nginx.conf /etc/nginx/conf.d/default.conf

# 80番ポートを開放
EXPOSE 80

# 起動時に実行されるコマンド
# nginxはデフォルトだとバックグラウンドで実行されるため、フォアグラウンドで実行するよう指定
CMD ["nginx", "-g", "daemon off;"]

注意点

  • Dockerは基本的に1コンテナにつき1プロセスを前提としている。
  • Dockerはフォアグラウンドプロセスがないと、自然終了してしまう。そのため、nginxやDBなど普段バックグラウンドで起動させるものもフォアグラウンドで起動させてあげる必要がある。