EurekaMoments

ロボットや自動車の自律移動に関する知識や技術、プログラミング、ソフトウェア開発について勉強したことをメモするブログ

PyCharmとDockerコンテナを接続してPythonスクリプトを実行するまでの手順

Kubernetes完全ガイド impress top gearシリーズ

Kubernetes完全ガイド impress top gearシリーズ

  • 作者:青山 真也
  • 出版社/メーカー: インプレス
  • 発売日: 2018/09/21
  • メディア: Kindle版

目次

背景・目的

前回まで取り組みを通じて、
Dockerfileからのイメージの
ビルド、コンテナの作成と
起動を出来るようになりました。

www.eureka-moments-blog.com

今度はここから、PyCharmと
コンテナを接続して、プロジェクト
のインタプリタにコンテナ側の
Pythonを使えるようにしようと
したのですが、またいろいろ
と知識不足で躓いたところが
ありました。

qiita.com

今回は、上記について調べた
事をメモしつつ、PyCharmと
Dockerコンテナを接続して、
コンテナ側のPythonを
インタプリタとして使える
ようにする方法を紹介して
いきます。

コンテナ側のPythonを使うメリット

プロジェクトに応じて複数の
バージョンを使い分けたい
場合、それを全て同じPCの
ローカルにインストールして
しまうと、いろいろ小細工を
してローカルが汚れたり、
それらが競合して動作が不安定
になったりするなどの問題が
起きやすくなります。
それに対して、各バージョンの
Pythonが入ったコンテナを
用意しておけば、切り替えが楽
になるし、競合しておかしく
なるなんて事も起きなくなる
ので安心です。

tks2.co.jp

PyCharmとDockerコンテナの接続手順

ここから先の手順は全て、
Docker for Windowsを使って
いる事を前提としています。

1. DockerデーモンとのTCP/IP接続を有効にする

Docker DesktopのSetting画面を
開き、そこのGeneralにある
「Expose daemon on
tcp://localhost:2375 without
TLS」にチェックを付けます。

f:id:sy4310:20200223145955p:plain

チェックを付けたら、
Docker Desktopを再起動して、
この設定を反映させます。
これでDocker側が、PyCharm
によるポート2375番からの
接続を受け入れるように
なります。

ここでの作業に関連するワード
で調べたのは、TCP/IP, デーモン,
TLSですが、それぞれで参考に
なった記事を一緒に紹介して
おきます。

TCP/IPについて

www.infraexpert.com

qiita.com

qiita.com

www.geekpage.jp

デーモンについて

wiki.archlinux.jp

www.memotansu.jp

TLSについて

www.nic.ad.jp

www.ogis-ri.co.jp

2. プロジェクトを作成する

プロジェクト用フォルダを
こちらのようなフォルダ
構成で作ります。

f:id:sy4310:20200223221356p:plain

作成したら、このフォルダを
PyCharmで開いておきます。

3. Dockerfileを作成する

イメージをビルドするための
Dockerfileを作成します。
今回は下記のようなものを
作成しました。

# pull base image
FROM ubuntu:18.04

# update packages
RUN set -x && \
    apt update && \
    apt upgrade -y

# installation
RUN set -x && \
    apt install -y wget && \
    apt install -y sudo

# anaconda
RUN set -x && \
    wget https://repo.anaconda.com/archive/Anaconda3-2019.10-Linux-x86_64.sh && \
    bash Anaconda3-2019.10-Linux-x86_64.sh -b && \
    rm Anaconda3-2019.10-Linux-x86_64.sh

# path
ENV PATH $PATH:/root/anaconda3/bin

# requirements
WORKDIR /var/Project
ADD requirements.txt /var/Project
RUN pip install -r requirements.txt

4. docker-compose.ymlファイルを作成する

詳細な書き方については、
こちらの記事が詳しいので
参照下さい。
qiita.com

今回はこのような内容で
書いてみました。

