お金をかけずにサーバーの勉強をしよう

開発用の Dockerコンテナを作る

2022年9月17日

メニューへ戻る

私はサーバーエンジニアでプログラマではなく、業務として Dockerコンテナを使っての開発環境を扱ったことがありません。

それどころかソースファイル管理はファイルサーバーにファイル名で配置するという古来の SIerなのでしたw。

ですので、CI/CD環境ってのは憧れであり、自分が開発しないにも関わらず「そういう環境を作ってみて〜な〜」と夢見ているのでございます。

そこでここでは以下のセットでの開発環境を作ってみようと思います。

ではまず Docker Hubにある [ubuntu]イメージを使ってコンテナを作ります。

-itターミナルに接続します。
subro@UbuntuServer2204:~$ docker run -it ubuntu
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
2b55860d4c66: Pull complete
Digest: sha256:20fa2d7bb4de7723f542be5923b06c4d704370f0390e4ae9e1c833c8785644c1
Status: Downloaded newer image for ubuntu:latest
root@8725917ec4d2:/#

上手く動いているようですね。
ターミナルに接続されて、コンテナ内部のシェルのコマンドプロンプト(ピンク行)が表示されています。

このコンテナイメージに、sshサーバーと Denoのインストールに必要なもの( curlと unzip)が欲しいので、インストールしましょう。
(本来このあたりは dockerfile でやります)

リポジトリデータベースのアップデートをします。
これをやらないと「パッケージが見つからない」ってエラーなりました。
(コンテナ内での作業であることに注意して下さい)

root@8725917ec4d2:/# apt update
Get:1 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
Get:2 http://archive.ubuntu.com/ubuntu jammy InRelease [270 kB]

〜〜〜 以下略 〜〜〜

ついでにパッケージのアップデートもしておきます。

root@8725917ec4d2:/# apt -y upgrade
Reading package lists... Done
Building dependency tree... Done

〜〜〜 以下略 〜〜〜

sshサーバーの openssh-server、Denoのインストールに必要な curlと unzipをインストールします。

root@8725917ec4d2:/# apt install -y openssh-server curl unzip
Reading package lists... Done
Building dependency tree... Done

〜〜〜 省略 〜〜〜

Running hooks in /etc/ca-certificates/update.d...
done.

インストールできました。

sshサーバーが動くために必要なディレクトリを作ります。

root@8725917ec4d2:/# mkdir /run/sshd

次に sshでログインするためのユーザーも作るんですが、このコンテナイメージを開発者に配布するネタとするにあたって、ユーザー名とパスワードはどうするのか、それぞれの開発現場で違うと思うんですよね。

更に Denoに限って言うと、ユーザーのホームディレクトリ下にインストールされるので、どこまでを配布用のコンテナイメージに含めるか、悩ましいところです。

仕事で開発している皆さんの環境ではどうしてるんでしょう。

  1. 要員全員分のユーザーやホームディレクトリを作る
  2. 同じユーザー名を使い回す
  3. コンテナ作成時に動的にユーザーを作り込んで行く

色々考えられますが、それぞれの現場でのベストプラクティスがあるんでしょうね。

とりあえずここでは私のアカウント(subro)を作って、そこに Denoもインストールしちゃいますけど、上のケースでは 2に相当するのだと思います。

root@8725917ec4d2:/# adduser subro
Adding user `subro' ...
Adding new group `subro' (1000) ...
Adding new user `subro' (1000) with group `subro' ...
Creating home directory `/home/subro' ...
Copying files from `/etc/skel' ...
New password: subroのパスワードを設定
Retype new password: 同じパスワードをもう一度
passwd: password updated successfully
Changing the user information for subro
Enter the new value, or press ENTER for the default
        Full Name []: Subro  ← 何でも良い
        Room Number []: Enterキー
        Work Phone []: Enterキー
        Home Phone []: Enterキー
        Other []: Enterキー
