「九州工業大学 生命情報工学科 情報工学部 安永研究室」様にて公開されているDockerfileを使ってrelionが入ったdockerイメージを作る
まず計算機ですが、GPUアリの方が望ましく2枚、もしくは4枚乗っている計算機を用意する.
次に、GPUを利用できるdockerが必要なので、dockerを参考にdocker と NVIDIA Container Toolkit を計算機に導入します.
そして利用ユーザには docker が実行できるように /etc/group を調整します.
これでほぼほぼ準備は整います.
Dockerfileを取得します †
一般ユーザで NVIDIA Container Toolkit(nvidia-docker) がインストールされた計算機にログインします。
そしてDokcerfileを取得します
[illya@s ~]$ git clone https://github.com/kttn8769/cryoem-docker
[illya@s ~]$ cd cryoem-docker
[illya@s cryoem-docker]$ ls -l
total 16
-rw-rw-r-- 1 illya illya 4614 May 10 23:32 Dockerfile
-rw-rw-r-- 1 illya illya 1070 Mar 23 00:39 LICENSE
-rw-rw-r-- 1 illya illya 68 Mar 23 00:39 README.md
[illya@s cryoem-docker]$
「git log」とかでupdate履歴とか参照するのもいいかも
設計 †
取得した「Dockerfile」には調整項目があります. ユーザ名とかグループ名、UIDにGIDと「公開鍵」など. まずはそれらを調整します.
すでに手持ちの公開鍵「~/.ssh/id_rsa.pub」があればそれを使いますが、存在してなければ「ssh-keygen」コマンドで作成します.
[illya@s cryoem-docker]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/illya/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): <--パスフレーズは設定しなくてもいいかな.
Enter same passphrase again:
Your identification has been saved in /home/illya/.ssh/id_rsa.
Your public key has been saved in /home/illya/.ssh/id_rsa.pub.
The key fingerprint is:
(略
[illya@s cryoem-docker]$
そして自身のUID/GIDを確認します
[illya@s cryoem-docker]$ id illya
uid=1000(illya) gid=1000(illya) groups=1000(illya),978(docker),3000(domain users),2002(supervisors),2005(sample)
[illya@s cryoem-docker]$
っと判明したので、「Dockerfile」にその内容を反映させます.
「USER_SSH_PUBKEY」欄は「~/.ssh/id_rsa.pub」の中身を書き写します
| diff --git a/Dockerfile b/Dockerfile
index c449e29..a522686 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -3,15 +3,15 @@ FROM nvidia/cuda:9.2-cudnn7-devel-centos7
### User account in Docker image
# username
-ARG USER_NAME=""
+ARG USER_NAME="illya"
# groupname
-ARG GROUP_NAME=""
+ARG GROUP_NAME="illya"
# UID
-ARG USER_ID=""
+ARG USER_ID="1000"
# GID
-ARG GROUP_ID=""
+ARG GROUP_ID="1000"
# SSH public key
-ARG USER_SSH_PUBKEY=""
+ARG USER_SSH_PUBKEY="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ(略
# Specify GID of "vglusers" group if exists, else leave this empty
ARG VGLUSERS_GROUP_ID=""
@@ -50,7 +50,7 @@ RUN yum update -y && \
vim \
libjpeg-turbo-devel \
mesa-libGL-devel \
- mesa-libGLU-devel && \
+ mesa-libGLU-devel
# Below only for Japan locale
# localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
# Node.js install for jupyter lab extension
@@ -77,7 +77,7 @@ RUN if [ "${VGLUSERS_GROUP_ID}" != "" ];then \
# User configuration
USER ${USER_NAME}
WORKDIR /home/${USER_NAME}
-RUN mkdir .ssh && echo -e "${USER_SSH_PUBKEY}" >> .ssh/authorized_keys && \
+RUN mkdir .ssh && echo -e "${USER_SSH_PUBKEY}" >> .ssh/authorized_keys && chmod 700 .ssh && chmod 600 .ssh/authorized_keys && \
echo "export LIBGL_ALWAYS_INDIRECT=1" >> .bashrc && \
echo 'export PATH=/usr/lib64/openmpi/bin:$PATH' >> .bashrc && \
echo 'export LD_LIBRARY_PATH=/usr/lib64/openmpi/lib:$LD_LIBRARY_PATH' >> .bashrc
|
確認 †
この「Dockerfile」を読むと、「dokcer build」で作られるイメージには relion の他に Gctf、EMAN2が用意される.
またイメージには前述のアカウントが用意され、sshでログイン可能にしている. 加えEMAN2はJupyterNotebookで扱えるようになっている.
イメージ作成 †
では、Dockerfileからイメージを作成してみます。
同じディレクトリに「Dockerfile」があるので「.」としています。
「docker build -t cryoem-docker .」
「-t」は名前を付けただけです
[illya@s cryoem-docker]$ docker build -t cryoem-docker .
(しばらく掛かります. 紅茶とケーキを頂きましょう)
[illya@s cryoem-docker]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cryoem-docker latest fc3d7af5ca0c 2 hours ago 12.4GB
nvidia/cuda 9.2-cudnn7-devel-centos7 db05dc5115cf 5 months ago 2.85GB
[illya@s cryoem-docker]$
これでイメージが作成できました.
留意
途中で「[Errno 28] No space left on device」と言われたらそれはイメージ作成中にコンテナのストレージ領域が圧迫したためです.
既定は10GBで、それを拡大させるには「/etc/docker/daemon.json」ファイルを下記のように別途作成して、コンテナ、イメージを一旦削除してdockerデーモンを再起動させます.
[root@s ~]# docker stop $(docker ps -q) # すべてのコンテナを停止
[root@s ~]# docker rm $(docker ps -q -a) # すべてのコンテナを削除
[root@s ~]# docker rmi $(docker images -q) # すべてのイメージを削除
[root@s ~]# systemctl stop docker # docker デーモンを停止
[root@s ~]# rm -rf /var/lib/docker # コンテナの置き場所を削除
[root@s ~]# vi /etc/docker/daemon.json # サイズを20Gに変更します
{
"storage-driver": "devicemapper",
"storage-opts": [
"dm.basesize=20G"
]
}
[root@s ~]# systemctl daemon-reload # 設定ファイルを再読み込みして
[root@s ~]# systemctl start docker # dockerを再起動します(/var/lib/dockerが再度作られます)
*もっと適切な方法があるかもしれない
コンテナ起動 †
イマージは完成して、次にコンテナを起動させます.
ただその前に
- sshとJupyterNotebookのポートアサイン
- ホストとのディレクトリ共有
を考慮する必要があり、ここでは ホストの2222ポートがコンテナの22(ssh)に繋がり、8888がコンテナの8888に繋がるようにします。
加え ユーザのホームディレクト「/home/illya」をコンテナの /tmp/home/illya にマウントするようにします. この辺は使いやすいように...
なので
[illya@s ~]$ docker run -itd --name cryoem-docker -h cryoem-docker -p 2222:22 -p 8888:8888 -v /home/illya:/tmp/home/illya fc3d7af5ca0c
と実行します。
コンテナに接続 †
sshで接続します
単純にlocalhostの2222にssh接続します。
[illya@s ~]$ ssh -p 2222 localhost -X
Last login: Mon May 11 19:53:27 2020 from gateway
[illya@cryoem-docker ~]$
公開鍵を登録したのでパスワードなしでログインできるかと思います。
それで
[illya@cryoem-docker ~]$ df -H
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/docker-8:4-68199551-76fa0ac5(略 22G 13G 8.9G 59% /
tmpfs 68M 0 68M 0% /dev
tmpfs 17G 0 17G 0% /sys/fs/cgroup
shm 68M 0 68M 0% /dev/shm
/dev/sda4 54G 43G 11G 80% /etc/hosts
tmpfs 17G 0 17G 0% /proc/asound
tmpfs 17G 0 17G 0% /proc/acpi
tmpfs 17G 0 17G 0% /proc/scsi
tmpfs 17G 0 17G 0% /sys/firmware
[illya@cryoem-docker ~]$
[illya@cryoem-docker ~]$ relion
と利用可能になるかと.
後始末など †
relionを起動して解析を進め終わったらそのままログアウト.
コンテナを削除しても構わない(docker rm <コンテナID>).
relionを更新したければ
[illya@s ~]$ ssh -p 2222 localhost -X
[illya@cryoem-docker ~]$ cd softwares/relion/build
[illya@cryoem-docker build]$ git pull
[illya@cryoem-docker build]$ make
[illya@cryoem-docker build]$ make install
で行える