Help us understand the problem. What is going on with this article?

Dockerの使い方メモ

More than 1 year has passed since last update.

学習履歴

■はじめに

Git と連携して開発環境上で自動デプロイ環境を作れるようになりたいので、Docker と Git を勉強している。
ここでは、Docker で学習した内容について備忘を残す。

■前提条件

Macbook pro 64bit
Mac OS 10.13

■参考

プログラマのためのDocker教科書 第2版
Docker
Docker入門

■Dockerとは

Docker は Docker 社が提供しているコンテナ型のアプリケーション実行環境だ。
Docker 自体は、Go 言語で書かれている。

Docker には、無償で利用できるエディションと商用利用に適した 2 つのエディションがあるが、
ここでは、無償版を使う。

■Dockerの環境構築

Mac では、Docker for Mac を使用する。

[Download]ページから「Get Docker CE for Mac(stable)」を押下し、Docker.dmgをダウンロードしよう。

Docker-hubのアカウントも作成しておこう。

■Dockerコマンド

Docker を使えばコマンドベースで色々な環境を構築できる。
Docker 環境を構築したら以下のコマンド達を実行してみよう。

・Hello World の表示

まずは、お決まりの Hello World の表示だ。

Docker が起動している状態で、以下のコマンドを実行する。

 $ docker run docker/whalesay cowsay Hello World

 _______ 
< Hello World>
 ------- 
    \
     \
      \     
                    ##        .            
              ## ## ##       ==            
           ## ## ## ##      ===            
       /""""""""""""""""___/ ===        
  ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~   
       \______ o          __/            
        \    \        __/             
          \____\______/  

・イメージ一覧の表示

ローカル上のダウンロード済みのイメージ一覧を表示する

$docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              f2a91732366c        4 months ago        1.85kB
docker/whalesay     latest              6b362a9f73eb        2 years ago         247MB

・ディスク利用量の表示

$ docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              14                  9                   2.46GB              2.181GB (88%)
Containers          29                  0                   1.285MB             1.285MB (100%)
Local Volumes       2                   1                   124MB               83.48MB (67%)
Build Cache                                                 0B                  0B

# 詳細を確認
$ docker system df -v

・イメージにタグ付けするコマンド

イメージに目印になるタグをつけることができる。

# docer tag イメージ名 新しいイメージ名
$ docker tag docker/whalesay my_whalesay

# こちらでもいい
$ docker image tag docker/whalesay my_whalesay

$docker images                          
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
my_whalesay         latest              6b362a9f73eb        2 years ago         247MB ←タグ付けされたイメージ

# さらにタグ名を変更する(ver1)
$ docker tag docker/whalesay my_whalesay:ver1
$ docker images                              
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
my_whalesay         ver1                6b362a9f73eb        2 years ago         247MB

ちなみにタグをつけるだけで元のイメージは、コピーやリネームは行われない。

・イメージの詳細情報を表示

$docker inspect my_whalesay

・Dockerイメージを削除

# rmi -> ローカル上のイメージを削除する($docker rmi -f docker/whalesay #-f 強制削除)
$ docker rmi docker/whalesay

# こちらでも可能
$ docker image rm docker/whalesay

$docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

# 全削除
# オプション
# --a/-a 使用していないイメージ全て削除
# --force/ -f イメージを強制的に削除
$ docker image prune

・イメージを取得(PULL)するコマンド

Docker Hub のレジストリなどから指定したイメージを取得できる。

# イメージの取得
$docker pull docker/whalesay

# 取得したイメージを確認
$docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker/whalesay     latest              6b362a9f73eb        2 years ago         247MB

# docker imagesと同じようなコマンド
# docker image ls

latest は必ずしも最新版のイメージであるとは限らない。
pull するときは、TAG が latest になっているものが優先して取得される。

・Dockerfileを使用したイメージビルド方法

Dockerfile は、インフラの構成情報を記述したファイルで、コンテナイメージの
作成(ビルド)に使用する。

基本的に Dockerfile のファイル名は、拡張子なしの「Dockerfile」で作成するが、
Dockerfile 以外のファイル名で作成する場合は、コンテナイメージ作成時に
ファイル名を明示的に指定する必要がある。

また、Dockerfile 以外の名前で作成した場合は、Docker Hub でのイメージの
自動生成機能が使えなくなる。

# ディレクトリの作成
$mkdir imagebuild
$cd imagebuild

# imagefile を作成
$vim Dockerfile 

# # でコメントにできる
FROM docker/whalesay:latest #{①}
RUN apt-get -y update && apt-get install -y fortunes #{②}
CMD /usr/games/fortune | cowsay #{③}

# イメージをビルド               
$ docker build -t docker-whale . 

# ファイル名を指定した場合
#$ docker build -t docker-whale -f Dockerfile .

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker-whale        latest              4999788d673b        2 minutes ago       277MB

# イメージを実行
$docker run docker-whale

 ____________________________________ 
/ Most people will listen to your    \
| unreasonable demands, if you'll    |
\ consider their unacceptable offer. /
 ------------------------------------ 
    \
     \
      \     
                    ##        .            
              ## ## ##       ==            
           ## ## ## ##      ===            
       /""""""""""""""""___/ ===        
  ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~   
       \______ o          __/            
        \    \        __/             
          \____\______/   


#一度、イメージファイルをビルドするとキャッシュが残る。そのため、--no-cache をつけることで、キャッシュが使用されることを防ぐ。
$docker build --no-cache -t docker-whale .

ここでは、元となるイメージファイルから新規に作成したいイメージファイルを作成した。

①・・・
FROM コマンド
→元となるイメージファイルを指定する。

②・・・
新規イメージに新しいパッケージとして、fortunes をインストールする。
また、RUN 命令でコンテナで実行するコマンドを指定できる。
whalesay のベースイメージが ubuntu のため apt-get コマンドを指定した。

③・・・
CMD(コマンド命令)は、コンテナが作成された後で、コマンドを実行するための命令。
fortunes で英語の格言をランダムで取得し、クジラに喋らせる。

このように DockerFile は、インフラの構成情報を記述できる。

・Docker Hub

Docker Hub 上に自分のリポジトリを作成して、独自の Docker Image の管理もできる。

1.Docker Hub アカウントを作成

Docker Hubでアカウントを作成する。

尚、アカウントとして、Docker ID とパスワードの設定が求められるが、これは以降の学習に使用する。

2.Docker Hub 上でリポジトリを作成

Docker Hub にログインしたら Create Repository からリポジトリを作成する。

スクリーンショット 2018-04-04 20.25.54.png

・Docker Hubのリポジトリにプッシュ

Docker Hub に自分が作った Docker Image を追加することをプッシュという。

プッシュを行うためには、最初にコンソール上で Docker にログインする必要があるので、ログインコマンドを確認しておこう。
※Docker Hub サイトにもログインしておく必要がある

# Dockerへログイン
$docker login #{Docker Hub にログインする場合}
$docker login quay.io #{Quay.io にログインする場合}

Docker Hub のタグ付けのルールも確認してしておこう。

#docker tag <Docker ID>/<イメージ名>:<タグ名>※タグ名は省略可能
$ docker tag docker-whale hogehoge/docker-whale:ver1

# イメージ一覧を表示
$ docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
hogehoge/docker-whale   ver1                3d11ad325d99        2 days ago          277MB

続いて、Docker Hub にプッシュする際のコマンドを確認しよう。

# docker push <Docker ID>/<イメージ名>:<タグ名>
$ docker push hogehoge/docker-whale:ver1

# こちらでも可能
$ docker image push hogehoge/docker-whale:ver1

プッシュしたDocker Image は、Docker Hub 上で確認できる。

<Push前>
スクリーンショット 2018-04-04 20.41.54.png

<Push後>
スクリーンショット 2018-04-04 20.46.37.png

最後にローカルの Docker Image を削除して、Docker Hub からプルする方法を確認しよう。

# DockerImage を削除
$ docker rmi -f 3d11ad325d99 #{IMAGE ID を指定してファイルを削除}

# Docker Hub 上の docker-whale イメージを取得する
#docker pull hogehoge/docker-whale:ver1

# ログアウト
$ docker logout 

Git Hub と操作感は似ている。

・NginxコンテナのWebサーバの構築

Nginx のコンテナを使って Web サーバ環境を構築してみる。

Docker のNginxページ から Nginx のイメージを取得する。

