3.24.2014

Docker: How the networking of Mac + boot2docker + Pipework works

Docker: Mac + boot2docker + Pipework で構築した環境のネットワーク周りについて

 

自分自身の理解のためにネットワーク構成を可視化してみる。

 

環境

  • OS: Mac OS X 10.9 (Mavericks)
  • VirtualBox: 4.3.6
  • boot2docker: v0.7.0 (Docker 0.9.0 を含む)
  • jpetazzo/pipework (最終コミット: 2014-03-15 時点)

 

構成イメージ

 

1. boot2docker インストール直後

Docker の内部ネットワークとして 172.17.0.0/16 のIPアドレスが各コンテナに割り当てられるが、
静的なアドレスを指定することはできない。
また、Macから直接そのIPアドレスへは到達できないので、VirtualBox と Docker の二段階の
ポートフォワーディングを経由してアプリケーションへアクセスするのが一般的である。

コンテナ間通信可否については、Docker デーモンの -icc オプション、および
コンテナ起動時の --link オプションによって制御可能。

1

2-1. Pipework でブリッジを作成

boot2docker VM上で Pipework を実行し、各コンテナをブリッジインタフェース br1 に対応させたところ。
コンテナ内部に eth1 インタフェースが作成され、指定した IPアドレスが割り振られる。

これで固定のIPアドレスを使ったコンテナ間通信が可能になる。
ただし、boot2docker VM からそのアドレスへのアクセスはまだできない。

以下は、コンテナに 192.168.99.0/24 ネットワークのアドレスを割り当てる例。

2 1

2-2. ブリッジにIPアドレスを割り当てる

boot2docker VM 上で、ブリッジに接続するためのIPアドレスを割り振れば、
boot2docker VM から各コンテナに固定アドレスを使った接続が可能になる。

ただし、この方法では Mac から直接コンテナにアクセスすることはできない。

2 2

3-1. VirtualBox のホストオンリーアダプタを作成する

VirtualBox の機能でホストオンリーネットワークを作成し、boot2docker VM のアダプタにも静的なIPアドレスを
設定する。

これで、Mac から boot2docker VM へ固定のIPアドレスでアクセスできるようになる。

3 1

3-2. ホストオンリーアダプタに対して Pipework を実行する

さいごに、boot2docker のホストオンリーネットワーク用アダプタ eth1 に対して Pipework を実行する。
ブリッジインタフェース以外に対して Pipework を実行すると、macvlan ブリッジが設定されるようだ。 

このようなネットワーク構成であれば、もはや VirtualBox + Docker の多段ポートフォワーディングは必須でない。

3 2

 

 

 

Related Posts

 

References

3.23.2014

Docker: boot2docker SSH Login without Password

Docker: boot2docker VM にパスワード無しで SSH 接続する方法

 

通常の Linux サーバ同様、ssh-keygen コマンドで作ったキーペアの公開鍵をリモートサーバ上に置けば
boot2docker VM に対してもノンパスワードで接続できる。

ただし、例によって boot2docker を再起動しても設定が永続化されるようにするためには
少々の細工が必要となる。

 

作業手順

 

1. 秘密鍵、公開鍵のペアを作成

キーペアを新規に作成し、~/.boot2docker/id_rsa として保存する例。

Mac$ ssh-keygen -t rsa -f $HOME/.boot2docker/id_rsa

プロンプトが出るのでパスフレーズを2回入力。(空でもよい)

 

2. 公開鍵を boot2docker VM の中に置く

公開鍵を永続化するため、/home/docker などではなく、/var/lib/boot2docker/keys というディレクトリを作って
そこに配備することにする。

(ちなみに /var/lib/boot2docker/ssh という既存のディレクトリには sshd サーバの設定情報が保存されている)

Mac$ scp -P 2022 ~/.boot2docker/id_rsa.pub docker@localhost:
docker@localhost's password:    ### tcuser と入力
Mac$ boot2docker ssh
docker@localhost's password:    ### tcuser と入力
boot2docker$ sudo mkdir /var/lib/boot2docker/keys
boot2docker$ sudo mv -i ./id_rsa.pub /var/lib/boot2docker/keys/

 

3. VM起動時に実行されるシェルスクリプトを記述する

もちろん、このままではSSH鍵を使ったログインを行うことはできない。

