ishikawa_pro's memorandum

若手webエンジニアの備忘録です.

Swift Node.js Docker AWS etc...色々やります。

Docker + PostgreSQL 永続化の話

こんにちは。ちゃんと更新しています。
一年くらい前に、DockerでPostgreSQLコンテナを立てる時に永続化させる方法を書いていました。
ishikawa-pro.hatenablog.com
僕のブログのアクセス先の8割は👆の記事なのですが、貼ってあるDockerfileを実行しても動かなかったり、色々変なことしててずっと書き直したいと思っていました。だからは今日はもっとシンプルでベターなやり方をメモっときます。

参考資料

Docker

Docker

使うイメージについて

今回使うイメージは、PostgreSQLの公式リポジトリです。
imageのバージョンは雑にlatestです。
https://hub.docker.com/_/postgres/

データコンテナの作成

まずは、データコンテナ作ります

docker create --name dbdata postgres

データコンテナは、起動する必要がないのでdocker createコマンドでコンテナだけ作っておきます。

データコンテナにpostgres imageを使う理由

データコンテナのためにbusyboxとかを使う人も多いと思います。今回postgresイメージでデータコンテナを用意している理由としては、

  • 同じイメージを使えば、別のイメージをpullする必要がないから余分な容量を消費しない
  • posrgres imageでデータコンテナを作っているからパーミッションが正しく設定されている

などのメリットがあるからです。

データコンテナをマウントしてpostgresコンテナを起動

--volumes-fromオプションでデータコンテナの名前を指定してマウントさせてpostgresコンテナを起動すれば永続化完了です。

docker run -d --rm -p 5432:5432 --volumes-from dbdata postgres

ユーザーとパスワードを指定しなければ、

  • user : postgres
  • password : mysecretpassword

です。
テーブル作ったりしてからコンテナを消して、データコンテナをマウントした違うコンテナを立てて見れば永続化されてることが確認できると思います。
詳しいpostgres imageの使い方とかは公式のdocumentを見てください。

終わりに

1年前の記事よりかなりスマートにできたと思います(笑)。docker-composeも活用すれば、いい感じの開発環境が構築できそうですね。
間違った解釈をしていたり異論があればコメントください🙇
今日はここら辺で失礼します。

はてなインターンでブクマ数100倍にしにいった話。

お久しぶりです。ishikawa_proです。
ブログは246日ぶりの更新です笑
なんと、はてなのサマーインターンシップに参加して来ました!
developer.hatenastaff.com

f:id:ishikawa_pro:20170911013230j:plainf:id:ishikawa_pro:20170911013224j:plain:h240

体験記に入る前に

自己紹介

id:ishikawa_pro
島根出身
岡山在住
大学3年生
はてなブックマークアプリ開発コース
twitter: ishikawa_pro (@akira_system) | Twitter
好きな言語
Swift
Ruby
Delphi

はてなについて

はてなのサービスは、はてなブログを過去にやっていましたし、はてなブックマークは技術ブログの記事をよくブックマークするのに使っています。会社としては、一方的に知っているエンジニアの方がいたりして技術レベルが高いイメージは前々からなんとなく持っていました。

応募した理由

前から、大学3年生になったらweb系の企業のインターンには絶対参加しようと考えていました。どんな風に企業を選んでいたかというと、RubyとSwiftはちょっとだけ書けるから、どちらかの言語を使うインターンを探していました。また、将来モバイルアプリの開発に携わってみたいと思っていて、Swiftの力をもっと伸ばしたいとも思っていました。
特に、はてなインターンは、評判が良いし歴史もあるし有名なエンジニアの方も多いし、倍率高そうだから記念受験的な感覚でダメ元でエントリーしました。

体験記

前半課程

前半の2週間は午前中が講義で、午後は講義を踏まえて課題に取り組むという感じでした。講義内容は、Webサービス開発、上から下までがテーマで、Perlの講義から始まり、DB、WAF、Swift or javascript機械学習AWS講義、インフラ、デザイン、サービス企画など、本当に充実しています。課題は必須課題とオプション課題があって、楽勝で必須課題が終わった人はオプション課題を思う存分できるので暇になることはないです!僕自身は、全体的に自分の実力よりも課題のレベルが高かったので、必須課題をこなすのに必死でした。基本的に課題でひかかっている時間はなくて、ひかかったら即メンターの方々に聞くようにするといいです。メンターの方々はとても親切に分かりやすく説明してくださるので僕みたいに少し実力が足りていない人でもなんとかなります。