# docker run --name <コンテナ名> -d -p <ホスト側のポート番号>:<コンテナ側のポート番号> <イメージ名>
$docker run --name test-nginx -d -p 8080:80 nginx
オプション名 用途
--name 起動するコンテナに任意の名前をつける
-d コンテナの実行をバックグラウンドで行う
-p コンテナのポートをコンテナ外に公開する

「localhost:8080」 でブラウザにアクセスすると Nginx のページが表示される。

スクリーンショット 2018-04-07 16.48.33.png

# サーバの状態を確認
$ docker container ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
4e487285b5c8        nginx               "nginx -g 'daemon of…"   14 seconds ago      Up 12 seconds       0.0.0.0:8080->80/tcp   test-nginx

# コンテナの稼働確認
$ docker container stats test-nginx
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
4e487285b5c8        test-nginx          0.00%               1.891MiB / 1.952GiB   0.09%               968B / 0B           0B / 0B             2

ついでに Docker の Nginx コンテナを止めて、削除する方法も確認しておく。

#Nginx停止
$docker stop test-nginx

#Nginxコンテナを削除(一旦停止しないと削除できない)
$docker rm test-nginx

・イメージの検索

Docker Hub に公開されているイメージを検索することができる。

# docker search オプション 検索キーワード
# nginxを検索
$ docker search nginx
NAME                                                   DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
nginx                                                  Official build of Nginx.                        8341                [OK]                

# 結果を全て表示
$ docker search --no-trunc nginx

# 検索結果の表示数を制限
$ docker search --limit 3 nginx

# お気に入りの数(数値は、お気に入りの数が1000件以上の意味)
$ docker search --filter=stars=1000 nginx
NAME                  DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
nginx                 Official build of Nginx.                        8341                [OK]                
jwilder/nginx-proxy   Automated Nginx reverse proxy for docker con…   1323                                    [OK]

・コンテナのログを確認

コンテナのログを確認することができる。

# centos7 のコンテナ作成後、ローカルホストにpingをうつ
$ docker run -d centos /bin/ping localhost
749623cda7532ef978e39feb7649882b3a0474ec851847238c3e3dbbfb5a0136

# ログを確認
$ docker container logs -t 749623cda7532ef978e39feb7649882b3a0474ec851847238c3e3dbbfb5a0136
2018-04-24T21:46:36.374313143Z PING localhost (127.0.0.1) 56(84) bytes of data.
2018-04-24T21:46:36.374395443Z 64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.032 ms
2018-04-24T21:46:37.455438243Z 64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.069 ms

# コンテナの状態を確認
$ docker container ps               
CONTAINER ID        IMAGE               COMMAND                 CREATED             STATUS              PORTS               NAMES
749623cda753        centos              "/bin/ping localhost"   6 minutes ago       Up 6 minutes                            unruffled_snyder

# こちらでも状態確認できる
$ docker container ls
CONTAINER ID        IMAGE               COMMAND                 CREATED             STATUS              PORTS               NAMES
749623cda753        centos              "/bin/ping localhost"   21 minutes ago      Up 14 seconds                           unruffled_snyder


# コンテナを停止
$ docker stop 749623cda753

$ docker container ps      
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

・コンテナの削除

使い終わったコンテナは削除しておこう。

# 一個ずつコンテナの削除
$ docker container rm コンテナ識別子

# "停止中"のコンテナの全削除
$ docker container prune

・コンテナのマウント方法

ホストマシンで作成した html ファイルを Docker コンテナにマウントする。
(マウントは、PC に接続した機器や記憶装置を OS に認識させて、利用可能な状態にすること)

# docker run --name <コンテナ名> -d -v <ホスト側のディレクトリ>:<コンテナ側のマウントポイント>:<オプション> -p <ホスト側のポート番号>:<コンテナ側のポート番号> <イメージ名>
$docker run --name some-nginx -v /some/content:/user/share/nginx/html:ro -d nginx
オプション名 用途
-v マウントするディレクトリを指定する。ro(read only)の略で読み取り専用でマウントする。絶対パスで指定する。

ディレクトリは、絶対パスで指定しないといけないので、注意が必要だ。

# Mac の場合
-v /Users/<ユーザ名>/docker-tutrial/html:/usr/share/nginx/html:ro

# Windows の場合
-v /c/Users/<ユーザ名>/docker-tutrial/html:/user/share/nginx/html:ro

ホストマシンの公開用のディレクトリと html ファイルを作成し、マウントしてみる。

# 練習用のフォルダを作成
$mkdir docker-tutrial
$mkdir html
$cd /docker-tutrial/html

# htmlファイルを作成
$vim index.html 
<!DOCTYPE html>
<html>
<head>
<title>Docker TEST</title>
</head>
<body>
<h1>MyFirst Heading</h1>
<p>My First Paragraph.</p>
</body>
</html>

# Nginxコンテナを立ち上げる
$ docker run --name first-nginx -v /Users/ユーザ名/docker-tutrial/html:/usr/share/nginx/html:ro -d -p 8080:80 nginx

さっきと同じ方法で、localhost:8080 にアクセスするとページが表示される。

スクリーンショット 2018-04-07 17.19.06.png

index.html のページ情報を修正してみる。

$vim index.html

