Docker のインストールからイメージビルド・コンテナ起動・Composeまで

f:id:Naotsugu:20191016185503p:plain


はじめに

Docker の OSX への導入からコンテナ起動までを見ていきます。


Docker のインストール

DockerHub からインストーラをダウンロードすることもできますが、Homebrew での導入が楽です。DockerHub アカウントの取得も不要です。

Homebrew をアップデートしておきましょう。

$ brew update
$ brew -v
Homebrew 2.1.14
Homebrew/homebrew-core (git revision 2f327; last commit 2019-10-15)
Homebrew/homebrew-cask (git revision 9c73f; last commit 2019-10-15)


docker を検索します。

$ brew search docker
==> Formulae
docker          docker-credential-helper 
docker-clean    docker-credential-helper-ecr
...
==> Casks
docker          docker-edge                     docker-toolbox
...

GUI 関連を含むCasks 側の docker を使いましょう。


内容を確認してみます。

$ brew cask info docker
docker: 2.1.0.3,38240 (auto_updates)
https://www.docker.com/community-edition
Not installed
From: https://github.com/Homebrew/homebrew-cask/blob/master/Casks/docker.rb
==> Names
Docker Community Edition
Docker CE
==> Artifacts
Docker.app (App)

Community Edition です。


インストールしましょう。

$ brew cask install docker
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
No changes to formulae.

==> Satisfying dependencies
==> Downloading https://download.docker.com/mac/stable/38240/Docker.dmg
######################################################################## 100.0%
==> Verifying SHA-256 checksum for Cask 'docker'.
==> Installing Cask docker
==> Moving App 'Docker.app' to '/Applications/Docker.app'.
🍺  docker was successfully installed!

インストールが完了しました。


Docker の起動

アプリケーションディレクトリに Docker.app としてインストールされます。

起動しましょう。

$ open /Applications/Docker.app


起動には少し時間がかかります。

f:id:Naotsugu:20191015233739p:plain

緑になれば起動完了です。

Docker Hub のアカウントがあればここからログインすることができます。

Docker Hub に Push したりしなければログインする必要はありません。


バージョンは以下のようになります。

f:id:Naotsugu:20191015233954p:plain

これで導入は完了です。



コンテナの起動

Nginx をコンテナで動かして見ましょう。

以下のようにするだけです。

$ docker run --name ws-nginx -d -p 8080:80 nginx


ブラウザで http://localhost:8080 にアクセスすれば Nginx の起動が確認できます。

f:id:Naotsugu:20191015234025p:plain


先程の docker run コマンドは以下を合わせて行います。

  • (イメージが存在しない場合)Docker Hub から nginx のイメージを取得(docker pull)
  • 取得したイメージからコンテナを作成(docker create)
  • コンテナを起動(docker start)


それぞれ個別のコマンドに置き換えた場合は以下のようになります。


Docker Hub から nginx のイメージを取得

$ docker pull nginx

Docker Hub から nginx という名前のイメージを取得します。


取得したイメージから ws-nginx という名前でコンテナを作成

$ docker create --name ws-nginx -p 8080:80 nginx

ローカルのイメージ nginx から ws-nginx という名前でコンテナを作成します。

-p 8080:80 でホストマシンの8080ポートをコンテナの80ポートにバインドしています。

create で作成したコンテナは stop 状態になっています。


作成したコンテナを起動

$ docker start ws-nginx

作成した stop状態のコンテナを起動します。



ベースとなるイメージからコンテナを作成し、コンテナをDockerホスト上のプロセスで動かすことで仮想環境が実現されます。

ここではイメージを Docker Hub から取得して直接利用しましたが、Dockerfile でイメージの構築手順を定義することで独自のイメージを作成することができます。



コンテナの操作

コンテナの操作方法を簡単に見ていきます。


動いているコンテナの一覧

起動しているコンテナを一覧するには ps を使用します。

$ docker ps


先程起動したコンテナは以下のように見えます。

$ docker ps
CONTAINER ID    IMAGE   COMMAND                  CREATED             STATUS          PORTS                  NAMES
37049268dde1    nginx    nginx -g 'daemon of…"   About an hour ago   Up 5 seconds    0.0.0.0:8080->80/tcp   ws-nginx


コンテナの停止

コンテナは stop で停止します。

$ docker stop ws-nginx


停止しているコンテナを含めて一覧

ps は起動しているコンテナしか見えません。

停止しているコンテナも含めて一覧するには -a オプションを指定します。

$ docker ps -a


ps -a で先程停止したコンテナを見ると以下のようになります。

$ docker ps -a
CONTAINER ID    IMAGE   COMMAND                  CREATED             STATUS                      PORTS       NAMES
37049268dde1    nginx   "nginx -g 'daemon of…"   About an hour ago   Exited (0) 37 seconds ago               ws-nginx

ステータスが Exited になっています。

停止しているコンテナは start で再度起動できます。


コンテナの削除

コンテナはコンテナ名(またはコンテナID)を指定して rm で削除できます。

$ docker rm ws-nginx


イメージの一覧

ローカルに存在するイメージは以下で一覧できます。

$ docker images


以下のような一覧が得られます。

