Dockerを体系的に学び直してみた(導入編)

# 1.はじめに

前回「[Dockerを体系的に学び直してみた(概要編)](https://qiita.com/takuya_tsurumi/items/5b2e286f1a97ba5e8f76)」という記事でDockerとは何なのか、どんなメリットがあるのかを書きました。
今回は前回に続き実践編と題して、インストールから簡単な使い方についてを書いていきます。

参考にした書籍は、[Docker/Kubernetes 実践コンテナ開発入門](https://www.amazon.co.jp/dp/4297100339/)です。

私の実行環境は以下です。
・macOS Mojave 10.14.6
・Docker version 19.03.4, build 9013bf5

# 2.Dockerインストール

私の実行環境がmacOSなので、macOSに特化して記載します。WIndows OS でのDockerインストール方法は[こちら](https://ops.jig-saw.com/techblog/docker-for-windows-install/)をご参照ください。

以下サイトにアクセスし、ダウンロードします。(ダウンロードにはDocker IDを取得し、ログインする必要があります。)
https://hub.docker.com/editions/community/docker-ce-desktop-mac

ダウンロードしたファイル(Docker.dmg)を実行し、インストールします。インストール完了後、アプリケーションフォルダのDockerを実行すると起動できます。初回起動時は注意事項等が表示されますので読み進めてください。

「Docker is now up and runnning!」の文字が表示されればDockerの起動が完了です。

<img width="1280" alt="スクリーンショット 2020-01-27 8.09.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329544/31c7062c-07a0-b8e1-630e-2926a330b7f7.png">
図.2.1.1.Docker ダウンロード例


# 3.Dockerの操作
Dockerは以下の図3.1.1のようにDockerイメージを用いて、Dockerコンテナを起動します。
それぞれの説明と基本操作を書いていきます。

![Dockerコンテナ作成イメージ図.001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329544/1ce27fb5-865d-3dc4-1b88-6e9c96428f20.jpeg)

図3.1.1.Dockerコンテナ作成イメージ図


## 3-1. Dockerイメージ

Dockerコンテナを構成するファイルシステムやアプリケーションの設定をまとめたテンプレート的な存在です。

Dockerは基本的にコマンドで操作します。一般的なコマンドは以下の表の通りです。



| コマンド | 説明 | コマンド例 | 備考 |
|---|---|---|---|
| docker search [options] 検索キーワード | Docker Hubに登録されているイメージの検索 | docker search --limit 3 mysql (mysqlのイメージ検索) | --limit は表示件数を搾る際に使用可能 |
| docker image pull [options] リポジトリ名[:タグ名] | Docker Hubに登録されているイメージの取得 | docker image pull mysql:latest(mysqlのイメージを取得) | リポジトリ名とタグ名はDocker Hubに存在するものを使用 |
| docker image build -t イメージ名[:タグ名] -f Dockerfile(*)のパス | Dockerイメージのビルド(作成) | docker image build example/test:latest | -f オプションを省略するとDockerfileという名前のDockerfileを使用する |
| docker image ls [options] [リポジトリ[:タグ]] | イメージの一覧 | docker image ls | - |
| docker image tag 元イメージ名[:タグ名] 新イメージ名[:タグ名] | イメージのタグ付け  | docker image tag mysql:latest mysql:1.0 | - |
| docker image push [options] リポジトリ名[:タグ名] | イメージの公開 | docker image push application:latest | パブリックのリポジトリに公開する際にはパスワードやAPIキー等を含めないこと |

(*)Dockerfile の書き方等は以下をご参照ください。
http://docs.docker.jp/engine/reference/builder.html


## 3-2. Docker コンテナ
Dockerイメージをもとに作成され、アプリケーション等を実行するためのものです。こちらもDockerイメージ同様にコマンドで操作するため、Dockerコンテナの基本操作を表にまとめました。

| コマンド | 説明 | コマンド例 | 備考 |
|---|---|---|---|
| docker container run [options] イメージ名[:タグ] [コマンド] [コマンド引数...] | コンテナの作成と起動 | docker container run -d -p 8080:80 test:latest | -d オプションはバックグラウンドでの実行、-p オプションはポートフォワードオプション |
| docker container ls [options] | コンテナの一覧 | docker container ls | - |
| docker container stop コンテナIDまたはコンテナ名 | コンテナの停止 | docker container stop mysql | - |
| docker container restart コンテナIDまたはコンテナ名 | コンテナの再起動 | docker container stop mysql | - |
| docker container rm コンテナIDまたはコンテナ名 | コンテナの破棄 | docker container rm mysql | - |
| docker container logs [options] コンテナIDまたはコンテナ名 | 標準出力の取得 | docker container logs 11b8xxxxxx51 | - |
| docker container exec [options] コンテナIDまたはコンテナ名 実行するコマンド | 実行中コンテナでのコマンド実行 | docker container exec -it 11b8xxxxxx51 sh | - |
| docker container cp [options] コンテナIDまたはコンテナ名:コンテナ内のコピー元 ホストのコピー先 <br>
docker container cp [options] ホストのコピー元 コンテナIDまたはコンテナ名:コンテナ内のコピー先 | ファイルのコピー | docker container cp 11b8xxxxxx51:test.log | カレントディレクトリにコピーする場合は記載なしでも可 |


## 3-3.Docker コンテナを複数同時に実行する
3-1と3-2で記載したコマンドは全て1つのイメージや1つのコンテナに対する基本的な操作でした。一般的なシステムはサーバを複数台使うように、コンテナも複数に分けて起動させるのが理想的です。複数のコンテナを同時に起動させるために使用するのが「Docker Compose」です。

任意のディレクトリに"docker-compose.yml"というyaml形式のファイルを作成後、中身を記述し、実行すると複数台のコンテナを同時に起動することができます。(Docker Composeの詳細は[こちら](https://qiita.com/y_hokkey/items/d51e69c6ff4015e85fce)がわかりやすかったので、ご参照ください。)

複数のコンテナをまとめて記載しておくと起動までがとても楽になるので便利な機能です。


# 4.まとめ
Dockerのインストール方法からDockerイメージ、Dockerコンテナの基本的な操作方法とDocker Composeについて記載しました。

それぞれの言語の環境構築方法と組み合わせてDockerでのCI/CD環境を構築したり、高可用性のシステムの構築だったりに繋げていけたら面白そうだなーと思いました。

まだまだ運用周りや機密情報のデータ周り等気になる点があるので、引き続き勉強していきたいと思います。

何か指摘事項等あればコメントください。