Ubuntu 16.04での「Docker」のインストールと使い方

このチュートリアルでは、**Alibaba Cloud**に**Docker**をインストールする方法を探り、コンテナサービスのデプロイと管理に役立ついくつかの重要なDockerコマンドを学びます。

*本ブログは英語版からの翻訳です。オリジナルは[こちら](https://www.alibabacloud.com/blog/how-to-install-and-use-docker-on-ubuntu-16-04_470612)からご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。*

#序章
Dockerは、開発者やシステム管理者向けのオープンソースプロジェクト（コンテナ管理サービス）で、ラップトップ、データセンターのVM、クラウド上で分散アプリケーションを構築、出荷、実行し、コンテナに出荷することで、どこにでもデプロイできるようにします。Dockerは、WindowsとLinuxベースのオペレーティングシステム上でオペレーティングシステムレベルの仮想化の自動化を提供します。
Dockerを使用することで、特定のスタックに依存することなく、簡単にWebアプリ、データベース、バックエンドサービスをデプロイしてスケーリングするためのブロックを構築することができます。

Dockerはいくつかのコンポーネントで構成されています。
1）Docker for Linux:Linux OS上でDockerコンテナを実行できるようにします。
2) Docker Engine:Dockerイメージの構築やDockerコンテナの作成に使用します。
3) Docker Hub:様々なDockerイメージを保存するために使用します。
4) Docker Compose: 複数のDockerコンテナを使用してアプリケーションを定義するために使用します。

####特徴
- Docker Swarmは、Dockerエンジンのグループを単一の仮想Dockerエンジンに変えるDockerコンテナのクラスタリングソリューションを提供します。
- Dockerは、小さなフットプリントのオペレーティングシステムを提供することで、開発の規模を縮小する能力を持っています。
- Dockerコンテナは非常に軽量で、容易に拡張可能です。
- 簡単かつ高速な設定を提供し、生産性を向上させる。
- アイソレーション環境であらゆる種類のアプリケーションを実行できるコンテナを提供する。

このチュートリアルでは、Dockerをインストールする方法を説明し、いくつかの重要なDockerコマンドを説明します。また、コマンドがどのように使われているのか、どのようなことをするのかについて、いくつかのハンズオン体験を共有します。

#前提条件
- Ubuntu 16.04をインストールした新鮮なAlibaba Cloud ECSインスタンス。
- インスタンスにルートパスワードが設定されています。

#Dockerのインストール
始める前に、Dockerの最新版をサーバーにインストールする必要があります。デフォルトでは、最新版のDockerはUbuntu 16.04のリポジトリでは利用できません。そのため、公式のDockerリポジトリをサーバーに追加する必要があります。

まず、以下のコマンドで公式DockerリポジトリのGPGキーをダウンロードしてシステムに追加します。

`curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - `を実行します。

次に、以下のコマンドでDockerリポジトリをaptのソースに追加します。

`echo "deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable" | sudo tee -a /etc/apt/sources.list.d/docker.list`

次に、リポジトリを更新し、以下のコマンドでDockerをインストールします。

```
shell
apt-get update -y
apt-get install  docker-ce -y
```

Dockerをインストールしたら、以下のコマンドでDockerの状態を確認することができます。

```
shell
systemctl status docker

● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2017-12-08 20:46:13 IST; 3min 2s ago
     Docs: https://docs.docker.com
 Main PID: 926 (dockerd)
    Tasks: 45
   Memory: 79.2M
      CPU: 7.463s
   CGroup: /system.slice/docker.service
           ├─ 926 /usr/bin/dockerd -H fd://
           ├─1453 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --st
           ├─2285 docker-containerd-shim e4202324477ae1870a77e12863ab3c79661cf8b7bfa617bb5709a816ea85194e /var/run/docker/libcontainerd/e420232
           └─2290 docker-containerd-shim 97bf4d277e0563906318bb276c3c65ebc274f28b6bb86cce80def795ecba76e2 /var/run/docker/libcontainerd/97bf4d2
```

#Dockerイメージのダウンロード
コンテナはDockerイメージを使って構築するので、まずはDockerイメージを引っ張ってくる必要があります。Dockerのサイトにはすでにたくさんのイメージが公開されています。簡単な検索コマンドで任意のイメージを見つけることができます。