$ docker images
REPOSITORY      TAG         IMAGE ID        CREATED         SIZE
nginx           latest      f949e7d76d63    3 weeks ago     126MB


イメージの削除

イメージはイメージ名(またはイメージID)を指定して rmi で削除できます。

$ docker rmi nginx


コンテナが存在する場合は -f で強制削除できます(コンテナは残ります)。


Dockerfile からイメージ作成

先ほどは Docker Hub からイメージを取得しましたが、イメージは自分で作成することもできます。

イメージは Dockerfile に 元にするベースイメージを指定し、コードにて環境構築手順を記載して作成します。


ここでは Nginx のイメージを作成してみます。


Nginx の設定ファイルの準備

最初に Nginx の設定ファイルを作成しましょう。

$ mkdir nginx
$ cd nginx
$ touch default.conf


default.conf を以下のように編集します。

server {
    listen       8080;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}


Dockerfile の作成

Dockerfile を作成していきます。

$ touch Dockerfile


Dockerfile を以下のように編集します。

FROM nginx:alpine

COPY ./default.conf /etc/nginx/conf.d/

EXPOSE 8080

CMD ["nginx", "-g", "daemon off;"]
  • FROM にてこのイメージのベースとなるイメージを指定
  • COPY にてローカルに準備した default.conf をイメージにコピー
  • EXPOSE にてコンテナが公開するポートを指定
  • CMD にてコンテナ起動時に実行するコマンドを指定


Dockerfile のビルド

作成した Dockerfile をビルドします(カレントディレクトリで実行します)。

$ docker build . -t alpine_nginx

-t にてリポジトリ名を指定しています。


ビルドが終了したら、作成されたイメージを確認してみましょう。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
alpine_nginx        latest              ae116f14a6d3        20 seconds ago      21.2MB

イメージが作成されています。


イメージの実行

先ほどと同様に docker run してみましょう。

$ docker run --name alpine_nginx -d -p 80:8080 alpine_nginx

Nginx が動いていますね。

f:id:Naotsugu:20191021210910p:plain


作成されたコンテナを削除しておきます。

$ docker stop alpine_nginx
$ docker rm alpine_nginx


Docker Compose

アプリケーションサーバやデータベースサーバなど各種のコンテナを起動する場合、都度 docker run するのは大変です。

その場合、docker-compose を利用することで、イメージのビルドやコンテナの起動を1コマンドで実行できるようになります。

docker-compose は YAML 形式でコマンドやオプションを指定します。早速作ってみましょう。


docker-compose.yml の作成

docker-compose.yml を作成します。

$ touch docker-compose.yml


docker-compose.yml を以下のように編集します。

version: '3'
services:
  nginx:
    image: alpine_nginx
    ports:
      - "80:8080"
    volumes:
      - ./public:/usr/share/nginx/html
  • image で先ほど作成したイメージ(alpine_nginx)を指定
  • build: . とすることで Dockerfile をビルドすることも可能
  • volumes でホスト側の public ディレクトリをコンテナの/usr/share/nginx/html にマウント


マウント元となる public ディレクトリの中に HTML を作成しておきます。

$ mkdir public
$ cat <<EOF > public/index.html
<!DOCTYPE html>
<html>
<body>
<h1>Hello docker-compose</h1>
</body>
</html>
EOF


docker-compose up

docker-compose.yml を動かすには以下のようにします。

$ docker-compose up


http://localhost にアクセスします。

f:id:Naotsugu:20191021214451p:plain

コンテナが起動し、ホスト側に用意したHTMLが表示されました。


Ctrl + C で停止し、コンテナとイメージを削除しておきましょう(docker-compose で -d 指定した場合は docker-compose stop とします)。


docker-compose ps でプロセスを確認することができます(docker ps でも見れます)。

$ docker-compose ps
    Name              Command           State     Ports
-------------------------------------------------------
nginx_nginx_1   nginx -g daemon off;   Exit 137


コンテナとイメージを削除します。

$ docker rm nginx_nginx_1
$ docker rmi alpine_nginx


まとめ

Docker のインストールからコンテナ操作、Dockerfile からのイメージビルド、Docker Compose による Docker コマンドの自動化までを見ました。


次回は、Webアプリケーションサーバとデータベースサーバの環境構築の実例を見ていきたいと思います。

blog1.mammb.com



Docker実戦活用ガイド

Docker実戦活用ガイド

  • 作者:吉岡 恒夫
  • 出版社/メーカー: マイナビ出版
  • 発売日: 2016/05/30
  • メディア: Kindle版

Docker実践入門――Linuxコンテナ技術の基礎から応用まで (Software Design plus)

Docker実践入門――Linuxコンテナ技術の基礎から応用まで (Software Design plus)

  • 作者:中井 悦司
  • 出版社/メーカー: 技術評論社
  • 発売日: 2015/09/26
  • メディア: 大型本

Kubernetes完全ガイド (impress top gear)

Kubernetes完全ガイド (impress top gear)

  • 作者:青山 真也
  • 出版社/メーカー: インプレス
  • 発売日: 2018/09/21
  • メディア: 単行本(ソフトカバー)