at posts/single.html

docker上のmongodbをバージョンアップ

Amazon認証リバースプロキシで使っているmongodbを3.0.3から3.2へバージョンアップした。

まずは現バージョンを確認。

$ docker images mongo
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
mongo               3                   e22de68f3183        11 months ago       257.7 MB
mongo               3.0                 e22de68f3183        11 months ago       257.7 MB
mongo               3.0.3               e22de68f3183        11 months ago       257.7 MB
mongo               latest              e22de68f3183        11 months ago       257.7 MB

念のためにデータファイルのバックアップを取っておく。データファイルの場所を調べる。

$ docker inspect rpaproxy_mongodb_1
    "Mounts": [
        {
            "Name": "b5ddbc3634e42846b5daaa699d0bb8f98aaeb3bb446aa94bc13fb66e12ab7702",
            "Source": "/var/lib/docker/volumes/b5ddbc3634e42846b5daaa699d0bb8f98aaeb3bb446aa94bc13fb66e12ab7702/_data",
            "Destination": "/data/db",
            "Driver": "local",
            "Mode": "",
            "RW": true
        }
    ],

データファイルをホスト側のディレクトリへ書き出す。

$ docker cp rpaproxy_mongodb_1:/data/db ~/var/dump/rpaproxy-20160503

単純なファイルコピーだけでなく、mongodumpコマンドを使ってbson形式でエクスポートする。1回限りのコンテナを作り、動作中の rpaproxy_mongodb_1 コンテナと接続し、自コンテナ内の /dump ディレクトリへ書き出す。その /dump ディレクトリをdockerのvolume機能を使ってホスト側にマッピングしているという仕組み。この辺、dockerだと少し面倒だね。

$ docker run --rm --link rpaproxy_mongodb_1:db --volume ~/var/rpaproxy/dump/20160503:/dump mongo mongodump -h db

バックアップを取得できたので、最新のmongoイメージを取得。

$ docker pull mongo
$ docker run --rm mongo mongo --version
MongoDB shell version: 3.2.6

いきなり切り替えるのではなく、事前に別コンテナでリストアできるかをテストする。docker-composeコマンドの-pオプションで同じ環境をもう1セット作れる。この辺はdockerの便利なところ。

$ docker-compose -p rpaproxy2 up -d
$ docker run --rm --link rpaproxy2_mongodb_1:db --volume ~/var/rpaproxy/dump/20160503:/dump mongo mongorestore -h db

だいたい動いているので、動作中の環境も新しいコンテナへ切り替える。

$ docker-compose -p rpaproxy2 stop
$ docker-compose -p rpaproxy2 rm
$ docker-compose up -d

これで切り替えおしまい。

関連する日記