このチュートリアルでは、Alibaba CloudにDockerをインストールする方法を探り、コンテナサービスのデプロイと管理に役立ついくつかの重要なDockerコマンドを学びます。
本ブログは英語版からの翻訳です。オリジナルはこちらからご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。
#序章
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チャンネルにも掲載されています。
アリババクラウドは日本に2つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
アリババクラウドジャパン公式ページ