Dockerを使ってみよう ~Docker ComposeとDocker Hub~|研修コースに参加してみた
今回参加したコースは Dockerを使ってみよう ~Docker ComposeとDocker Hub~ です。
最近のサーバーの分野では、Dockerやコンテナという言葉をよく聞きます。とりあえずどんなものか調べてみると、インターネットや本でも、いろいろ情報が出てきますね。
とはいえ、興味はあるけど、実は実際にDockerを触ってみたことはないんだよね、という人もいるのではないでしょうか。
そこでこのコースでは、ある程度Linuxサーバーの経験があるがDockerは触ったことはないという人を対象に、短時間でDockerを操作してみるところをハンズオン形式で体験します。Docker Desktop for Windowsを使い、自分のPCでDockerを動かすことで、本物のDockerに触れます。
Dockerでコンテナを動かすのはもちろんのこと、Docker Composeを使って複数のコンテナを組み合わせて1つのシステムとして動かすところ、オリジナルのイメージを作るところ、さらにそのイメージをDocker Hubに登録するところまで実習します。
なお、受講にあたっては、事前に自分のWindows PCにDocker Desktop for Windowsをインストールし、Docker Hubのアカウントを作ってあるものとします。
では、どのような内容だったのか、レポートします。
もくじ
コース情報
想定している受講者 | 下記項目についての知識がある。
|
---|---|
受講目標 |
|
講師紹介
このコースの講師は、一戸 英男さんです。
一戸 英男
「とにかく昔からサーバ構築が大好き」から現場に役立つベストセラーが誕生。研修でも明日から現場で使える技術を教えます
Azure Kubernetes Service ( AKS ) を使ってみよう|研修コースに参加してみたDocker 入門 ~たった 5 つのコマンドで出来る環境構築 研修コースに参加してみた
Dockerとは?
まずはDockerについての座学です。そこで学んだことをざっくりまとめます。
- Dockerとは
- 仮想ソフトウェアの一つ
-
「マイクロ仮想OS を使用してアプリを実行するのに最適な実行環境を提供する環境ソフトウェア」
- 速く動作する
- コンテナ とは
- もともとは、船に積まれる 移動、追加を前提とした箱(移動倉庫)
- Dockerでは、OSの上で別のOS環境を箱(コンテナ)として実行する
- コンテナの実体
- OSの イメージ が元になる
- インストールメディアのようなもの
- OSのイメージがあるところを レポジトリ と呼ぶ
- レポジトリから イメージ をとってくる
- そのイメージを元に自分の稼動するOSを作る
- これを インスタンス または コンテナ と呼ぶ
レポジトリからイメージをとってきて、そこからコンテナを作るのですね。
Dockerを使うメリットの話もありました。
- macOSでもWindowsでもDockerで作ったイメージを同じように使える
- イメージを元に、自分のところの環境にあわせて再ビルドできる
- その手順をスクリプトに書いて自動でビルド
- 改版、改修のとき、毎度最適な状態でやってくれる
- クラウドと連動させる
特に2つめが重要という話でした。
Dockerイメージの取得とコンテナの生成
実習に入る前に、Dockerでイメージを取得してコンテナを生成する流れを座学で学びます。
- Dockerでは作業しているマシンに ローカルレポジトリ がある
- ここにDocker Hubなどのリモートレポジトリからイメージをダウンロードする(引っぱってくる)
- これを使ってコンテナ(インスタンス)を作る
- ローカルレポジトリにあるイメージから、実際に稼動するコンテナを生成する
リモートレポジトリからローカルレポジトリに引っぱってきて、それを元に作業するのは、ちょっとGitっぽいですね。
Dockerコマンドを試す
ここからハンズオンです。まずはWindowsのコマンドプロンプトで、Dockerの基本コマンドをいくつか実行してみます。
Dockerの確認とイメージの検索
まず、Dockerのバージョンを確認します。以下のように表示されます。
> docker version
Client: Docker Engine - Community
Version: 24.0.6
API version: 1.43
Go version: go1.20.7
Git commit: ed223bc
Built: Mon Sep 4 12:32:12 2023
(以下略)
Dockerは変化が早いので、ネットなどの解説を読むときには、自分のDockerのバージョンを確認しておいて、近いバージョンかどうか見ておくといいでしょう。
次にイメージを検索します。
> docker searchc centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos DEPRECATED; The official build of CentOS. 7653 [OK]
kasmweb/centos-7-desktop CentOS 7 desktop for Kasm Workspaces 41
bitnami/centos-base-buildpack Centos base compilation image 0 [OK]
couchbase/centos7-systemd centos7-systemd images with additional debug… 8 [OK]
(以下略)
- DESCRIPTION列:説明
- STARS列はほかの人がお気に入りにした数
- OFFICIAL列は公式イメージかどうか
- NAME列はイメージ名
- 一般の人がDocker Hubなどにイメージを入れると「ユーザー名/レポジトリ名」の表記になる
イメージは、オフィシャルなものから個人によるものまで、さまざまなものがあります。DESCRIPTIONをヒントに、自分の用途に近いものを探すとよいでしょう。
たとえばCentOS 7に限定して探すときには、付帯情報(タグ)を指定します。以下の場合、「centos7」がタグです。
> docker search centos:centos7
なお、タグの付けかたはイメージの開発者が好きに決めます。そのため、書式が「centos7」のようになっているとは限りません。そのへんはいろいろなパターンを想像して検索にかけることになると思います。
イメージをダウンロードしてコンテナを実行
イメージをダウンロードしてローカルレポジトリに入れるには、docker pullコマンドを実行します。
> docker pull centos:centos7
ローカルレポジトリの内容はdocker imagesコマンドで確認できます。ダウンロードした「centos:centos7」のイメージが表示されます。
> docker images
このイメージを元にコンテナ(インスタンス)を作るには、docker runコマンドを使います。
> docker run -d -it -p 外部ポート:内部ポート --name コンテナ名 元にするイメージ名
- 「-d」と「-it」は必ず使う。「-dit」のように1つにしてよい
- まだWebサーバーを入れてないのでポート番号を指定する必要はないが、いちおう指定しておく
ここでは次のように実行します。
> docker run -d -it -p 80:80 --name mycentos7 centos:centos7
コンテナIDを表示して、あっさり実行終了します。
動いているコマンドを以下のコマンドで調べると、Dockerコンテナが作られて実行されていることがわかります。
> docker ps
実行されていることを確認するために、動いているコンテナにターミナル接続します。
> docker exec -it コンテナIDまたはコンテンの名前 シェル
以下のように実行します。
> docker exec -it mycentos7 /bin/bash
[root@ae681b1444d8 /]#
見なれたLinuxのプロンプトが表示されました。ここでlsやpsなどを実行できます。
ここでCtrl-p Ctrl-qのキー操作をするとWindowsのプロンプトに戻ります。もう一回コンテナに戻るにはdocker attachコマンドを実行します。
> docker attach コンテナIDまたはコンテナの名前
> docker attach mycentos7
Linuxのexitコマンドでコンテナを抜けます。
# exit
この状態でdocker ps
で確認すると、コンテナが終了していて表示されません。ただし、ディスクには残っているので、docker ps -a
で確認します。
> docker ps -a
再開するにはdocker startコマンドを、終了するにはdocker stopコマンドを実行します。
> docker start mycentos7
> docker stop mycentos7
終了したコンテナをディスク上から削除するには、docker rmコマンドを使います。
> docker rm コンテナIDまたはコンテナ名
これで、docker ps -a
で確認しても消えています。
コマンド1つで、OSをダウンロードしたり、OSを実行したり、動作状況を確認したり、終了や再開をしたりと、あたかもコマンドラインツールを動かすように仮想環境を操作できますね。
コンテナでWebサーバーを実行
Dockerの操作がわかったところで、実際に何かをするコンテナを作ってみます。
Dockerコンテナをもう1回作成して実行し、ターミナル接続します。
> docker run -d -it -p 80:80 --name mycentos7 centos:centos7
> docker exec -it mycentos7 /bin/bash
yumでパッケージをアップデートして、Apache Webサーバーをインストールします。
# yum update
# yum instal httpd
このへんは普通にLinuxサーバーを作るときと同じですね。
違うのは、普通のLinuxではsystemdがサーバーソフトを起動するようになっていますが、Dockerのコンテナではsystemdがありません。そこで、Apache Webサーバーをフォアグラウンドで動かします。
# http -D FOREGROUND
この状態でPCのWebブラウザーから「http://localhost/」に接続すると、Apache Webサーバーのデフォルトのページが表示されました。簡単ですね。
なお、このとき、最近のChromeなどのブラウザーでは、「http:」を勝手に「https:」に変えてアクセスして、エラーになってしまうことがあります。これを避けるには、Chromeをシークレットモードにして接続すると簡単だそうです。正直、ちょっと面倒……
インスタンスをイメージとして保存
このインスタンスをイメージとして保存します。
Ctrl-CでApache Webサーバーを終了し、Ctrl-p Ctrl-qでターミナルを抜けます。
そしてdocker commitコマンドでイメージを作成します。
docker commiit コンテナIDまたはコンテンの名前 付与するイメージ名
ここでは「origin-centos7:v1.0」というイメージ名を付けます。
> docker commit mycentos7 origin-centos7:v1.0
これでオリジナルのイメージができました。docker imagesで確認すると、origin-centos7のv1.0が表示されます。
自分オリジナルのイメージを、意外と簡単に作れました。コンテナイメージがOSのインストールメディアのようなものだとすると、それが1つのコマンドですぐに作れるのはすごいですね。
なお、このあとWordPressを試すので、Apache Webサーバーのコンテナは停止しておきます。
> docker stop mycentos7
Docker上でWordPressを構築
続いて、複数のコンテナを組み合わせて1つのシステムに作り上げるのを体験します。Docker Composeを使います。
- Dockerは「マイクロ仮想OS」
- 1つのコンテナで1つのソフトが動き、それを組み合わせることで1つのシステムにする
- 題材はWordPress
- Webサーバー、PHP、MySQLという複数のソフトの組み合わせ
- 今回は2つのコンテナを使う
Docker Composeによるシステム構成は、YAMLファイルで定義します。ここでは、事前に配布された「docker-compose.yml」をそのまま使います。
まず、Windowsで作業ディレクトリを作って移動します。ここでは「wp」とします。
> mkdir wp
> cd wp
ここにdocker-compose.ymlをコピーします。そしてコマンド1つで実行します。
> docker-compose up -d
構築が実行され、少し時間がかかってから終了します。動作状況は、docker psのように、以下のコマンドで見られます。
> docker-compose ps
2つのコンテナが動いていることがわかります。また、WordPressのコンテナが0.0.0.0:8000で待っていることがわかります。
そこで、Apache Webサーバーのときと同じように、PCのブラウザーで「http://localhost:8000」にアクセスして確認します。WordPressの初期設定画面が表示されればOKです。
このように、コンテナ2つから構成されるシステムが、コマンド1つで実行できてしまいました。しかもYAMLファイルで定義しているので、どこでも何回でも再現できますね。
docker-composeで作ったコンテナを止めたり再びスタートしたりするには、stopサブコマンドとstartサブコマンドを使います。
> docker-compose stop
> docker-compose start
docker-composeコマンドでもdockerコマンドと同じような感じですね。
消すにはdownサブコマンドを使います。
> docker-compose down
次のようにすると、コンテナからコンテナイメージまできれいに消します。
> docker-compose down --rmi all --volumes --remove-orphans
Dockerfileからイメージをビルドする
さきほどはコンテナにターミナル接続してApache Webサーバーをインストールして、オリジナルのイメージを作りました。
Dockerでは、これをDockerfileという一種のスクリプトで自動化できます。
Dockerfileで使える命令には次のようなものがあります。
- FROM:docker pullする流用イメージ
- LABE:情報記述。コメントのようなもの
- RUN:コマンド実行。1つ1つの構築コマンドを記述
- CMD:イメージからコンテナを作るときに実行するコマンド
- ENTRYPOINT:CMDと似ているが、docker runのときに引数で上書きできない
- EXPOSE:ポートのエクスポート。のちの実習で解説する
このコースでは、まず配布された次のDockerfileを使います。
FROM centos:centos7
LABEL OreOreDocker
# Package Install
RUN ["yum","install","-y","httpd"]
RUN ["yum","install","-y","php"]
# httpd実行
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]
まず、Windowsで作業ディレクトリを作って移動します。ここでは「centos7」とします。そのディレクトリに上のDockerfileをコピーします。
Dockerファイルからビルドしてイメージを作るコマンドは、次の書式です。最後の「.」はDockerfileのあるディレクトリで、忘れないようにします。
docker build -t イメージ名 .
今回は次のように「mycentos7-build:v0.1」というイメージ名を付けて実行します。
> docker build -t mycentos7-build:v0.1 .
これでdocker imageで確認すると、mycentos7-buildのv0.1ができていることがわかります。
Dockerfileで外部からファイルをコピーしてビルドする
次に、コンテナの外(ホストOS)からファイルをコピーしてイメージをビルドしてみます。しかも、コンテナのOSにはAlpine Linuxを使い、PHPの簡単なシステムを作ります。
FROM alpine
RUN apk add --update --no-cache nginx
RUN apk add php81 php81-fpm php81-opcache
COPY files/nginx.conf /etc/nginx/nginx.conf
COPY files/default.conf /etc/nginx/http.d/default.conf
COPY files/index.html /var/www/localhost/htdocs/index.html
COPY files/info.php /var/www/localhost/htdocs/info.php
COPY files/start.sh /etc/nginx/start.sh
RUN chmod 775 /etc/nginx/start.sh
EXPOSE 80
ENTRYPOINT /etc/nginx/start.sh
ENTRYPOINT /etc/nginx/start.sh
- FROM 〜でalpineを引っぱってくる。タグ名がなければlatestを引っぱってくる
- RUN
- apkでダウンロードしてインストール
- 1行目でnginxをインストール
- 2行目でPHP関係の言語モジュールやFCGIモジュールやキャッシュモジュールをインストール
- apkでダウンロードしてインストール
- COPY
- ローカル(ホストOS)のファイルをコンテナのディレクトリにコピー
- RUN
- 起動スクリプトに実行権を付ける
- EXPOSE
- リッスンするポート番号を指定
- ENTRYPOINT
- 起動スクリプトを実行
Dockerfile中でコピー元として書かれているfilesフォルダーの内容と、上記のDockerファイルは、事前に配布されたファイルを使います。
まず、Windowsで作業ディレクトリを作って移動します。ここでは「nginx」とします。
> cd nginx
> dir
そのディレクトリに、Dockerfileとfilesフォルダーをコピーして、docker buildを実行します。
> docker build -t mynginx:v0.1 .
docker imagesで確認すると、mynginx01のv0.1のイメージが表示されます。
このイメージからインスタンスを作成して起動します。
> docker run -d -it -p 80:80 --name mynginx mynginx01:v0.1
起動したら、今回もPCのブラウザーで「http://localhost」にアクセスして確認します。Nginxのデフォルトページが表示されればOKです。
ちょっと複雑なDockerfileでしたが、コマンド1つでイメージができて、次のコマンド1つであっさり動いて、びっくりです。
このコンテナを止めておくのを忘れないようにします。
> docker stop mynginx
Docker Hubへ自分の開発イメージを登録
最後に、こうして作ったオリジナルのDockerイメージをDocker Hubへ登録してみます。
手順は次のとおりです。
- Docker Hubのアカウントを登録してあるものとする
- 登録するイメージを作成
- docker loginでそのアカウントで認証する
- Webブラウザーからの認証
- クレデンシャル情報がローカルに保存される
- Docker Hubのサイトでレポジトリを作成
- docker tagで、ローカルとリモートのレポジトリを結びつける
- それができたらpush
「centos7-httpd-org:v1」というイメージを作ってあり、それを「ユーザー名/mycentos7:v1.0」というリモートにプッシュするとすると、次のようになります。
> docker login
> docker tag centos7-httpd-org:v1 ユーザー名/mycentos7:v1.0
> docker push ユーザー名/mycentos7:v1.0
これで、ブラウザーでDocker Hubの自分のレポジトリのページを開いて、リロードすると、イメージの情報が表示されます。なお、混んでいると反映に10〜20分かかることもあるそうです。
アップロード完了したイメージをローカルから削除するには、次のようにします.
> docker rmi origin-centos7:v1.0
> docker rmi ユーザー名/myceotos7
もちろん、自分のpushしたイメージをDocker Hubからpullすることもできます。
> docker pull ユーザー名/mycentos7:v1.0
すごい。立派なDockerイメージ作者になったような気分です。
まとめ
ここまで、Dockerの基本操作から、Docker Composeによって2つのコンテナから1つのシステムを構築、イメージの作成、Dockeffile、Docker Hubへの登録と、一気に体験しました。
Dockerを使うと、開発チームのメンバーで同じ環境を用意したり、システムのバージョンアップや変更時の作業を自動化して短縮したりできます。また、Dockerイメージ化したアプリケーションを、Kubernetesを使って、負荷分散や冗長構成、スケールアウトなどを実現したりできます。
SEカレッジではほかにも、DockerやKubernetesのコースがいくつかあります。今回のコースを基礎として、興味を持った人は、いろいろなコースを試してみてください。
label SEカレッジを詳しく知りたいという方はこちらから !!
IT専門の定額制研修 月額 28,000 円 ~/ 1社 で IT研修 制度を導入できます。
年間 670 講座をほぼ毎日開催中!!