時には立ち止まってみるのもいいよ

仕事の合間の息抜き。やってることは仕事と同じ。

1台のCentOSマシンを使って複数人で開発するのだ(Docker+VSCode)

基本的にWindowsPCを使うので、CentOS含め他のOSなPCはそんなに転がってない。が、3人でCentOS上で開発する案件が決まってしまったのでPCどうしようかと考えていたところ、「Dockerでそれぞれの環境作ればいいんじゃね?」と思った次第でござる。

 

CentOSなんだから普通に複数人でログインして使えば?と言いたいのだが、

  • /var 以下に設定ファイルを作ったり、共有メモリを使ったりするのでCentOSをそのまま使うと同時に動かせない。

のである。

 

で、目論見としては

  • コンテナじゃGUI無いので、ソースとMakefile書いてCUIでビルドできるように
  • 開発用環境は、自分のWindowsPCのVSCodeからコンテナにSSHリモート接続

どやぁ。

 

って後輩に言ったら

 後「GUIいるんすか?」

 俺「検索とか置換とか、面倒やん」

 後「viでできますよ」

 俺「・・・関数の定義位置にジャンプとか要るやん」

 後「viでできますよ」

 俺「・・・・・シンタックスの色わ」

 後「vid

 

Dockerインストール

(略)

 

docker-ceいれてね

 

ネットワーク設定

要件としては、

  • 普通にWindowsPCからSSHでログインしたい
  • 各開発者(SSHで接続するPC)ごとにコンテナを固定したい

 

なので、

  1. コンテナに固定IPを割り当てる
  2. コンテナへのルートを設定する

が必要。

 

コンテナへの固定IP割り当て

標準では172.17.0.1/16がブリッジネットワークになっているけど、固定IPにしたいので競合しないよう別サブネット 172.20.0.1/16 にする。

f:id:poiuy56:20200828162134p:plain

ネットワーク構成

# docker network create --subnet=172.20.0.1/16 devel_nw

 

で、コンテナを起動するときに

# docker run --net devel_nw --ip 172.20.0.11 なんちゃらかんちゃら

--netと--ipで指定する。

 

WindowsPCからコンテナへのルーティング

WindowsPCからは172.*は見えないので、選択肢としては

  • DockerホストPCに別IPを割り当ててiptablesで変換
  • WindowsPCにrouteを設定して172.*をDockerホストにルーティング

前者のほうが完全にDockerを隠蔽しててWindowsPC側に設定が要らないのでステキなのだが、いかんせん面倒そう。なので後者。

 

WindowsPC側:

> route add 172.20.0.0 mask 255.255.0.0 192.168.0.10

 

※ ルーティングを保存しておきたい時は -p オプションをつける。

 

コンテナ作る

Dockerfile

FROM nvidia/cuda:10.0-devel-centos7

 

RUN yum -y groupinstall 'Development tools'

RUN yum -y install openssh-server bind-utils tcpdump iproute sudo

 

CUDA使う予定なので。その他必要なものはよしなに。

んで、ビルド。

# docker build  -t hogehoge-devel .

 

コンテナ起動

# docker run --privileged \

    -d \

    --gpus all \

    --net devel_nw --ip 172.20.0.11 \

    --name hogehoge \

    hogehoge-devel \

    /sbin/init

 

  • --privileged は /sbin/init からsystemdを起動してもらうのに必要。
  • -d は実行後デタッチを指示。
  • --gpus all はCUDAを使うのに必要。
  • --net, --ip は固定IP指定。前述のとおり。
  • --name はコンテナのID。あとで docker exec とかする時にわかりやすいように。
  • hogehoge-devel は Dockerfileで作ったイメージ名。

んで、/sbin/init を実行することでコンテナ内の systemd が起動してくれてSSHデーモンが動く。

 

あとは、ユーザーがないとSSHでログインできないのでアカウントを追加してパスワード設定。

# docker exec hogehoge adduser hoge -G 10

# docker exec -it hogehoge passwd hoge

Changing password for user hoge.

New password:

Retype new password:

passwd: all authentication tokens updated successfully.

 adduserの引数 -G 10 はユーザーをwheelグループに入れてsudoできるようにしてる。

 

Windowsからつないでみる

192.168.0.11 のPCから ssh で 172.20.0.11 につないで、hogeユーザーでログイン!

 

 

あれ。VSCodeの話は。。ま、いいか。