Is the information correct? [Y/n] Y

ユーザーができました。

Denoをインストールします。
これに関しては OSへの素のインストールを「Denoインストール」に書いています。

Denoのインストールは個々のユーザーで行いますので、まず subroユーザーにスイッチします。

root@8725917ec4d2:/# su - subro

subro@8725917ec4d2:~$

スイッチしました。
コマンドプロンプトが変わっていますね。

Denoをインストールします。

subro@8725917ec4d2:~$ curl -fsSL https://deno.land/install.sh | sh
######################################################################## 100.0%
Archive:  /home/subro/.deno/bin/deno.zip
  inflating: /home/subro/.deno/bin/deno
Deno was installed successfully to /home/subro/.deno/bin/deno
Manually add the directory to your $HOME/.bashrc (or similar)
  export DENO_INSTALL="/home/subro/.deno"
  export PATH="$DENO_INSTALL/bin:$PATH"
Run '/home/subro/.deno/bin/deno --help' to get started

インストールできました。

インストール時に「.bashrc ファイルに denoコマンドへのパスを通しておきなさい。」というようなメッセージがありますので、設定追加しておきます。

このコンテナには vimが入っていませんので、echoコマンドとリダイレクトで。
(\マークの所は実際はバックスラッシュです。)

subro@8725917ec4d2:~$ echo "export DENO_INSTALL=\"~/.deno\"" >> .bashrc

subro@8725917ec4d2:~$ echo "export PATH=\"\$DENO_INSTALL/bin:\$PATH\"" >> .bashrc

これでコンテナの中身は良いはずなので、一度ログアウトします。

subro@8725917ec4d2:~$ exit  ← subroで exit

root@8725917ec4d2:/# exit  ← rootで exit

これでコンテナから離れて OSに戻ってきたはずです。

今変更を加えたコンテナを別なコンテナイメージにしましょう。

現在のコンテナの様子を見てみます。

subro@UbuntuServer2204:~$ docker ps -a
CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS                     PORTS     NAMES
8725917ec4d2   ubuntu       "bash"                   51 minutes ago   Exited (0) 3 minutes ago             adoring_cannon

1個しかないのでコンテナIDが「8725917ec4d2」の奴が対象です。

docker commit コンテナ 作りたいコンテナイメージ名 で作れます。

subro@UbuntuServer2204:~$ docker commit 8725917ec4d2 ubuntu-deno
sha256:54da0e74a1a6f96cdcac707aa1c1b209483574961276e5913e0fd493ac29fc73

コンテナイメージができました。

コンテナイメージ一覧を見てみます。

subro@UbuntuServer2204:~$ docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
ubuntu-deno   latest   54da0e74a1a6   2 minutes ago   332MB
ubuntu        latest    2dc39ba059dc   2 weeks ago     77.8MB

[ubuntu-deno]というコンテナイメージができています。

ではこのコンテナイメージを使って、コンテナを作ります。

-dバックグラウンド実行。
-p 10022:22sshアクセス用。
10022/tcpで接続できるようにします。
-p 18000:8000Denoで作ったWebアプリ(8000/tcp)へのアクセス用。
18000/tcpで接続できるようにします。

コンテナ起動と同時に、/usr/sbin/sshd -D を実行することで、sshサーバーが動き出します。

subro@UbuntuServer2204:~$ docker run -d -p 10022:22 -p 18000:8000 ubuntu-deno /usr/sbin/sshd -D
7b571e8a5e390d536bdafbc19991fa034ab4e64d8a875993af88f92b477ed50c

VS Codeのリモート開発機能で、コンテナにアクセスしてみます。

ssh接続設定ファイルの [~/.ssh/config] には以下のような記述をしました。

Host UbuntuServer2204-deno
  HostName UbuntuServer2204
  Port 10022
  User subro
  IdentityFile id_ed25519

VS Codeのターミナルでもちゃんと、コンテナに入ってることが分かりました。

