Docker学んでみた

はじめに

今までXAMPPで不便しなかったのですが、転職活動などを通じてやはり理解しておくことに越したことはないと感じました。

環境構築はしたことがありましたが、体系的に学習したことはなかったので勉強してみました。

✅ゴール
・Dockerの理解を深める

✅環境
Windows

✅参考教材
📚Docker/Kubernetes 実践コンテナ開発入門 ※サポートページ
当記事はこちらの内容を軸にまとめています。以下教本。

💻docker-composeでよく使うコマンド
コマンドの参考に。

💻Docker入門(第一回)~Dockerとは何か、何が良いのか~
とりあえず一通り読んでおいて損はなさそう。
4回目が参考になる。Infrastructure as Code (IaC)、インフラ構築部分も含めコード化できるのはいい点ですね!

💻さわって理解するDocker入門
※こちらも4回目が参考になる。
Linuxのコンテナ技術をベースにDocker社が開発した仮想化技術
コンテナとは、Dockerイメージを起動し、その内部でアプリケーションが稼動している状態
Dockerイメージのビルドとは、ベースとなるイメージに対して、何らかの機能を加えて、ユーザイメージ(自分独自のイメージ)を作り出すこと

💻Dockerにおけるボリュームのマウント
※後程読みたい

💻Dockerfileでうまくマウントできないのでdocker-compose.yml使ってマウントする(o*。_。)o

💻AWS ECSでDockerコンテナ管理入門(基本的な使い方、Blue/Green Deployment、AutoScalingなどいろいろ試してみた)
AWSでもDockerコンテナを運用するためのマネージドサービスがある。それに伴ってFargateというのも知った。色々ありすぎ。。。

💻AWS上のコンテナはネットワークをどう利用するのか? ポート番号の扱いとDNSの仕組みを中心に

関連記事

Docker for WindowsでLaradock(+MySQL)の環境構築

Dockerについて

✅Dockerとは

アプリケーションをデプロイすることに特化した箱(コンテナ)を作る。

コンテナ型仮想化技術を実現するために実行される常駐アプリケーションとそれを操作するためのコマンドインターフェースからなるプロダクト。

✅メリット

ホストOS型仮想化技術(VirtualBoxなど)に比べ、軽量な仮想環境を構築し検証に用いることが可能。(オーバーヘッドを避けられる)
本番環境への展開やアプリケーションプラットフォームとして機能する。
(ローカルとサーバにDocker環境を置くことでほぼ同等の動作を再現可能)

✅基本

Dockerイメージ

コンテナ作成に利用されるテンプレート。Dockerコンテナを構成するファイルや実行するアプリ、設定をまとめたもの。※Dockerfileで構築する。

Dockerコンテナ

Dockerイメージを基に作成。具現化されたシステム、アプリが実行されている状態。イメージから複数のコンテナを生成できる。

実行中・停止(コンテナ終了時の状態を保持)・破棄の3つの状態に分類(ライフサイクル)。

Dockerfile

コンテナの情報をコード管理。ユーザイメージをビルドするためのコマンド群。イメージの構築に使用。

Docker Compose

複数のコンテナで構成されるDockerアプリケーションの設定(docker-compose.yml)を記述し、一括管理で実行するためのツール。

システムは単一のアプリケーションやミドルウェアでは成り立たないため、複数のアプリケーションの連携をする。その仕組みを、単一のコンテナを連携させ、かつ依存関係を管理運用する仕組みがDocker compose。

ポートフォワーディング

コンピューターが特定のポート番号で受け付けた通信を、別のアドレスの特定のポート番号へと自動的に転送する機能

✅使い方

①Dockerイメージのビルド(Dockerfileを基にするか、イメージをプルする)

docker image build -t イメージ名[:タグ名] Dockerfile配置ディレクトリのパス

②イメージからDockerコンテナを実行(※ポートフォワーディングでユーザーがコンテナ内のアプリケーションを利用できるようにする。)

docker container run -d <コンテナ名> -p <ホスト側ポート>:<コンテナポート>

