コンニチハ、BFT名古屋支店のヤタテです。
今回は、AWSのLambda/Batchでのコンテナイメージを理解するためにやった事を
書いていきたいと思います。
Lambda/Batchへのコンテナ利用 -01_コンテナ理解-
背景
AWS Lambda/Batchにて、コンテナイメージによる実装を開始。
検証内容
- Lambdaへのコンテナイメージによる関数実装
- Batchへのコンテナイメージ流用が可能であるか確認
現状
⇒ AWSについてはある程度イメージがつく。
コンテナは、使用や作成イメージがほとんどついていない。
コンテナに触れてみる
Dockerインストール
OSの選定
OS:ubuntu 20.04
OSのこだわりは特になく、dockerの導入が容易であるため。
AWS ECS等は、Dockerを使用しているため。
参考:Amazon ECS における Docker の基本
導入手順
- 前提パッケージのインストール (https経由でのパッケージ取得に必要)
- 公式DockerリポジトリのGPGキー追加
- aptソースにDockerリポジトリを追加
- aptリポジトリの更新 (Dockerリポジトリ追加分の読み込み)
- Docker本体のインストール
本手順は、以下サイト参照にて実施。
Ubuntu 20.04へのDockerのインストールおよび使用方法
Ubuntuにdockerをインストールする(Qiita)
コンテナの基本概念
- コンテナイメージ:コンテナの元の様なもの。OSイメージやAMIイメージのようなもの。
- コンテナ :立ち位置としては仮想マシン。イメージを元に起動する。
- Pull(プル) :コンテナイメージを、リポジトリから取得すること。
- Push(プッシュ) :コンテナを元に、コンテナイメージを作成/更新すること。
Dockerの基本操作
Dockerコマンド
Docker操作を行うためのコマンド。 実行するためには、実行ユーザをグループ「docker」へ追加する必要あり。 ※Dockerインストール時に自動でグループ作成
$ docker <サブコマンド> <オプション>
Dockerコンテナの起動/停止
稼働中のコンテナ確認
※オプション(-a)を付けることで、非稼働中のコンテナも表示。
$ docker ps
コンテナの起動 (非稼働コンテナ)
※本コマンドで起動できるのは、非稼働中のコンテナのみ。(docker ps -aで確認可能)
$ docker start <コンテナID>
コンテナの起動 (コンテナイメージ)
※オプション(-lt)を付けることで、コンテナ上で操作可能。
$ docker run <コンテナイメージ名(ubuntuなど)>
コンテナの停止
$ docker stop <コンテナID>
Dockerイメージの作成
Dockerfileを利用したイメージ作成
イメージ作成(ビルド)コマンド
docker build -t <イメージ名>:<タグ名> <Dockerfile配置先> 例) docker build -t testimage:v1.0 . ←カレントディレクトリ指定
注意
- Dockerfileのファイル名は、「Dockerfile」で固定
- イメージ作成に使うパッケージやソースコードは、Dockerfileの配置先を規準に決定される
→ Dockerfileを記述する際、COPYやADDで要注意
Dockerfileの作成
Dockerfileの作成時は、Dockerfileを中心にディレクトリ構成を考える。 ※各ディレクトリ名は任意。
./Dockerfile ./Packages.d ← ビルド時に使用するpkgファイル格納用 ./Sources.d ← ビルド時に使用するソースコード格納用 ./Conf.d ← コンテナ稼働させるMWの設定ファイル格納用 etc...
Dockerfile内のコマンド
以下、代表的なコマンド記載。
- FORM:ビルドに使用する元イメージを指定。
- RUN:ビルド時に実行するコマンド。
- COPY:ビルド時にホストからファイルをコピーする際に使用。
ディレクトリ指定は、Dockerfile配置場所がルートディレクトリになる点注意。 - ADD:COPYと異なり、gzなどの圧縮ファイルの解凍まで実施。扱いが難しい。
- ENV:コンテナ起動時の環境変数指定。
→起動時に指定のため、コンテナ内部でprofile等による永続設定必要なし。 - WORKDIR:後述の「CMD」コマンド実施時のカレントディレクトリ指定。
- CMD:コンテナ起動時に実行するコマンドの指定。
→コンテナ内のサービス起動やシェル実行などで使用。
ubuntuイメージにoracleJDKを導入し、「Hello world!!」を出力するdockerイメージ
--ディレクトリ構成-- ./Dockerfile ./Packages ←oracleJDKのパッケージ(.tar.gz)を格納ディレクトリ ./Sources ←「Hello world!!」を出力するJavaのクラスファイルを格納ディレクトリ ./temp ←一時保存ディレクトリ (今回は特に使用なし)
--Dockerfile-- # ubuntu 20 のベースイメージを取得 FROM ubuntu:latest RUN mkdir /work RUN mkdir /work/01_dockerfiles RUN mkdir /opt/java/ COPY Sources/Main.class /work/01_dockerfiles/ COPY Packages/jdk-15.0.2_linux-x64_bin.tar.gz /tmp/ RUN tar -zxvf /tmp/jdk-15.0.2_linux-x64_bin.tar.gz -C /opt/java/ ENV JAVA_HOME /opt/java/jdk-15.0.2 ENV PATH $PATH:$JAVA_HOME/bin WORKDIR /work/01_dockerfiles CMD ["java","Main"]
--Hello worldのコード-- public class Main{ public static void main(String[] args){ String OneWord; OneWord = "Hello World!!"; System.out.println(OneWord); } }
この後実行してHello worldが出力されたらOKとなります。