例えば、Ubuntu 16.04のイメージを検索するには、以下のコマンドを実行します。

`docker search ubuntu:16.04`

すると、Dockerのウェブサイトに以下のような画像が公開されているはずです。

```
shell
NAME                                           DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
ubuntu                                         Ubuntu is a Debian-based Linux operating s...   6917                [OK]                
ubuntu-upstart                                 Upstart is an event-based replacement for ...   80                  [OK]                
ubuntu-debootstrap                             debootstrap --variant=minbase --components...   32                  [OK]                
mlaccetti/docker-oracle-java8-ubuntu-16.04     Oracle Java 8 on Ubuntu 16.04 LTS               4                                       [OK]
gocd/gocd-agent-ubuntu-16.04                   Docker GoCD agent for Ubuntu 16.04              2                                       
seresearch/opendavinci-ubuntu-16.04            Docker image with all Ubuntu 16.04 depende...   2                                       [OK]
proudmail/ubuntu-16.04                         Create ubuntu 16.04                             1                                       [OK]
superkumkum/ubuntu-16.04                       base image of ubuntu 16.04                      0                                       [OK]
gocdexperimental/gocd-agent-ubuntu-16.04       Experimental GoCD Agent - Ubuntu 16.04          0                                       
dokken/ubuntu-16.04                            For use with kitchen-dokken, Base image pl...   0                                       
keithf/ubuntu-16.04-armhf                      Ubuntu 16.04 for ARM-based devices.             0                                       
neoncluster/ubuntu-16.04                       Ubuntu 16.04 image with recent package upg...   0                                       
cdbishop89/docker-ubuntu-16.04                 Base Ubuntu 16.04 Image                         0                                       [OK]
vlex/ubuntu-16.04-node                         Ubuntu 16.04 with node 6.1.0                    0                                       
seresearch/opendavinci-ubuntu-16.04-complete                                                   0                                       
itsspeed/ubuntu-16.04-python                   Base Ubuntu 16.04 image with python and pi...   0                                       
syseleven/ubuntu-16.04-puppet4                 ubuntu-16.04-puppet4                            0                                       [OK]
opencpu/ubuntu-16.04                           OpenCPU Server builds for Ubuntu 16.04 (Xe...   0                                       [OK]
lgong/mml-ubuntu-16.04                                                                         0                                       
stafory/ubuntu-16.04-ci                                                                        0                                       
kensenshi/ubuntu-16.04-oracle-java8-ant        Oracle Java 8 and ANT on Ubuntu 16.04.          0                                       
naritadev/narita-ubuntu-16.04                  Narita Ubuntu 16.04 Distro                      0                                       
addle/ubuntu-16.04                             Ubuntu 16.04 LTS (Xenial Xerus)                 0                                       
uberr2000/ink-ubuntu-16.04                     ubuntu 16.04 with nginx ,phalcon ,mysql,ph...   0                                       
syseleven/ubuntu-16.04-puppet5                 ubuntu-16.04-puppet5                            0                                       [OK]
```

次に、上記の画像からUbuntu-16.04のベースイメージをダウンロードします。

`docker pull ubuntu`

出力は以下のようになります。

```
Using default tag: latest
latest: Pulling from library/ubuntu
660c48dd555d: Pull complete 
4c7380416e78: Pull complete 
421e436b5f80: Pull complete 
e4ce6c3651b3: Pull complete 
be588e74bd34: Pull complete 
Digest: sha256:7c67a2206d3c04703e5c23518707bdd4916c057562dd51c74b99b2ba26af0f79
Status: Downloaded newer image for ubuntu:latest
```

ダウンロードが完了したら、以下のコマンドを実行することで、システム上で利用可能なすべてのイメージを一覧表示することができます。

`docker images`

出力します。

```
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
ubuntu                       latest              20c44cd7596f        3 weeks ago         123MB
```

#Dockerコンテナの起動
さて、基本的なubuntu-16.04のコンテナをbashシェルで設定するには、コマンドを1つ実行するだけです。

`docker run -i -t ubuntu /bin/bash`

以下のような出力が表示されるはずです。

`root@0b775c3f606d:/#`

さて、Ubuntuのベースイメージとインスタンスの準備ができたら、Apacheサーバをインタラクティブにインストールすることができます。そのためには、ターミナルで以下のコマンドを実行する必要があります。