f:id:ishikawa_pro:20170911005809j:plainf:id:ishikawa_pro:20170911005745j:plainf:id:ishikawa_pro:20170911005803j:plain
f:id:ishikawa_pro:20170911005756j:plainf:id:ishikawa_pro:20170911000440j:plain
講義の様子
講義の内容は全て繋がっていて、最終的にはブログサービスをAWSへデプロイして使えるようになるところまでいきます。そして最終課題でオリジナルの機能を実装します。短時間で追加機能を実装するのは大変でみんな苦戦していました。僕はiOSのアプリでSpeech frameworkを使った声でブログを書ける機能を追加機能として実装しました。
そして前半課程最終日は、自分の追加機能を発表してみんなで良いと思ったブログサービスに投票して順位を競います。
f:id:ishikawa_pro:20170910233846j:plainf:id:ishikawa_pro:20170910233851j:plain
発表の様子
最初の2週間は結構ハードスケジュールで大変ですが、2週間頑張った後のビールは最高でした。(疲労と開放感からすぐに酔いました)
f:id:ishikawa_pro:20170911011457j:plainf:id:ishikawa_pro:20170911011453j:plain
前半課程の打ち上げ

後半課程

後半パートでは実際のチームに配属されて新機能の開発など実際の業務に携わります。僕は、id:snowman_mhくんと一緒にはてなブックマークのアプリチームに配属され、iOSはてなブックマークアプリの開発に携わりました。
具体的には、僕が「クイックブックマーク」という機能を実装して、id:snowman_mhくんが「合わせて読みたい機能」を実装して最終的に2つの機能をマージするような感じで開発しました。詳しくは↓で!
bookmark.hatenastaff.com
f:id:ishikawa_pro:20170911014722j:plain:h300
2週間で、開発→申請→リリース→発表 なので結構スピィーディーに開発していきました。僕はチームでの開発経験や実務経験はなかったのでメンターやチームの方々には結構迷惑をかけてしまったなと思っています。でも2週間をとおして、実際の開発の流れなどを経験できたこと、Swift力をあげられたこと、最高の新機能を実装できたこと、本当に貴重な経験だったし、これからのエンジニア人生にとってもプラスになってくると思います。
僕は人生初リリースだったので超嬉しかったです!

f:id:ishikawa_pro:20170911023916g:plainf:id:ishikawa_pro:20170911192842g:plain
申請 & リリース記念
後半パートでも最終日に4チームが実装した新機能などを発表して、みんなで投票を行い順位を争いました。1位を狙ってプレゼンにも力を入れて頑張りましたが残念ながら3位という結果でした😭
※ブクマ数100倍も達成できませんでした笑
結果は3位でしたが、アプリチームのみなさんの協力でプレゼンや最高の新機能をリリースできたので後悔はありません。
ブクマアプリチームの皆さん本当にありがとうございました。

まとめ

4週間のインターンを通して技術力や知識を上げることができたのはもちろんですが、はてなのエンジニアの方々の姿勢や技術力の高さを見て、自分もこういうエンジニアになりたい!と思いました。また、インターンを通して自分の技術力の無さを痛感したし、今までの勉強のしかたではダメだということがよくわかりました。この1ヶ月で得た経験で満足せずこれまで以上に努力して技術力を向上させていきたいと思います!

おまけ

その他インターンでの出来事などを簡単に紹介して終わります。

ステッカー

めっちゃ色々なステッカーやグッズ貰えます。ステッカー集めるのが好きなので超嬉しかったです笑

f:id:ishikawa_pro:20170911185211j:plainf:id:ishikawa_pro:20170911185222j:plain:h300
※一部、ステッカーを作った本人じゃない人からもらったモノもあります
f:id:ishikawa_pro:20170911185516j:plainf:id:ishikawa_pro:20170911185455j:plain
Before After

旅行

2週目の土曜日に社員の方に京都を案内していただきました!

f:id:ishikawa_pro:20170911190958j:plainf:id:ishikawa_pro:20170911190310j:plainf:id:ishikawa_pro:20170911190254j:plain
f:id:ishikawa_pro:20170911190301j:plain
f:id:ishikawa_pro:20170911190216j:plainf:id:ishikawa_pro:20170911190307j:plain

関西モバイルアプリ研究会

関モバで登壇させていただきました!
Delphi ネタが思った以上に受けたので安心しました。
来年もインターン期間中に何かしらの登壇チャンスがあると思うので是非チャレンジしてみてください!

