1. システムとオフィスの融合|株式会社QES
  2. media
  3. 仕事効率化 Docker
  4. 手順書を改善して、効率よく業務を進めよう with Docker

QESブログ

手順書を改善して、効率よく業務を進めよう with Docker

  • LINEで送る
  • このエントリーをはてなブックマークに追加


こんにちは。システムソリューション営業本部の吾妻です。


コンピューターを使って何らかの業務を行う際、手元に手順書を置いておくことがよくあると思います。これはシステム開発・構築の業界だけの話というわけではなく、例えばお役所や銀行など、個々の作業に関する手順書や、それらをまとめた業務マニュアルが存在していると思います。
今回ご紹介するのは、作業手順と実行環境、タイムキーパー、証跡を1ファイルでまとめて管理して、業務効率を改善するための方法について試してみたものです。Dockerを利用することで、作業を実施する人や立会いをする人など、様々な立場の人に向けて、手順書を読んだり書いたり実行したりする環境を簡単に用意できるようにしたいと思います。



§そもそも手順書とは?

手順書は、とある業務に含まれる各作業工程について、事前に決められた手順を準備し、実施し、確認して、作業時刻や結果などを記載して証跡として結果報告に使う、というのを目的に作られるドキュメントです。
システム開発・構築において、手順書は従来、Word形式やExcel形式(Excel方眼紙)で、スクリーンショットやその他の図を織り交ぜながら作られることが多かったと思います。
しかしながら近年では、アプリケーションソースコードやパラメーターだけでなく、「インフラストラクチャー」もソースコードによって構成・管理する「 Infrastructure as Code (IaC)」が普及してきており、必ずしも画面を操作して作業を行うことを前提とする必要はなくなってきていると言えます。画面を操作して結果を得るのではないため、証跡も、スクリーンショットをやみくもに撮る必要はなくなります。



§登場人物

今回、手順書を改善して業務効率を向上させるために、以下の技術を利用していきます。


Docker

コンテナ技術を利用して、複数人が複数環境で同じアプリケーション実行環境を作成するためのツールです。
作業を実施する人や立会いをする人など、様々な立場の人が共通の実行環境を簡単に用意できます。
Dockerに関する詳細は過去記事などをご覧ください。 


JupyterLab

データサイエンス、科学計算、機械学習といった幅広い分野で利用されているWebベースの統合開発環境(IDE)です。
もともと、Jupyter Notebookという、ソースコードとプログラム実行結果をまとめて保存できるドキュメントのプロジェクトがあり、それを作成・実行・共有するためのUIとして公開されています。
JupyterLabにはカーネルや拡張機能が用意されており、これらを追加することで、Notebookが対応するプログラミング言語を増やしたり、JupyterLabの見た目や機能をカスタマイズしたりすることができます。


DockerとJupyterLabを組み合わせることのメリット

上でご紹介した2つの技術を組み合わせることで、次のようなメリットが生まれます。
  • 実行コマンドと実行結果(証跡)を1ファイルで管理でき、さらには実行環境もまとめて1つのイメージとして管理することもできる
  • 基になるのがテキストファイルなので、バージョン管理が容易
  • オープンソースソフトウェアであるJupyterを利用することで、誰でも利用しやすい。Officeソフトウェアが不要



§実装手順

今回は、JupyterLabを実行しているUbuntuコンテナから、インターネット上にあるWebサーバーに対して ping を送信して疎通確認を行う作業を手順書の対象とします。
そのため、JupyterLabをUIとして「操作する対象」となるのは「Ubuntuコンテナ内のBash」になります。

1. Dockerイメージの作成(初回のみ)

まずは、手順書を読み書きする全員が利用することになる、JupyterLab入りのDockerイメージを作成していきます。
全員が行う必要はなく、誰か1人だけが最初に実施します。

この記事をご覧の皆さんがご自身で作らずに私が作成したイメージを利用することもできますが、自己責任でお願いします(悪意のあるプログラム・スクリプトはさすがに含まれていませんが、脆弱性などセキュリティ上のリスクが絶対に含まれていないとは言い切れませんので)。

①手順書の対象とする作業工程で「何を操作するか」を決定

操作する対象が決まると、JupyterLabのベースイメージや、そこに追加でインストールする必要があるカーネルも決まります。

ベースイメージについてはSelecting an Imageを参考に、カーネルについてはカーネル一覧から選んで、インストール手順を確認しておきます。
今回は、jupyter/base-notebookをベースイメージに、Bashカーネルを追加することにします。

Bashカーネルの他にも様々なカーネルが用意されており、例えば、PowerShellでコマンドを実行したい場合はjupyter-powershellを、
SSH接続で本番環境のホストに接続して操作したい場合はSSH Kernelを、それぞれインストールすると良いと思います。

ちなみにPythonのカーネルはデフォルトでインストールされているので、Pythonでデータを可視化したい場合や、boto3を利用してAWSリソースを操作したい場合については追加でカーネルをインストールする必要はありません(ただしデータ可視化のような目的には、ベースイメージ自体をjupyter/datascience-notebookなどに変更した方が後からパッケージをインストールせずに済みます)。

②ベースイメージをカスタマイズ

Docker Hubで公開されているjupyter/base-notebookをローカルで実行して、カスタマイズしていきます。

(1)Dockerイメージからコンテナを起動

以下のコマンドを実行してコンテナを実行します。
$ docker run -p 8888:8888 -e JUPYTER_ENABLE_LAB=yes -v $PWD/work:/home/jovyan/work --name notebook jupyter/base-notebook
※環境変数はJupyterLabを有効化するために指定します。また、jovyanというのはJupyterイメージで標準で作られるユーザーなので、ホームディレクトリにworkディレクトリをマウントすることになります