```
shell
apt-get update -y
apt-get install apache2 apache2-utils -y
```

これで、Ubuntu Dockerコンテナ内でbashシェルを使用していることになります。終了せずにシェルから切り離す、または切り離すには、Ctrl-p + Ctrl-qのエスケープシーケンスを使用します。

これで、Ubuntuインスタンスで行った変更を保存することができます。そのためには、まず、実行中のUbuntuインスタンスのコンテナIDが必要になります。それを取得するには、実行します。

`docker ps`

以下のような出力が表示されるはずです。

```
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
0b775c3f606d        ubuntu              "/bin/bash"              36 minutes ago      Up 36 minutes                               dreamy_murdock
```

さて、以下のコマンドを実行して、変更内容をubuntu-apacheという名前の新しいイメージとして保存します。

```
docker commit 0b775c3f606d ubuntu-apache

sha256:6997db13c6587d1403c2360515d29028a30de786101c4ec26faddc505f5242c4
```

コンテナIDとイメージ名ubuntu-apacheを使用して変更が保存されていることがわかります。
新しいイメージが実行されているかどうかを確認するには、実行します。

```
docker images

REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
ubuntu-apache                latest              6997db13c658        30 seconds ago      261MB
ubuntu                       latest              20c44cd7596f        3 weeks ago         123MB
```

#Dockerでアプリケーションを起動
これで、Apache Web サーバを含む新しいイメージができました。そのイメージを元にDockerfileをビルドし、必要なファイルを追加することができます。サイトコンテンツのtarballへの相対パスが与えられると、Dockerは自動的にソースのtarまたはzipファイル内のファイルをターゲットディレクトリにアンタールまたはアンジップします。

これを行うには、ホストシステム上にindex.htmlファイルを作成し、カレントディレクトリにあるapplication.tarというtarballに追加する必要があります。

```
mkdir application
nano application/index.html
```

以下の行を追加します。

```
html
<html>
Sample Apache Web Page
</html>
```

保存してファイルを閉じます。

それでは、tarを使ってWebサイトのディレクトリを圧縮します。

`tar -cvf application.tar application`

さて、Webサイトの内容をubuntu-apacheイメージに追加するためのDockerfileを作成し、ポート80でApacheを起動します。

`nano Dockerfile`

以下の行を追加します。

```
Dockerfile
FROM ubuntu-apache
ADD application.tar /tmp/
RUN mv /tmp/application/* /var/www/html/
EXPOSE 80
ENTRYPOINT [ "/usr/sbin/apache2ctl" ]
CMD [ "-D", "FOREGROUND" ]
```

保存してファイルを閉じます。

上記のDockerfileでは、website.tar内のwebsiteの内容が自動的に/tmp/フォルダに展開されます。そして、サイト全体がApacheのルートディレクトリ/var/www/html/に移動し、expose80が80番ポートを開くので、正常にサイトが利用できるようになります。そして、エントリーポイントを/usr/sbin/apache2に設定して、Apacheサーバが実行されるようにします。

さて、先ほど作成したDockerfileを使ってコンテナを構築し、その上にWebサイトを追加していきます。

そのためには、以下のコマンドを実行します。

`docker build -t application .`

以下のような出力が表示されるはずです。

```
shell
Sending build context to Docker daemon  71.68kB
Step 1/6 : FROM ubuntu-apache
 ---> 6997db13c658
Step 2/6 : ADD application.tar /tmp/
 ---> 9b20f474c3a0
Step 3/6 : RUN mv /tmp/application/* /var/www/html/
 ---> Running in 6f0b4a29cc8a
 ---> a5ffa4710b58
Removing intermediate container 6f0b4a29cc8a
Step 4/6 : EXPOSE 80
 ---> Running in e4ef5dfc0838
 ---> a584d0068bb6
Removing intermediate container e4ef5dfc0838
Step 5/6 : ENTRYPOINT /usr/sbin/apache2ctl
 ---> Running in ab5bda3f593a
 ---> 65f187a34ce6
Removing intermediate container ab5bda3f593a
Step 6/6 : CMD -D FOREGROUND
 ---> Running in b8ddd1d006b5
 ---> 354383fb2666
Removing intermediate container b8ddd1d006b5
Successfully built 354383fb2666
Successfully tagged application:latest
```