www.slideshare.net


はてなの社員の皆様、他のインターン生のみんなのおかげで最高の夏にすることができました。
本当にありがとうございました!


他のインターン生の体験記

anatofuz.hatenablog.com

hogashi.hatenablog.com

snowman-mh.hatenablog.com

k3ntaroo.hatenablog.com

cohalz.hatenablog.com

syfm.hatenablog.com

makenowjust.hatenablog.com

Docker ComposeでRailsコンテナとPostgreSQLコンテナを管理

こんにちは。
最近、電子書籍を読み始めて、住野よるさんの「君の膵臓をたべたい」を一気読みしていたせいで更新が遅くなりました。めっちゃ感動した・・・笑
前回の記事でRailsコンテナとPostgreSQLコンテナをつないでみる部分を書きました。
ishikawa-pro.hatenablog.com
今回は、Docker Composeを使って2つのコンテナを簡単に管理できるようにしてみます。前回の続きを想定して行なっていますので、プロジェクトやDocker image は既に出来ている前提でいきます。

Docker Composeとは
設定ファイルにアプリケーションで利用するコンテナの構成情報を記述しておくことで、複数のコンテナを手動で操作したりせずに、アプリケーションの構築や管理をすることができます。

設定ファイルの作成
早速、設定ファイルの作成をしていきます。設定ファイルはdocker-compose.ymlという名前で作成します。

#docker-compose.yml
version: '2'

services:
  #postgreSQLコンテナの設定
  db:
    #imageを指定
    image: postgres9.3
    ports:
      - "5432:5432"
    #データを永続化させるためのボリュームコンテナを指定する。
    volumes_from:
      - container:postgres-data
    container_name: postgres
  web:
    image: test-app
    ports:
      - "3000:3000"
    #postgreSQLに接続するため、postgresqlのコンテナ名を記述
    links:
      #サービス名:エイリアス
      - db:postgres
    volumes:
      - "Railsプロジェクトのパス":/usr/src/engenius
    #環境変数
    environment:
      - TEST-APP_DATABASE_USERNAME=username #データベースのユーザー名
      - TEST-APP_DATABASE_PASSWORD=password #データベースのパスワード
    container_name: test-app
    stdin_open: true
    tty: true

config/railsプロジェクト内のdatabse.ymlの編集
railsプロジェクトのconfig/database.yml の設定をdocker-compose.ymlで記述した内容に変更します。

default: &default
  adapter: postgresql
  encoding: unicode
  # For details on connection pooling, see rails configuration guide
  # http://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  #docker-compose.ymlで設定した環境変数を入れる。
  username: <%= ENV['TEST-APP_DATABASE_USERNAME'] %>
  password: <%= ENV['TEST-APP_DATABASE_PASSWORD'] %>
  #docker-compose.ymlのlinksで書いたサービス名を入れる。
  host: db

以上で設定は終わりです。

アプリケーションの起動
それでは、アプリケーションを起動させます。データベースは既に出来ている前提です。docker-compose.ymlがあるディレクトリで以下のコマンドを叩きます。

$ docker-compose up -d

-d オプションをつけることで、バックグラウンドで実行されます。それではRailsコンテナに入ってサーバーを立ち上げてみましょう。(コンテナ立ち上がったらサーバーも起動するようにしてもいいと思います。)

$ docker exec -it test-app /bin/bash
$ rails s -b 0.0.0.0

これでアプリケーションが起動したはずです。http://localhost:3000にアクセスしていつもの画面が立ち上がれば成功です。コンテナを落とす場合は、

$ docker-compose down

で2つとも落ちてくれます。

終わりに
とりえあずこれで簡単な開発環境の構築ができるようになったんじゃないかと思います。実際に現場で開発とかしたことないのでプロの方々から見ればツッコミどころ多いでしょうが、今回はこんな感じで終わりです。

最近Rubyスクレイピングするコードを書いたので、次回はそこらへんを簡単に書いてみようかな。

Rails コンテナ x PostgreSQL コンテナ

こんにちは。
126日ぶりに更新します。笑
学校の卒業制作がピークを迎えていた関係で全然遊びでコード書いたり出来てませんでした。働きながら技術ブログとかを書かれている方々はすごいですね。いつも尊敬しながら読んでます。先月の上旬に私の卒業制作はほぼ終わりを迎え、1ヶ月ほど体を休めたのでまた色々と遊びでコードを書いて行きたいと思います。