以下にような内容の /var/lib/boot2docker/bootlocal.sh を作成して、authorized_keys ファイルを動的に生成する。
このシェルスクリプトはVM起動時に自動的に実行される。

boot2docker$ sudo vi /var/lib/boot2docker/bootlocal.sh
boot2docker$ cat /var/lib/boot2docker/bootlocal.sh
#!/bin/sh

mkdir -p /home/docker/.ssh
cat /var/lib/boot2docker/keys/*.pub > /home/docker/.ssh/authorized_keys
boot2docker$ sudo chmod +x /var/lib/boot2docker/bootlocal.sh
boot2docker$ exit

 

4. boot2docker の再起動と接続確認

これで、boot2docker を再起動し ssh コマンドに秘密鍵のパスを渡せば、
ノンパスワードでのログインができるはずだ。

Mac$ boot2docker restart
Mac$ boot2docker ssh -i ~/.boot2docker/id_rsa

問題が発生した場合は、boot2docker ssh -v コマンド(-vvv でも可)で調査。

 

作業シェル記述例

楽をするため、この一連の作業をシェルスクリプトで書く。

適当な作業ディレクトリで実行。

#!/bin/bash

KEY_NAME=id_rsa
PRIVATE_KEY=$HOME/.boot2docker/$KEY_NAME
PUBLIC_KEY=$PRIVATE_KEY.pub
BOOTLOCAL_TMP=/tmp/bootlocal.sh

# Create SSH key pair
if [[ ! -f $PRIVATE_KEY ]]; then
    mkdir -p $HOME/.boot2docker
    ssh-keygen -t rsa -f $PRIVATE_KEY
fi

# Create bootlocal.sh
cat <<EOF > $BOOTLOCAL_TMP
#!/bin/sh

mkdir -p /home/docker/.ssh
cat /var/lib/boot2docker/keys/*.pub > /home/docker/.ssh/authorized_keys
EOF

# Upload public key and bootlocal.sh to VM
boot2docker start
scp -P 2022 $PUBLIC_KEY $BOOTLOCAL_TMP docker@localhost:

# Install files in VM
boot2docker ssh sudo install -D -o root -g root -m 644 ./$KEY_NAME.pub /var/lib/boot2docker/keys/
boot2docker ssh sudo install -o root -g root -m 755 ./bootlocal.sh /var/lib/boot2docker/

# Clean bootlocal.sh
rm -f $BOOTLOCAL_TMP

# Restart boot2docker
boot2docker restart

途中でプロンプトが何回か出るので、その都度、手で入力すること。(改善の余地あり)

 

 

 

Related Posts

3.22.2014

How to Connect Directly to the Docker Container on boot2docker with Static IP Address

Docker: boot2docker 上の Docker コンテナに狙ったIPアドレスで直接接続する方法

 

boot2docker を導入した Mac OS 環境で {Mac, boot2docker VM, Dockerコンテナ} の三者を
同一のネットワークに所属させ、それぞれに対して固定IPアドレスでアクセスできるようにしたい。

ただし pipework の README にもあるように、闇雲にこの方式を採用するのはお勧めしない。

 

環境

  • OS: Mac OS X 10.9 (Mavericks)
  • VirtualBox: 4.3.6
  • boot2docker: v0.7.0 (Docker 0.9.0 を含む)
  • jpetazzo/pipework (作業手順の中でダウンロードする)

 

事前準備

  • boot2docker のセットアップ
    boot2docker ssh が実行できる状態となっていること。
  • Mac から docker コマンドが利用できること
    Docker クライアントがインストールされていて、環境変数 DOCKER_HOST が
    tcp://127.0.0.1:4243 のように設定されていること
  • IP アドレス/ネットワークの決定
    VirtualBox のホストオンリーネットワーク上に静的に設定するIPアドレスを決める。
    今回の例では以下のように設定。
    • Gateway: 192.168.99.1/24
    • boot2docker VM (Dockerホスト): 192.168.99.2/24
    • Dockerコンテナ1: 192.168.99.101/24
    • Dockerコンテナ2: 192.168.99.102/24

作業手順

コマンドはすべて Mac上で実行するべく記述している。

1. boot2docker VM 起動時処理の追加

boot2docker では、Docker の実行環境それ自体が Docker コンテナとして構築されている。
そのため、boot2docker ssh でネットワーク周りの設定をしても、boot2docker VM を再起動すると
設定が初期化されてしまう。

/var/lib/boot2docker/bootlocal.sh を作成すれば、VM(の中のコンテナ?)起動時にこのシェルが実行される。
永続化したい処理はここに書くのがセオリーだ。

  • boot2docker 起動
    $ boot2docker up
  • pipework 最新版のダウンロード
    $ boot2docker ssh " \
    sudo mkdir -p /var/lib/boot2docker/bin && \
    sudo curl -o /var/lib/boot2docker/bin/pipework https://raw.githubusercontent.com/jpetazzo/pipework/master/pipework && \
    sudo chmod +x /var/lib/boot2docker/bin/pipework"
    

    pipework の実行ファイル(実態はシェルスクリプト)を永続化対象の /var/lib/boot2docker/bin 配下に
    置き、VM 起動時に /usr/local/bin/pipework へシンボリックリンクを張る戦略。
  • bootlocal.sh の作成
    $ boot2docker ssh "sudo bash -c '
    echo -e \"ln -s /var/lib/boot2docker/bin/pipework /usr/local/bin/pipework
    \nip addr add 192.168.99.2/24 dev eth1
    \nip link set eth1 up\" > /var/lib/boot2docker/bootlocal.sh
    && chmod +x /var/lib/boot2docker/bootlocal.sh
    '"
    

    ここで、boot2docker VM のIPアドレスを指定する。

    実際の bootlocal.sh は以下のような内容になる。(shebang を付けたほうがいいかもしれない)

    ln -s /var/lib/boot2docker/bin/pipework /usr/local/bin/pipework
    ip addr add 192.168.99.2/24 dev eth1
    ip link set eth1 up

 

2. VirtualBox ホストオンリーアダプタの設定

VirtualBox の GUI でも操作可能だが、スクリプト化したいのでコマンドで実行してみる。

  • 目的に適したアダプタが既に存在するかどうか確認
    $ VBoxManage list -l hostonlyifs
    IPアドレス(192.168.99.1)、ネットワークマスク(255.255.255.0)が一致するものが存在していれば、
    そのアダプタを利用する。
  • アダプタが存在していなければ、新規作成
    $ VBoxManage hostonlyif create
    0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
    Interface 'vboxnet0' was successfully created
    $ VBoxManage hostonlyif ipconfig vboxnet0 --ip 192.168.99.1 --netmask 255.255.255.0
    $ VBoxManage list -l hostonlyifs
    
    表示されたインタフェース名に対して変更を施し、確認。
  • boot2docker 停止
    $ boot2docker stop
  • boot2docker VM にホストオンリーインタフェースを追加
    $ VBoxManage modifyvm boot2docker-vm --nic2 hostonly --hostonlyadapter2 vboxnet0
    $ VBoxManage modifyvm boot2docker-vm --nicpromisc2 allow-all
    先ほど作成したホストオンリーアダプタの名前(ここでは vboxnet0)を指定。
    nic1 は NATアダプタとして既に存在しているので、ここでは nic2 を作成する。
    Docker コンテナ間の通信を可能とするため、Promiscuous Mode の設定を変更する。
  • boot2docker 起動
    $ boot2docker up
  • 疎通確認
    $ ping 192.168.99.2
    $ ssh docker@192.168.99.2
    まずは boot2docker VM (Dockerホスト) に対して直接アクセスできるようになった。

 

3. コンテナの起動と pipework の実行

ここでは、CentOS 6.4 上で sshd が動くだけの Docker コンテナ (mogproject/sshd Repository | Docker Index) を
2つ立ち上げて、pipework の動作を確認してみる。

  • コンテナの起動
    $ CID1=$(docker run -d -t mogproject/sshd)
    $ CID2=$(docker run -d -t mogproject/sshd)
    $ docker ps
  • pipework の実行
    $ boot2docker ssh sudo pipework eth1 $CID1 192.168.99.101/24
    $ boot2docker ssh sudo pipework eth1 $CID2 192.168.99.102/24
    コンテナID と IPアドレスを指定し、boot2docker VM上のホストオンリーアダプタ(eth1)と対応付ける。
  • 疎通確認
    $ ping 192.168.99.101
    $ ping 192.168.99.102
    $ ssh ssh-user@192.168.99.101    ### パスワードも ssh-user
    [ssh-user@xxxxxxxxxxxx ~]$ ping 192.168.99.102
    [ssh-user@xxxxxxxxxxxx ~]$ exit
    $ ssh ssh-user@192.168.99.102
    [ssh-user@xxxxxxxxxxxx ~]$ ping 192.168.99.101
    [ssh-user@xxxxxxxxxxxx ~]$ exit
    
    Mac から Docker コンテナに直接アクセスできる。
    さらに、そのIPアドレスを使ってコンテナ間通信もできるようになった。

このように、pipework のおかげで Docker コンテナの活用の幅はますます広がりそうだ。

なお、pipework の設定は、コンテナが停止すると同時に削除される。

 

 

 

References

3.14.2014

Using Docker 0.9 in Mac

Mac で Docker 0.9 を使う

 

Mac 用に最適化された docker クライアントと boot2docker VM を使って Docker 0.9 環境を構築する。

2014-03-15 追記

すでに boot2docker が Docker 0.9 に対応された(Releases · boot2docker/boot2docker)ので
もはや下記手順は必要ない。

また、Homebrew でのインストールを半自動化するシェルを書いた。

 

環境

  • ホストOS: Mac OS X 10.9 (Mavericks)
  • VirtualBox: 4.3.6

 

事前準備

既に docker クライアントや boot2docker をインストールしてある場合は
不要な混乱を避けるため一旦削除しておく。

  • Homebrew でインストールした場合の例
$ brew install docker
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/docker-0.8.0.mavericks.bottle.tar.gz
Already downloaded: /Library/Caches/Homebrew/docker-0.8.0.mavericks.bottle.tar.gz
==> Pouring docker-0.8.0.mavericks.bottle.tar.gz
    /usr/local/Cellar/docker/0.8.0: 8 files, 18M
$ docker version
Client version: 0.8.0
Go version (client): go1.2
Git commit (client): cc3a8c8d8ec57e15b7b7316797132d770408ab1a

xxxx/xx/xx xx:xx:xx Can't connect to docker daemon. Is 'docker -d' running on this host?

現時点では、まだ 0.9 に対応していないようだった。

  • アンインストール
$ brew uninstall docker
$ brew uninstall boot2docker

 

手順

 

Docker OS X Client のインストール

以下の公式ドキュメントに従って作業。

適当な作業ディレクトリに移動して、シェルで以下のコマンドを実行する。
環境変数 DOCKER_HOST は今後も使い続けるのでシェルのrcスクリプトに書いておくと良い。

$ curl -o docker https://get.docker.io/builds/Darwin/x86_64/docker-latest
$ chmod +x docker
$ sudo mv -i docker /usr/local/bin/
$ export DOCKER_HOST=tcp://127.0.0.1:4243

確認

$ docker version
Client version: 0.9.0
Go version (client): go1.2.1
Git commit (client): 2b3fdf2
xxxx/xx/xx xx:xx:xx Cannot connect to the Docker daemon. Is 'docker -d' running on this host?

この時点ではサーバ接続が失敗する。

 

boot2docker のインストール

引き続き作業ディレクトリで実行。

$ curl https://raw.github.com/boot2docker/boot2docker/master/boot2docker > boot2docker
$ chmod +x ./boot2docker
$ sudo mv -i boot2docker /usr/local/bin/

起動とログイン

$ boot2docker init
$ boot2docker up
$ boot2docker ssh
docker@localhost's password:    <=== tcuser と入力
                        ##        .
                  ## ## ##       ==
               ## ## ## ##      ===
           /""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
           \______ o          __/
             \    \        __/
              \____\______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
boot2docker: 0.6.0
docker@boot2docker:~$ docker version
Client version: 0.8.1
Go version (client): go1.2
Git commit (client): a1598d1
Server version: 0.8.1
Git commit (server): a1598d1
Go version (server): go1.2
Last stable version: 0.9.0, please update docker

バージョン 0.8.1 だった。

  • SSHの問題が発生した場合は、「ssh -v -o StrictHostKeyChecking=no -o LogLevel=quiet -o UserKnownHostsFile=/dev/null -p 2022 docker@localhost」といったコマンドで原因調査。

/etc/ssh_config に以下のようにパスワード認証を優先する設定を追加することで改善する場合がある。

PreferredAuthentications password,gssapi-with-mic,hostbased,publickey,keyboard-interactive
  • boot2docker コマンドには、b2d などのエイリアスを付けると便利だと思う

 

boot2docker のビルド

現時点(2014-03-13)では、boot2docker は Docker 0.9 に対応していない。

Issue もあるので近日中に対応するものと思われるが、今回は練習も兼ねて
自分でisoファイルをビルドし直して最新化してみる。

boot2docker 自体が Docker を利用しているので、先ほど導入した古い boot2docker 環境でビルドを行う。

$ boot2docker up
$ boot2docker ssh
docker@boot2docker:~$ git clone https://github.com/boot2docker/boot2docker.git
docker@boot2docker:~$ cd boot2docker
docker@boot2docker:~/boot2docker$ docker pull boot2docker/boot2docker:base
docker@boot2docker:~/boot2docker$ docker build -t boot2docker --rm rootfs/

docker@boot2docker:~/boot2docker$ docker rm build-boot2docker    # 未作成ならエラーとなるが問題なし
docker@boot2docker:~/boot2docker$ docker run --privileged -name build-boot2docker boot2docker
docker@boot2docker:~/boot2docker$ sudo docker cp build-boot2docker:/boot2docker.iso .
docker@boot2docker:~/boot2docker$ exit

docker pull は長時間(数分〜数十分)を要する場合がある。
rootfs のビルドの過程で最新版の docker プログラムが取得される。

ISO ファイルが出来上がったら、Mac上にコピーしてくる。
boot2docker-docker-0.9.iso とリネームして保存するなら以下のようなコマンドだ。

$ scp -P 2022 docker@localhost:boot2docker/boot2docker.iso ~/.boot2docker/boot2docker-docker-0.9.iso

 

boot2docker VM の再作成

先ほど作成したVMは一旦削除。

$ boot2docker stop
$ boot2docker delete

boot2docker 用の profile ファイルを書くことで ISOファイルのパス、VMのメモリサイズなどを指定できる。
今回はISOのパス変更のほか、メモリ容量を 2GB に増やしてみた。

$ vi ~/.boot2docker/profile
$ cat ~/.boot2docker/profile
VM_MEM=2048
BOOT2DOCKER_ISO=${BOOT2DOCKER_CFG_DIR}/boot2docker-docker-0.9.iso

VM作成

$ boot2docker init
$ boot2docker up
$ docker version
Client version: 0.9.0
Go version (client): go1.2.1
Git commit (client): 2b3fdf2
Server version: 0.9.0
Git commit (server): 2b3fdf2
Go version (server): go1.2.1

無事、Docker 0.9 の環境が Mac + boot2docker で使えるようになった。

最後にポートフォワーディングの設定を実施。

$ boot2docker stop
$ for i in {49000..49900}; do
   VBoxManage modifyvm "boot2docker-vm" --natpf1 "tcp-port$i,tcp,,$i,,$i";
   VBoxManage modifyvm "boot2docker-vm" --natpf1 "udp-port$i,udp,,$i,,$i";
  done
$ boot2docker start

設定には数分かかる。

運用にあたっては、コンテナ起動時に各種サービスポートをVM上の 49000-49900 ポートとバインドさせる。
その後 Mac から localhost:49000-49900 へアクセスすれば、コンテナの内部へ接続することが可能となる。

 

 

References

 

Related Posts

3.12.2014

Python: Getting Started with Making Web API Client

Python: Web API のクライアントを作る

 

Python で セッションを使って Web API を叩く方法についてまとめる。

 

使用ライブラリ

requests が現時点で最も Pythonic なライブラリだと思う。
urllib2 などと比べて扱いやすい。

pip が入っていれば、簡単にインストールできる。 (以下は sudo する場合)

$ sudo pip install requests

 

使用方法

セッションを引き回して POST / GET リクエストを投げる例。
驚くほど簡単に実現可能。

import requests

# Create session object
s = requests.session()

# POST request
r = s.post(URL, params={'param1': PARAM1, 'param2': PARAM2})

# GET request
r = s.get(URL)

POST / GET メソッドを実行すると、Response オブジェクトが返る。
Response には様々なアクセスが用意されている。

r.url
r.status_code
r.text
r.json()    # レスポンスが JSON 形式である場合にパース

エラーチェック用のメソッドもある。
ステータスコードが 4XX または 5XX の場合、例外を発生させる。

r.raise_for_status()

ドキュメントも非常に充実しており分かりやすい。

3.02.2014

Mac: How to Upgrade to SciPy 0.13

Mac: SciPy のアップグレード

 

目的

過去に scipy 0.11.0 をインストールした Mac で、scipy.spatial.Voronoi などの新しめのライブラリを利用したい。

今回、scipy 0.13.3 にアップグレードするまでの過程をメモとして残しておく。

 

環境
  • OS: Mac OS X 10.9 (Mavericks)
  • Homebrew インストール済み
  • Python 2.7.5
  • pip インストール済み
  • scipy: 0.11.0 -> 0.13.3
$ pip show scipy
---
Name: scipy
Version: 0.11.0
Location: /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python
Requires:
$ python
Python 2.7.5 (default, Aug 25 2013, 00:04:04)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import scipy
>>> scipy.__version__
'0.11.0'
>>> from scipy.spatial import Voronoi
Traceback (most recent call last):
  File "", line 1, in
ImportError: cannot import name Voronoi
>>>

 

手順

愚直に sudo pip install --upgrade scipy コマンドを叩くと、以下のエラーとなった。

error: library dfftpack has Fortran sources but no Fortran compiler found

Fortran のコンパイラが必要らしい。

 

1. gFortran のインストール

Homebrew で Fortran コンパイラ、gFortran をインストール。

$ brew install gfortran
(略)
$ gfortran -v    ### 確認
Using built-in specs.
COLLECT_GCC=gfortran
COLLECT_LTO_WRAPPER=/usr/local/Cellar/gfortran/4.8.2/gfortran/libexec/gcc/x86_64-apple-darwin13.0.0/4.8.2/lto-wrapper
Target: x86_64-apple-darwin13.0.0
Configured with: ../configure --prefix=/usr/local/Cellar/gfortran/4.8.2/gfortran --datarootdir=/usr/local/Cellar/gfortran/4.8.2/share --bindir=/usr/local/Cellar/gfortran/4.8.2/bin --enable-languages=fortran --with-system-zlib --with-gmp=/usr/local/opt/gmp --with-mpfr=/usr/local/opt/mpfr --with-mpc=/usr/local/opt/libmpc --with-cloog=/usr/local/opt/cloog --with-isl=/usr/local/opt/isl --disable-cloog-version-check --disable-isl-version-check --enable-checking=release --disable-stage1-checking --disable-libstdcxx --enable-lto --disable-nls --disable-multilib
Thread model: posix
gcc version 4.8.2 (GCC)

 

2. scipy のアップグレードインストール

これでビルドが行える状態になった。所要時間は10分程度。

$ sudo pip install --upgrade scipy
(略)
$ pip show scipy    ### 確認
---
Name: scipy
Version: 0.13.3
Location: /Library/Python/2.7/site-packages
Requires:

ところが、いざ python を使ってみるとバージョンが元のままである。

$ python -c 'import scipy; print(scipy.__version__)'
0.11.0

 

3. 旧バージョンのライブラリの退避

どうやらライブラリパスの関係で、旧バージョンの scipy が検出されている様子。

旧バージョンの scipy インストール先をディレクトリごと退避したら、新しいバージョンが無事使えるようになった。

$ sudo mv -i /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/scipy /tmp/_OLD_scipy    ### 適宜削除
$ python -c 'import scipy; print(scipy.__version__)'
0.13.3

 

補足. Python3 対応

Python3 側は numpy、scipy ともに未導入だったので新規インストールを実施。

$ python3
Python 3.3.2 (default, Jan 13 2014, 17:04:15)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.2.79)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import scipy
Traceback (most recent call last):
  File "", line 1, in
ImportError: No module named 'scipy'
>>>
$ sudo pip3 install numpy
$ sudo pip3 install scipy
$ sudo ln -s /usr/X11/include/freetype2/freetype/ /usr/X11/include/freetype    ### 注1参照
$ sudo pip3 install matplotlib
$ python3 -c 'import scipy; print(scipy.__version__)'   ### バージョン確認
0.13.3

これで Python3 でも scipy 0.13.3 が使えるようになった。

 

注1) freetype のシンボリックリンクを作らないと、以下のエラーとなってしまった。

/usr/X11/include/ft2build.h:56:10: fatal error: 'freetype/config/ftheader.h' file not found

#include <freetype/config/ftheader.h>

         ^

1 warning and 1 error generated.

error: command 'clang' failed with exit status 1

(そもそも /usr/X11/include が存在しない場合には、「brew install freetype libpng」
「brew link --overwrite freetype」「xcode-select --install」といった準備が必要かもしれない)

 

 

 

References