yNagaokaのブログ

このブログはNGS解析初心者がつまずいた部分と解決方法をまとめた覚書のようなものです。

Dockerとは何か?の覚書ーその1

はじめに

NGS解析を始めると様々な解析ツールを使う機会が増え、GitHubやDockerHubで公開しているものに出会うと思います。それらを全く知らない初心者からしたら何それ?どうやって使うの?といった感じになると思います。ウェット出身の私もそうでした。今回はDockerに関しての基礎知識や使い方に関して簡単にまとめたいと思います。

Dockerとは?

・Dockerは、アプリケーションを開発・実行するためのオープンプラットフォームのことです。Container (コンテナ)と呼ばれる仮想環境を構築し、コンテナ内で様々な解析コマンドを実行することができます。

・コンテナには、アプリケーション (解析コマンド等) を実行するために必要なもの(PythonやRのツールなど)全てが含まれています。また、コンテナ自体を他の人に配布することがでるため、同一のコンテナを得た人全員が、同じ方法で確実に同じ作業をすることができます。ホストPC上で何をインストールしていても問題ありません。
Reference : https://www.docker.com/resources/what-container/

Docker image・コンテナとは?

Docker image

Docker image (イメージ)とは、コンテナを作成する命令が入った読み込み専用のテンプレートのことです。DockeHubからダウンロードすることが可能で、このイメージからコンテナを作成します。

・イメージはDockerfileというテキストファイルを使って自分で作成することも可能です。このDockerfileにはイメージを生成して実行するまでの手順を記載します。何を、どの順番で、どのバージョンをインストールするかもこのファイルに記載します

コンテナ

・コンテナとは、イメージが実行状態となったインスタンス (場所・環境) のことです。コンテナに対する生成、実行、停止、移動、削除などの操作は Docker API などを使って行われます。コンテナは、複数のネットワークへの接続、ストレージの追加を行うことができます。 コンテナを削除すると、その時点での状態に対して変更がかかっていたとしてもイメージに反映されていないものは消失しますが、コンテナ内で行った変更 (新しいツールのインストールなど) をコンテナ内からイメージに反映させることも可能です。

・コンテナはイメージや生成、実行するために設定したオプションによって定義されます。デフォルトでは、コンテナは他のコンテナやホストマシンとは、程よく分離されています。コンテナに属するネットワーク、ストレージ、基盤となるサブシステムなどをどの程度切り離すかはコンテナを起動する際のオプション設定で制御することが可能です。この部分を簡単に言うと、何もオプションを設定せずにコンテナを生成した場合、コンテナ内からローカル環境やファイルを参照することができません。

Dockerの少し詳しい概要

・Docker はクライアント・サーバ型の構造をしています。Docker クライアント は Docker デーモンに処理を依頼します。このデーモンがコンテナの構築、実行、配布という仕事をこなします。

Docker デーモン

・Docker デーモン (dockerd) は Docker API リクエストを受け付け、イメージ、コンテナ、ネットワークといった Docker オブジェクトを管理します。 docker runなどのコマンドは Docker API を利用しています。

Docker クライアント

・Docker クライアント (docker ) は Docker とのやりとりを行うために、ユーザが利用するものです。docker run のようなコマンドが実行されると、Docker クライアントは dockerd にそのコマンドを伝え、dockerd はその内容を実行します。Docker クライアントは複数のデーモンと通信することができます。

Docker レジストリ

・Docker レジストリは Docker イメージを保管する場所です。Docker はデフォルトで DockerHub (公開レジストリ) のイメージを探すよう設定されています。独自にプライベート・レジストリを運用することもできます。docker rundocker pull などのコマンドを使うと、設定されたレジストリから必要なイメージを取得します。docker push コマンドを使えば、イメージを指定したレジストリに送信します。 Reference : https://docs.docker.com/get-started/overview/

Dockerの何がいいのか?

1) 複数のPCで完全に同一の解析環境を構築できること
ユーザやPC毎にOSのバージョンやインストールされているツールが違うことがほとんどです。同じツールを利用したにも関わらずエラーが起き際に、それがツール自体のバグなのかローカル環境依存の問題なのか、判断が難しいという問題が多々あります。同じDockerイメージを使用することでこの問題を回避することができます。イメージを揃えることで、利用者の環境が原因でエラーが起きる、バージョン毎に解析結果が変わってしまうという事態を回避し、再現性を担保することができます。イメージファイルの更新は一元管理可能なので、製作者・管理者にとっても利点が大きいです。

2)ローカルの環境を汚さないこと
例えば、Linux上に複数のパッケージをインストールする際、それぞれのパッケージが要求するライブラリのバージョンが異なることが原因で、同時にインストールすることができないという問題が生じることがあります。アップグレード・ダウングレードにより既存のツールがエラーになることもよくあります。余計なものをインストールして容量を圧迫してしまうなんてこともあります。PythonやRでも同じことが言えますね。必要なツールがインストールされたイメージを利用することでこの問題を回避することができます。(自分でイメージを作成する際にはバージョンコンフリクトと戦うことになりますが...これは次回以降でまとめようと思います。)

3)環境構築が用意なこと
新しくPCを購入した際やOSを再インストールした際など、必要なツールが全くインストールされていない環境であっても、DockerHubからイメージをダウンロードすれば解析に必要な環境が整うため、毎回環境構築をやり直さなくて済みます (もちろんですが、Dockerを利用せずにローカルで解析を実施したい場合は話は別です)。

Dockerの入手

DockerHubに登録してアカウントを作成し、Docker Desktopをインストールすることで利用することができます。

Docker Desktop

・Docker Desktopは MacWindowsLinux 環境へ簡単にインストールできるアプリケーションです。コンテナを構築・共有できるようになります。Docker デスクトップに含まれるのは Docker デーモン (dockerd )、Docker クライアント (docker)、Docker Compose、Docker Content Trust、Kubernetes、 Credential Helpeです。それぞれ以下からインストールできます。

Machttps://docs.docker.com/desktop/install/mac-install/

Windowshttps://docs.docker.com/desktop/install/windows-install/

Linuxhttps://docs.docker.com/desktop/install/linux-install/

Dockerを利用する際のコマンドラインは次回まとめようと思います。