過去の記事を遡ると、Dockerを使ってPostgreSQLコンテナを作りデータを永続化させたり、Railsのコンテナを作成したりしました。
ishikawa-pro.hatenablog.com
ishikawa-pro.hatenablog.com
今回は、RailsコンテナからPostgreSQLコンテナへ接続してデータベースとして利用する部分を書きたいと思います。
まずは前々回の記事を参考にrailsのプロジェクトを作成します。

$ docker run -it --rm -v "rails-appのパス":/usr/src/ rails-app-generater rails new my_project -d postgresql

今回は、PostgreSQLをデータベースに使うので、-dオプションでpostgresqlを指定する。これでデータベースをSQLiteからPostgreSQLへ変更できます。後は以前作ったDockerfileからDocker buildして、railsコンテナを作成し下のコマンドを実行してコンテナを立ち上げます。

$ docker run -it -v "プロジェクトのパス":/usr/src/my_project -p 3000:3000 --name my_project rails-app /bin/bash

次に、PostgreSQLコンテナを立ち上げます。コンテナの作成は過去の記事を参考にしてください。

$ docker run -it --volumes-from postgres-data -p 5432:5432 -d --name postgres9.3 postgres9.3

これで、2つのコンテナがたちあがりました。(postgres用のVolume コンテナを入れれば3つ)
f:id:ishikawa_pro:20170108001318p:plain
では、railsのプロジェクトファイルのconfig/database.ymlに接続先の情報を記述してPostgreSQL につないでみましょう。

default: &default
  adapter: postgresql
  encoding: unicode
  # For details on connection pooling, see rails configuration guide
  # http://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  #ここから下を追記
  username: "ユーザー名"
  password: "パスワード"
  host: "PostgreSQLコンテナのipアドレス(コンテナに入って調べる)"

これで設定は終わりです。次に、Railsコンテナ内に入り、rake db:createを行ってデータベースを作成します。

$ rake db:create

これでdatabase.ymlの設定を間違えていなければ、うまくデータベースができており、railsのアプリを立ち上げればうまくアクセスできるはずです。

$ rails s -b 0.0.0.0

上記のコマンドでサーバーを立ち上げ、http://localhost:3000/にアクセスしてみましょう。おなじみの画面が表示されるはずです。以前は、192.168.99.100:3000にアクセスしていたのですが、ホストOSをアップグレードしたり、Docker for Macのバージョンを変えたりした関係で変わってしまったみたい。本当はDocker Composeを使って二つのコンテナを管理するところまで書く予定でしたが長くなったので今日はここら辺で区切ります。

次回はDocker Composeのお話。

RailsアプリをGitHubで管理

お久しぶりです。
2週間ほどかなりハードな日々が続いていた関係で自宅でパソコン構えずブログも更新できてませんでした。
とりえず今日は、ひと段落ついてコーディング出来る時間ができたのでその時のメモ。

今回は、RailsアプリをGitHub で管理する話です。
特別難しいことはしないです。
私自身gitを使ったことがなかったのですが、最近触れる機会があったのでこれを機にgitでバージョン管理が出来るようになろうと思ったので、その手始めです。

今回の環境は、Docker上にRails用のコンテナを作成しています。プロジェクト自体は、ローカルディレクトリにマウントしているので、管理自体はMac上からやります。

まずgitのユーザー名とメールアドレスをMacに登録します。

$ git config --global user.name "ユーザー名"
$ git config --global user.email "メールアドレス"

次に適当な場所にRailsのプロジェクトを作成します。

$ rails new my_project

プロジェクトのルートディレクトリに移動してgit initして初期化します。

$ git init

とりあえず全て管理対象にして、コミットします。

$ git add .
$ git commit -m "my first commit"

*commitしてから気がついたのですが、全ファイルをcommitしない方がよかったかもしれないですね笑
GitHubにpush
GitHubにログインしてリポジトリを作成します。
rails newしたらREAD MEが作成されているのでREAD MEは作成しません。
f:id:ishikawa_pro:20160902233217p:plain
リポジトリを作成できたらrailsプロジェクトをGitHubにプッシュします。

$ git remote add origin https://github.com/ユーザー名/リポジトリ名.git
$ git push -u origin master

以上でプッシュ完了です。
以下のサイトを参考にしました。
fuzz-jpn.com

正直まだ、ほとんどgitを理解できていないので開発しながら試行錯誤していこうと思います。
学校の卒研でもgit使えたらいいな。

