Docker コンテナ編 ~基礎からの応用~

基礎

Dockerコンテナ dockerイメージから作成された、システムとアプリケーションが実行されている状態。

基本コマンド

Dockerコンテナ実行コマンド

docker container run -d イメージ名:タグ名

-dがバックグラウンドで実行。 出力される文字列は実行時のコンテナIDで操作でコンテナを特定するために利用する。

コンテナ一覧コマンド

docker container ls

Dockerコンテナ停止コマンド

docker container stop $(docker container ls --filter "ancestor=イメージ名" -q)



ポートフォワーディング

Dockerコンテナは1つの独立したマシンのように扱える。 そのためホストマシンのコンテナポートに紐付け、コンテナの外からきた通信をコンテナポートに転送することができるポートフォワーディングを使う。

docker container run -d -p ホスト側ポート番号:コンテナポート イメージ名:タグ名

-pオプションで指定できる。 またホスト側ポート番号は省略でき、その場合はホスト側で空いているポートが自動的に割り当てられる。

docker container run -d -p コンテナポート イメージ名:タグ名

ポート番号確認はdocker container ls で PORTSの:と->の間の番号になる。

Docker Image編 ~初心者はここから!~

基本

dockerイメージ
dockerコンテナの構成を設定したもので、コンテナの作成の基になる。
dockerコンテナ
dockerイメージから作成された、システムとアプリケーションが実行されている状態。

docker image pull イメージ名:タグ 


でイメージを取得できる。 タグを指定しない場合はlatestとなる。


Dockerfile

Dockerfileはdocker独自のDSL(ドメイン固有言語)を使ってイメージの構成する。 FROMやRUNといったキーワードはインストラクション(命令)と呼ばれる。

FROMは作成するDockerイメージのベースとなるイメージを指定する。 イメージはDockerHubに登録されているものをダウンロードする。

RUNの引数にはコマンドを指定して、dockerイメージ作成時に実行する。

COPYはホストマシン上(自分のパソコンなど)のファイルやディレクトリをDockerコンテナ内にコピーするためのインストラクション。

CMDはDockerコンテナ起動時に実行されるプロセス。 コマンドのスペースで分けて、配列の形式で指定する。

コマンド

イメージのビルドコマンド docker image build -t イメージ名:タグ名 Dockerfileの配置ディレクトリパス -t は任意のイメージを指定する。
タグ名も指定できる。
省略時はlatest -tがないとハッシュ値で管理するため、めんどくさい。 イメージ名にはexample/testなどと/の前に名前空間を指定し、衝突回避が良い。

docker image ls 

でイメージを確認する。

その他

その他のインストラクション
LABEL イメージの作者名などに使用。
ENV Dockerfileを基に作成したコンテナ内での環境変数を指定する。
ARG 実行時にに情報を埋め込むために使用。実行時だけ使用できる一時的な環境変数

ENTRYPOINT
ENTRYPOINTはイメージの作成側でコンテナを制限したい場合に活用できる。

Docker 序章 ~Linuxコンテナ編~

まずdockerの使う意味について

開発中はライブラリやファイルの設定をしていますよね?

それでデプロイするときにファイルの修正とかするのめんどくさいから、

開発中からサーバーの環境を再現するためのもの。

 

dockerってどんな技術?

dockerは、Linuxのコンテナ技術を使ったもの。

まずコンテナから。

 

そもそもコンテナとは?

コンテナはよく仮想化と比較される。

1.仮想化

ハイパーバイザーっていうコンピュータを仮想化するためのソフトウェアが

エミュレート(ハードウェア(モニター、ハードディスク)をコピー)して

物理的なマシンの中に、仮想的なコンピュータを作る。

それで複数のOSを単一のシステム上で並列で実行できる。

つまり、一台のmacWindowsだったりLinuxを一緒に実行できるよってこと。

 

2.コンテナ

ではLinuxのコンテナ技術へ

Linuxのコンテナ技術は仮想的なコンピューターを作りません!

ハードウェアまで仮想化しません。

OS上の環境(アプリケーションとか)を仮想化します。だから軽いんです。

細かくいうとカーネルを共有している。

 

だからハードウェアとかは一緒だよって感じ。

 

まとめ

仮想化とコンテナは仮想化させる範囲が違う。

仮想化はコンピューター丸ごと仮想化するけど

コンテナはOS上の環境までしか仮想化させないから軽い。

 

アプリケーションの独立とかカーネルの詳細は触れてません。

また、間違っていることや意見などあればコメントをお願いします。