subro@0e7dce6528d6:~$

VS Codeの(リモート)ターミナルで、Freshのアプリケーションを作ってみましょう。
Freshのプロジェクト作成は「Fresh(Deno製フレームワーク)」に書いてあります。

subro@0e7dce6528d6:~$ mkdir -p work/fresh

subro@0e7dce6528d6:~$ cd work/fresh

subro@0e7dce6528d6:~/work/fresh$ deno run -A -r https://fresh.deno.dev my-project
Download https://fresh.deno.dev/
Download https://deno.land/x/fresh@1.1.1/init.ts
Download https://deno.land/x/fresh@1.1.1/src/dev/deps.ts
Download https://deno.land/x/fresh@1.1.1/src/dev/error.ts
Download https://deno.land/x/fresh@1.1.1/src/dev/imports.ts
Download https://deno.land/x/fresh@1.1.1/src/dev/mod.ts
Download https://deno.land/std@0.150.0/flags/mod.ts
Download https://deno.land/std@0.150.0/fs/walk.ts
Download https://deno.land/std@0.150.0/path/mod.ts
Download https://deno.land/std@0.150.0/semver/mod.ts
Download https://deno.land/x/ts_morph@16.0.0/mod.ts
Download https://deno.land/std@0.150.0/_util/assert.ts
Download https://deno.land/std@0.150.0/fs/_util.ts
Download https://deno.land/std@0.150.0/_util/os.ts
Download https://deno.land/std@0.150.0/path/_interface.ts
Download https://deno.land/std@0.150.0/path/common.ts
Download https://deno.land/std@0.150.0/path/glob.ts
Download https://deno.land/std@0.150.0/path/posix.ts
Download https://deno.land/std@0.150.0/path/separator.ts
Download https://deno.land/std@0.150.0/path/win32.ts
Download https://deno.land/x/ts_morph@16.0.0/ts_morph.js
Download https://deno.land/x/ts_morph@16.0.0/ts_morph.d.ts
Download https://deno.land/std@0.150.0/path/_constants.ts
Download https://deno.land/std@0.150.0/path/_util.ts
Download https://deno.land/x/ts_morph@16.0.0/common/mod.ts
Download https://deno.land/x/code_block_writer@11.0.3/mod.ts
Download https://deno.land/x/ts_morph@16.0.0/common/ts_morph_common.js
Download https://deno.land/x/ts_morph@16.0.0/common/ts_morph_common.d.ts
Download https://deno.land/x/code_block_writer@11.0.3/utils/string_utils.ts
Download https://deno.land/x/ts_morph@16.0.0/common/typescript.js
Download https://deno.land/x/ts_morph@16.0.0/common/typescript.d.ts
Download https://deno.land/x/ts_morph@16.0.0/common/DenoRuntime.ts
Download https://deno.land/std@0.140.0/fs/ensure_dir.ts
Download https://deno.land/std@0.140.0/fs/expand_glob.ts
Download https://deno.land/std@0.140.0/path/mod.ts
Download https://deno.land/std@0.140.0/fs/_util.ts
Download https://deno.land/std@0.140.0/_util/os.ts
Download https://deno.land/std@0.140.0/path/_interface.ts
Download https://deno.land/std@0.140.0/path/common.ts
Download https://deno.land/std@0.140.0/path/glob.ts
Download https://deno.land/std@0.140.0/path/posix.ts
Download https://deno.land/std@0.140.0/path/separator.ts
Download https://deno.land/std@0.140.0/path/win32.ts
Download https://deno.land/std@0.140.0/_util/assert.ts
Download https://deno.land/std@0.140.0/fs/walk.ts
Download https://deno.land/std@0.140.0/path/_constants.ts
Download https://deno.land/std@0.140.0/path/_util.ts

  🍋 Fresh: the next-gen web framework.

Let's set up your new Fresh project.

