Docker 入門 ~たった 5 つのコマンドで出来る環境構築 研修コースに参加してみた
今回参加したコースは Docker 入門 ~たった 5 つのコマンドで出来る環境構築です。
エンタープライズ領域でも Kubernetes 活用事例が発表されるなど、 SI の領域でも Docker は身近になりつつあります。
安定志向のNRIが変化の激しいKubernetesを推進する理由 (1/2):巨大SIerのコンテナ・Kubernetes活用事例(1) – @IT
いよいよ、アーリーマジョリティが使うだけのものではなくなっている気がするのは、私だけでしょうか。
このコースでは、そんな Docker について、コンテナの捉え方や基礎を学んで、必要最低限 5 つのコマンドを使って環境構築をやってみました。たった 5 つで本当にできました insert_emoticoninsert_emoticon
では、どのようなコースだったのか、レポートします!
もくじ
コース情報
想定している受講者 | Linux の基本操作を知っている |
---|---|
受講目標 | Docker でスグに使える 5 つのコマンドで環境構築ができる |
講師紹介
講師はこのレポートでは初登場となる 一戸 英男さんです。
「昔からサーバ構築が大好き、とにかく好きなんですよ」と講師紹介からお話されていた一戸さん。どれだけ好きかわかるのが、この本です。
刊行が 2005 年ですが、 Linux で環境構築されていた古参の IT エンジニアの方であれば、表紙カバーをご覧になったことがあるのではないでしょうか。
“初版が売れれば御の字” と言われる技術書で 16 刷りまでいったのですから、ベストセラーと言っても過言ではないでしょう。
一戸 英男
「とにかく昔からサーバ構築が大好き」から現場に役立つベストセラーが誕生。研修でも明日から現場で使える技術を教えます
今日のコースも書籍同様に、やはり Linux が題材ですが、そうは言っても今は 2020 年。 Docker です。
Docker とは
- アメリカの Docker, Inc. が開発しているオープンソースソフトウェア
- AWS, GCP, Azure といった世界的なクラウドサービスがいち早く取り入れたことから世界中に普及
では、 Docker とは何か、一戸さんから具体的には
「マイクロ仮想 OS を活用してアプリを実行する環境ソフトウェア」
と紹介いただきました。
“ん? コンテナとか仮想化とか、そういった話ではない??”
ちょっと知っている説明ではなかったので戸惑いますが、、これはあとでふりかえると、実はとても的確な表現だったことに気づきます。
VMware / VirtualBox との違い
説明は続きます。
- VMware や VirtualBox と同様の仮想化の一種
- 専用サーバ、VMware/VirtualBox、Dockerの違い
- 専用サーバ
- OS 上で動かしている Web サーバやデータベースなどが使用するメモリやディスクなどのリソースは共有されている
- VMware/VirtualBox
- 仮想環境の上で OS は完全に仮想化されており、メモリやディスクといったリソースは独立している( ← 重くなる)
- Docker
- コンテナ実行のための標準マイクロ仮想 OS ( CoreOS ) 注 とコンテナ実行イメージを重ねたもの
- リソースも共有できるため、 1 台のサーバ上で複数の OS を動かそうとした場合でも、オーバーヘッドが少ない
- 結論、 Docker のほうが動作が軽い
注 超軽量化された Linux 。他にもマイクロ仮想 OS はいくつかあります
やはりコンテナ、コンテナイメージという言葉が出てきましたね。
では、コンテナとはなんでしょうか ?
コンテナとは
- Docker イメージとコンテナイメージとでわかれる
- Docker イメージは Docker Hub ( GitHub のような Docker イメージを共有するところ) からダウンロードしたもの
- Docker イメージ = Linux の設定 + アプリケーションを組み合わせたもの
- コンテナとは Docker イメージと設定した差分
- Docker イメージとコンテナイメージとあわせて実行される
- Docker イメージは Docker Hub ( GitHub のような Docker イメージを共有するところ) からダウンロードしたもの
な、なるほど!コンテナとは Docker イメージとその差分のことだったのですね。
先程の「マイクロ仮想 OS を活用」とは Docker イメージのことを例えられていたのかと、ようやくおっしゃっていた意味がわかりました!
Docker イメージと Docker Hub
- Docker 上で動作させたい OS とアプリケーションは、それぞれ イメージレイヤー と呼ばれる
- イメージレイヤーを 1 つにまとめたものが Docker イメージ
- Docker イメージを定義する設定ファイルが Dockerfile
- Dockerfile の命令 1 行が 1 つのイメージレイヤーに相当
RUN ["yum","install","-y","httpd"]
- Dockerfile の命令 1 行が 1 つのイメージレイヤーに相当
この Docker イメージが GitHub のように集まっているのが Docker Hub です。
なお、 Docker Hub の利用にあたっては、特にアカウント登録は必要ないのですが、 ↓ の記事にもある通り、アカウントを作っておくと良いかも知れません(無料プランもあります)。
ちなみに、アカウントを作ると、クラウド版の Docker Play with Docker が使えます。
私の手持ちの PC はディスク領域の空き容量が怪しかったので、このコースの演習で Play with Docker を使ってみたところ、全く問題なく使えました!
Play widh Docker には 4 時間の利用時間の制限がありますが、 Docker でポートを指定して立てた Web サーバにアクセスしてブラウザからページを見れたり、 ssh したり、 scp もできます。
また、 scp を使わずとも GUI 上でファイルをドラッグ・アンド・ドロップすれば、ファイル転送できます( yaml ファイルや dokcerfile などもこれで転送しました)。
もし、このあとの演習をやろうとされている方は、このコースの演習であれば利用時間の制限内で使えますので、以下の記事を参考にしながら、ぜひぜひ試してみてはいかがでしょうか。
Docker 入門にはインストールなしで使える「Play with Docker」がいいと思う – Qiita
The best way to learn Docker for Free: Play-With-Docker (PWD) – Docker Blog
Docker 基本の 5 コマンドで環境構築
では、ここから Docker を使った演習です。
Docker Desktop for Windows のインストール
まずは Windows で Docker を使うには「 Docker Desktop for Windows 」 が必要なので、ダウンロードしてインストールします(前述の通り、私はクラウド版を使いました)。
docker pull
では、 Docker の基本コマンドを試していきます。
まずはインストールできたことを確認するため、バージョンを確認してみましょう。 docker version
で確認できます。
$ docker version
Client: Docker Engine - Community
Azure integration 0.1.15
Version: 19.03.12
API version: 1.40
Go version: go1.13.10
Git commit: 48a66213fe
Built: Mon Jun 22 15:43:18 2020
OS/Arch: windows/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.12
API version: 1.40 (minimum version 1.12)
Go version: go1.13.10
Git commit: 48a66213fe
Built: Mon Jun 22 15:49:27 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: v1.2.13
GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683
続いて、何はともあれ、 Docker イメージがないと始まりません。
Docker イメージの検索には、docker search [イメージ]
で、 Docker Hub から検索できます。ここれは CentOS を探してみます。
なお、 centos:centos7
の : 以降はタグで、イメージをアップした人が自由につけられます。このため、ググるときと同様に推測しながら検索しましょう、とのことでした。
$ docker search centos:centos7
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
kriation/centos7 A base CentOS v7 image derived from centos:c… 2 [OK]
tukiyo3/centos7-ja-systemd from centos:centos7 1 [OK]
projectplato/centos FROM: centos:centos7 0
kingnomura/centos7-httpd-php centos:centos7 + php 0 [OK]
mrkepple/base_ldap_container centos:centos7.5.1804 image with LDAP packag… 0
romanchg/nginx A simple nginx image based on centos:centos7… 0
brew317/linux centos:centos7 with docker, make .... 0
snoopj123/navissh_centos7 Latest centos:centos7 image (7/30/14), EMC's… 0
2k0ri/centos7-systemd centos:centos7 with systemd, and service com… 0 [OK]
myeof/tengine v2.2.1 from centos:centos7, ssh: root_passwo… 0
wachira90/centos centos 7 original #docker pull wachira90/ce… 0
kongfanhong/centos-jre centos:centos7.7.1908, jre-8u211 0
frankxiaozhibin/centos7.8.2003.ssh docker run -p 9501:22 --name XXX --privilege… 0
dtheus/redis-cache Caching in-memory database with redis on cen… 0
xiaoyaoo/tutum tutum/centos:centos7 0
addblue/mssql Image from centOS:centOS7,improved compatibi… 0
addblue/mssql-sp Image from centOS:centOS7,improved compatibi… 0
「 OFFICIAL 」の項目が [OK] となっているのは、公式から提供されているイメージ、「 AUTOMATED 」の項目が [OK] になっているのはアップデートがあれば、ユーザーに通知してくれるイメージです。
では、 Docker イメージをダウンロードしましょう! docker pull [イメージ名]
で出来ます。
$ docker pull centos:centos7
centos7: Pulling from library/centos
75f829a71a1c: Pull complete
Digest: sha256:19a79828ca2e505eaee0ff38c2f3fd9901f4826737295157cc5212b7a372cd2b
Status: Downloaded newer image for centos:centos7
docker.io/library/centos:centos7
イメージが正しくダウンロードされたかどうかを確認してみましょう。 docker images
で確認できます。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos centos7 7e6257c9f8d8 6 weeks ago 203MB
docker run
Docker イメージを元に、コンテナを作成します。 docker run
を使うのですが、いろいろオプションがあります。
$ docker run -d -it -p 80:80 --name mycentos centos:centos7
7a7ef0ca2d196bb65474ff3d51ef7a0fdd249b2259b91f2e29522e13da13b008
-
docker run の詳細
-d
- コンテナをバックグラウンドで実行するデタッチドモード(起動後、他のコマンドが実行できる状態)
-i
- 外部からコンテナへアクセスできるようにする。 i は interactive
-p
:
の前が外部ポート番号、後が内部ポート番号の指定--name
- コンテナ名を設定
- コマンドの最後
- 使用するイメージ名を指定
コンテナの起動は docker ps
で確認できます
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7a7ef0ca2d19 centos:centos7 "/bin/bash" 13 minutes ago Up 13 seconds 0.0.0.0:80->80/tcp mycentos
動いていますね。
今度はコンテナを停止してみましょう。 docker stop [コンテナ ID or コンテナ名 ]
コマンドを使います。
$ docker stop 7a
7a
コンテナ ID はすべて入力する必要はなく、上の例のように ID の最初の 2 文字程度で指定可能です。これは楽チンですね。また、名前( NAMES )でも停止できます。
停止を確認してみましょう。
ここでは起動 / 停止に関わらず、存在しているコンテナをすべて表示したい場合につけるオプション、 -a
を使ってみましょう。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7a7ef0ca2d19 centos:centos7 "/bin/bash" 18 minutes ago Exited (137) 2 minutes ago mycentos
なお、コンテナが存在している場合は docker start
で動かせます。
centos を設定
せっかくなので、コンテナで起動している CentOS を動かしてみましょう。
docker exec -it [コンテナ ID or コンテナ名] [コマンド名]
で出来ます。
$ docker exec -it 7a7ef0ca2d19 /bin/bash
[root@7a7ef0ca2d19 /]#
root で入れましたね。
-it
は bash などのシェルスクリプトを実行するときに使うオプションです。
このまま bash で操作してみましょう。
[root@7a7ef0ca2d19 /]# top
op - 06:21:05 up 14 days, 6:39, 0 users, load average: 1.86, 1.75, 2.46
Tasks: 3 total, 1 running, 2 sleeping, 0 stopped, 0 zombie
%Cpu(s): 10.3 us, 17.2 sy, 0.0 ni, 71.7 id, 0.0 wa, 0.0 hi, 0.8 si, 0.0 st
KiB Mem : 32929980 total, 3485112 free, 9720380 used, 19724488 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 22416412 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 11836 3024 2756 S 0.0 0.0 0:00.03 bash
15 root 20 0 11836 3012 2656 S 0.0 0.0 0:00.02 bash
28 root 20 0 56184 3864 3364 R 0.0 0.0 0:00.00 top
いちいち外部から ssh しなくても良いのでいいですね。
ただ、ここで一戸さんから注意があり、抜けるときは、いつものように exit
や Ctrl + q するとコンテナ自体も停まってしまいます。
なので、 [ Ctrl + p ] -> [ Ctrl + q ] をしよう、と頂きました。危ない危ない。
docker commit
もし、ここで Apache などをインストールして、オリジナルなイメージを作ったら、保存して、 Docker Hub にアップすることも出来るとのこと。
マジですか。次やるとき、めちゃラクじゃないですか。。
そこで使うのが docker commit
です。
docker commit [コンテナ ID or コンテナ名] [イメージ名]
やってみましょう!
$ docker commit 7a7ef0ca2d19 mycentos-v1
sha256:c1122aa6364226f3f482754bc9318c162e6c5366434240fbd301e5e0fae80aa7
確認してみます。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos-v1 latest c1122aa63642 18 seconds ago 203MB
centos centos7 7e6257c9f8d8 6 weeks ago 203MB
そして、このあと docker push
すると、 Docker Hub にアップされるとのこです。
このコースではやりませんでしたが、これはデビューしたくなるやつですね。
docker build
オリジナルの Docker イメージを作って、共有する方法は Docker Hub だけではありません。
それは Dockerfile という手順書を作って、それを docker build
で実行するというやり方です。
一戸さんに予め用意いただいたので、実際に Dockerfile を見てみましょう。
FROM centos:centos7
LABEL OreOreDocker <ore2@seplus.jp>
# Package Install
RUN ["yum","install","-y","httpd"]
RUN ["yum","install","-y","php"]
# httpd実行
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]
初めて見ましたが、だいたいわかりますね(書けるとは言ってない)。
では、これをもとにビルドしてみましょう。 docker build
というコマンドを使います。
docker build -t [イメージ名]:[タグ(オプション)]] [Dockerfile のディレクトリ]
-t
でイメージ名とタグを指定できます。
$ docker build -t centos7-httpd-org:v1 .
Sending build context to Docker daemon 2.048kB
Step 1/5 : FROM centos:centos7
---> 7e6257c9f8d8
Step 2/5 : LABEL OreOreDocker
---> Running in 7fa2651d7f6b
Removing intermediate container 7fa2651d7f6b
---> 99681d582509
Step 3/5 : RUN ["yum","install","-y","httpd"]
:
:
Successfully built a823f3b5c709
Successfully tagged centos7-httpd-org:v1
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos7-httpd-org v1 42aa9f25d016 About a minute ago 437MB
イメージができてますね。
docker run -> docker ps でコンテナを起動・確認し、 local host の画面でも確認してみます。
docker-compose
Docker では複数のイメージを合わせて、一気に構築することもできます。来ました Docker Compose です!
WordPress を題材に、コマンド一発でやっちゃいます。ワクワクが止まらねぇ。
- Docker Compose を実行するには docker-compose.yml という YAML で書かれたファイルが必要
- 必要なソフトウェアや設定が書かれたファイル
- 今回は予め、一戸さんに用意頂いたファイルを使用
- docker-compose.yml があるディレクトリで
docker-compose
コマンドを実行
version: '3.1'
services:
db:
image: jayudev/mysql5.7
volumes:
- C:\docker\db:/var/lib/mysql # クラウドでは任意のディレクトリを指定 eg. tmp/db:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: rootpass01
MYSQL_DATABASE: wp_testdb
MYSQL_USER: admin
MYSQL_PASSWORD: adminpass01
wordpress:
image: wordpress:latest
depends_on:
- db
ports:
- "80:80"
restart: always
volumes:
- C:\docker\www:/var/www/html # クラウドでは任意のディレクトリを指定 eg.tmp/ww:/var/www/html
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: admin
WORDPRESS_DB_PASSWORD: adminpass01
WORDPRESS_DB_NAME: wp_testdb
では、ディレクトリを移動して、やっちゃいましょう!
$ docker-compose up -d
Creating network "wordpress_default" with the default driver
Pulling db (jayudev/mysql5.7:)...
latest: Pulling from jayudev/mysql5.7
f17d81b4b692: Pull complete
c691115e6ae9: Pull complete
41544cb19235: Pull complete
254d04f5f66d: Pull complete
4fe240edfdc9: Pull complete
0cd4fcc94b67: Pull complete
8df36ec4b34a: Pull complete
b8edeb9ec9e2: Pull complete
2b5adb9b92bf: Pull complete
5358eb71259b: Pull complete
e8d149f0c48f: Pull complete
Digest: sha256:4c339d817020c348b5e7455678c4a1ceeeb881bd6c2de0b60e15e2fc41cbc183
Status: Downloaded newer image for jayudev/mysql5.7:latest
Pulling wordpress (wordpress:latest)...
latest: Pulling from library/wordpress
d121f8d1c412: Pulling fs layer
58b3577b786a: Pulling fs layer
60538287851f: Pull complete
c53ff72fe225: Pull complete
79b018c8773f: Pull complete
fbe3e00ac4b0: Pull complete
ff35226e1df8: Pull complete
ab3b1d46dd82: Pull complete
b29cdd230d9a: Pull complete
d466b05cf627: Pull complete
771f930f6d23: Pull complete
b89a2786f2a3: Pull complete
c35594c34f69: Pull complete
8e3c480bd8bf: Pull complete
2d3e26ca1157: Pull complete
cc0d53b93bc3: Pull complete
dbcd12305020: Pull complete
90356c70a472: Pull complete
ceb2ac363e49: Pull complete
202d7e2f6c6c: Pull complete
Digest: sha256:7b67b32c076e9463a804182e0356966829d5533184c5064e22a7b97686e2154b
Status: Downloaded newer image for wordpress:latest
Creating wordpress_db_1 ... done
Creating wordpress_wordpress_1 ... done
本当にこれは感動体験です!コマンド一発ですよ、一発。
では、本当に構築できているのか確認してみましょう。
$ docker-compose ps
Name Command State Ports
------------------------------------------------------------------------------------
wordpress_db_1 docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
wordpress_wordpress_1 docker-entrypoint.sh apach ... Up 0.0.0.0:80->80/tcp
画面でも確認してみます。
ちなみに、今まで使ってきた docker run などのように docker compose と出来ないのはなぜかなぁ、と思っていると、この docker-compose は Docker とは別ソフトウェアだったからなんですね。
docker/compose: Define and run multi-container applications with Docker
Docker のユースケース
このコースの最後は Docker の使い方です。
自社プロダクト / サービス開発などが主な企業では当たり前のように使う Docker ですが、 SI の領域ではこれからというところが多いように感じます。
「 Docker 便利そうなんだけど、どこで使うかな~」という感想はよく伺います。
このあたりの使い方まで踏むこむのが一戸さんらしさかも知れません。
- docker-compose で開発チームの環境を統一
- docker build でバージョンアップなどの作業を統一
- 同じようなアプリケーションを派生させるときに、docker-compose で拡張
- 全国の各支店で同じアプリケーションを構築・開始するとき
一戸さんも強調していましたが、コロナ禍でリモートでの開発が増えているので、 docker-compose を使った開発環境の構築はかなり効果がありそうです。
あとはバージョンアップ。作業手順を共有しても、個々でアレンジしないと統一されないことが多いですものね。
こういったユースケースを紹介頂けると、プロダクションで使わなくとも、手近なところから使うシーンをイメージしやすいですね!
最後に余談として Apache の命名の由来や四方山をお話頂いて、このコースは修了しました。
まとめ
いよいよエンタープライズでも利用が広がり始めた Docker について、捉え方やイメージの仕方、基礎知識を学び、たった 5 つのコマンドだけで環境構築してみました。
なんとなく聞きかじった Docker コンテナのイメージが、一戸さんのご説明で、きっちりわかりました。 Docker イメージ、ちゃんと説明できそうです。
また、コロナ禍の中、リモートでの開発環境の構築には、本当に今回のコマンドだけで出来るので、これは Docker をスタートさせやすいですね。
さすがです、一戸さん。
このコースの次は、これもデファクトになった Docker コンテナ管理ツール、 Kubernetes に入門したいところです!
SEプラスにしかないコンテンツや、研修サービスの運営情報を発信しています。