仕事でDocker使いましょうって話になったのですが、実は今までDockerを使ったことがありませんでした。この記事では、Docker初心者がDockerについて勉強した結果をまとめてみたいと思います。
- 第1回 Dockerの概要を勉強してみる ★本記事
- 第2回 Dockerコマンドを使ってみる
- 第3回 Docker Composeコマンドを使ってみる
とりあえずネット上の記事を読み漁る
ググってみるといろいろDockerやコンテナのことについて書かれている記事が出てきますが、読み合わせてみると微妙にしっくりこなかったり・・・
なので最後に行き着いたのは公式ドキュメント。これを読み解いていくことにしました。
ドキュメントを日本語化するプロジェクトもあって、こちらで公開されています。バージョンが必ずしも最新ではないようですが、要所要所で読み合わせていこうと思います。
Dockerをざっくり言うと
自己流でまとめてみると、
「OS環境から隔離されたアプリとその動作環境を一つのパッケージにまとめて、それらをパッケージ単位で利用・管理する」のがDocker。
と理解しました。
このパッケージですが、保存したり配布したりするときのファイルは「Dockerイメージ」、Dockerイメージが実行状態となったインスタンスのことを「Dockerコンテナ」と言うそうです。
Dockerコンテナってどう動く?
「OS環境から隔離されたアプリとその動作環境」というのが、実際どう隔離されているのか。ちょっと絵を書いてみました。
①基本的なアプリの動作パターン
基本的でシンプルなアプリの動作パターンとしては、ハードウェアにOSがインストールされて、その上でOSのカーネル機能や他のバイナリ、ライブラリを利用しながらアプリケーションが動作する感じかなと思います。
②Dockerの場合の動作パターン
ハードウェアにOSがインストールされて動くのは基本パターンと変わりません。Dockerの場合はOS上でまずDockerがデーモンとして動きます。このDockerデーモンからコンテナを起動したり停止したり管理するという形になります。
コンテナの中では、OS環境から隔離された形でアプリが動作しています。アプリが動作に必要なバイナリやライブラリもコンテナの中に配置されていているので、概ねコンテナの中のリソースだけでアプリが動作しています。
ただカーネル機能はコンテナの中に用意されてはおらず、OSのカーネル機能を利用しています。
- OSのような基盤が持っている機能は他のアプリと共有する
- ライブラリなどはアプリが使うものだけに絞ってコンテナに詰め込んでしまう
- コンテナの中はOSの環境から独立したコンテナ独自の環境で動作する
という感じで動作しているようです。
Dockerのいいところ(その1)
アプリを自分の要件に合うように動かすには、それなりにインストール・構築作業に手間がかかります。Dockerイメージを作るときもそれは同じ。なので、構築の時点ではDcockerであってもそんなにメリットは無いと思います。
でもDockerの場合は、アプリとその動作環境がDockerイメージというファイルの形でパッケージングされます。ここがとても大事なポイント。
ファイルの形になってしまえば他人と共有するのも簡単です。ネット上のどこかに公開してダウンロードしてもらえば、コンテナをそのまま使ってもらえます。
DockerではDocker Hubというサイトが用意されていて、世界中の色んな人が作ったコンテナが公開されています。誰かが作ったDockerイメージをすぐに使い始められるのです。DockerコマンドにもDocker Hubからコンテナをダウンロードしてくる機能が標準でついてます。
Dcokerは、アプリのインストーラーだけではなくその後発生するインストール作業や構築作業までも共有できるようにするものだと言えると思いました。
Dockerのいいところ(その2)
なにかアプリを動かそうと思っても、一つのアプリだけでは済まないケースがよくあります。例えばてんこが愛用しているnextcloud。
nextcloudはphpで記述されているWebアプリです。nextcloudを動かすには「phpエンジン」、「Webサーバー」、「データベース」が必要になります。その環境をDockerイメージを利用して用意すると、こんな感じ。
nextcloudの公式Dockerイメージが公開されています。nextcloudと一緒にApacheもセットアップされています。これだけだとデータベースがないので、MySQLの公式Dockerイメージを利用します。
さて、Dockerイメージが2つ必要ってことになりました。Dpckerでは複数のコンテナを一括して起動・連携させる仕組みとして、Docker Composeという機能が提供されています。
例えば上記の例をDocker Composeで実現するなら、まず次のようなdocker-compose.yml
というファイルを作成します。
volumes: nextcloud: db: services: db: image: mariadb container_name: docker_mariadb restart: always volumes: - db:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=******** - MYSQL_PASSWORD=@@@@@@@@@@ - MYSQL_DATABASE=nextcloud - MYSQL_USER=%%%%%%%%%% app: image: nextcloud container_name: docker_nextcloud ports: - 8080:80 links: - db volumes: - nextcloud:/var/www/html restart: always
そしてdocker-compose.yml
があるディレクトリで、
$ sudo docker-compose up -d
とコマンドを投入すれば上記の環境がまるごと起動します。Docker Hubからイメージを取ってきて、必要なdockerコマンドもすべて自動で投入してくれます。
しかもシステムが再起動してもこの環境は自動的に起動するようになります。
Dockerでどのくらい楽ができるのか
さてここまで説明したところで、先程少し触れたnextcloudのインストール・セットアップ手順を、通常の方法とDocker / Docker Composeを使用する方法で比較してみましょう。
普通に構築する手順
CentOS 8でnextcloudを動かすまでの構築作業をざっくり列挙します。
- Apache HTTP Serverをインストールする。(dnf/yumコマンド)
- phpやphpのExtensionをインストールする。(dnf/yumコマンド)
- httpd.confを編集してApacheの設定をする。phpも動くようにする。(viコマンド)
- Apacheを起動する。システム起動時の自動スタートも有効にする。(systemctlコマンド)
- MySQL Serverをインストールする。(dnfコマンド)
- my.cnfを編集してnextcloudに必要な設定を加える。(viコマンド)
- MySQLを起動する。システム起動時の自動スタートも有効にする。(systemctlコマンド)
- MySQLの初期設定をする。(mysql_secure_installationコマンド)
- MySQL上にnextcloud用のユーザとデータベースを作成する。(mysqlコマンド)
- nextcloudを公式からダウンロードする。(wgetコマンド)
- Apacheのサーバールートディレクトリにnextcloudを展開する。(unzipコマンド)
- クライアントからnetcloudにブラウザでアクセスして初期セットアップする。
普通にインストールして構築すると、こんなに手順があります。細かく挙げればもうちょっと手順を細分化できるかもですが。
Docker / Docker Composeで構築する場合
Docker / Docker Composeを使うとこうなります。
docker-compose.yml
ファイルを作る。中身は前述参照。(viコマンド)docker-compose.yml
があるディレクトリでdocker-compose up -d
コマンドを投入する。
以上です。相当手間が省けました。これがDockerのパワーってことですかね。
実際にはdocker-compose.yml
を作成するのに知識が必要だったりはしますが、nextcloudの場合は公式がdocker-compose.yml
をGitHubで公開されてたりするので、それすら楽をできてしまったりもします。
今回勉強して把握できた概要部分は以上になります。
続いて別記事に、具体的な利用シーンとコマンドについてまとめていく予定です。