<!DOCTYPE html>
<html>
<head>
<title>Docker TEST</title>
</head>
<body>
<h1>MyFirst Heading</h1>
<p>My First Paragraph.</p>
<p>My Second Paragraph.</p> {#追加}
</body>
</html>

編集を終えたらブラウザを更新すると修正後のページが表示される。

スクリーンショット 2018-04-07 17.23.22.png

・copy命令

copy 命令はホストマシン上のファイルをイメージ内にコピーするコマンドだ。

# ホストマシンのファイルをコンテナ内にコピーする方法
$docker cp <ホスト上のコピーしたいファイルのパス> <コンテナ名 or ID>:<コピー先のパス>

# コンテナ内のファイルをホストマシンにコピーする場合
$docker cp <コンテナ名 or ID>:<コンテナ上のコピーしたいファイルのパス> <コピー先のパス> 

Nginx の設定ファイルを取り出して、コピーしてみる。

# Nginxコンテナを立ち上げる。-rm は終了時にNginxコンテナを削除するオプション
$ docker run --name tmp-nginx --rm -d nginx 

$ mkdir copy_lesson
$ cd copy_lesson

# 起動中のNginxの設定ファイルをコピーする
$ docker cp tmp-nginx:/etc/nginx/conf.d/default.conf ./ 

$ls
default.conf

$vim default.conf

# listenを80ー>8080 に変更
server {
    listen       8080;
    server_name  localhost;

# Dockerファイルを作成して、コピー命令を実行する
$vim Dockerfile

FROM nginx:latest
COPY default.conf /etc/nginx/conf.d/default.conf

# Dockerファイルをビルドする
$ docker build -t nginx:ver1 .
Sending build context to Docker daemon  4.096kB
Step 1/2 : FROM nginx:latest
 ---> hogehoge
Step 2/2 : COPY default.conf /etc/nginx/conf.d/default.conf
 ---> hogehoge
Successfully built d86e7aa428fe
Successfully tagged nginx:ver1

# 作成したイメージから Nginx コンテナを起動する
docker run --name web -p 8080:8080 --rm nginx:ver1

・コンテナのライフサイクル

コンテナのライフサイクルは大まかに、以下の通りになる。

<コンテナのライフスタイル>
1. Docker イメージからコンテナを生成 (docker {container} create)
2. コンテナ起動 (docker {container} run)
3. コンテナ停止 (docker {container} stop)
4. 停止したコンテナを起動 (docker {container} start)
5. コンテナ削除 (docker {container} rm)
* container は、指定しなくても実行できる

Docker コンテナにはステータスがある

ステータス名 内容
Created コンテナが作成されて起動する前の状態
Running コンテナ作成後、起動した状態
Paused コンテナを一時停止させた状態
Docker Restarting コンテナの再起動中の状態
Exited コンテナが終了した状態
Removing コンテナ削除中の状態
Dead 正常に終了できず残ってしまった状態
# alpineイメージを作成。
# -iは、コンテナの標準入力を取得し、双方向に接続できるようにする
# -tは、コンテナ内に tty を割り当てる
# shellで実行する場合は、これらのオプションをつけないとすぐに shell が終了する
$ docker create --name status-test -it alpine /bin/sh

# 実行中のコンテナを表示
$docker ps -a

CONTAINER ID        IMAGE                COMMAND                  CREATED              STATUS                     PORTS                  NAMES
149fe3b65485        alpine               "/bin/sh"                About a minute ago   Created                                           status-test

# コンテナ起動
$ docker start status-test
status-test

$ docker inspect status-test

[
    {
        "Id": "hogehoge",
        "Created": "2018-04-07T22:39:15.561475462Z",
        "Path": "/bin/sh",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 2196,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2018-04-07T22:43:48.284317259Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },

... 省略

# 一時停止
$docker pause status-test
status-test

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                  PORTS               NAMES
149fe3b65485        alpine              "/bin/sh"                8 minutes ago       Up 4 minutes (Paused)   

# 一時停止解除
$ docker unpause status-test
status-test

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
149fe3b65485        alpine              "/bin/sh"                10 minutes ago      Up 6 minutes 

# hello-world イメージ起動
$docker run hello-world

$docker ps -a
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS                      PORTS                  NAMES
925f1e25dda9        hello-world          "/hello"                 16 seconds ago      Exited (0) 20 seconds ago                          stupefied_zhukovsky

# コンテナ停止
docker stop status-test   
status-test

$docker ps -a
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS                        PORTS                  NAMES
149fe3b65485        alpine               "/bin/sh"                17 minutes ago      Exited (137) 16 seconds ago 

# コンテナ起動
$docker start status-test
status-test

$ docker ps -a
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS                     PORTS                  NAMES
149fe3b65485        alpine               "/bin/sh"                18 minutes ago      Up 23 seconds 

・起動中のコンテナのシェルへの接続

起動中のコンテナのシェルへ接続する方法がある。

# docker attach を使用する場合
$ docker attach <コンテナ名 or コンテナID>
※コンテナでシェルを実行している場合のみ

# docker exec を使用する場合
$ docker exec -it <コンテナ名 or コンテナ ID> /bin/bash
※/bin/bash/がなければ、別のシェルを指定する必要がある

ただし、docker commit コマンドで作成したイメージには、変更履歴が残らないらしい。
その為、通常は、docker file を作成して、操作の履歴を残す。

ubuntu のコンテナを立ち上げて、attach コマンドでシェルに接続してみる。

# utuntuを立ち上げる
$ docker run --name connect-test -it -d ubuntu /bin/bash

# ubuntuのシェルに接続
$ docker attach connect-test 
{Enter を押下}

# 接続完了
root@hogehoge:/#
{Ctrl p -> Ctrl q で接続状態から抜ける}

# Ctrl p -> Ctrl qで、接続を遮断した場合、コンテナは起動し続ける(STATUS参照)
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
hogehoge            ubuntu              "/bin/bash"         4 minutes ago       Up 4 minutes 

# 再接続
$ docker attach connect-test
{Enter を押下}

#{接続完了}
root@hogehoge:/#
{exit で抜ける}

#exit で抜けるとコンテナは停止する
$docker ps -a
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS                      PORTS                  NAMES
hogehoge             ubuntu               "/bin/bash"              9 minutes ago       Exited (0) 37 seconds ago                          connect-test

#ubuntuコンテナをリスタート
$docker start connect-test
#docker exec で接続
$docker exec -it connect-test /bin/bash
#{接続完了}
root@hogehoge:/#
{exit で抜ける}

# exitで抜けてもコンテナは起動し続ける
$docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
hogehoge           ubuntu              "/bin/bash"         13 minutes ago      Up About a minute                       connect-test

・Docker コミット

Docker コミットで、Docker コンテナからイメージを作成できる。

$ docker commit <コンテナ名 または コンテナID> <イメージ名>:<タグ名>
# docker container commit でも可

ubuntu のコンテナを例に試してみる。

# ubuntuコンテナに接続
$ docker run --name commit-test -it -d --rm ubuntu /bin/bash

# コンテナにログイン
$ docker exec -it commit-test /bin/bash

# コンテナに変更を加えるため、10Mファイルを作成する
$cd /tmp/
root@hogehoge:/# dd if=/dev/zero of=tempfile bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.00849182 s, 1.2 GB/s

# 一度コンテナから抜ける
root@hogehoge:/#exit

# コミットする
$ docker commit commit-test commit-test:ver2

# イメージが作成してされたことを確認
$ docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
commit-test             ver2                f6c04d469bc8        39 seconds ago      123MB

# commit-testを起動し、tempfileが含まれているか確認
$ docker run -it commit-test:ver2 /bin/bash
root@hogehoge: cd /tmp/
root@hogehoge: ll
tempfile
root@hogehoge: exit

# 変更履歴を表示
$docker history commit-test:ver2
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
f6c04d469bc8        6 minutes ago       /bin/bash                                       10.5MB              
f975c5035748        4 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B                  
<missing>           4 weeks ago         /bin/sh -c mkdir -p /run/systemd && echo 'do…   7B                  
<missing>           4 weeks ago         /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$…   2.76kB              
<missing>           4 weeks ago         /bin/sh -c rm -rf /var/lib/apt/lists/*          0B                  
<missing>           4 weeks ago         /bin/sh -c set -xe   && echo '#!/bin/sh' > /…   745B                
<missing>           4 weeks ago         /bin/sh -c #(nop) ADD file:c753df38640ab6e24…   112MB    

・自動ビルド

自動ビルドでは、Github などのホスティングサービスを管理し、リポジトリ上のビルドコンテキストの内容が
変更された場合に自動的にビルドを実行することができる仕組みだ。

ここでは、Github に Docker ファイルの自動ビルドを試してみる。

1.Githubアカウントを取得

Github からアカウントを作成する。

2.リポジトリを作成

Github のアカウントを作成したら、下の画像のページに飛ぶので、○印で囲まれているプラスボタンを押下し、
リポジトリを作成しよう。

スクリーンショット 2018-04-10 21.37.33.png

筆者は、「automated-build-test」 というリポジトリ名で作成した。

3.GitClientの導入

GitClient が必要になるので、インストールされているか確認しよう。

$git --version
# version が表示するされれば、インストールされている
git version 2.14.3 (Apple Git-98)

version が表示されない場合はインストールされていないので、ここからダウンロードする。

4.Dockerhub への自動ビルドの設定

Docker Hub のアカウントで、Docker-hubのサイトにログインしておく。

最初に Dockerhub と Github のリンク設定を行う。

Docker-hub のサイトの Create タブから 「Create Automated Build」 をクリックする。

スクリーンショット 2018-04-10 21.49.23.png

遷移先で、「Link Accounts」をクリックする。

スクリーンショット 2018-04-10 21.51.01.png

遷移先で、「Link Github」 をクリックする。

スクリーンショット 2018-04-10 21.52.04.png

遷移先で、「Public and Private (Recommended)」 をクリックする。
スクリーンショット 2018-04-10 21.53.13.png

遷移先で、「Authorize Docker」 をクリックする。
※Github にログインしていない場合は、先に Github にログインすること

スクリーンショット 2018-04-10 21.54.44.png

再度、Create タブの 「Create Automated Build」 を押下する。

遷移先で、Create Auto-build をクリックする。

スクリーンショット 2018-04-10 22.01.01.png

さらに遷移先で、先ほど Github で作成したリポジトリ名が表示されるので、リポジトリ名をクリックする。

またさらに遷移先で、自動ビルド作成ページに飛ぶので 「Short Description*」 に何らかの文字を
入れて、他の設定項目はデフォルトのまま 「Create」 ボタンを押下する。

これで自動ビルド用のリポジトリは作成できた。

5.自動ビルド

設定が完了したので、自動ビルドの様子を見ていく。

最初に Github にユーザ登録をしておく。

# Gitの設定
$git config --global user.name "ユーザ名"
$git config --global user.email "メールアドレス"

次に、Github 上に作成した automated-build-test リポジトリをコピーする。

そのために、automated-build-test の url を取得する。

スクリーンショット 2018-04-11 5.32.19.png

スクリーンショット 2018-04-11 5.36.11.png

# automated-build-testリポジトリをコピーする
$ git clone https://github.com/****/automated-build-test.git
Cloning into 'automated-build-test'...
warning: You appear to have cloned an empty repository.

# コピーが終わると arutomated-build-test ディレクトリが作成される
$cd automated-build-test/

# Dockerfile を作成
$ vim Dockerfile
FROM dockersamples/static-site
ENV AUTHOR="ユーザ名"

# Git に Dockerfile を追加
$ git add Dockerfile
$ git commit -m "Initial commit"

ここまできたら自動ビルドまでもう少しだ。

自動ビルドの様子を確認するために、Dockerhub の automated-build-test リポジトリの
ビルド前の状態を確認しておく。

スクリーンショット 2018-04-11 5.44.55.png

特に何も入っていないことがわかる。

では、Dockerfile を push して動作を確認してみよう。

$git push origin master
Username for 'https://github.com': #ユーザ名
Password for 'https://hogehoge@github.com': #パスワード

Dockerhub 上の BuildDetails を確認すると問題なく自動ビルドできていることが確認できる。

スクリーンショット 2018-04-11 5.51.32.png

このイメージを pull することも可能だ。

$ docker pull hogehoge/automated-build-test

$ docker images
REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE
hogehoge/automated-build-test   latest              963507c7eac9        8 minutes ago       191MB

・Docker Machine

Docker Machine は、 Docker Engine を搭載した仮想マシンの作成、起動、停止、再起動などを
コマンドラインから実行できるツールだ。

ローカル PC だけではなく、 AWS などのクラウド環境上で Docker ホストを立ち上げて
管理することも可能らしい。

Docker Machine は、Docker for Mac をインストールした段階で、合わせてインストールされている。

VirtualBox を使って、実際に試してみよう。

・Docker MachineによるDockerホストの管理

Docker Machine で、 Docker ホストを作成し、管理する方法を見ていく。
※筆者は、Mac 環境で実行している(Windowsでは、コマンドが少し異なる場合がある)

# Docker Machineのリストを表示
$docker-machine ls
NAME   ACTIVE   DRIVER   STATE   URL   SWARM   DOCKER   ERRORS

# virtual box上のdockerhostという名前のDockerホストを作成
$ docker-machine create --driver virtualbox dockerhost

# Dockerホストの作成を確認
$ docker-machine ls
NAME         ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
dockerhost   -        virtualbox   Running   tcp://192.168.99.100:2376           v18.04.0-ce

# dockerhostへの環境変数を設定することで、コマンドライン上から操作を可能にする
# 環境変数を設定するコマンドを確認
$ docker-machine env dockerhost
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/hogehoge/.docker/machine/machines/dockerhost"
export DOCKER_MACHINE_NAME="dockerhost"
# Run this command to configure your shell: 
# eval $(docker-machine env dockerhost)

# 環境変数を設定
$eval $(docker-machine env dockerhost)

# Dockerホストがアクティブ状態になったか確認(ACTIVE -> *)
$ docker-machine ls
NAME         ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
dockerhost   *        virtualbox   Running   tcp://192.168.99.100:2376           v18.04.0-ce   

# 確認のため、hello-world コンテナを実行してみる(この時点で、仮想マシン上に作成した dockerhost 上で動作するようになっている)
$ docker run hello-world

Hello from Docker! 

# dockerhostにssh接続する(hello-world コンテナの実行確認)
$ docker-machine ssh dockerhost

# コンテナのプロセス一覧からも確認できる
docker@dockerhost:~docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
17fe4fead6c3        hello-world         "/hello"            3 minutes ago       Exited (0) 3 minutes ago                       affectionate_edison

# dockerhost から抜ける
exit

# ipアドレスの確認
$docker-machine ip dockerhost
192.168.99.100

# Nginxを使ってdockerhostのアドレスからアクセスしてみる
$ docker run -d -p 8000:80 nginx #{図1}

# dockerhostを停止
$ docker-machine stop dockerhost

# 停止を確認
$docker-machine ls
NAME         ACTIVE   DRIVER       STATE     URL   SWARM   DOCKER    ERRORS
dockerhost   -        virtualbox   Stopped                 Unknown   

# dockerhostを起動
$ docker-machine start dockerhost

# DockerMachineの一覧表示
$docker-machine ls
NAME         ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
dockerhost   *        virtualbox   Running   tcp://192.168.99.100:2376           v18.04.0-ce 

# 環境変数を削除するコマンドを確認
$ docker-machine env -u
unset DOCKER_TLS_VERIFY
unset DOCKER_HOST
unset DOCKER_CERT_PATH
unset DOCKER_MACHINE_NAME
# Run this command to configure your shell: 
# eval $(docker-machine env -u) ★

# アクティブな Docker Machine の選択を解除する(先ほど作成した環境変数を削除することで対応)
$ eval $(docker-machine env -u)

# アクティブが解除されたことを確認(ACTIVE -> -)
$ docker-machine ls            
NAME         ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
dockerhost   -        virtualbox   Running   tcp://192.168.99.100:2376           v18.04.0-ce  

# docker-machine 削除
$ docker-machine rm dockerhost

$ docker-machine ls           
NAME   ACTIVE   DRIVER   STATE   URL   SWARM   DOCKER   ERRORS

・図1
スクリーンショット 2018-04-12 6.24.59.png

・AWSへのDockerホストのプロビジョニング

Docker Machine を利用すれば AWS 上に Dokcer イメージを作成できる。

1.AWSアカウント登録

AWS アカウントを公式サイトで作成しよう。

2.AWSの認証情報を取得

AWS の認証情報を取得しよう。

AWS のトップページから「サービス」を選択肢、その中の「IAM」をクリックしよう。

スクリーンショット 2018-04-14 7.31.54.png

スクリーンショット 2018-04-14 7.34.11.png

左側のリストから「ユーザー」を選択して、「ユーザーを追加」をクリックする。

スクリーンショット 2018-04-14 7.36.36.png

ユーザー名に任意の値をいれて、「プログラムによるアクセス」にチェックし、「次のステップ」を押下する。

スクリーンショット 2018-04-14 7.38.26.png

「既存のポリシーを直接アタッチ」を選択後、「AdministratorAccess」にチェックを入れ、
「次のステップ」を押下する。

スクリーンショット 2018-04-14 7.41.27.png

最後に、「ユーザの作成」をクリックする。

スクリーンショット 2018-04-14 7.44.24.png

作成が完了すると、アクセスキー ID とシークレットアクセスキーを確認できる画面が
表示されるので、両方ともメモしておく。

3.認証登録

取得したアクセスキー ID とシークレットアクセスキーを Docker Machine に登録する。

#ホームディレクトリ配下にawsディレクトリと認証ファイルを作成
$mkdir ~/.aws
$vim ~/.aws/credentials

[default]
aws_access_key_id = XXXXXX{アクセスキー}
aws_secret_access_key = XXXXXX{シークレットアクセスキー}

# EC2 インスタンスを作成
$docker-machine create --driver amazonec2 --amazonec2-open-port 8000 --amazonec2-region ap-northeast-1 aws-sandbox 

コマンドの実行が完了したら、AWS 上のトップページから「サービス」から「EC2」を選択肢、
インスタンスの一覧を表示させてみよう。

スクリーンショット 2018-04-14 8.02.18.png

AWS 上に作成したインスタンスを利用して、Webページを公開してみよう。

# Docker MachineにAWSのインスタンスを認識させる
$ eval $(docker-machine env aws-sandbox)
$ docker-machine ls
NAME          ACTIVE   DRIVER       STATE     URL                       SWARM   DOCKER        ERRORS
aws-sandbox   *        amazonec2    Running   tcp://52.69.57.250:2376           v18.04.0-ce   
dockerhost    -        virtualbox   Stopped 

# Nginxコンテナのハローワールドイメージを取得
$ docker run -d -p 8000:80 --name webserver kitematic/hello-world-nginx

# AWSのIPアドレスと取得
$docker-machine ip aws-sandbox
52.69.57.250

確認した IP アドレスで Web ページにアクセスしてみる。

スクリーンショット 2018-04-14 8.10.55.png

問題なく表示されたようだ。

最後に AWS のコンテナを終了させ、作成したインスタンスを削除する方法を確認しておこう。

# インスタンス停止
$ docker-machine stop aws-sandbox

# インスタンス削除
$ docker-machine rm aws-sandbox

コマンドの実行が完了したら、AWS のコンソール上でインスタンスを確認してみると
「terminated」となって、削除されたのがわかる。

スクリーンショット 2018-04-14 8.16.27.png

・Dockerとネットワーク

Docker コンテナのネットワークとして、ブリッジドライバーを使用したネットワークについて調べてみた。

ブリッジドライバーは、単一な Docker コンテナ内に構成されるネットワークで、比較的小規模なネットワークを構成するときに使用される。

# 仮想環境を構築
$ docker-machine create nw-vm1

# 仮想環境に SSH でログインする
$ docker-machine ssh nw-vm1

# デフォルトで用意されているネットワークを確認
$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
7e35f85ffc2e        bridge              bridge              local
66167f70df3e        host                host                local
e56413505bc2        none                null                local

# ネットワークの詳細な情報を確認
$ docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "7e35f85ffc2ef1423fdc8466c208ff7116d55b1ec804fa9a8b2a91a618d55d1a",
        "Created": "2018-04-15T21:49:29.423639009Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

# インターフェースを確認
$ ip add show
6: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:43:7e:f4:c3 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

# コンテナを立ち上げる(ブリッジネットワークに自動接続される)
$ docker run -itd --name alpine1 alpine /bin/sh

# alpine1 のコンテナが追加されたか確認
$docker inspect bridge
[
    {
        "Name": "bridge",
        "Id": "7e35f85ffc2ef1423fdc8466c208ff7116d55b1ec804fa9a8b2a91a618d55d1a",
        "Created": "2018-04-15T21:49:29.423639009Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "b2e7b18edc07330c853f2bcbbc8e30c8f8cf805e320b56d62a21920411199938": {
                "Name": "alpine1",
                "EndpointID": "83a2c169a304fa7a789aab5989f236eeb5685e75a33b36b8a11adbfa3fda2ac1",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

# コンテナをもう一つ立ち上げる
$ docker run -itd --name alpine2 alpine /bin/sh

# alpine2に入る
$ docker attach alpine2
# ip アドレスを確認
/ ip addr show
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0

# apline1と通信できるか確認
/ ping -w 3 172.17.0.2  #apline1のIP アドレス
PING 172.17.0.2 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.091 ms
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.084 ms
64 bytes from 172.17.0.2: seq=2 ttl=64 time=0.079 ms

# コンテナ名では、通信できない
/ ping -w 3 alpine1
ping: bad address 'alpine1'

# apline2から抜ける
Ctrl + p, Ctrl + q

# コンテナ名で通信できるようにするため、ユーザ定義のブリッジネットワークを作成する
$ docker network create my_nw

$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
7e35f85ffc2e        bridge              bridge              local
66167f70df3e        host                host                local
7905132c1cd6        my_nw               bridge              local
e56413505bc2        none                null                local

# my_nwにコンテナを追加
$ docker network connect my_nw alpine1
$ docker network connect my_nw alpine2

# my_nwネットワークに接続する
$ docker run -itd --name alpine3 --network my_nw alpine

# apline2に入る
$ docker attach alpine2
/ ping -w 3 alpine1
PING alpine1 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.136 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.085 ms
64 bytes from 172.18.0.2: seq=2 ttl=64 time=0.103 ms

# apline2から抜ける
Ctrl + p, Ctrl + q

$ docker network disconnect bridge alpine2

・ノンネットワークとホストネットワーク

先ほど作成した nw-vm1 の仮想環境上で作業を行う。

# none ネットワークを確認
$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
7bc7e5083411        bridge              bridge              local
88ca9c8c88e3        host                host                local
9a56281cffd9        my_nw               bridge              local
859bdc4605d9        none                null                local

null ドライバへ接続したネットワークは、ループバックインターフェース以外にネットワークインターフェースを持たない。

また、ノンネットワークに接続するには、他のネットワークを全て切断する必要がある。

$ docker run -itd --name none --network none alpine /bin/sh

# ネットワークに none だけ表示
$ docker inspect none
[
・・・省略
            "Networks": {
                "none": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "859bdc4605d9663accb6cc67ae8cba5df58face3c3d2fc395b48b50029e8a424",
                    "EndpointID": "452ffb88f3803ca3b416eff296979999857f42577899add2913e37da9989dfa1",
                    "Gateway": "",
                    "IPAddress": "",
                    "IPPrefixLen": 0,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "",
                    "DriverOpts": null     
]

$ docker attach none
/ # ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever

一方、ホストネットワークは、ホストドライバで接続したネットワークだ。

$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
88ca9c8c88e3        host                host                local

# 仮想マシンから抜けて IP アドレスと確認
exit 

$ docker-machine ip nw-vm1
192.168.99.100

現状だと、192.168.99.100 にアクセスしても何も表示されない。

スクリーンショット 2018-04-17 5.58.38.png

# 仮想環境に再接続
$ docker-machine ssh nw-vm1

# ホストネットワークで、 Nginx を立ち上げる
$ docker run -d --name web --network host nginx

再びアクセスしてみると今度は、Nginx のデフォルトページが表示された。

スクリーンショット 2018-04-17 6.00.11.png

ホストネットワークに接続すると Docker ホストと同じネットワーク環境を持ち、Web ページにも
アクセスすることができるようになる。

・Dockerのデータ管理

Docker には、3つのデータのマウント方法がある。

1.volume

一つ目は、volume だ。
仮想マシン上で、検証する。

# 仮想マシンを起動   
$ docker-machine create vol-test

# sshログイン
$ docker-machine ssh vol-test

# volumeを作成
$ docker volume create my-vol
my-vol

# 存在するボリュームを確認
$ docker volume ls
DRIVER              VOLUME NAME
local               my-vol

# volumeの詳細を確認
$ docker volume inspect my-vol
[
    {
        "CreatedAt": "2018-04-17T21:24:34Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/mnt/sda1/var/lib/docker/volumes/my-vol/_data",
        "Name": "my-vol",
        "Options": {},
        "Scope": "local"
    }
]

# volumeの削除
$ docker volume rm my-vol
my-vol

$ docker volume ls
DRIVER              VOLUME NAME

# Nginx コンテナに volume をマウント(volumeがない場合は、新規作成。/app 配下にマウントする)
$ docker run -itd --name mount-c1 -v vol1:/app nginx:latest

$ docker volume ls
DRIVER              VOLUME NAME
local               vol1

# マウントされているか確認
$ docker inspect mount-c1
"Mounts": [
            {
                "Type": "volume",
                "Name": "vol1",
                "Source": "/mnt/sda1/var/lib/docker/volumes/vol1/_data",
                "Destination": "/app",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }
        ],


# コンテナに接続して、volume の情報を確認
$ docker exec -it mount-c1 /bin/bash
$ df
Filesystem     1K-blocks   Used Available Use% Mounted on
none            18745336 164148  17590464   1% /
tmpfs              65536      0     65536   0% /dev
tmpfs             509764      0    509764   0% /sys/fs/cgroup
/dev/sda1       18745336 164148  17590464   1% /app
shm                65536      0     65536   0% /dev/shm
tmpfs             509764      0    509764   0% /proc/scsi
tmpfs             509764      0    509764   0% /sys/firmware

# 適当なファイルを作成
$ touch hogehoge
$ ls
hogehoge

# Nginxコンテナから抜ける
# exit

# 別のコンテナを立ち上げて、hogehoge ファイルを共有できるようにする
# mount コマンドでマウントする。(-v の別のマウント方法だが、動作は同じ)
$ docker run -itd --name mount-c2 --mount source=vol1,target=/a
pp nginx:latest

$ docker exec -it mount-c2 /bin/bash
$ ls -l /app
total 0
-rw-r--r-- 1 root root 0 Apr 17 21:34 hogehoge
※ 同じホスト間でのみ共有できる

$ exit

# 新規に volume を作成し、/etc/nginx にマウントする
$ docker run -itd --name mount-c3 --mount source=copy-vol1,dest
ination=/etc/nginx nginx

$ docker volume inspect copy-vol1
[
    {
        "CreatedAt": "2018-04-17T21:43:17Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/mnt/sda1/var/lib/docker/volumes/copy-vol1/_data",
        "Name": "copy-vol1",
        "Options": null,
        "Scope": "local"
    }
]

# 設定ファイル等がコピーされている
$ sudo ls -la /var/lib/docker/volumes/copy-vol1/_data
total 48
drwxr-xr-x    3 root     root          4096 Apr 17 21:43 .
drwxr-xr-x    3 root     root          4096 Apr 17 21:43 ..
drwxr-xr-x    2 root     root          4096 Apr 17 21:43 conf.d
-rw-r--r--    1 root     root          1007 Apr  9 16:01 fastcgi_params
-rw-r--r--    1 root     root          2837 Apr  9 16:01 koi-utf
-rw-r--r--    1 root     root          2223 Apr  9 16:01 koi-win
-rw-r--r--    1 root     root          5170 Apr  9 16:01 mime.types
lrwxrwxrwx    1 root     root            22 Apr  9 16:01 modules -> /usr/lib/nginx/modules
-rw-r--r--    1 root     root           643 Apr  9 16:01 nginx.conf
-rw-r--r--    1 root     root           636 Apr  9 16:01 scgi_params
-rw-r--r--    1 root     root           664 Apr  9 16:01 uwsgi_params
-rw-r--r--    1 root     root          3610 Apr  9 16:01 win-utf

# 読み取り専用でvolumeをマウントする
$ docker run -itd --name mount-c4 --mount source=copy-vol1,dest
ination=/etc/nginx,readonly nginx

$ docker inspect mount-c4 
"Mounts": [
            {
                "Type": "volume",
                "Name": "copy-vol1",
                "Source": "/mnt/sda1/var/lib/docker/volumes/copy-vol1/_data",
                "Destination": "/etc/nginx",
                "Driver": "local",
                "Mode": "z",
                "RW": false, <- readwrite が false
                "Propagation": ""
            }
        ],

# -vオプションを使った場合
$ docker run -itd --name mount-c5 -v copy-vol1:/etc/nginx:ro ng
inx

$ docker inspect mount-c5
"Mounts": [
            {
                "Type": "volume",
                "Name": "copy-vol1",
                "Source": "/mnt/sda1/var/lib/docker/volumes/copy-vol1/_data",
                "Destination": "/etc/nginx",
                "Driver": "local",
                "Mode": "ro",
                "RW": false,
                "Propagation": ""
            }
        ],

2.bind mount

マウントの2つ目の方法は、 「bind mount」 だ。

bind mount は、任意のディレクトやファイルを指定することができる。
(volume は Docker の管理領域のみ指定可能)

$ ls
html

# カレントディレクトリに存在しないディレクトリをマウント
# "$(pwd)"/source で、カレントディレクトリ上のsourceディレクトリをマウント
$ docker run -itd --name bind-test1 -v "$(pwd)"/source:/app nginx
3924e14975fa22b7be33a8f0a904f7a41f06bfa40673d45cf5fa060445b4b37f

# 自動的にsourceディレクトリを作成
$ ls
html    source

# マウントフラグを使用して存在しないディレクトリを作成しようとした場合はエラーになる
$ docker run -itd --name bind-test2 --mount type=bind,source="$(pwd)"/source2,target=/app nginx 
docker: Error response from daemon: invalid mount config for type "bind": bind source path does not exist.
See 'docker run --help'.

$ docker inspect bind-test1
"Mounts": [
            {
                "Type": "bind",
                "Source": "/Users/hoge/docker-tutrial/source",
                "Destination": "/app",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }

3.tmpfs

マウントの 3 つ目は、「tmpfs」 だ。

tmpfs は、ホストのメモリ上の領域をマウントされ、コンテナやホストが停止すると
保持していたデータが解放され、tmpfs が終了する。

# tmpfs でマウント
$ docker run -itd --name tmptest --mount type=tmpfs,destination=/app nginx
9d6bfaf0b6fc10b04ac21c590bf324a7e58660a9f25c8108b2122fb2c8c05f16

# マウントサイズとファイルモードの指定
$ docker run -itd --name tmptest2 --mount type=tmpfs,destination=/app,tmpfs-size=50000000,tmpfs-mode=700 nginx
ff68dc703c1453f54b2788bbe6c2cebc1dce1c3fc1897ac1939c4a5f689c35e0

・Docker compose

Docker compose は、複数の Docker コンテナを一度に作成したり、まとめて管理したりするためのツールだ。

開発環境や自動テスト環境を立ち上げる際によく利用されている。

<Compose実行のステップ>
1. Dockerfile を用意するか、使用するイメージを Docker Hub などに用意する
2. docker-compose.yml を定義する
3. docker-compose up を実行する

# Composeファイルを作成
$ vim docker-compose.yml

version: '3' # docker-compose のファイル形式のバージョン
services:
  web: #サービス名(任意の名前でいい)
    build: .  # docker-compose.yml と同じディレクトリをビルドコンテキストにする(ここに Dockerfile等を用意する必要がある)
    ports: # コンテナ内外に公開するポート
    - "5000:5000"
    volumes: # dokcer-compose.ymlが存在するディレクトリをcodeディレクトリにマウント
    - .:/code
    - logvolume01:/var/log
    links: # Webサービスからredisサービスへのリンク
    - redis
  redis: #サービス名(任意の名前でいい)
    image: redis
volumes:
   logvolume01:{}# /var/logにマウント

一応、Compose が使えるか確認する。

# バージョン確認
$ docker-compose -v
docker-compose version 1.20.1, build 5d8c71b

・Docker Compose を使用した Django 環境の立ち上げ

Django 環境を Docker Compose で立ち上げてみよう。

# ビルドコンテキスト用のディレクトリを作成
$ mkdir django
$ cd django

# pythonのDocker fileを作成
$ vim Dockerfile
FROM python:3 # python3 の実行環境を指定
ENV PYTHONUNBUFFERED 1 #環境変数を設定(pythonの標準出力やエラーをバッファに溜め込まない設定。1に意味はないが、PYTHONUNBUFFERED変数に何らかの値を入れると設定が有効になる)
RUN mkdir /code # code ディレクトリを作成 
WORKDIR /code # code ディレクトリに移動
COPY requirements.txt /code/ #ビルドコンテキスト上にあるファイルをcodeディレクトリに配置
RUN pip install -r requirements.txt # pip install する
COPY . /code/ # ビルドコンテキスト内の情報をcodeディレクトリに配置

# requirements.txt を作成(pip install でインストールするパッケージを定義)
$ vim requirements.txt
Django==2.0 # Django version 2 を指定
psycopg2 # Djangoから PostgreSQLにアクセスするためのドライバ 

# docker-compose.yml ファイルを作成
$ vim docker-compose.yml

version: '3'
services:
  db:
    image: postgres
  web:
    build: .
    command: python3 manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on: #webサービスが起動する前にDBサービスを起動させる設定
      - db

# カレントディレクトリに examplepj プロジェクトを立ち上げる
$ docker-compose run web django-admin.py startproject examplepj .

$ ls -l
total 32
-rw-r--r--  1 hogehoge  staff  147  4 19 06:42 Dockerfile
-rw-r--r--  1 hogehoge  staff  210  4 19 06:57 docker-compose.yml
drwxr-xr-x  6 hogehoge  staff  192  4 19 06:59 examplepj
-rwxr-xr-x  1 hogehoge  staff  541  4 19 06:59 manage.py
-rw-r--r--  1 hogehoge  staff   22  4 19 06:48 requirements.txt

# DB の設定を記述(mysql -> postgresに変更)
$ vim examplepj/settings.py 
ALLOWED_HOSTS = ['localhost']

・・・
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
    }
}

# デタッチモードで、サービスを立ち上げる
$ docker-compose up -d
django_db_1 is up-to-date
Creating django_web_1 ... done

localhost:8000 で、Web ページにアクセスしてみる。

スクリーンショット 2018-04-19 7.08.05.png

うまく立ち上がったようだ。

せっかくなので、Django のチュートリアルを少しやってみよう。

# pollsアプリを作成
$ docker-compose run web python3 manage.py startapp polls

$ ls -l
total 32
-rw-r--r--  1 hogehoge  staff  147  4 19 06:42 Dockerfile
-rw-r--r--  1 hogehoge  staff  210  4 19 06:57 docker-compose.yml
drwxr-xr-x  7 hogehoge  staff  224  4 19 07:07 examplepj
-rwxr-xr-x  1 hogehoge  staff  541  4 19 06:59 manage.py
drwxr-xr-x  9 hogehoge  staff  288  4 19 07:11 polls
-rw-r--r--  1 hogehoge  staff   22  4 19 06:48 requirements.txt

# indexページのビューを記述
$ vim polls/views.py
from django.http import HttpResponse

def index(request):
        return HttpResponse("Hello, world! You're at the polls index.")

$ vim polls/urls.py
from django.urls import path 

from . import views

urlpatterns = [
    path('', views.index, name='index'),
]

$ vim examplepj/urls.py 

from django.contrib import admin
from django.urls import path, include
urlpatterns = [
    path('admin/', admin.site.urls),
    path('polls/', include('polls.urls')),
]

ここまで設定できたら pollsの8000番ポートにアクセスしてみよう。

スクリーンショット 2018-04-19 19.55.15.png

最後にコンテナを停止しよう。

# コンテナを停止
$ docker-compose stop

その他、コマンドを確認する。

# docker-composeのプロセスを確認
$ docker-compose ps
    Name                  Command                State     Ports
----------------------------------------------------------------
django_db_1    docker-entrypoint.sh postgres    Exit 0          
django_web_1   python3 manage.py runserve ...   Exit 137  

$ docker-compose start
Starting db  ... done
Starting web ... done

$ docker-compose ps   
    Name                  Command               State           Ports         
------------------------------------------------------------------------------
django_db_1    docker-entrypoint.sh postgres    Up      5432/tcp              
django_web_1   python3 manage.py runserve ...   Up      0.0.0.0:8000->8000/tcp

・Swarm Mode

Swarm Mode は、Docker Engine の動作モードの一つで、クラスタ管理機能やオーケストレーション機能などを提供する。

1.Swarm クラスタの作成

マネージャーノード、ワーカーノード1、ワーカーノード2 という名前の Dokcer ホストを 3 台用意してクラスタ構成を組んでみる。

# マネージャーノード1を作成
$ docker-machine create manager1

# ワーカーノード1、2 を作成
$ docker-machine create worker1
$ docker-machine create worker2

# ホストの一覧
$ docker-machine ls 
NAME       ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
manager1   -        virtualbox   Running   tcp://192.168.99.100:2376           v18.04.0-ce   
worker1    -        virtualbox   Running   tcp://192.168.99.103:2376           v18.04.0-ce   
worker2    -        virtualbox   Running   tcp://192.168.99.104:2376           v18.04.0-ce  

# maneger1の環境変数を設定(このコマンドをうつとDovkerMachine上で、選択状態のノードになる)
$ eval $(docker-machine env manager1)

# この時点でのSwarmの状態を確認
$ docker info
Swarm: inactive # docker engine が Swarm モードで動作してない

# IPアドレスを確認(後で使用する)
$ docker-machine ip manager1
192.168.99.100

# Swarmの初期化(manager1がアクティブの状態で実行。またこのコマンドを実行したノードが、マネージャーノードになる)
$ docker swarm init --advertise-addr 192.168.99.100
To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-0u1wk0d3yob20g183peiv1n9frd3crpk48rrq4mot9ei55zxb5-1sh3stkyhw3m2k0ezpv5n6z63 192.168.99.100:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

$ docker info
Swarm: active

# ノードの一覧を表示(マネージャーノードでのみ実行可能)
$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
p39xw7r1919k7ph5qt69t67wz *   manager1            Ready               Active              Leader              18.04.0-ce

# Swarmワーカーノード参加用のコマンドを表示
$ docker swarm join-token worker
To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-0u1wk0d3yob20g183peiv1n9frd3crpk48rrq4mot9ei55zxb5-1sh3stkyhw3m2k0ezpv5n6z63 192.168.99.100:2377

# Swarmマネージャーノード参加用のコマンドを表示
$ docker swarm join-token manager
To add a manager to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-0u1wk0d3yob20g183peiv1n9frd3crpk48rrq4mot9ei55zxb5-ezuwa9oft0qo1nixnak3gmysn 192.168.99.100:2377

# worker1,2をSwarmに参加させる
$ eval $(docker-machine env worker1)
$ docker swarm join --token SWMTKN-1-0u1wk0d3yob20g183peiv1n9frd3crpk48rrq4mot9ei55zxb5-1sh3stkyhw3m2k0ezpv5n6z63 192.168.99.100:2377

$ eval $(docker-machine env worker2)
$ docker swarm join --token SWMTKN-1-0u1wk0d3yob20g183peiv1n9frd3crpk48rrq4mot9ei55zxb5-1sh3stkyhw3m2k0ezpv5n6z63 192.168.99.100:2377

# マネージャーノードを選択
$(docker-machine env manager1)

# ノードの状態を確認
$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
p39xw7r1919k7ph5qt69t67wz *   manager1            Ready               Active              Leader              18.04.0-ce
vpm6zddd5182ohat4iupi0pt2     worker1             Ready               Active                                  18.04.0-ce
q7xrcev2zyy2ntzpu931xlod9     worker2             Ready               Active                                  18.04.0-ce

2.Swarm Modeのサービスとタスク

Swarm クラスタ内で作成したノードでコンテナを起動するには、最初にサービスを作成する必要がある。
サービスは、何のイメージからいくつのコンテナを起動するか定義した物だ。

サービスを作る前に Swarm クラスタの構成を可視化できるコンテナを導入しよう。

# マネージャーノードをアクティブにする
$eval $(docker-machine env manager1)

# Swarmクラスタを可視化するコンテナを導入
$ docker run -d --name=viz --publish=8080:8080/tcp --mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock dockersamples/visualizer

# managerノードのIPアドレスと確認
$ docker-machine ip manager1
192.168.99.100

manager ノードの IP アドレスと 8080 ポートでアクセスすると現在の Swarm クラスタのの構成を確認できる。

スクリーンショット 2018-04-21 6.37.19.png

上記の図では、manager ノード 1 台、 worker ノード 2 台の合計 3 台のノードが動作していることがわかる。

次は、コンテナを起動するサービスを作成する。

# サービスを作成(3つのnginxタスクが作成)
$ docker service create -d --name nginx --replicas 3 --publish 8000:80 nginx

$ docker service ps nginx
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE             ERROR               PORTS
tfq8o13vpb7t        nginx.1             nginx:latest        manager1            Running             Preparing 9 seconds ago                       
ovc79aszrbnp        nginx.2             nginx:latest        worker1             Running             Preparing 9 seconds ago                       
on6dnq3qng70        nginx.3             nginx:latest        worker2             Running             Preparing 9 seconds ago                       

Swarm クラスタの構成は、以下のようになる。

スクリーンショット 2018-04-21 7.10.22.png

それぞれのノード上で Nginx が稼働しているので、それぞれアクセスが可能になっているはずだ。

$ docker-machine ls
NAME       ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
manager1   *        virtualbox   Running   tcp://192.168.99.100:2376           v18.04.0-ce   
worker1    -        virtualbox   Running   tcp://192.168.99.101:2376           v18.04.0-ce   
worker2    -        virtualbox   Running   tcp://192.168.99.102:2376           v18.04.0-ce  

192.168.99.100:8000 / 192.168.99.101:8000 / 192.168.99.102:8000 で、
Web上にアクセスすれば、問題なく nginx のトップページが表示される。

スクリーンショット 2018-04-21 7.13.14.png

3.サービスの管理コマンド

# 稼働中のサービスを確認
$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
jn3dcx7a7oaq        nginx               replicated          3/3                 nginx:latest        *:8000->80/tcp

# サービスの修正を行う(5050ポートにでも公開できるように変更)
$ docker service update --publish-add 5050:80 --detach=true nginx
nginx

$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
jn3dcx7a7oaq        nginx               replicated          3/3                 nginx:latest        *:5050->80/tcp, *:8000->80/tcp

# 変更前の状態に戻す
$ docker service rollback --detach=true nginx
nginx

$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
jn3dcx7a7oaq        nginx               replicated          3/3                 nginx:latest        *:8000->80/tcp

# もう一度コマンドを実行すると、ロールバックする前の状態に戻る
$ docker service rollback --detach=true nginx
$ docker service ls                          
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
jn3dcx7a7oaq        nginx               replicated          3/3                 nginx:latest        *:5050->80/tcp, *:8000->80/tcp

# ポートを削除
$ docker service update --publish-rm 5050:80 --detach=true nginx
nginx

$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
jn3dcx7a7oaq        nginx               replicated          3/3                 nginx:latest      

# サービスの詳細を表示
$ docker service inspect nginx
$ docker service inspect --pretty nginx

# タスクの一覧を表示
$ docker service ps nginx
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE             ERROR               PORTS
szc15f7wtszz        nginx.1             nginx:latest        manager1            Running             Running 3 minutes ago                         
s77f31rwr8dj         \_ nginx.1         nginx:latest        manager1            Shutdown            Shutdown 3 minutes ago                        
vnnlkqxnacw5         \_ nginx.1         nginx:latest        manager1            Shutdown            Shutdown 5 minutes ago                        
y99l47annm0r         \_ nginx.1         nginx:latest        manager1            Shutdown            Shutdown 7 minutes ago                        
tfq8o13vpb7t         \_ nginx.1         nginx:latest        manager1            Shutdown            Shutdown 11 minutes ago                       
9914p7juqdy7        nginx.2             nginx:latest        worker1             Running             Running 3 minutes ago                         
2e2v7y07p0yt         \_ nginx.2         nginx:latest        worker1             Shutdown            Shutdown 3 minutes ago                        
oczmy863stx6         \_ nginx.2         nginx:latest        worker1             Shutdown            Shutdown 5 minutes ago                        
j7d7oxiu85jj         \_ nginx.2         nginx:latest        worker1             Shutdown            Shutdown 7 minutes ago                        
ovc79aszrbnp         \_ nginx.2         nginx:latest        worker1             Shutdown            Shutdown 11 minutes ago                       
ogaxoda9hgl8        nginx.3             nginx:latest        worker2             Running             Running 3 minutes ago                         
d5scywoadosv         \_ nginx.3         nginx:latest        worker2             Shutdown            Shutdown 3 minutes ago                        
xonl77xehchd         \_ nginx.3         nginx:latest        worker2             Shutdown            Shutdown 5 minutes ago                        
yar4qtabedtz         \_ nginx.3         nginx:latest        worker2             Shutdown            Shutdown 7 minutes ago                        
on6dnq3qng70         \_ nginx.3         nginx:latest        worker2             Shutdown            Shutdown 11 minutes ago 

# サービスを削除
$ docker service remove nginx
nginx

$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS

# 特定のコンテナでサービスを実行(コンストレイント)
# コンストレイントを指定しない場合は、ノード間にタスクが分散される
# manager ノードのみにnginxコンテナを起動させる

$ docker service create --name nginx --constraint 'node.role==manager' --replicas 2 --detach=true nginx 
cjh56c2i30tfdbn30sfl3flwk

$ docker service ps nginx
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
hupl8l2bxswk        nginx.1             nginx:latest        manager1            Running             Running 24 seconds ago                       
fjyxd2u32mnl        nginx.2             nginx:latest        manager1            Running             Running 24 seconds ago

$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
cjh56c2i30tf        nginx               replicated          2/2                 nginx:latest

# 分散数を増やす
$ docker service scale nginx=4      

$ docker service ls           
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
cjh56c2i30tf        nginx               replicated          4/4                 nginx:latest     

# ノードの稼働状態を確認
$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
vsy5jiyy9jc429rk250baq068 *   manager1            Ready               Active              Leader              18.04.0-ce
b4w5v61mfmnrti03jilh2a8ix     worker1             Ready               Active                                  18.04.0-ce
7od1rcb4dyqxb5jjo4o8reo5g     worker2             Ready               Active                                  18.04.0-ce

# managerノードをドレイン(タスクを起動しない状態)に変更
$ docker node update --availability drain manager1
manager1

$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
vsy5jiyy9jc429rk250baq068 *   manager1            Ready               Drain               Leader              18.04.0-ce
b4w5v61mfmnrti03jilh2a8ix     worker1             Ready               Active                                  18.04.0-ce
7od1rcb4dyqxb5jjo4o8reo5g     worker2             Ready               Active                                  18.04.0-ce

4.Docker Composeを使用したサービスの作成

Wordpress のコンテナを例に、 Docker Compose でサービスを作成する。

まずは、docker-compose.yml ファイルを作成する

docker-compose.yml
version: '3.4' # composeファイルの形式のバージョンを指定

services: # wordpress / mysql サービスを定義
  wordpress:
    image: wordpress
    ports:
      - 8080:80 # 公開ポート
    environment:
      WORDPRESS_DB_PASSWORD: samplewp # wordpressで使用するDBのパスワードを指定
    deploy:
      replicas: 2
      placement:
        constraints:
          - node.role == worker
    depends_on: # mysqlサービスが先に起動する設定
      - mysql

  mysql: # wordpressはデフォルトで「mysql」というサービス名にアクセスするようになっている
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: samplewp # wordpressと同じパスワード
    volumes:
      - mysql_vol:/var/lib/mysql # データ領域をマウント
    deploy: # manager1で動作するように設定
      replicas: 1
      placement:
        constraints:
          - node.hostname == manager1

volumes:
   mysql_vol:

作成した compose ファイルで、Wordpress をデプロイする。

# wordpress をデプロイ
$ docker stack deploy --compose-file docker-compose.yml wp
Creating network wp_default
Creating service wp_mysql
Creating service wp_wordpress

# 存在するサービスを指定
$ docker stack ls
NAME                SERVICES
wp                  2

# wordpressのページにアクセスするため、manager1のIPアドレスを確認
$ docker-machine ls
NAME       ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
manager1   *        virtualbox   Running   tcp://192.168.99.100:2376           v18.04.0-ce   
worker1    -        virtualbox   Running   tcp://192.168.99.101:2376           v18.04.0-ce   
worker2    -        virtualbox   Running   tcp://192.168.99.102:2376           v18.04.0-ce 

# サービスを削除する(Wordpress画面を確認した後に不要になったら実行)
$ docker statck remove wp

web にアクセスすると wordpress が立ち上がっていることが確認できる。

スクリーンショット 2018-04-21 9.03.15.png

可視化するとこんな感じになった。

スクリーンショット 2018-04-21 9.06.44.png

ちなみに、ポートが被るとうまく行かないので注意しよう。

・プライベートレジストリ構築

Docker Hub を使って、外部に Docker イメージを公開できることは既に学習した。
しかし、Docker イメージを外部に公開したくない時もある。

Docker では、プライベートネットワーク内で Docker レジストリを構築できる registry という公式のイメージがある。

registry イメージを使って、プライベートネットワーク内のみにイメージを公開してみよう。

1.プライベートリポジトリの構築

最初に、registry イメージからプライベートレジストリを構築する。

# registryの検索
$ docker search registry
NAME                                    DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
registry                                The Docker Registry 2.0 implementation for s…   1978                [OK]

# registryイメージを取得
docker pull registry         

# イメージ一覧を確認
$ docker image ls
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
registry                   latest              d1fd7d86a825        3 months ago        33.3MB

# registryコンテナ起動
$ docker container run -d -p 5000:5000 --name registry registry

# コンテナの起動を確認
$ docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                                              NAMES
6533e1da3ea8        registry            "/entrypoint.sh /etc…"   About a minute ago   Up About a minute   0.0.0.0:5000->5000/tcp                             registry

2.Dockerイメージの作成

プライベートレジストリに公開する docker イメージを作成しよう。

$ vim Dockerfile
FROM nginx:latest
COPY default.conf /etc/nginx/conf.d/default.conf

3.Dockerfileのビルド

作成した Dockerfile から docker イメージを作成する。

# web-baseという名前のイメージを作成
# docker build -t web-base .

$ docker image ls
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
web-base                   latest              78062a937f43        21 hours ago        196MB

プライベートレジストリにイメージをアップロードするには、イメージにタグをつける必要がある。

# docker image tag ローカルのイメージ名 アップロードするレジストリのアドレス:ポート番号/イメージ名
$ docker image tag web-base localhost:5050/docker-webbase

$ docker image ls
REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE
localhost:5050/docker-webbase   latest              78062a937f43        21 hours ago        196MB

# プライベートレジストリにアップロード
$ docker image push localhost:5050/docker-webbase

# 削除
$ docker image rm localhost:5050/docker-webbase
$ docker image rm web-base

# プライベートリポジトリからダウンロード
$ docker image pull localhost:5050/docker-webbase

・Kitematic

KiteMatic は、Docker を GUI で管理するソフトウェアだ。

ただし、Mac 環境では、以下の図のようにインストーラの起動が途中で止まってしまう。

スクリーンショット 2018-04-21 9.26.21.png

Mac 上でインストールするためには、brew コマンドを使用する必要がある。

色々と回避策はあると思うが、ここでは、 Mac のパッケージ管理システムである brew を使うことで、回避しようと思う。

brew のサイトから実行コマンドを取得しよう。

# ターミナル上で、brewのインストール
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

# brewのアップデート
$ brew update

# docker-toolboxのインストール
$ brew cask install docker-toolbox

インストールに成功すると Application フォルダ配下に、「Kitematic(Beta).app」ファイルが作成されるのでクリックすると以下の画面が表示される。

スクリーンショット 2018-04-21 17.26.27.png

これを使えば、GUIベースでコンテナの作成・削除等が可能になるので、色々試してみるといい。

■まとめ

Docker を使えばインフラ環境の構築がすごく楽できそう。
使いこなすのが大変そうなので、色々と試行錯誤をする必要があるが、積極的に学んでいきたいと思う。

Git と連携して、開発環境の自動構築なんかもやっていきたいと思う。

__init__
PythonとGo言語が一番好きです。どちらも仕事で使っています!
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away