30
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Docker】Dockerについて

Posted at

はじめに

今までなんとなく使用していたDockerでしたが、改めてしっかり勉強しようと思い、学んだことをアウトプットしていきたいと思います。

Dockerとは

Dockerを一言で表すと、データやプログラムを隔離できる仕組みです。
私たちが使用しているパソコンやサーバでは、複数のプログラムが動いています。パソコンであれば、ExcelやWordなどのソフトウェアを同時に立ち上げて使用していますし、サーバでは、ApacheやMySQLなどの複数のソフトウェアが同時に動いています。
こうした複数のデータやプログラムを、独立した環境に構築することができるのがDockerです。

Docker Engineとcontainer(コンテナ)

Dockerのイメージとしては、パソコン上やサーバ上の環境をコンテナという単位で分けて、この独立したコンテナにデータやプログラムなどが入っています。そして、このコンテナを支える仕組みがDocker Engineです。
Dockerを使用するには、Docker Engineというソフトウェアをインストールする必要があります。
image.png

image(イメージ)からcontainer(コンテナ)を作る

コンテナを作成するには、イメージと呼ばれるコンテナの素になるものから生成します。
イメージはたくさんの種類があり、Apacheのコンテナを作りたいならApacheのイメージが必要ですし、MySQLのコンテナを作りたいならMySQLのイメージが必要です。
コンテナは複数作成することができ、Dockerの上にいくつでも乗せることができます。

Linux OSが必要!

Dockerを使用するには、必ずLinux OSが必要です。また、コンテナに入れるプログラムもLinux用のプログラムです。
image.png

コンテナで複数のサーバを同居させる

Dockerのコンテナ環境を使用すれば、完全に隔離することができるのでWebサーバやDBサーバなどを別々のコンテナに分けて安全に運用することができるようになります。アップデートをしても、隔離されているのでお互いの環境に影響することはありません。
普通であれば、一台のサーバマシンには1つのWebサーバ(Apache)しか載せられませんが、コンテナを使用すれば複数のWebサーバを作成して載せることができます。

もしコンテナを使用せずに複数のWebサーバを同居させるとなると、あるプロジェクトのメンバーが他のプロジェクトの環境を触ってしまう可能性もあります。それに、Apacheは1つしか入れることはできないので、Webサーバの機能を共有することになってしまいます。
コンテナを使用することで、こうしたリスクなしにサーバを同居させることができます。

コンテナを持ち運ぶ

コンテナは、書き出すことで別のDocker上に再構築することもできます。簡単にいうと、DockerからDockerへコンテナを移すことができるということです。
移せるということは、あるコンテナを全員に配布することで開発環境を一斉に揃えることができますし、開発サーバで作ったものをそのまま本番サーバへ持っていくこともできます。
Dockerは、OSに依存しないので開発環境では動いたけど本番環境では動かないなどといった問題が発生することはなくなります。

Dockerの仕組み

まず、物理マシンがあってその上にLinux OSがあります。ここまでは普通のサーバと同じですが、Dockerの場合は、OSの上にDocker Engineを載せて、その上でコンテナを動かします。プログラムやデータはコンテナに入れます。
コンテナの中には、OSのようなものが入っています。これは完全なOSではありません。
image.png
まず、OSというのはユーザーやソフトウェアからの命令をハードウェアに伝える役割を持っています。そしてOSは、核となるカーネルとその周辺の部分から構成されています。周辺の部分が命令を受け取ってカーネルに伝え、カーネルがハードウェアを操作します。
Dockerの場合は、コンテナは完全に隔離されているので土台となるLinux OSの周辺部分がコンテナにあるプログラムの命令を受け取ることはできません。そのため、OSの周辺部分をコンテナの中に入れることでプログラムからの命令を受け取り、カーネルに伝える仕組みになっています。
OSの核となるカーネルを土台であるホストOSに任せることで、Dockerは非常に軽くなっています。

MacやWindowsでDockerを使う

Dockerは、Linux OS上でしか動きません。コンテナの中に入れるソフトウェアもLinux用のものしか入れることはできません。
このようにDockerはLinuxを前提としたソフトウェアなので、MacやWindowsでは動かないはずです。
しかし、Docker Desktop for MacDocker Desktop for Windowsを使用することでDockerを使用することができるようになります。

これらは、MacやWindows用のDockerではありますが、ユーザーからは見えない仮想のLinux環境を作成してそこでDockerを動かします。

このソフトウェアはダブルクリックで起動できますが、実際にDockerを操作するにはコマンド(CLI)で操作することになります。

ボリュームのマウント

ボリュームというのは、ストレージの1領域を区切ったものです。例えば、SSDなどの区切られた1領域です。
マウントとは取り付けるという意味があり、対象を接続してOSやソフトウェアの支配下に置くことです。

コンテナを使用するには、記憶領域にデータを置くので記憶領域のマウントが必要です。
コンテナは停止しても消えることはありませんが、コンテナのライフサイクル上いつかは削除する日が来ます。そのような時に、コンテナ内にデータを置いていると、コンテナの削除と同時にそのデータも消えてしまうことになります。

例えばパソコンなどを買い替えるときは外付けのHDDなどにデータを逃して移し替えると思いますが、それはコンテナも同じで外部にデータを逃します。しかし、コンテナの場合はいちいちデータを移し替えるのではなく、最初から外部にデータを置き、そこからアクセスして使用するのが一般的です。
これをデータの永続化といいます。 このデータを置く場所がマウントした記憶領域です。

Dockerfileとは

Dockerfileとは、新規にDockerイメージを作成するための手順を記したテキストファイルのことです。
Dockerfileというテキストファイルを作成することで、Docker Imageを作ることが出来ます。

Dockerfileを使うことで、以下のようなメリットがあります。

・自分の好きなようにカスタマイズすることができる

・ファイルで管理できる

・一連の手順を自動化できる

・Dockerfileを開発者に配布

・共有することで簡単に同じ環境を構築することができる

Docker Composeとは

Docker Composeとは、複数のコンテナを構築し運用する場合などに使用するコマンド文を1つのテキストファイルに書き込んで、一気に実行したり、停止、破棄したりすることができるものです。
コマンド操作に慣れてくると複数のコンテナで構成するシステムを作成するのが少し面倒になってきますが、Docker Composeを使用することでこれらを簡単に行うことができるようになります。

Docker Composeでは、構築に関する定義を記述したファイルをYAML形式で用意します。
定義ファイルには、コンテナやボリュームをこういう設定で作成したいという項目を記述しておきます。

DockerfileとDocker Composeの違い

Docker Composeは、テキストファイルに定義を書いて実行するのでDockerfileに似ているのですが、Docker Composeはdocker runコマンドの集合体なので作成するのはコンテナや周辺環境です。
一方、Dockerfileは、イメージを作成するものなのでボリュームやネットワークなどは作成することはできません。

最後に

今回は、Dockerの概要についてでしたが、実際のコマンド操作についてもアウトプットしていきたいと思います。

30
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?