初めに
今回はDockerの初級編ということで「Docker」のインストールとコンテナの起動方法及び複数のコンテナを一気に起動させるために[Docker Compose]の導入から使用までをやってみます。
起動させるコンテナはそれぞれ別のページを表示させるWEBサーバにしようかと考えています
(サーバ構成は正直適当に考えました!)
事前準備
・AWSインスタンス
→ 参照:この記事で作成したインスタンスを使います
やり方
【手順1】Dockerのインストール
まずはコンテナ作成のためのパッケージを導入します。でも以前作成したインスタンスの状態で導入を行っても失敗するため[Docker-ce]のリポジトリを追加します。
- 以下のコマンドを実行して作業前のリポジトリを確認します
$ ls -l /etc/yum.repos.d
[centos@ip-xx-xx-xx-xx ~]$ ls -l /etc/yum.repos.d
total 32
-rw-r--r--. 1 root root 1664 May 17 2018 CentOS-Base.repo
-rw-r--r--. 1 root root 1309 May 17 2018 CentOS-CR.repo
-rw-r--r--. 1 root root 649 May 17 2018 CentOS-Debuginfo.repo
-rw-r--r--. 1 root root 314 May 17 2018 CentOS-fasttrack.repo
-rw-r--r--. 1 root root 630 May 17 2018 CentOS-Media.repo
-rw-r--r--. 1 root root 1331 May 17 2018 CentOS-Sources.repo
-rw-r--r--. 1 root root 4768 May 17 2018 CentOS-Vault.repo
[centos@ip-xx-xx-xx-xx ~]$
2) 以下のコマンドを実行して[Docker-ce]のリポジトリを追加する
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[centos@ip-xx-xx-xx-xx ~]$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
Loaded plugins: fastestmirror
adding repo from: https://download.docker.com/linux/centos/docker-ce.repo
grabbing file https://download.docker.com/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo
[centos@ip-xx-xx-xx-xx ~]$
3) 再度手順[1)]のコマンドを実行しリポジトリが追加されたことを確認する
$ ls -l /etc/yum.repos.d
[centos@ip-xx-xx-xx-xx ~]$ ls -l /etc/yum.repos.d
total 36
-rw-r--r--. 1 root root 1664 May 17 2018 CentOS-Base.repo
-rw-r--r--. 1 root root 1309 May 17 2018 CentOS-CR.repo
-rw-r--r--. 1 root root 649 May 17 2018 CentOS-Debuginfo.repo
-rw-r--r--. 1 root root 314 May 17 2018 CentOS-fasttrack.repo
-rw-r--r--. 1 root root 630 May 17 2018 CentOS-Media.repo
-rw-r--r--. 1 root root 1331 May 17 2018 CentOS-Sources.repo
-rw-r--r--. 1 root root 4768 May 17 2018 CentOS-Vault.repo
-rw-r--r--. 1 root root 2424 Oct 24 17:22 docker-ce.repo
[centos@ip-xx-xx-xx-xx ~]$
↑新しく[docker-ce.repo]が追加されているのがわかるかと思います
4) 以下のコマンドを実行して[Docker-ce]を導入する
$ sudo yum install -y docker-ce
[centos@ip-xx-xx-xx-xx ~]$ sudo yum install -y docker-ce
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
<中略>
Dependency Installed:
container-selinux.noarch 2:2.68-1.el7 containerd.io.x86_64 0:1.2.0-3.el7
docker-ce-cli.x86_64 1:18.09.0-3.el7 libtool-ltdl.x86_64 0:2.4.2-22.el7_3
Complete!
[centos@ip-xx-xx-xx-xx ~]$
4)補足 リポジトリを追加しないで[Docker-ce]を導入した場合
→ 当然ながらエラーが返ってきます
[centos@ip-xx-xx-xx-xx ~]$ sudo yum install -y docker-ce
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirror.mobap.edu
* extras: mirror.ash.fastserv.com
* updates: mirror.steadfastnet.com
base | 3.6 kB 00:00
extras | 3.4 kB 00:00
updates | 3.4 kB 00:00
No package docker-ce available.
Error: Nothing to do
[centos@ip-xx-xx-xx-xx ~]$
- dockerコマンドを実行し導入されたことを確認する
$ docker -v
[centos@ip-xx-xx-xx-xx ~]$ docker -v
Docker version 18.09.0, build 4d60db4
[centos@ip-xx-xx-xx-xx ~]$
↑上記結果のようにバージョンが表示されれば導入は成功していますが、今のままでは導入されてても使える状況ではありません。ではDockerが使えるかどうかを確認します
$ sudo docker ps
※稼働中のコンテナの状況を確認するコマンドです
[centos@ip-xx-xx-xx-xx ~]$ docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
[centos@ip-xx-xx-xx-xx ~]$
↑のようにDockerDaemonにアクセスできないと怒られます。この答えはサービスです。ではサービスがどうなっているのかを確認します
$ systemctl status docker
[centos@ip-xx-xx-xx-xx ~]$ systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: inactive (dead)
Docs: https://docs.docker.com
[centos@ip-xx-xx-xx-xx ~]$
↑のように[Active: inactive (dead)]になっており起動されていないことがわかります。ではサービスを起動させて先ほど失敗したコマンドを実行します
$ sudo systemctl start docker
$ systemctl status docker
$ sudo docker ps
[centos@ip-xx-xx-xx-xx ~]$ sudo systemctl start docker
[centos@ip-xx-xx-xx-xx ~]$ systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: active (running) since Fri 2018-11-23 13:02:15 UTC; 7s ago
Docs: https://docs.docker.com
Main PID: 10144 (dockerd)
Tasks: 8
Memory: 30.6M
CGroup: /system.slice/docker.service
mq10144 /usr/bin/dockerd -H unix://
<略>
[centos@ip-xx-xx-xx-xx ~] sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[centos@ip-172-31-26-24 ~]$
↑のように今度は[docker ps]の結果が返ってきてインストールと起動は成功しました
【手順2】dockerfileの作成とコンテナ起動
Dockerのインストールは終わりました。次にDockerのコンテナを起動させます。Dockerのコンテナを起動させるのはインターネット上にあるイメージファイルを落としてきて起動させる方法と自分でDockerFileを作成してbuildするやり方がありますが、コンテナ運用では基本的にDockerfileを使用します。したがって今回はDockerfileを作成してコンテナを起動させます
1) 以下のコマンドを実行してDockerfileと格納用のディレクトリを作成します
$ sudo mkdir -p /doc-file/web/
$ sudo mkdir -p /doc-file/web2/
$ sudo vi /doc-file/web/dockerfile
[centos@ip-xx-xx-xx-xx ~]$ sudo mkdir -p /dok-file/web/
[centos@ip-xx-xx-xx-xx ~]$ sudo mkdir -p /dok-file/web2/
[centos@ip-xx-xx-xx-xx ~]$ sudo vi /doc-file/web/dockerfile
# centosのイメージファイルを使用する
FROM centos
# installコマンドとWebページの展開、Config設定
RUN yum install -y httpd
RUN echo "This is a Web Page" >> /var/www/html/index.html
RUN sed -ri "s/#ServerName www.example.com:80/ServerName www.example.com:80/g" /etc/httpd/conf/httpd.conf
# サービス自動起動設定
RUN systemctl enable httpd
# コンテナ内部で使用するポートを設定
EXPOSE 80
:wq
※/dok-file/web/dockerfileに記載しているコマンドは通常のインストールコマンドにそれぞれRUN等を追記しています。
それぞれのコマンドの意味は以下の表を参照してください
Dockerコマンド | 意味 |
---|---|
FROM | Dockerイメージの指定 |
RUN | コマンド実行 |
COPY | ディレクトリ、ファイルのコピー |
Add | ディレクトリ、ファイルの作成 |
Env | 環境変数の指定 |
EXPOSE | ポート指定 |
MAINTENER | 作成者の情報 |
USER | 実行ユーザの指定 |
WORKDIR | 作業ディレクトリの指定 |
VOLUME | ボリュームのマウント |
2) イメージビルドとコンテナ起動
作成したDockerFileを使用してコンテナを起動させます。コンテナの起動はイメージにビルドしてからビルドしたイメージを起動させる流れになります
1)以下のコマンドを実行してDockerfileをイメージにビルドする
$ sudo docker images
$ sudo docker build -t centos/web /doc-file/web
$ sudo docker images
[centos@ip-172-31-26-24 ~]$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[centos@ip-172-31-26-24 ~]$ sudo docker build -t centos/web /doc-file/web
Sending build context to Docker daemon 3.072kB
Step 1/6 : FROM centos
latest: Pulling from library/centos
aeb7866da422: Pull complete
Digest: sha256:67dad89757a55bfdfabec8abd0e22f8c7c12a1856514726470228063ed86593b
Status: Downloaded newer image for centos:latest
---> 75835a67d134
Step 2/6 : RUN yum install -y httpd
---> Running in 8fe0914012aa
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
<中略>
Complete!
Removing intermediate container 8fe0914012aa
---> b86f81848ed1
Step 3/6 : RUN echo "This is a Web Page" >> /var/www/html/index.html
---> Running in 091785345e62
Removing intermediate container 091785345e62
---> ad550e9cf55b
Step 4/6 : RUN sed -ri "s/#ServerName www.example.com:80/ServerName www.example.com:80/g" /etc/httpd/conf/httpd.conf
---> Running in 159c80ef1fef
Removing intermediate container 159c80ef1fef
---> bd14c6dedef2
Step 5/6 : RUN systemctl enable httpd
---> Running in 0172bf0d69e5
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service, pointing to /usr/lib/systemd/system/httpd.service.
Removing intermediate container 0172bf0d69e5
---> d1f528a6359b
Step 6/6 : EXPOSE 80
---> Running in 176f4d8b46ce
Removing intermediate container 176f4d8b46ce
---> 7dfa2abbb54d
Successfully built 7dfa2abbb54d
Successfully tagged centos/web:latest
[centos@ip-xx-xx-xx-xx ~]$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos/web latest 7dfa2abbb54d 18 seconds ago 333MB
centos latest 75835a67d134 6 weeks ago 200MB
↑上記の通りDockerImageが表示されているのがわかると思います
次にコンテナの起動を行います
$ sudo docker images
$ sudo docker run -p 8080:80 -itd --privileged centos/web /sbin/init
$ sudo docker ps
注意:[--privileged],[/sbin/init]について
ビルドしたDockerイメージをコンテナ起動させる際に以下のコマンドを実行します。ですがその際Dockerfile内にサービスに関するコマンドがある場合(systemctl)は特権モード(--privileged)とsbinでコマンド起動しないとサービスコマンド実行時エラーが発生しします
Failed to get D-Bus connection: Operation not permitted
これはサービスのコマンドが実行できないがために起こるエラーになります
注意:[-p 8080:80]について
こちらはポートバインディングになります。コンテナで作成したWEBサイトを外部から表示させる際内部的にポートの設定する必要があります。外部から来た8080ポートの指定はコンテナでの80番ポートを示しています
[centos@ip-172-31-26-24 ~]$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[centos@ip-172-31-26-24 ~]$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos/web latest 7dfa2abbb54d 19 minutes ago 333MB
centos latest 75835a67d134 6 weeks ago 200MB
[centos@ip-172-31-26-24 ~]$ sudo docker run -p 8080:80 -itd --privileged 7dfa2ab
bb54d /sbin/init
0ab5d448af5c3d733353c88a768be71a498826ebfaa5a9f6e3f657d192bce9f7
[centos@ip-172-31-26-24 ~]$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c25360100fba centos/web "/sbin/init" 11 seconds ago Up 10 seconds 0.0.0.0:8080->80/tcp eager_yalow
[centos@ip-172-31-26-24 ~]$
↑のように最終的に[Docker ps]を打ち込んだ時にプロセスのstateがUpになっていればコンテナは起動しています
【手順3】Dockerコンテナのログイン
次は作成したコンテナにログインします。コンテナは仮想マシンの1種なので、Dockerを導入したマシンは[Dockerhost]と呼ばれたりします。一般的に言うコンテナは[Docker ps]コマンドで表示されるプロセスのことになります。
1)以下のコマンド実行してログインします
※Dockerhostから
$ sudo docker exec -it [containerID] bash
[centos@ip-xx-xx-xx-xx ~]$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c25360100fba centos/web "/sbin/init" 11 seconds ago Up 10 seconds 0.0.0.0:8080->80/tcp eager_yalow
[centos@ip-xx-xx-xx-xx ~]$ sudo docker exec -it c25360100fba bash
[root@c25360100fba /]#
↑のようにコンテナのIDが表示されていればコンテナにログイン成功です
次にログアウトをします
※Dockerコンテナから
$ exit
[root@c25360100fba /]# exit
exit
[centos@ip-xx-xx-xx-xx ~]$
【手順3】Dockerコンテナの削除
起動させているコンテナを停止してからイメージファイルを削除します
- 以下のコマンドを実行し稼働中のコンテナを停止する
$ sudo docker ps
$ sudo docker stop [containerID]
$ sudo docker ps
[centos@ip-xx-xx-xx-xx ~]$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0ab5d448af5c 7dfa2abbb54d "/sbin/init" 20 minutes ago Up 20 minutes 0.0.0.0:8080->80/tcp flamboyant_williamson
[centos@ip-xx-xx-xx-xx ~]$ sudo docker stop 0ab5d448af5c
0ab5d448af5c
[centos@ip-xx-xx-xx-xx ~]$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[centos@ip-xx-xx-xx-xx ~]$
- 以下のコマンドを実行し停止中のコンテナを削除する
$ sudo docker ps -a
※[-a]オプションは起動停止関係なく登録されているコンテナをすべて表示させます
$ sudo docker rm [containerID]
$ sudo docker ps -a
[centos@ip-xx-xx-xx-xx ~]$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0ab5d448af5c 7dfa2abbb54d "/sbin/init" 24 minutes ago Exited (137) 3 minutes ago flamboyant_williamson
[centos@ip-xx-xx-xx-xx ~]$ sudo docker rm 0ab5d448af5c
0ab5d448af5c
[centos@ip-xx-xx-xx-xx ~]$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[centos@ip-172-31-26-24 ~]$
- 以下のコマンドを実行しイメージをすべて削除する
$ sudo docker images
$ sudo docker rmi [imageID]
※[imageID]は複数指定が可能です
$ sudo docker images
[centos@ip-xx-xx-xx-xx ~]$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos/web latest 7dfa2abbb54d About an hour ago 333MB
centos latest 75835a67d134 6 weeks ago 200MB
[centos@ip-xx-xx-xx-xx ~]$ sudo docker rmi 7dfa2abbb54d 75835a67d134
Untagged: centos/web:latest
Deleted: sha256:7dfa2abbb54d73640811f5108843702a8df76fa0047cf2ddc5f7ac6bb0b19d66
<中略>
Untagged: centos:latest
<中略>
Deleted: sha256:f972d139738dfcd1519fd2461815651336ee25a8b54c358834c50af094bb262f
sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[centos@ip-xx-xx-xx-xx ~]$
↑のようにすべてのイメージを消えていれば削除成功となります
【手順4】Dockercomposeのインストール
Docker composeはDockerの複数実行や停止を可能とさせるツールになります。Composeが入っていない場合は一台づつ起動停止を行いますがComposeがあればYamlファイルを使用して一斉に起動かけたり停止かけたりします。
■事前準備
・Dockerが入ったサーバ : 先に構築したDockerサーバを使用します
・Dockerfile : 今回はわかりやすくするため先に作ったDockerfileのWEBページのメッセージを変えたものを別コンテナで作成します
1) 以下のコマンドを実行し[Docker]作成時に自動作成されるDockerグループにユーザを参加させます。また設定を反映させるためにサービスの再起動を行い、ログオフしてログインします
$ cat /etc/group | grep docker
$ groups centos
$ sudo usermod -aG docker $USER
$ groups centos
$ sudo systemctl restart docker
$ exit
[centos@ip-xx-xx-xx-xx ~]$ groups centos
centos : centos adm wheel systemd-journal
[centos@ip-xx-xx-xx-xx ~]$ sudo usermod -aG docker $USER
[centos@ip-xx-xx-xx-xx ~]$ groups centos
centos : centos adm wheel systemd-journal docker
[centos@ip-xx-xx-xx-xx ~]$ sudo systemctl restart docker
[centos@ip-xx-xx-xx-xx ~]$ exit
2) 以下のコマンドを実行し[Docker compose]を導入します
$ sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version
[centos@ip-xx-xx-xx-xx ~]$ sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 617 0 617 0 0 2585 0 --:--:-- --:--:-- --:--:-- 2592
100 8648k 100 8648k 0 0 10.9M 0 --:--:-- --:--:-- --:--:-- 10.9M
[centos@ip-xx-xx-xx-xx ~]$ sudo chmod +x /usr/local/bin/docker-compose
[centos@ip-xx-xx-xx-xx ~]$ docker-compose --version
docker-compose version 1.16.1, build 6d1ac21
[centos@ip-xx-xx-xx-xx ~]$
↑のようにバージョンが表示されていれば導入成功です
【手順5】Docker-comporse.yml作成
Dockerコンテナを複数起動させるためにYmlファイルを作成します。書き方は多種多様になるため、ここでは複数起動させることだけを目的にしてシンプルに記載します。詳細を知りたい場合はDocker-compose.ymlのドキュメントを参照してください
1) 以下のコマンドを実行し[Docker-compose.yml]を作成する
$ sudo vi /doc-file/docker-compose.yml
version: '3'
services:
web1: // コンテナの指定
build: "/doc-file/web" // Dockerfileのパスを指定
container_name: "web-01" // 起動させるコンテナの名前を指定
image: centweb-01 // 使用するイメージファイル名
privileged: true // サービス関連のコマンドを扱うときは必須
command: /sbin/init // サービス関連のコマンドを扱うときは必須
tty: true // これがないと起動してもすぐにダウンする
ports: // 使用するポートの指定
- 8080:80 // (Dockerホストのポート):(コンテナ内部のポート)
web2:
build: "/doc-file/web2"
container_name: "web-02"
image: centweb-02
privileged: true
command: /sbin/init
tty: true
ports:
- 9090:80
2) 以下のコマンドを実行してコンテナを起動させる
# docker-compose.ymlが存在しているパスに移動
$ cd /doc-file
$ docker-compose up -d
$ docker ps
[centos@ip-xx-xx-xx-xx ~]$ docker-compose up -d
Creating network "docfile_default" with the default driver
Creating web-02 ...
Creating web-01 ...
Creating web-02
Creating web-02 ... done
[centos@ip-xx-xx-xx-xx ~]$ docker ps
[centos@ip-xx-xx-xx-xx doc-file]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6541757c6926 centweb-02 "/sbin/init" 7 minutes ago Up 7 minutes 0.0.0.0:9090->80/tcp web-02
e80ee686defc centweb-01 "/sbin/init" 7 minutes ago Up 7 minutes 0.0.0.0:8080->80/tcp web-01
[centos@ip-xx-xx-xx-xx doc-file]$
2)補足 : 複数のコンテナを停止させる場合
$ cd /doc-file
$ docker-compose down
$ docker ps
[centos@ip-xx-xx-xx-xx doc-file]$ docker-compose down
Stopping web-02 ... done
Stopping web-01 ... done
Removing web-02 ... done
Removing web-01 ... done
Removing network docfile_default
[centos@ip-xx-xx-xx-xx doc-file]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[centos@ip-172-31-26-24 doc-file]$
【手順5】WEB起動による確認
起動させたDockerがちゃんとサービスしているかどうかをWEBの軌道をもって確認します。起動方法はシンプルに「Dockerhost-GlobalIP:Dockerhost-port/index.html」になります
Dockercompose.yamlのPorts指定部分で記載した通りのポートを使用します。
本手順では以下のように設定しています。
web1
ports:
- 8080:80
web2
ports:
- 9090:80
Web1-WEBURL : http:(GlobalIP):8080/index.html
Web2-WEBURL : http:(GlobalIP):9090/index.html
結果判定:それぞれのコンテナからWEBが起動していますので本手順は成功となります
終わりに
今回はDockerのインストールから複数起動までを一気にやってみました。Dockerを本格的に運用しているところではもはやDocker-composeは当たり前かと思います。またDockerfileは自分の検証環境を引き渡す際などに非常に楽になるかと思います。ファイルを使うことで簡単に環境構築ができるのですから。。。しかも今回のEC2は[t2.micro]でやってるのでスペックもそこまで要求されないのも利点の一つかなと思います