🦔

dockerfileのEXPOSEとネットワークオプション

2021/02/09に公開

はじめに

くーばねてすをやっつけるためにこれまでにLinuxさんとAWSさんと仲良くさせていただいたが、新たなステージに上がるためについにdockerさんに会いに行くことにした。dockerさんと仲良くなることでコンテナシステムの仕組みの理解とくーばねてすを倒すための調査をする。
今回はdockerさんでコンテナを開発して、くーばねてすでの構築の基礎的な部分を理解する。

概要

■dockerfileのコマンド
■EXPOSE

をまとめた!(^_-)-☆

■dockerfileのコマンド

dockerfile命令(コマンド)、意味ざっくり
|コマンド|意味|
| --- | --- | --- |
|FROM イメージ:タグ|コンテナのベースイメージ|
|RUN コマンド|FROMのベースイメージで実行するコマンド|
|ADD ソース コンテナ内宛先|ソースをコンテナ内宛先へコピーする|
|ENTRYPOINT |コンテナが実行するファイルを指定する|
|CMD|コンテナの実行時に実行されるコマンドを指定する|
|ENV key=Value|環境変数をセットする|
|EXPOSE port|公開ポートを設定する|
|USER ユーザ名|RUN,CMD,ENTRYPOINTの実行ユーザを指定する|
|VOLUME["/path"]|共有可能なボリュームをマウントする|
|WORKDIR /path|RUN,CMD,ENTRYPOINT,COPY,ADDの作業ディレクトリを指定する|
|ARG <名前>[=<デフォルト値>]|ビルド時の引数を定義する--bild-arg<引数>=<値>|
|LABEL key=value key=value|イメージのメタデータにラベルを追加する|
|MAINTAINER<名前>|イメージのメタデータに製作者を追加する|
ルールがたくさんある!('_')

dockerfileはGO言語で記述する。

■EXPOSE

EXPOSEはコンテナのポートを公開するコマンドだ。

EXPOSE記述形式
EXPOSE [ポート番号]

EXPOSEはDockerのコンテナのポートを公開するだけになる。
EXPOSEコマンドは指定しなくても-pオプションでコンテナポートを指定することができる。

EXPOSEなしにポートを指定接続
$ docker run -p ホストポート:コンテナポート

EXPOSEは書いただけで何か動作が変わるといったものではなく、他の機能から参照されて意味を持つ。EXPOSE命令は、実際にはポートを公開しておらず、ドキュメントとして機能し、ポートの公開のみが意図されている。
EXPOSEの指定はdocker run -PもしくはDockerのlink機能を使ってコンテナ間連携をするときだけ意味を持つ。

doker run -PはEXPOSEしているすべてのポートを公開する。
ここでEXPOSEで指定したポート番号がいきてくる。
ホストポートの指定はしないのでdockerが勝手にホストのポートを割り当て接続される。
docker run --link は連携対象のコンテナを指定するとEXPOSEしているポートに接続するための環境変数を付けてコンテナを起動する。

↓run コマンドの、コンテナのネットワークに対応するオプション

docker run でコンテナポートを露出する
--expose: コンテナ内のポート(ポート範囲)を露出する
         「EXPOSE」で設定される露出ポートに追加される
 $ docker run --expose 80 ubuntu bash
EXPORTしたポート番号をホストに接続する
-P    : (EXPOSEした)全ての露出ポートをホスト側に公開する
ここでEXPOSEで指定したポート番号がいきてくる。
ホストポートの指定はしないのでdockerが勝手にホストのポートを割り当て接続される。
コンテナのポートを指定しホスト側に接続する
-p     : コンテナのポートまたはポート範囲をホスト側に公開し接続する。
	ポートがTCPとUDPどちらも指定できる。デフォルトではTCPになる。
記述形式
docker run -p ipアドレス:ホスト側ポート:コンテナ側ポート 
docker run -p ipアドレス::コンテナ側ポート
docker run -p ホスト側ポート:コンテナ側ポート 
docker run -p コンテナ側ポート
$ docker run -p 127.0.0.1:80:8080 ubuntu bash
--link : 他のコンテナに対するリンクを追加 (<名前 or id>:エイリアス or <名前 or id>)

docker run -pでのポート番号の公開範囲指定
ホスト側ポートとコンテナ側のポートは、どちらもポート範囲を指定できる。
docker run -p コンテナポート番号
とした時はホストポートが指定されないのでホストポートの空いてるポート番号が自動的の接続される。
確認する場合は
docker ps
で確認する。
docker run -pで
両方で範囲を指定する時は、コンテナ側のポート範囲とホスト側のポート範囲が一致する必要がある。
例:-p 1234-1236:1234-1236

ホスト側のポート範囲しか指定しない時は、コンテナ側で公開されるポートはホスト側のポート範囲のいずれで指定する。
例:-p 1234-1236:1234

話は戻ってEXPOSEコマンドで露出ポートを指定する。

testdockerfile
FROM centos:centos7
RUN yum install -y httpd
EXPOSE 80     ※80番ポートを公開する

あんまり使わないやつ?('_')

まとめ

EXPOSEとかネットワークオプションとかこんがらがってきた!('_')

Discussion