(2)JupyterLabを起動

コンテナを起動すると、ターミナルにhttp://127.0.0.1:8888/lab?token=<TOKEN>(<TOKEN>は毎回変わります)というURLが表示されるので、ブラウザで開きます。

(3)Bashカーネルをインストール

ブラウザで開いたJupyterLabの画面からTerminalを開き、Bashカーネルをインストールします。
$ pip install bash_kernel
$ python -m bash_kernel.install

Terminalではなく、Python 3カーネルのJupyter notebook上で実行することもできます(行頭に をつけます)。
jpt_bashkernel.png

(4)Dockerイメージの作成・プッシュ

Bashカーネルがインストールされたタイミングで、Dockerコンテナに加えた変更をコミットします。
カスタマイズされたDockerイメージ( bash-notebook )として、Docker Hubにプッシュしておきます。
# <container id>を確認
$ docker ps

# commitして作成されたイメージをDocker Hubにプッシュ
$ docker commit <container id> <Docker username>/bash-notebook:latest
$ docker push <Docker username>/bash-notebook:latest

2. Dockerコンテナの実行

前の手順で作成した「カスタマイズされたDockerイメージ」をもとに、Dockerコンテナを実行する手順です。
作業者・立会人など、手順書を読んだり実行したりする人達全員が行うものになります。

(1) (Optional)ファイルをマウント

誰かから共有された既存のJupyter notebook形式(拡張子:ipynb)の手順書があれば、カレントディレクトリにworkディレクトリを作成して、その配下に格納します。

(2)カスタマイズされたDockerイメージを実行

以下のコマンドを実行してコンテナを実行します。
$ docker run -p 8888:8888 -e JUPYTER_ENABLE_LAB=yes -e GRANT_SUDO=yes -v $PWD/work:/home/jovyan/work --name notebook --user root /bash-notebook:latest

(3)JupyterLabを起動

コンテナを起動すると、ターミナルにhttp://127.0.0.1:8888/lab?token=<TOKEN>(<TOKEN>は毎回変わります)というURLが表示されるので、ブラウザで開きます。
JupyterLabが表示されるので、(1)でマウントした既存の手順書を開いたり、新規手順書の作成を開始したりします。

Bashカーネルを追加したので、Jupyter notebook上で ! をつけずにそのままwhoamiやaptなどのコマンドが実行できるようになっています。
(1.②(3)でBashカーネルをインストールしたときは ! をつけていました)
jpt_whoami.png

インターネット上にあるWebサーバーに対して ping を送信して疎通確認を行う作業を手順書に落とし込んでみた例を以下に載せます。

※GitHubの仕様上、Jupyter notebook形式(拡張子:ipynb)のファイルは自動的に整形されて表示されるので、内容をただのテキストファイルとして確認したい場合はGistページを開いてからRawボタンを押してご覧ください。

(4)おまけ

Jupyter notebook形式まわりのツールで、使いやすいものが続々出てきており、例えば、VS Codeでも拡張機能を利用すると今回立ち上げたJupyterに簡単に接続して一体的に扱うことができます。今回はローカルで Jupyter サーバーを実行しているため、下図のように localhost へ接続する設定としていますが、接続先には任意の URL を指定できるので、共用マシンや AKS 上で Jupyter の Docker コンテナを実行して、そこへ複数人で接続しに行く、というような利用方法も取れるかと思います。
こうしたツール群の勢いからも、今後一層Jupyter notebook形式が普及していきそうだと感じます。
jpt_vscode.png


🎉完成です🎉




§まとめ

本記事では、ソースコードやパラメーターだけでなく「インフラストラクチャー」もソースコードによって構成・管理する「 Infrastructure as Code (IaC)」が普及してきているなかで、JupyterLabとDockerを組み合わせたテキストファイルベースの手順書を利用することによって、管理コストを抑えて、業務効率を改善する方法について、簡単にご紹介しました。

今回は扱いませんでしたが、手順書のJupyter notebook形式(拡張子:ipynb)のファイルそのものもDockerイメージの中に埋め込んでしまえば、実行環境だけでなく手順書までひとまとまりに管理することもできます。ただし、その場合はイメージのプッシュ先はパブリックなレジストリではなくAzure Container Registryのようなプライベートで使い倒せるサービスを選択する必要はあるかと思います。

今回ご紹介したような手順書作成・作業実施の省力化から始めて、自動化を意識した開発・構築の習慣がついていくことで、
システム開発・構築の現場では、テスト駆動開発やCI/CDといった開発手法を横展開していく足掛かりに、
その他の業界では、定型業務に掛かっていた時間をより創造的な業務に使えるように切り替えていけるようになればと考えています。



さて、QESではクラウドエンジニアを募集中です。
今回の記事でご紹介したようなDockerについて、また、Kubernetesや
それらのクラウド展開といったテーマにご興味のある方はこちらもご覧ください。








関連記事はこちら











このブログで参照されている、Microsoft、Windows、その他のマイクロソフト製品およびサービスは、米国およびその他の国におけるマイクロソフトの商標または登録商標です。

このブログで参照されている、Dockerは、米国およびその他の国におけるDocker Inc.の商標または登録商標です。

このブログで参照されている、Jupyterは、米国およびその他の国におけるNumFOCUSの財団の商標です。

 
  • LINEで送る
  • このエントリーをはてなブックマークに追加

お気軽にお問い合わせください。

ページのトップへ