version: '3'
services:
  hello_world:
    build:
      context: '.'
      dockerfile: 'Dockerfile'
    image: ubuntu:18.04
    container_name: hello_world
    ports:
    - 8080:80
    volumes:
    - '../:/var/Project'
    tty: true
    working_dir: '/var/Project'

ざっと説明すると、これにより
hello_worldというサービスが
立ち上がります。
このサービスの中で、同じく
hello_worldというコンテナが
作られ、ホスト側のルート
ディレクトリをコンテナ側の
/var/Projectというディレクトリ
マウントして共有します。

5. ビルドしてコンテナを起動させる

こちらのコマンドにより、
docker-compose.ymlを
使ったイメージのビルド
とコンテナの起動を一度
に行う事が出来ます。

$ docker-compose up -d --build

この時にオプションとして、
-dを付けるとコンテナはバック
グラウンドで起動されるので、
ホスト側のターミナル操作が
出来るようになります。
--buildを付けると、コンテナ作成
の前にイメージのビルドを行う
ようになります。
コンテナを作成した後に各設定
を変更したい時は、ファイルを
編集した後でこのコマンドを
実行すれば、全てのコンテナを
一旦停止させて作成し直して
くれます。

$ docker-compose up -d

6. コンテナの作成・起動を確認する

先述したコマンドを実行した後、
このようなメッセージが出力
されれば成功です。
f:id:sy4310:20200223235819p:plain
イメージが作られているか確認
してみます。
f:id:sy4310:20200223235947p:plain
コンテナが作成され、起動して
いるかも確認してみます。
f:id:sy4310:20200224000046p:plain

7. Dockerサーバとの接続を設定する

PyCharmのFileメニューから、
Settingsへ進み、その中の
Build, Execution, Deployment
へ進み、そこのDockerを選び
ます。
f:id:sy4310:20200223172908p:plain
左上の赤丸の+アイコンを
押すと新規のDockerサーバが
作られ、その設定画面が開き
ます。そこで、TCP socketによる
接続を選択し、「Connection
successful」のメッセージが
表示されればOKです。

8. インタプリタを設定する

PyCharmのFileメニューから、
Settings -> Project -> Project
Interpreterと進みます。
この時点でコンテナがちゃんと
作成されていれば、こちらの
ような画面になっているはず
です。
f:id:sy4310:20200224001049p:plain
作成されたコンテナの中にいる
Pythonがインタプリタとして
設定されている事が分かったら、
OKを押して設定完了です。

9. コンテナに接続する

ここまでの設定が全て完了した
状態で画面左下にあるServicesを
開くと、先程設定したDocker
サーバが表示されているはずです。
まずはこれを右クリックして、
Connectを選んでサーバと接続
します。

f:id:sy4310:20200224100923p:plain

接続すると、その中で立ち上がった
サービスやイメージが表示されるので、
そこからdocker -> hello_world ->
hello_worldと表示させます。一つ目の
hello_worldがサービスで、二つ目の
hello_worldがコンテナに当たります。

f:id:sy4310:20200224101642p:plain

コンテナのhello_worldを右クリックし、
exec -> create -> コマンドとしてbashを
入力すれば、こちらのようにコンテナに
入る事が出来ます。

f:id:sy4310:20200224102119p:plain

10. Pythonスクリプトを作成・実行する

ホスト側のプロジェクトフォルダ内に、
実行させたいPythonスクリプトを
作成します。
「hello_world.py」

print('Hello World!!')

コンテナ内のPythonがインタプリタに
なっているので、コーディング時は
ちゃんとコード補完などが働いて
くれます。
スクリプトが出来たら、コンテナ側
から「python hello_world.py」で
実行出来ます。ファイル自体はホスト
側にありますが、コンテナ側と共有
されたディレクトリ内にあるので、
コンテナ側から参照する事が出来ます。
あとは実行して、コーディングした
通りの動作をしてくれたら成功です。

f:id:sy4310:20200224103110p:plain