Docker x Ruby on Rails

こんにちは。
とりあえずDocker を使った Ruby on Railsの開発環境が整ったので記事にしておきます。

色々試行錯誤しましたが、rails のプロジェクトを生成するimageとrailsの実行環境のimageの二つを作ることで今は落ち着かせています。

流れとしては、
1. railsのプロジェクト生成用imageでrails new をしてホスト上にプロジェクトを生成
2.railsの実行用imageで、先程作ったプロジェクトをマウントして実行
です。

1. railsのプロジェクト生成用imageでrails new をしてホスト上にプロジェクトを生成
最初にrails プロジェクト生成用と、rails実行用の二つのimageのディレクトリを作っておきます。

$ mkdir rails-app-gene rails-app

それからrails-app-geneディレクトリ上にDockerfileを作ります。
rails new 専用のDockerfileです。

FROM ruby
MAINTAINER akira

RUN apt-get update -y &&\ 
    apt-get install -y postgresql libpq-dev node.js
RUN gem install pg &&\ 
    gem install rails

WORKDIR /usr/src/

rails-app-geneディレクトリ上で、buildします。

docker build -t rails-app-generater . 

次にコンテナを作成し、rails-appディレクトリ上にプロジェクトを生成します。

docker run -it --rm -v "rails-appのパス":/usr/src/ rails-app-generater rails new my_project

rails-app上にプロジェクトを作成しているのは、rails-appのimageをbuildする際にbundle install をするのですが、プロジェクトが構築時の コンテント 内にある必要があるからです。
--rmオプションを指定しておいて、プロジェクトの生成が終わったら自動的にコンテナを削除するようにしておきましょう。
これで、ローカル上にプロジェクトの生成が完了しました。

2.railsの実行用imageで、先程作ったプロジェクトをマウントして実行
rails-app上にDockerfileを作成します。
railsの実行用のDockerfileは以下のようになっています。

FROM ruby
MAINTAINER akira

RUN apt-get update -y &&\ 
    apt-get install -y postgresql libpq-dev node.js
RUN gem install pg &&\ 
    gem install rails

WORKDIR /usr/src/my_project
COPY ./my_project/Gemfile* ./
RUN bundle install
COPY  ./test-app .

EXPOSE 3000

rails インストール後に、プロジェクトのGemfileとGemfile.lockだけを先にマウントしてbundle install しています。
こうすることで、再度buildする際にGemfileが変更されていなければ、bundle installのキャッシュを利用してくれるので高速で buildが完了します。

Dockerfileをbuildします。

$ docker build -t rails-app .


では、コンテナを作成してみましょう。

docker run -it -v "プロジェクトのパス":/usr/src/my_project -p 3000:3000 --name my_project rails-app /bin/bash

サーバーを起動してみましょう

コンテナ上$ rails s -b 0.0.0.0

mac上からアクセスできるように、ipを指定して起動します。
macchrome から http://192.168.99.100:3000でアクセスすれば、確認できます。
f:id:ishikawa_pro:20160817140658j:plain
イラスト変わったんですね。知らなかった笑
まだPostgreSQLを使用してアプリケーションを作ってないので、動作確認ができていないですが、とりあえずうまく動く予定です。次回の記事で確認します。

確認記事を作成しました。
ishikawa-pro.hatenablog.com

Docker上のPostgreSQLのデータの永続化の話

👇こちらがよりベターなやり方をまとめた記事です。
ishikawa-pro.hatenablog.com

初めまして
情報系の学生をやってまして趣味で色々作って遊んでいます。
作業手順をよく忘れたり、色々試した結果どうしたらうまくできたのかをよく忘れる性格なので、どんどん書き留めていきたいと思います。
飽きっぽいので続かないかも笑

今回は、最近使い始めたDocker の話です。
Docker上のPostgreSQLのデータの永続化でかなりつまずいたのでその記録です。
今回は、Mac book proで試しています。
そもそもデータベースをちゃんと扱ったことがなくてSQL文すらあやふやな状態だったので、Dockerで悩んだと言うよりはPostgresの設定的な部分でかなり悩んだ。


今回は、DockerHub公式リポジトリのpostgresは使わずに、1から作ってデータの永続化までやってみました。
ちなみに、データの永続化はデータボリュームコンテナを作りました。
ネットでよく、

データボリュームコンテナを作成して/var/lib/postgresql/dataをホストにマウント
            ↓
