2020/08/21 Dockerの勉強します
ここ最近DockerやECSを勉強しつつもアウトプットがなかったので、軽くアウトプット。
k8sにも触れていければなぁと。
学校の課題でECサイトを作ってみよう。みたいなものがあり、
ECSを使うことに。AWS今までほとんど使っていなかったため、
ひとつひとつ勉強しながらモクモク。
いろいろ構成を考えるも、
それが正しいのかどうかもわからない。
答え合わせというかベストプラクティスを知りたくても、
聞く人がいない。残念。
ECS
ECSはElastic Container Serviceといい、AWSが提供するコンテナ型のサービス。
タスク、サービスなどという単位で実行させる。
コンテナはDockerhubやECRから持ってくる。
ECSを使うにあたって、コンテナを作成する必要があったので、
ローカルのマシンで、Dockerfileを使ってコンテナを作成。
そのコンテナをECRにプッシュして利用する。
つまりDockerの知識は必須。。。
Docker
前に書いたように、Dockerはコンテナ型の仮想化技術。
必要最低限のDockerのイメージに関する知識が必要。
build
Dockerはイメージからコンテナを作成する。
そのためにイメージを手元に用意する必要がある。
イメージは自分で作る、外部リポジトリから持ってくる等で入手する。
Dockerfileというファイルからイメージを作成する。
イメージを作成することをビルドという。
Dockerイメージはなるべく軽量で1コンテナ1プロセスで作成する。
構文
# docker build -t <name>:latest .
-tオプションはイメージの名前を設定する。
:latestについてはタグを指定する。
Dockerにはタグを利用してバージョン管理をする特徴がある。
:latestはデフォルトで付けられるタグ。
例) testimage:1.1 testimage:1.2
. についてはカレントディレクトリを示している。
デフォルトでDockerfileという名前のファイルを参照する。
parentdir*
| - Dockerfile
L sub
L Dockerfile2
の場合、-fオプションを利用することで
docker build -t image1:latest .
docker build -t image2:latest -f sub/Dockerfile2
のように指定ができる
Dockerfile
Dockerfileにはイメージの作成に関する部分を記載する。
イメージは階層になっており、他のイメージをベースに新しいイメージを作成する。
code:例 Dockerfile
FROM centos:7
RUN echo "building..."
RUN yum -y install httpd
EXPOSE 80
これはCentOSをベースのイメージにして、httpdをインストールし、
80を待ち受けながらhttpdを実行するという設定。
このDockerfileでビルドすると、、
docker build -t httpdtest:latest .
https://gyazo.com/bc6ed37ef24eec3b10d8ed22727dca7b
https://gyazo.com/1ab84dfd73216b235d2e6bfa12f07904
このようにビルドが完了する。
FROMでpullしたイメージはローカルに保存される。
イメージは自動でDockerhubを参照するが、ローカルにある場合はそれを利用する。
所持イメージの表示
docker image ls
https://gyazo.com/40c360d11b5831b39a150f248a2fa78a
このように表示される。
Dockerfileで利用される命令
table:コマンドについて
FROM ベースとなるイメージを指定
MAINTAINER 作成者の情報(非推奨。LABELを使うべき)
RUN ビルド時に実行するコマンド
CMD コンテナ起動時に実行するコマンド
LABEL ラベル情報
EXPOSE 公開するポート番号
COPY ホストマシンからコンテナにファイルをコピー
ADD COPYと同じだが、圧縮ファイルを展開してコピーする
USER 実行ユーザーの指定
VOLUME 永続ボリュームの割り当て
FROMで指定するリポジトリはデフォルトでDockerhubを参照するが、
他のリポジトリを指定することも出来る。
<ホスト>/<Namespace>/<Repository>:<tag>
ホストはURLと違い「 https:// 」のようなプロトコルがつかない。
レジストリにログインするには
docker login
コマンドを利用する。
RUN
起動するにはRUNを使う
ビルドしたイメージからコンテナを起動する
docker container run -d -p 80:80 httpdtest:latest
オプション
-d
デタッチモードで起動する。
デタッチモードとはコンテナに入ること無くバックグラウンドで起動する。
dオプションを使わない場合はフォアグラウンドモード
フォアグラウンドモードはコンテナ内の出力がコンソールに表示される。
-i
コンテナの標準入力を開いたままにする。
-t
ttyを割り当てる (-itのようにセットで使う)
-p
ポートフォワーディングをおこなう。
EXPOSEで指定したポートでコンテナは待ち受けているが、
それはホストマシンからのみ。
外部からアクセスするにはホストマシンの待受ポートと、コンテナの待受ポートを紐付ける。
そのために、<ホストポート>:<コンテナポート>のように指定する。
今回は80:80
--name
コンテナの名前を指定する。デフォルトではランダムに名前がつけられる。
その他色々
色々あるので省略。使いながら覚える。
コンテナ確認するコマンド
docker container ps
https://gyazo.com/5803963a01204420b285bcff8c74765c
CONTAINER IDを利用してstopやrmなどを行う。
PORTSはポートフォワーディング。
NAMESはランダムで決められている。
ブラウザからアクセスしてみると、
https://gyazo.com/f6449ae48c7d7b2a84ebdff78ec69112
ここまでは最低限のDocker操作。
他にも
中に入って作業を行う場合、
docker exec -it <id> /bin/bash
作業を行った後、そのイメージを新たに保存する
docker container stop <id>
docker commit <id | name> <imagename>:<tag>
イメージ名変更
docker tag <name>:<tag> <new_name>:<tag>
詳細を見る
docker inspect <id>
いろいろあるけどまだ勉強中。。。。