Docker
Dockerとは
-
Docker社が開発している、コンテナ型の仮想環境を作成、配布、実行するためのプラットフォーム
-
コンテナ技術によりLinux仮想環境を動作可能
- サービスのサーバーはLinuxが一般的。開発環境と本番環境の環境差異を軽減するのに役に立つ
💡コラム
Linuxコンテナは、Linuxカーネルとリソース管理機能(cgroups、namespacesなど)を使用して動作する。そのため、 📄 仮想化 で述べた通り、LinuxコンテナをWindowsやmacOSなどの異なるOS上で直接実行することは難しい。
異なるOS間でシームレスに実行するための方法として、仮想マシン技術が存在し、仮想マシンを提供、実行するためのツールとしてDocker Desktopがある。 -
コンテナを入れ替えることで開発環境を簡単に動かせる
- ゲームのカセット(ソフト)みたいなイメージ
-
コンテナ技術によりLinux仮想環境を動作可能
Dockerを使う利点
- 構築環境をコードで管理できるので、どこでもだれでも同じ環境が作れる
- コード化されているため作成した環境を配布しやすい
-
冪等性
が保証されていてスクラップ&ビルドが容易にできる
💡冪等性とは?
何度やっても同じように動くこと- 冪等である:何度セーブという処理をしても適切に起動する
- 冪等でない:セーブされる時とセーブされない時がある
Dockerを構成する要素
-
クライアント(Docker クライアント)
- Docker(デーモン)を操作するのに利用する
-
クライアントとデーモンは同じシステム上でも実行できる
- リモート上のデーモンに接続することも可能
- ユーザからのコマンドを受け付けると、Dockerデーモンと通信し、応答を返す
-
Docker Host
-
Docker デーモン(
daemon
)
- ホスト上で動く
- コンテナを起動したり管理する
-
デーモンとは
-
裏方で仕事が来るのを待ち構えているプログラム
- ftpd,sshd,httpdの末尾dはdaemonのd
- 悪魔( demon )じゃないではなく守護神( daemon )の意
-
裏方で仕事が来るのを待ち構えているプログラム
-
コンテナ
- アプリケーションと実行環境本体
- 実行・開始・停止・移動・削除ができる
-
イメージ
- コンテナを作成するために使われる、読み込み専用のテンプレート
- イメージからコンテナを作る、またコンテナからイメージを作る
-
Docker デーモン(
daemon
)
-
レジストリ
- イメージを保存・管理するリポジトリ
- 既存のイメージをPULLしてローカル環境で使ったり、自分のイメージをPUSHして共有したりする
Docker Hub
- Docker公式のDockerレジストリ
-
代表的なミドルウェアはすでにイメージ化されているのでそのまま使える
- 自分用にカスタマイズすることも可能
- 例えばCentOSのイメージをベースとしてそこにPythonを入れて自分の開発環境イメージを作ったりなど
-
フリーソフトをインストールするのと同じでちゃんと中身を確認してから使いましょう
- 非公式なimageをrunすると悪意あるプログラムが動くかもしれない。Docker fileはちゃんと確認しましょう
ECR public について
- AWSで用意されているコンテナレジストリの一種で、Docker Hubと同様にパブリックアクセスが可能なツール
- dockerhub同様のパブリックなコンテナイメージリポジトリとしてECR Publicがある
制限
- AWSアカウントユーザはパブリックリポジトリ用に 50 GB/月のストレージを常時無料で利用可能
- 匿名で (AWS アカウントを使用せずに) 毎月 500 GB のデータを無料でパブリックリポジトリからインターネットに転送可能
- AWS アカウントにサインアップするか、既存の AWS アカウントで Amazon ECR に認証すると、毎月 5 TB のデータをパブリックリポジトリからインターネットに無料で転送可能
- パブリックリポジトリから任意の AWS リージョンの AWS コンピューティングリソースにデータを転送する際には、コスト無しで無制限の帯域幅を得ることがでる
Docker Hub におけるダウンロード率制限とは
ユーザーの種類 | pull rate limit |
---|---|
非認証ユーザ | 100 pull / 6 hour |
無料プラン | 200 pull / 6 hour |
Proプラン | 無制限 |
Teamプラン | 無制限 |
Dockerfileとは?
-
Dockerイメージを作成するための設定ファイル(手順書のようなもの)
- 例えば「CentOSをベースにして、Apacheを入れて、コンテナ起動時にApacheを立ち上げる」というような環境を定義することができる。
-
docker image build
コマンド一つで、Dockerfileに書かれた通りにイメージを作ってくれる
sample
FROM node:16-alpine3.14
WORKDIR /usr/src/app
# モジュールインストール
COPY ./tool ./
RUN npm config set registry "http://registry.npmjs.org/"
RUN npm install
Dockerfileを定義する利点
- ファイルを配布することで同一の環境を複製でき、常に同じ構成で環境構築することができる
- ファイルの記述を読むことで、アプリケーション構成や構築手順などの情報を確認することができる
- ビルドコマンド1つでイメージが生成できるため、構築作業の省力化や作業ミスの低減になる
よく使うDockerfileの命令
命令 | 概要 |
CMD | (コンテナ実行時)コマンド実行 |
COPY | ファイルやディレクトリの追加 |
ENV | 環境変数を設定 |
FROM | ベースイメージの指定 |
RUN | (イメージ作成時)コマンド実行 |
VOLUME | ボリュームを指定 |
WORKDIR | 作業ディレクトリの指定 |
Appendix
Dockerでよく使うコマンド
コマンド | 概要 |
docker container cp
| コンテナとローカル間でのファイルコピー |
docker container exec
| 起動中のコンテナでコマンド実行 |
docker container ls
| コンテナ一覧表示 |
docker container rm
| コンテナの削除 |
docker container run
| コンテナの起動 |
docker container stop
| コンテナの停止 |
docker container prune
| 停止中コンテナの一括削除 |
docker container logs
| コンテナのログ表示 |
docker image ls
| イメージ一覧 |
⚠️
資料中のコマンドについて
これらは新しいコマンド体系です。こちらの方が説明・イメージしやすいと思います。
$ docker [ 操作対象 ] [ 操作内容 ]
旧コマンドを利用する方も多いので、好きな方を使ってください。
コマンドの意味 | 新 | 旧 |
イメージ一覧表示 | docker image ls | docker images |
コンテナの起動 | docker container run | docker run |
コンテナ一覧表示 | docker container ls | docker ps |
docker container runでよく使うオプション
オプション | 概要 |
-it
| 対話モード&ログイン(コンテナ内で作業したいとき) |
-e
| 環境変数を設定 |
-d
| バックグラウンド起動 |
-p
| ホストとコンテナ間のポートをマッピング |
-v
| ホストとコンテナ間のディレクトリをマッピング |
コマンド・オプションのユースケース
コンテナ起動時にコンテナに入る
-
抜けるときは
Ctrl-C
かexit
-
コンテナから出るとコンテナは停止する
$ docker container run -it httpd /bin/bash root@hoge# cat /etc/debian_version 10.3 root@hoge#
起動中コンテナの操作
-
exec
コマンド$ docker container run -d httpd $ docker container ls $ docker container exec <コンテナ名> /bin/bash -c "cat /etc/debian_version"
起動中コンテナに入る
-
Dockerfileに書かれているOSで起動していることがわかる
$ docker container exec -it <コンテナ名> /bin/bash root@hoge# cat /etc/debian_version 10.3 root@hoge#