Edited at

PyCharmでDocker(Hyper-V)を使う on Windows 10(2017/8時点)

More than 1 year has passed since last update.

Windows10でPyCharmにDockerを使おうとしたら、パスの解決等、色々とハマったのでメモしておきます。

試行錯誤の結果であるため、余計な手順があるかもしれません。


できるようになること


  • Docker(Hyper-V)上での、PyCharmからテストのRun/Debug


できないこと


  • 1テストケースを選択してのRun/Debug(できるが、設定が大変)

  • Coverageの収集


試した環境


  • Windows 10 Pro

  • Hyper-Vマネージャ バージョン: 10.0.15063.0

  • docker-machine version 0.12.2, build 9371605

  • Docker version 17.06.0-ce, build 02c1d87

  • PyCharm 2017.2 Build #PY-172.3317.103, built on July 26, 2017

PyCharmは、2017.1だとうまくできませんでした。

Windowsでない方や、WindowsだけどHyper-Vを使わない方は PyCharmでの開発でDockerを使う を参考にされると良いかと思われます。


1. Docker環境の準備


1.1. Docker Toolboxのインストール

WindowsでDockerを使う場合はDocker for WindowsとDocker Toolboxがありますが、Docker Toolboxを入れます。下記ページにてGet Docker Toolbox for Windowsのボタンを選択し、インストールしてください。

https://docs.docker.com/toolbox/overview/

初めはHyper-Vを使うためにDocker for Windowsをインストールしたのですが、後述するCertificates folderの設定が出来ず、諦めました1

また、Docker ToolboxでもHyper-Vは使えました。


1.2. Hyper-Vの有効化

以下を参考にHyper-Vを有効化してください。

Windows 10 上に Hyper-V をインストールする


1.3. Boot2Docker virtual machineの作成

下記を参考にVMを作成します。

https://docs.docker.com/machine/drivers/hyper-v/

$ docker-machine create --driver hyperv --hyperv-memory 4096 --hyperv-cpu-count 4 default

上記コマンドを実行すると、下記設定でVMが作成されます。

設定項目
option
上記例

ドライバ
--driver
hyperv

メモリ容量
--hyperv-memory
4096

CPU数
--hyperv-cpu-count
4

マシン名

default

その他オプションや詳細は上記リンク先をご参照ください。

この辺の設定値はHyver-Vマネージャで後から変更できるようです。


1.4. Hyper-V の設定

このままのVMでは外部ネットワークに接続できません。Docker Machine 入門(Hyper-Vの場合)Hyper-V環境設定 を参考に、仮想スイッチ及びネットワークアダプタを設定してください。

この際の注意点として、外部、内部ネットワークの両方を設定するようにしてください。外部ネットワークだけにしてしまうと、別のネットワークに接続した際にアドレスが変わり、動かなくなります。

以下のような状態になっていれば良いです。

virtual-machineのネットワーク設定.png


1.5. Windows共有フォルダの作成

Windows 10の共有フォルダへ特定の人のみアクセスさせる設定方法(後編)

上記ページを参考に、下記の設定を行います。


  • VMからWindows共有フォルダへアクセスする際のユーザを追加

  • 共有フォルダへのアクセス権を設定

共有フォルダには開発するプロジェクトが含まれるようにしてください。

ここで設定したユーザ名、パスワードは次節で使います。

(ユーザ追加は本当は必要ないかも。ここは自信無いです。)


1.6. VM上で共有フォルダをマウント

Windowsの共有フォルダをcifsとしてVMからアクセスできるようにします。

まずVMへcifs-utilsをインストールします。docker-machine sshでVMへログインし、以下を実行してください。(参考)

$ wget http://distro.ibiblio.org/tinycorelinux/5.x/x86/tcz/cifs-utils.tcz

$ tce-load -i cifs-utils.tcz

そして、以下を参考に設定した共有フォルダをマウントします。

Ubuntu から Windows の共有フォルダをマウントして利用する


設定の永続化

VMの再起動時にも自動でマウントされるように設定します。

VM上で/var/lib/boot2docker/bootlocal.shを下記内容で新規作成します。


bootlocal.sh

# /var/lib/boot2docker/に格納するとdocker-machine起動時に実行される

ip addr add 172.29.32.2/20 dev eth0 # HostOSと同じサブネット内で固定IPアドレスを設定する

uid=1000 # dockerユーザ
gid=50 # staffグループ
user=share # HostOSで共有を許可したユーザ名
password=xxxxxxxxxxxx # 共有を許可したユーザのパスワード
host_ip=//172.29.32.1 # HostOSのIPアドレス

mkdir -p /home/docker/src
mount -t cifs -o uid=${uid},gid=${gid},username=${user},password=${password} ${host_ip}/src /home/docker/src


ここでのuser, passwordは 「1.5. Windows共有フォルダの作成」で設定したものです。

host_ipはWindowsPCのIPアドレスです。ネットワーク変化の影響を受けないよう、内部ネットワークのIPアドレスを指定します。私の環境では以下の状態になっていました。

> ipconfig

Windows IP 構成

イーサネット アダプター vEthernet (HNS Internal NIC) 2:

