【開発環境】Windows10で、Emacs上のシェルでDockerコンテナログインできるようになった話

DockerEmacsWSL2開発環境

モチベーション

20190910005912

  • NTEmacsでは、eshellやshell-modeからdockerコンテナにログインできないのです
  • より正確には、Docker Desktop for Windowsだと駄目

    • winptyをつけても駄目
    • linux上のdockerdのコンテナにtrampで入ることは可能
  • EmacsもDockerもLinux上で動いてれば大丈夫なのでは??

WSL2入れる

Windows10のビルド確認

  • PowerShellとかでwinver
  • Build 18917 以上でないとWSL2使用不能
  • 19/09/10現在、安定版ビルドではまだWSL2が入ってこない
  • バージョンが足りてなければWindows Insider Programに加入して、将来のビルドを先取りする

    • 更新プログラムをインストールして再起動

20190910010324

WSL有効化

  • Windowsの機能の有効化 => Windows Subsystem for Linux
  • 再起動

Ubuntu18.04 LTS 入れる

  • ストアから落としてくる
  • 管理者権限PowerShellでwsl実行

    • ストアから落としてきたUbuntuをインストール
  • wsl --set-version <distro> 2でWSLをWSL2にバージョンアップ
PS C:\Users\wand> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-18.04    Stopped         1
PS C:\Users\wand> wsl --set-version Ubuntu-18.04 2
変換中です。この処理には数分かかることがあります...
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
変換が完了しました。
  • スタートメニューから管理者権限でwsl実行、ubuntuにログイン
  • 今後のためにいつものやつ
sudo apt update && sudo apt upgrade -y

Emacs26入れる

sudo add-apt-repository ppa:kelleyk/emacs
sudo apt update sudo apt install emacs26
sudo apt update -y
sudo apt install emacs26
  • 適宜「ぼくのさいきょうの.emacs.d」を配置する
  • ~/.bashrcで環境変数export EDITOR=emacsclientしておく

Docker環境揃える

Docker

sudo apt install docker.io -y
sudo usermod $USER -aG docker # sudoなしでdockerコマンド実行するため
  • wsl再起動

    • バックグラウンドで残るっぽい?調べるのも面倒なのでホストのWindowsごと再起動した
sudo cgroupfs-mount
sudo service docker start
Client:
 Version:           18.09.7
 API version:       1.39
 Go version:        go1.10.1
 Git commit:        2d0083d
 Built:             Fri Aug 16 14:20:06 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.09.7
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.1
  Git commit:       2d0083d
  Built:            Wed Aug 14 19:41:23 2019
  OS/Arch:          linux/amd64
  Experimental:     false
  • 注記

    • WSL2じゃないと17.12までしか動かない
    • Docker 17.12対応のDocker Composeはv1.21.0
    • このバージョンだとネットワーク周りがうまく動かない

Docker Compose

  • 執筆時点でいちばん新しいやつ

    • 変に古いやつだとネットワーク周りがうまく動かない
sudo curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose 
docker-compose version
docker-compose version 1.24.1, build 4667896b
docker-py version: 3.7.3
CPython version: 3.6.8
OpenSSL version: OpenSSL 1.1.0j  20 Nov 2018

eshell上でdockerコンテナログインできることを確認

  • WSLの/etc/resolv.confnameserver 8.8.8.8を加えないと名前解決できずイメージが降ってこないことに注意する

    • コンテナ内の/etc/resolv.confについても同様。apk updateが通らなかったりする
docker container run --rm -it alpine sh

20190909215705

  • Windowsで!Emacs上のシェルから!!コンテナにログインできた!!!

    • もうコンテナログインのためだけにPowerShellを使わなくて済むんですね…(感涙)

X11Forwarding

  • この時点でNTEmacsよりうれしいこと

    • shell,eshell上でdockerコンテナにログインできる
    • plinkとか入れなくてもtrampでssh接続できる
    • magitの動作が軽快
  • コマンドラインemacsの問題点

    • F5~F12キーとかC-RETとかが入らない
    • カーソルとかが地味で見づらい
  • X11Forwardingで解決
  • 参考にさせていただいた記事

Ubuntu側

sshd

sudo ssh-keygen -A # 鍵ねーぞ、と怒られるので一式作る
sudo service ssh start

Windows側

sshクライアント: PuTTY

  • NTEmacsでtrampでssh接続していた諸兄はplink目当てにインストール済のはず
  • なければ鍵ペア作って公開鍵をUbuntuに搬送する (略)
  • localhost:22向きの接続設定をつくる

    • [ ] Enable X11 Forwardingにチェックを入れる

Xサーバー: VcXsrv

  • なんか流行ってるらしいので特に何も考えずこれにした

Xクライアント: emacs26

  • X11Forwardingできてる状態で
emacs26 &

20190910005713

  • GUI版が立ち上がった!

嫁透過

  • このままでは裏側の嫁が見えないという致命的な欠陥が

TranspWnds

  • 任意のウィンドウを透過するやつ
  • cmd,PowerShell,wslと同じ、「Ctrl + Shift + マウスホイール」に透明度操作を割り当てた

20190910005736