dオプションでバックグラウンドでコンテナを実行。

pオプションでポートフォワーディング。ホスト側は省略可能でdocker container ls コマンドで割り当てられたポートを確認できる。

Dockerfileの書き方

DockerfileはDocker独自のDSL(ドメイン固有言語)を使ってイメージの構成を定義する。

FROM:ビルドする際に作成するDockerイメージのベースとなるイメージを指定。DockerHubのレジストリを参照する。

RUN:Dockerイメージビルド時にDockerコンテナ内で実行するコマンドを定義。

COPY:Dockerを動作させているホストマシン上のファイルやディレクトリをDockerコンテナ内にコピーするためのインストラクション(命令)。シェルスクリプトを指定するケースが多い。

WORKDIR:コンテナの作業ディレクトリ。

CMD:Dockerコンテナとして実行する際に、コンテナ内で実行するプロセスを指定。

ENTRYPOINT:コンテナが実行可能ファイルとして使用する際に定義するコマンド。

EXPOSE:コンテナが公開するポート

VOLUME:ホストや他のコンテナからマウントできるポイントを作成。

👉docker image buildコマンドでイメージをビルドする。docker image lsコマンドでイメージがビルドされたのが確認できる。

docker-compose.ymlの書き方

version:docker-compose.ymlのフォーマットのバージョン

・service:
└ echo:コンテナの名前の定義
└ image:Dockerイメージ
ports:ポートフォワーディングの指定
build:Dockerfileが存在するディレクトリの相対パスを指定

👉docker-compose up時にDockerイメージのビルドも一緒に行って実行する。

教本通りにとりあえず使ってみる

※教本の1~2章参考

✅Hyper-Vの有効化

※無効化になっていると以下のようにDockerは起動しない。

「Windowsの機能の有効化または無効化」からHyper-Vのチェックを入れて再起動。

✅出来合いのイメージで使ってみる

①Dockerイメージ取得(5分くらいかかる)

docker image pull

docker image pull gihyodocker/echo:latest // DockerレジストリからDockerイメージをダウンロード
>> latest: Pulling from gihyodocker/echo

②コンテナ(イメージ基に作成)の実行

ポートフォワーディング:Docker実行環境の9000ポート経由でHTTPリクエストが受けられるようにしている。

docker container run -t -p 9000:8080 gihyodocker/echo:latest
>> 2020/05/16 07:00:43 start server

③動作確認

curl http://localhost:9000/
>> Hello Docker!!

④停止

docker container stop <container IDもしくはNAME>

一括停止

docker stop $(docker ps -q)

✅Dockerfileを手作業で作成して使ってみる

①Dockerfile作成

※コード割愛

②Dockerイメージをビルドする

※Dockerfileのあるディレクトリ内で実行。-tオプションで任意のイメージ名を指定。example/echoというイメージ名にしている。「.」はDockerfile配置のディレクトリ場所。

docker image build -t example/echo:latest .
docker image ls
>> REPOSITORY                         TAG                  IMAGE ID            CREATED             SIZE
   example/echo                       latest               7a3ccd08928c        5 minutes ago       803MB

③コンテナの実行

docker container run -d example/echo:latest
> f1fb3f2f91f2fa09c02409a25ccdaabf3cd0063920b6b~~~ // DockerコンテナのID

④ポートフォワーディング

docker container run -d -p 9000:8080 example/echo:latest
>> 5b8f0c0593e0c7c97dadfc0be037151537~~~
curl http://localhost:9000/
>> Hello Docker!!

⑤イメージのプッシュ

Docker Hubへのサインアップが必要。

docker login
>> Authenticating with existing credentials...
   Login Succeeded
docker image tag example/echo:latest chobi1125/echo:latest
docker image push chobi1125/echo:latest

リポジトリを確認。

実用的なコンテナの構築

※教本3章を基にまとめています

✅Dockerコンテナ運用で知っておくべきこと

①Dockerのコンテナ型仮想化技術ではホストOSとカーネルのリソースを共有しているため、Windows、Linux、macOSすべてで共有することはできない。