接続固有の DNS サフィックス . . . . .:
リンクローカル IPv6 アドレス. . . . .: fe80::68fe:336d:b69b:e392%24
IPv4 アドレス . . . . . . . . . . . .: 172.29.32.1 ★これをHostOSのIPアドレスとして使う
サブネット マスク . . . . . . . . . .: 255.255.240.0 ★サブネットにはこれ
デフォルト ゲートウェイ . . . . . . .:

・・・省略


1.7. VMへの固定IPアドレスの設定

先に出てしまいましたが、上述のbootlocal.shに記載していた下記一行で固定IPアドレスを設定します。

ip addr add 172.29.32.2/20 dev eth0 # HostOSと同じサブネット内で固定IPアドレスを設定する

サブネットマスクはWindows上でのipconfigの結果に合わせます。

PyCharmからは、ここで設定したIPアドレスへアクセスすることになります。

docker-machine envDOCKER_HOSTがここで指定したIPアドレスになっていればOKです。

$ docker-machine env default

You can further specify your shell with either 'cmd' or 'powershell' with the --shell flag.

SET DOCKER_TLS_VERIFY=1
SET DOCKER_HOST=tcp://172.29.32.2:2376
SET DOCKER_CERT_PATH=C:\Users\uj\.docker\machine\machines\default
SET DOCKER_MACHINE_NAME=default
SET COMPOSE_CONVERT_WINDOWS_PATHS=true


1.8. Python用Docker imageの用意

お好みのimageを用意しておきます。私は以下から取ってきました。

https://hub.docker.com/_/python/

> docker pull python:3.5


2. PyCharmでの設定

ようやくPyCharm上での設定に入ります。


2.1. VMの指定

File > Settings から設定画面を開き、Build,Execution, Deployment > Dockerを開きます。

+ボタンを押して追加したら、下記画面のように入力します。

pycharm-virtual-machine設定2.png



  • Engine API URL: 「1.7. VMへの固定IPアドレスの設定」で指定したIPアドレスをip_addrとすると、https://${ip_addr}:2376のように入力します。DOCKER_HOSTのIPアドレスと一致している必要があります。プロトコルをtcpやhttpとしている情報もありましたが、httpsでないとうまく行きませんでした。


  • Certificates folder: docker-machine envDOCKER_CERT_PATHと同じパス。ここではバックスラッシュではなくスラッシュ区切りにします。


  • Path mappings: デフォルトで何か入っていた気がしますが、この後の設定がうまく行かなくなるため全て消します。

成功するとウィンドウの真ん中あたりにConnection successfulと表示されます。

なお、Docker for WindowsではこのCertificates folderが指定できませんでした。1


2.2. Project Interpreterの指定

引き続き、設定画面からProject: 自身のプロジェクト > Project Interpreterを開きます。

ウィンドウ右上の歯車アイコンをクリックして、下記の通り設定します。

pycharm-interpreter設定.png


  • ラジオボタンでDockerを選択


  • Server: 「2.1. VMの指定」で指定したもの


  • Image name: 「1.8. Python用Docker imageの用意」で用意したもの


  • Python interpreter path: そのまま

うまく設定できて、暫く(3~4分?)待つと、指定したimageで有効なPackageが表示されます。

pycharm-interpreter設定2.png


2.3. Run/Debug Configurations

最後にテスト実行用の設定をします。


2.3.1 実行設定の追加

メニューバーからRun > Edit Configurationsを選択し、Run/Debug Configurations画面を表示します。

+ボタンを押し、Python tests > Unittestsを選択します(Unittestsの箇所はお好みのもので良いと思います)。

pycharm-test-add.png


2.3.2 実行設定

ここが一番ややこしいです。

Windows上のパスか、VM上のパスかを区別して設定する必要があります。

なお、パスは適宜自身の環境に合わせて読み替えてください。

以降の例では、プロジェクトパスは以下です。

C:\Users\uj\src\github.com\ujiro99\auto_logger

pycharm-test設定.png



  • Target: ラジオボタンでPathを選択。Pathには、プロジェクトのtestファイルを保存したディレクトリを選択。


  • Python interpreter: 「2.2. Project Interpreterの指定」で選択したInterpreterを選択。


  • Working directory: Windows上でのプロジェクトのパスを指定。


  • Path mappings: ...を押してダイアログを表示。



    • Local pathWindows上でのプロジェクトのパスを指定。



    • Remote Pathはデフォルトのまま。




  • Docker container settings: ...を押してダイアログを表示。以下の通り設定。

pycharm-test-container設定.png



  • Volume bindings: >>を押してダイアログを表示。



    • Container pathはそのまま。


    • Host pathVM上でのプロジェクトのパスを指定。



なお、「2.1. VMの指定」でPath mappingsの設定を残しているとパスが意図せず変換されてしまい、うまく行きません。


3. テスト実行

ここまでの設定が完了すると、テスト実行ができるようになります。

今回の例ですと、testファイル群をプロジェクトパス/tests/配下に格納しておき、テスト実行すると下記の通り実行されます。デバッグ実行、ブレークポイントの利用等も可能です。

pycharm-test.png


まとめ

Docker(Hyper-V)環境でPyCharmを使う方法を紹介しました。

正直、設定がかなり面倒なので、現時点では素直にLocal上へPython環境をこさえた方が宜しいかと存じます。

今後のJetbransの(というかDocker for Windowsの)発展に期待します。





  1. docker-machine regenerate-certsを実行していればDocker for Windowsでも良かったかもしれません。