物理のバス停 by salt22g

とある物理学見習いの備忘録。

大学院生Macユーザーへ Dockerの勧め

最近研究でDockerを使うようになり、Linuxサーバー上で実行環境を作成するなどしていました。
使っているうちに「Docker面白いな」と感じたので手持ちのMac上でも使えるようにして詳しくなりたいと思った次第です。

f:id:salt22g:20200511183927p:plain
Dockerのクジラ可愛い

Dockerとはなんぞ。

qiita.com
色々なサイトで紹介されています。上記のサイトは余計な絵が少なくておすすめ。
筆者はDockerを環境構築をサボれるツールだと考えています。
「全く同じ開発環境(Docker image)をどのマシンでも使うことができる。」
これはチームでの開発はもちろんですが、理系大学院生にとって後輩への引継ぎ、指導が楽になることを意味します。

研究室で必要なツールを1から後輩のPCにインストールするとなると指導や質問対応に多くの時間を割かねばなりません。
それはそれぞれのPCの環境(OSやバージョン)が異なることが大きな理由の一つです。
特にMacユーザーの私がプログラミングの講習会をする際には、Windowsユーザーのことも考える必要がありました。
手元の動かせるWindowsマシンで環境構築を試さなければなりません。
Dockerを導入すれば同一の開発環境をWindowsでもmacOSでも準備できます。
今回はまず、MacOSへの導入についてです。

Dockerの導入

まずはmacOSにインストール。
環境はこちらの記事を参照。今回もHomebrewを使います。
salt22g.hatenablog.jp

CUI及びGUIアプリを取得。

% brew install docker
% brew cask install docker

インストールできたか確認。

% docker --version
Docker version 19.03.8, build afacb8b

f:id:salt22g:20200507095505p:plain
メニューバーにコンテナを載せたクジラが出現

Dockerの主なコマンドはこちらのサイトによくまとまっています。
qiita.com

Docker imageを作成、起動

今回作ったDocker imageについては後日詳しくお話しします。
Dockerfileの作り方についてもこのブログで公開する予定です。

Dockerfileを作成したフォルダに移動して

% docker build -t <イメージ名> .

イメージが作成できているか確認してみましょう。

% docker images
REPOSITORY                              TAG                 IMAGE ID                  CREATED                 SIZE
自分が作ったイメージ名            latest              イメージID               作成された時刻        ファイルサイズ
ubuntu                                         18.04               c3c304cb4f22        2 weeks ago             64.2MB

自分が作ったイメージの名前が表示されればOKです。
早速起動しましょう。

% docker run -it <イメージ名>
[root@8fc1f79b0233] /workspace

docker runには様々なoptionがあるのでそれはまたどこかで…

自分のイメージをDockerhubにpush

Docker hub
作成したimageをクラウド上で管理するのがDocker hubです。
他の人が作ったimageはもちろん。公式imageも掲載されています。
今回は筆者が作ったimageをpushしてみます。

アカウントを作成
hub.docker.com

f:id:salt22g:20200507095954p:plain
アカウントが作れたらクジラをクリックしてsign inしておく。

予めdockerhubでリポジトリを作成。

f:id:salt22g:20200507104735p:plain
リポジトリを作成

f:id:salt22g:20200508153426p:plain
こんな感じ

% docker tag <ビルドしたimageの名前> <DockerhubのユーザID>/<さっきDockerhubで作ったリポジトリ名>:<tag名(latestとするのが一般的)>
% docker login -p="Dockerhubのパスワード" -u="Dockerhubのユーザー名"
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded

なんかWARNINGが出たけれど無視。
Login Succeededが出ればOK。

docker push salt22g/docker-rpg:latest

f:id:salt22g:20200511012440p:plain
push後のリポジトリ画面

GUIを使ってみる

まずはsocatをインストール。

brew install socat

XQuartzもインストール。
salt22g.hatenablog.jp
この記事でも紹介したソフトです。
sshで接続した先の画像やGUIを取得するサーバーみたいなものです(多分)

brew install caskroom/cask/brew-cask
brew cask install xquartz
open -a XQuartz #普通にlaunchpadから起動してもOK

f:id:salt22g:20200513051908p:plain
XQuartzを起動するとxtermという画面が出てきます。

Docker側から見たMac(hostマシーン)のIPアドレスを取得。

ifconfig en0 | grep inet | awk '$1=="inet" {print $2}'
    xxx.xxx.xxx.xxx #ipアドレス

socatを起動。

socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"

ターミナルから返答がないはずなので別ターミナルからdockerを以下のオプション付きで起動。

docker run -it <イメージ名>-e DISPLAY="xxx.xxx.xxx.xxx:0"

f:id:salt22g:20200513053506p:plain
こんな感じ

dockerコンテナ内で作成したグラフが表示できるか見てみましょう。

f:id:salt22g:20200513054132p:plain
pythonのmatpltlibとか
f:id:salt22g:20200513054238p:plain
ROOTとか

後輩や部下の環境構築に困っている方々いかがでしょう。