ハイファットマンの友人M

ハイファットマンはおともだちです。ほぼメモ

Docker for Macでpythonの環境を構築するメモ

新しくMacBookを買ってpythonを触りたいけどMacBookの環境は汚したくないな・・と思ったので dockerでpythonを触れるようにしてみます。

普段はdocker+docker compose+railsで開発しているのでdockerについてはなんとなくわかってますが、自分で構築した事ないというレベルです。

  1. まずはdockerをインストール
  2. pythonのイメージをpullして触ってみる
  3. Dockerfileを書いてみる
  4. ホストのディレクトリをマウントする

1. まずはdockerをインストール

docs.docker.com

2.pythonのイメージをpullして触ってみる

コンテナ内で実行したコマンドはDockerfileに記載するのでメモしておきます。

  • pythonのイメージをpull
$ sudo docker pull python:3.6
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
python              3.6                 c1e459c00dc3        2 weeks ago         692MB
  • コンテナ内に入る
$ docker run -it --name 3.6 python:3.6 /bin/bash
  • pythonのバージョン確認
# python --version
Python 3.6.4
  • 必要なものをインストール+ユーザー追加+pythonが動くか確認
# apt-get update
# apt-get install -y vim
# apt-get install sudo
# adduser username
# gpasswd -a username sudo
# su - username
$ vim hello_world.py
$ python hello_world.py

3. Dockerfileを書いてみる

先ほど実行したコマンドをDockerfileに書き出す。

FROM python:3.6

RUN set -x && \
    apt-get update && \
    apt-get install -y vim sudo && \
    useradd -ms /bin/bash username && \
    gpasswd -a usename sudo

USER username
WORKDIR /home/username

docker runするとrootユーザー+ルートディレクトリでコンテナ入ってしまうので、
USERとWORKDIRを追加して指定したユーザー+ディレクトリでログインするようにしました。
あと、adduserだと対話的にパスワード等を入力しないといけないので、Dockerfileではuseraddコマンドにしています。

次にDockerfileからimageを作ります。
Dockerfileを置いているディクトリで以下コマンドを実行し、imageが作られた事を確認します。

$ docker build -t pytest .
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
pytest              latest              422b3750bcfe        20 hours ago        735MB
python              3.6                 c1e459c00dc3        3 weeks ago         692MB

imageにpytestが追加されていることを確認できました。
このイメージからコンテナを起動します。

$ docker run -it pytest /bin/bash
username@a1291da72c01:~$ pwd
/home/username

無事起動できました。指定したユーザー+ディレクトリでログインもできています。

ちなみに、コンテナ起動中にpsで確認してみると以下のようになっているかと思います。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                      PORTS               NAMES
a1291da72c01        pytest              "/bin/bash"         About a minute ago   Up About a minute                               unruffled_fermi
ef71d433718f        python:3.6          "/bin/bash"         16 minutes ago       Exited (0) 10 minutes ago                       3.6

exitしたあとにもう一度実行するとstatusは変わっていますが消えません。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
a1291da72c01        pytest              "/bin/bash"         3 minutes ago       Exited (0) 2 seconds ago                        unruffled_fermi
ef71d433718f        python:3.6          "/bin/bash"         17 minutes ago      Exited (0) 12 minutes ago                       3.6

exit後にコンテナを削除するには--rmをつけてdocker runを実行します。

$  docker run --rm -it pytest /bin/bash

statusがExitedになっているコンテナを起動するには以下のコマンドを実行します。

$ docker start コンテナID

ex)
$ docker start a1291da72c01
a1291da72c01

起動したコンテナに入るにはexecを使います。

$ docker exec -it {dockerのname} /bin/bash

ex)
$ docker exec -it unruffled_fermi /bin/bash
username@a1291da72c01:~$

4. ホストのディレクトリをマウントする

ソースはホスト側、実行するのはdocker側にしたかったのでホストのディレクトリをdockerにマウントします。 -vをつける事でマウントできます。

$ docker run --rm -v {ホスト側のディレクトリ}:{docker内のディレクトリ} -it {イメージ名} /bin/bash

ex)
$ docker run --rm -v /Users/username/hoge/:/home/username/ -it python /bin/bash

最低限ですがこれで一応完了です。

docker runで毎回-vを指定するのはめんどくさいので、Dockerfileでマウントの設定が可能ならそうしたいです。

参考