PostgreSQLコンテナでデータボリュームコンテナをマウントして永続化完了


見たいな記事をよく見かけたけど全然うまくできなかった。
そもそもデータボリュームコンテナのDockerfileで

VOLUME /var/lib/postgresql/data

とだけ書いて、データボリュームコンテナのimage 作ってPostgreSQLコンテナでマウントしたらデータベースクラスタディレクトリが空っぽになっちゃう気がするのは勘違いなのかな?


とにかく今回やったまず大まかな流れとしては、
1. PostgreSQLのimageの作成
2. データ保存用のVolumeを作成
3. データボリュームコンテナ の作成
4. PostgreSQLコンテナでデータボリュームコンテナをマウント
です。

Dockerfile作るの初めてでかなり色々勉強になった(笑)

1. PostgreSQLのimageの作成
Dockerfileは以下のようにしました。
とりあえずubuntuPostgreSQLをインストールして最低限の設定をしているだけです。

FROM ubuntu-upstart

MAINTAINER akira

RUN apt-get update && \
    apt-get install -y postgresql

USER postgres

RUN /etc/init.d/postgresql start &&\ 
    psql --command "CREATE ROLE user01 LOGIN CREATEDB PASSWORD 'your_password';" &&\ 
    psql --command "CREATE DATABASE test01 OWNER user01;" &&\ 
    echo "local all  postgres                      peer" >> /etc/postgresql/9.3/main/pg_hba.conf &&\ 
    echo "local all  all                           trust" >> /etc/postgresql/9.3/main/pg_hba.conf &&\ 
    echo "host  all  all         127.0.0.1/32      md5" >> /etc/postgresql/9.3/main/pg_hba.conf &&\ 
    echo "host  all  all         ::1/128           md5" >> /etc/postgresql/9.3/main/pg_hba.conf &&\ 
    echo "host  all  postgres    0.0.0.0/0         reject" >> /etc/postgresql/9.3/main/pg_hba.conf &&\ 
    echo "host  all  all         0.0.0.0/0         md5" >> /etc/postgresql/9.3/main/pg_hba.conf &&\ 
    echo "listen_addresses='*'" >> /etc/postgresql/9.3/main/postgresql.conf &&\ 
    /etc/init.d/postgresql reload

EXPOSE 5432

CMD ["/usr/lib/postgresql/9.3/bin/postgres", "-D", "/var/lib/postgresql/9.3/main", "-c", "config_file=/etc/postgresql/9.3/main/postgresql.conf"]

ユーザー名とパスワードとかは自分で設定してください。
次にDockerfileのあるディレクトリにて

$ docker build -t postgres9.3 .

を実行してimageの作成

2. データ保存用のVolumeを作成
データベースクラスタの置き場所を、pgDataという名前のVolumeであらかじめ作っておきます。

$ docker volume create --name pgData


3.データボリュームコンテナの作成
ここがかなり大事です。
まず、PostgreSQLコンテナを起動して、データベースクラスタディレクトリを先ほど作ったpgDataにマウントします。

$ run -it -v pgData:/var/lib/postgresql/9.3/main/ --name postgres-test -d postgres9.3

これでこのコンテナは用無しなので削除しておきます。
次にpgDataをマウントして データボリュームコンテナを作成します。
データボリュームコンテナは起動しておく必要はないのでrun ではなくcreate しておきます。

$ docker create -it -v pgData:/var/lib/postgresql/9.3/main/ --name postgres-data busybox

これでDataVolumeContainer内にデータベースクラスタを置くことができました。

4. PostgreSQLコンテナでデータボリュームコンテナをマウント
最後は、データボリュームコンテナをマウントしてPostgreSQLのコンテナを起動すれば永続化の完了です。

$ docker run -it --volumes-from postgres-data -p 5432:5432 -d --name postgres9.3 postgres9.3


Mac OS 上からPosticoを使ってテーブルを操作したりしてから、一旦コンテナ削除してもう一回立ち上げたりしてもちゃんとデータ残ってました。

ここまで来るのに約1週間くらいかかった笑 夏休みで時間はたくさんあるので別にいいですが笑
ローカルのディレクトリを汚したくないという理由でDockerを使い始めたけどかなり苦労しました。
次は本題のRuby on Railsのアプリケーションを作っていきたいと思ってます。来週中にできるかな?笑

Rails コンテナとPostgreSQLコンテナの連携については、こちら
ishikawa-pro.hatenablog.com