②Dockerコンテナを実行中に書き込まれたファイルは、ホスト側にファイル・ディレクトリをマウントしない限りコンテナ破棄のタイミングでディスクから消去される。

✅永続化課題

ステートフルな性質を持つアプリケーションをコンテナで運用するには、Data Volume(Dockerコンテナ内のディレクトリをディスクに永続化する仕組み。共有・再利用が可能になる)を利用する。

Data Volumeの作成 (vオプションを利用する。)

docker container run [options] -v ホスト側ディレクトリ:コンテナ側ディレクトリ リポジトリ名[:タグ] [コマンド] [コマンド引数]
docker volume create --name hoge_volume // こっちの方が明示的でシンプル

VolumeはDockerの管理領域であるvar/lib/docker/volumes如何に配置される。

Data Volumeの確認

docker volume ls

公式参照

Data Volumeのマウント

docker run -d --name mysql -p 3306:3306 -v mysql_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=password mysql

✅Docker composeで使う場合 参考

volumesのkey以下に、data volumeを定義できる

volumes:
# ${volumesに定義したkey}:{マウントパス}
- mysql:/var/lib/mysql

✅Laradock(windows)のPostgreSQL永続化

参考:Docker for Windowsでpostgresのデータマウントができない人へ

①docker-compose.ymlのpostgres部分を編集

    postgres:
      build: ./postgres
      volumes:
        - laravel-ci-db:/var/lib/postgresql/data
        #- ${DATA_PATH_HOST}/postgres:/var/lib/postgresql
        - ${POSTGRES_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d

volumes:
  laravel-ci-db:
    external: true

②Data Volumeの作成

docker volume create --name laravel-ci-db

③コンテナ起動

docker-compose up -d workspace php-fpm nginx postgres

公式

externalオプションをtrueに設定したらComposeの外にあるボリュームを作成する。

※var/lib/dockerは通常以下にマウントされるらしい。参考

C:\Users\Public\Documents\Hyper-V\Virtual hard disks

おわりに

まだ学習して間もないが書籍で学ぶことで、ネットでは得られなかった情報を学ぶことができている。

引き続き学びは追記していきます◎

✅参考
Dockerコンテナの作成、起動〜停止まで
2018年の最先端バックエンドエンジニアに必要なスキルについて考えてみました。
いまさらだけどDockerに入門したので分かりやすくまとめてみた
【図解】Dockerの全体像を理解する -前編-

💻第2回 HTTPSの詳細 (1/2)

通常のHTTPを使った通信では、Webサーバ側のTCPのポート番号は(デフォルトでは)80番となっている。

備忘録

✅GUIを扱う

Desktopでコンテナの起動状況や停止もできますね◎

詳細も見れる。

✅ECS

・AWSにはAmazon Elastic Container Service(ECS)があり、Dockerコンテナを運用するためのマネージドサービスが存在している。公式

・WindowsでHyper-V有効にしてるとVirtualBoxが同時に実行できないらしい。また、著書ではDocker for Windows挫折の代替案としてDocker Toolboxが紹介されてる。

✅コマンドで理解を深める

イメージを削除するにはまずそのイメージに紐づくコンテナを削除している必要がある。

イメージの一覧確認 参考

docker images

多すぎて衝撃。。。容量もめっちゃ食ってそう??

動いているコンテナの確認

docker ps

停止しているコンテナ含めて確認

docker ps -a

こちらも-aオプション初めて使った。。。これまた衝撃。。。

参考:Dockerイメージとコンテナの削除方法

コンテナの削除

docker rm <コンテナID>

イメージの削除

コンテナが残っている場合は削除されない。

※通常はコンテナを削除してからイメージを削除するのが良さそう。

docker rmi <イメージID>
docker rmi -f <イメージID> // forceオプションを付けるとコンテナを消していない状態でも削除できる。ただしコンテナは残る。

✅初回起動時に時間がかかる理由

イメージのビルドが走るため

✅マウントに関して

Dockerにおけるボリュームのマウント
※後程読みたい記事。

コメントを残す