Fresh has built in support for styling using Tailwind CSS. Do you want to use this? [y/N] y
Do you use VS Code? [y/N] y
The manifest has been generated for 3 routes and 1 islands.

Project initialized!

Enter your project directory using cd my-project.
Run deno task start to start the project. CTRL-C to stop.

Stuck? Join our Discord https://discord.gg/deno

Happy hacking! 🦕

プロジェクトができたので、実行します。

subro@0e7dce6528d6:~/work/fresh$ cd my-project

subro@0e7dce6528d6:~/work/fresh/my-project$ deno task start
Warning deno task is unstable and may drastically change in the future
Task start deno run -A --watch=static/,routes/ dev.ts
Watcher Process started.
Download https://deno.land/x/fresh@1.1.1/dev.ts
The manifest has been generated for 3 routes and 1 islands.
Download https://deno.land/x/fresh@1.1.1/plugins/twind.ts
Download https://deno.land/x/fresh@1.1.1/server.ts
Download https://esm.sh/preact@10.11.0/hooks
Download https://esm.sh/preact@10.11.0/jsx-runtime
Download https://deno.land/x/fresh@1.1.1/runtime.ts
Download https://esm.sh/preact@10.11.0
Download https://deno.land/x/fresh@1.1.1/plugins/twind/shared.ts
Download https://esm.sh/twind@0.16.17/sheets
Download https://deno.land/x/fresh@1.1.1/src/runtime/csp.ts
Download https://deno.land/x/fresh@1.1.1/src/runtime/head.ts
Download https://deno.land/x/fresh@1.1.1/src/runtime/utils.ts
Download https://esm.sh/twind@0.16.17
Download https://deno.land/x/fresh@1.1.1/src/server/mod.ts
Download https://deno.land/x/fresh@1.1.1/src/server/context.ts
Download https://deno.land/x/fresh@1.1.1/src/server/deps.ts
Download https://deno.land/x/fresh@1.1.1/src/server/render.ts
Download https://deno.land/x/fresh@1.1.1/src/server/types.ts
Download https://deno.land/std@0.150.0/http/http_status.ts
Download https://deno.land/std@0.150.0/http/server.ts
Download https://deno.land/std@0.150.0/media_types/mod.ts
Download https://deno.land/x/esbuild@v0.14.51/mod.js
Download https://deno.land/x/esbuild@v0.14.51/wasm.js
Download https://deno.land/x/esbuild@v0.14.51/mod.d.ts
Download https://deno.land/x/esbuild_deno_loader@0.5.2/mod.ts
Download https://deno.land/x/rutt@0.0.13/mod.ts
Download https://deno.land/x/fresh@1.1.1/src/server/bundle.ts
Download https://deno.land/x/fresh@1.1.1/src/server/constants.ts
Download https://deno.land/x/fresh@1.1.1/src/server/default_error_page.ts
Download https://deno.land/x/fresh@1.1.1/src/server/htmlescape.ts
Download https://esm.sh/*preact-render-to-string@5.2.4
Download https://deno.land/std@0.150.0/media_types/_util.ts
Download https://deno.land/std@0.150.0/media_types/vendor/mime-db.v1.52.0.ts
Download https://deno.land/std@0.150.0/async/mod.ts
Download https://deno.land/x/esbuild_deno_loader@0.5.2/deps.ts
Download https://deno.land/x/esbuild_deno_loader@0.5.2/src/deno.ts
Download https://deno.land/x/esbuild_deno_loader@0.5.2/src/native_loader.ts
Download https://deno.land/x/esbuild_deno_loader@0.5.2/src/portable_loader.ts
Download https://deno.land/std@0.152.0/http/server.ts
Download https://deno.land/x/esbuild@v0.14.51/wasm.d.ts
Download https://deno.land/x/denoflate@1.2.1/mod.ts
Download https://esm.sh/v95/twind@0.16.17/deno/twind.js
Download https://esm.sh/v95/twind@0.16.17/twind.d.ts
Download https://esm.sh/stable/preact@10.11.0/deno/hooks.js
Download https://esm.sh/v95/preact@10.11.0/hooks/src/index.d.ts
Download https://esm.sh/stable/preact@10.11.0/deno/preact.js
Download https://esm.sh/v95/preact@10.11.0/src/index.d.ts
Download https://deno.land/std@0.150.0/async/abortable.ts
Download https://deno.land/std@0.150.0/async/deadline.ts
Download https://deno.land/std@0.150.0/async/debounce.ts
Download https://deno.land/std@0.150.0/async/deferred.ts
Download https://deno.land/std@0.150.0/async/delay.ts
Download https://deno.land/std@0.150.0/async/mux_async_iterator.ts
Download https://deno.land/std@0.150.0/async/pool.ts
Download https://deno.land/std@0.150.0/async/tee.ts
Download https://deno.land/x/importmap@0.2.1/mod.ts
Download https://deno.land/x/esbuild_deno_loader@0.5.2/src/shared.ts
Download https://deno.land/std@0.152.0/async/mod.ts
Download https://esm.sh/v95/twind@0.16.17/deno/sheets.js
Download https://esm.sh/v95/twind@0.16.17/sheets/sheets.d.ts
Download https://esm.sh/stable/preact@10.11.0/deno/jsx-runtime.js
Download https://esm.sh/v95/preact@10.11.0/jsx-runtime/src/index.d.ts
Download https://esm.sh/v95/style-vendorizer@2.2.3/deno/style-vendorizer.js
Download https://deno.land/x/denoflate@1.2.1/pkg/denoflate.js
Download https://deno.land/x/denoflate@1.2.1/pkg/denoflate_bg.wasm.js
Download https://deno.land/x/importmap@0.2.1/_util.ts
Download https://deno.land/std@0.152.0/async/abortable.ts
Download https://deno.land/std@0.152.0/async/deadline.ts
Download https://deno.land/std@0.152.0/async/debounce.ts
Download https://deno.land/std@0.152.0/async/deferred.ts
Download https://deno.land/std@0.152.0/async/delay.ts
Download https://deno.land/std@0.152.0/async/mux_async_iterator.ts
Download https://deno.land/std@0.152.0/async/pool.ts
Download https://deno.land/std@0.152.0/async/tee.ts
Download https://esm.sh/v95/csstype@3.1.1/index.d.ts
Download https://esm.sh/v95/preact@10.11.0/src/jsx.d.ts
Download https://esm.sh/v95/preact-render-to-string@5.2.4/X-ZS8q/deno/preact-render-to-string.js
Download https://esm.sh/v95/preact-render-to-string@5.2.4/X-ZS8q/src/index.d.ts
Listening on http://localhost:8000/

動き出しました。

Dockerエンジンのある Ubuntu Server 22.04.1 のマシンの 18000/tcp からコンテナに繋がるはずなので、Webブラウザで見てみましょう。
Freshの画面
ヒャッハァ〜⬆、こんなもん持ってやがったぜ、今じゃケツ拭く紙にもなりゃしねぇのによぉ〜
な気分です。\(^o^)/


こうして開発用のコンテナを作ることができました。

作成するソースファイルの扱いをどうするか、永続ストレージを使うかなど、まだまだ本気の開発環境としては詰めないといけないことがありますが、とりあえずはこれで OKだと思います。

このコンテナイメージ、いずれは Jenkinsなどで回して CI/CDでグルグルするときの1部品になるものですね。

以上、勝手に想像した「Dockerで開発環境」の環境作成でした。


ケツ拭けば良いじゃん、って思います。紙もロクにない時代なのだから。

[新品]北斗の拳 [文庫版] (1-15巻 全巻) 全巻セット

価格:12,705円
(2022/9/17 17:51時点)
感想(3件)