はじめに
※ Docker入門者の学習記事です!
Deno が盛り上がって来ているように見えます。🦕
興味をそそられたので、学習も兼ねてさっそくDockerでコンテナ化してみました。
ゴール
- Dockerfileを自作して、イメージを作ってみる
- コンテナにDenoをインストールして、触れる環境を作る
- Denoの標準APIを使用して、Webサーバーを立ち上げる
Dockerfileを作成
コンテナイメージの元となるDockerfile
を作成します。
最終的には、以下のようなものが出来上がりました。
FROM debian:stable-slim
WORKDIR /var/www/html
RUN apt-get -qq update \
&& apt-get -qq -y install curl zip unzip \
&& curl -fsSL https://deno.land/x/install/install.sh | sh \
&& apt-get -qq remove curl zip unzip \
&& apt-get -qq remove --purge -y curl zip unzip \
&& apt-get -qq -y autoremove \
&& apt-get -qq clean \
&& echo 'export DENO_INSTALL="/root/.deno"' >> ~/.bash_profile \
&& echo 'export PATH="$DENO_INSTALL/bin:$PATH"' >> ~/.bash_profile
CMD ["/bin/bash", "-c", "source ~/.bash_profile && bash"]
Dockerfileの内容
基本設定
元となるOSイメージ: 今回は軽量なdebian-slim
を選択
FROM debian:stable-slim
今回はWebサーバーを起動させるので、/var/www/html
を作業ディレクトリに指定してみました。
WORKDIR /var/www/html
Denoのインストール
基本的には、Deno公式のやり方と同じです。
まずは、Denoのインストールと、シェルスクリプトの実行に必要なcurl
zip
unzip
をインストールします。
RUN apt-get -qq -y install curl zip unzip
Deno公式のやり方と同じようにインストールコマンドを実行。
RUN curl -fsSL https://deno.land/x/install/install.sh | sh
あとしまつ
不要なファイルを削除します。
—purge
オプションを使用すると設定ファイルごとすべて削除します。再び使わないようなパッケージに使用。
RUN apt-get -qq remove --purge -y curl zip unzip
不要になった依存パッケージまで削除
RUN apt-get -qq -y autoremove
パスを通す
deno
コマンドを使用するために、パスを通してやる必要があります。
RUN echo 'export DENO_INSTALL="/root/.deno"' >> ~/.bash_profile \
&& echo 'export PATH="$DENO_INSTALL/bin:$PATH"' >> ~/.bash_profile
たった今変更したプロファイルを、bashに適用します。
CMD
にはコンテナ起動直後に実行されるコマンドを記述します。
コンテナ起動後も引き続きbashを使用するので、最後に&& bash
を引っ付けておきました。
CMD ["/bin/bash", "-c", "source ~/.bash_profile && bash"]
イメージのビルド
-t
オプションをつけることで、名前をつけてイメージをビルドします。今回はdeno-docker
と名付けました。
Dockerfileを作ったディレクトリで、以下のコマンドを実行します。
docker build ./ -t deno-docker
コンテナの起動
以下のコマンドで、コンテナを起動します。
ちょっと長いですが…
docker container run -it --rm -p 8080:8080 --mount src=`pwd`,target=/var/www/html,type=bind --disable-content-trust deno-docker
1行づつコメントを以下につけました。
docker container run \ # コンテナ起動
-it \ # コンテナに入って標準入力を待ち受ける
-p 8080:8080 \ # ポートの指定(ホストのポート:コンテナのポート)
--rm \ # コンテナを停止したら自動でコンテナ廃棄する
--mount src=`pwd`,target=/var/www/html,type=bind\ # バインドマウント
--disable-content-trust\ # 証明書のないイメージを信頼する
deno-docker # 先ほど作成したイメージ
DenoでWebサーバーを立ち上げる
コチラも公式チュートリアルのまんまです。
詳しい解説は、公式から確認できます。
helloDeno.ts
import { serve } from "https://deno.land/std@0.50.0/http/server.ts";
const s = serve({ port: 8080 }); // さっきコンテナに指定したポート
console.log("http://localhost:8080/");
for await (const req of s) {
req.respond({ body: "<h1>Hello Deno</h1>\n" });
}
- Denoは標準でTypescriptをサポートしています! 面倒な設定ともオサラバ?✋
async
なしで、await
が使用可能です!
denoコマンドで実行する
先ほどバインドマウントしたディレクトリに、Typescriptファイル(今回はhelloDeno.ts
)を保存し、
以下のコマンドを実行します。
deno run --allow-net helloDeno.ts
Denoは標準でファイル、ネットワーク、環境変数等にアクセスすることができないセキュアな設定になっています。
ネットワークを許可するには--allow-net
オプションを付与して実行します。
見事、Webサーバーが起動できました!
まとめ
- Dockerfileを自作して、イメージを作ることができた
- コンテナにDenoをインストールして、(少しだけど)Denoプログラムを書けた
- Denoの標準APIを使用して、Webサーバーを立ち上げた