イメージが構築できたら、その上でApacheのインスタンスを実行するコンテナを作成して進めます。

`docker run -d -P application`

出力します。
`a749b23fb87c821b69479353bf067f2b1af53fd0fd300ad86ac5c028dd5dcbde`

さて、"docker ps "コマンドを使用してアクティブ化されたポートを判断し、curlを使用してサンプルの内容を検査します。

`docker ps`

以下のような出力が表示されるはずです。

```
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
a749b23fb87c        application         "/usr/sbin/apache2..."   30 seconds ago      Up 28 seconds       0.0.0.0:32768->80/tcp   nifty_bose
```

ここで、以下のコマンドを実行してApache Webサーバを確認します。

`curl localhost:32768`

または

`curl "Container IP Address”:80`

先ほど作成したApacheのWebページが表示されているはずです。

```
html
<html>
Sample Apache Web Page
</html>
```

#Dockerコマンドを使った作業
まずはDockerが持っているすべての利用可能なコマンドを見てみましょう。以下のコマンドを実行することで、利用可能なDockerコマンドをすべて一覧表示することができます。

`docker`

Dockerのバージョンを確認するには、実行します。

`docker version`

出力します。

```
Client:
 Version:      17.09.0-ce
 API version:  1.32
 Go version:   go1.8.3
 Git commit:   afdb6d4
 Built:        Tue Sep 26 22:42:18 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.09.0-ce
 API version:  1.32 (minimum version 1.12)
 Go version:   go1.8.3
 Git commit:   afdb6d4
 Built:        Tue Sep 26 22:40:56 2017
 OS/Arch:      linux/amd64
 Experimental: false
```

Dockerのシステム全体の情報を確認するには、実行します。

`docker info`

以下のような出力が表示されるはずです。

```
Containers: 2
 Running: 1
 Paused: 0
 Stopped: 1
Images: 2
Server Version: 17.09.0-ce
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
```

実行中のコンテナをすべてリストアップするには、実行します。

`docker ps`

作成した最新のコンテナを一覧表示するには、実行します。

`docker ps -l`

実行中のコンテナと実行していないコンテナの両方をリストアップするには、実行します。

`docker ps -a`

コンテナのプロセスを起動・停止するには、以下のように実行します。

docker start "Container ID”
docker stop "Container ID" 

実行中のコンテナをすべて停止するには、実行します。

`docker stop $(docker ps -a -q)`

注: コンテナIDはsudo docker psコマンドを使って調べられます。

実行中のコンテナにアタッチしたい場合、Dockerではattachコマンドを使って実行中のコンテナと対話することができます。

`docker attach "Container ID”`

コンテナIDを指定したexpectコマンドを使うと、Dockerコンテナに関するあらゆる情報を確認することができます。

`docker inspect "Container ID”`

単一のコンテナを削除するには、実行します。

`docker rm "Container ID”`

既存のコンテナをすべて削除するには、実行します。

`docker rm $(docker ps -a -q)`

注: コンテナを削除する前に、まずコンテナを停止する必要があります。

1つのイメージを削除するには、image IDを指定してrmiコマンドを使用します。イメージIDは "docker images "コマンドを使って取得できます。

`docker rmi "Image ID”`

既存のイメージをすべて削除するには、実行します。

`docker rmi $(docker images -q -a)`

Dockerコンテナをデーモンとして実行している場合、実行中のコンテナのコンソール出力に何が表示されるかを知っておくと便利かもしれません。

Docker logsコマンドは実行時に存在するログを取得します。

コンテナIDを指定してDocker logコマンドを使うことができます。

`docker log -f "container ID”`

#結論
おめでとうございます。これでDockerのインストールと実行が完了しました。これで、本番環境でDockerコンテナをインストールして使うための知識が十分に身についたと思います。Dockerの詳細については、Dockerの公式ドキュメントページを参照してください。その他のチュートリアルは、[Alibaba Cloud Getting Started](https://www.alibabacloud.com/ja/getting-started)チャンネルにも掲載されています。

*アリババクラウドは日本に２つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
[アリババクラウドジャパン公式ページ](https://www.alibabacloud.com/ja)*