データベースの構築なんて聞いただけだと難しそうー 大変そう って感じですが
Dockerを使えば、ワタシのような初心者でもデータベースが作れます
使用するサービス
VirtualBox … PC に仮想環境を構築
Vagrant … 仮想マシン環境を管理
Docker … コンテナ型の仮想環境を作成、実行
PostgreSQL … データベース管理
ワタシのイメージ
初心者の解釈なので違うかもしれませんが、温かい心で読んで頂けたらと思います。
今、作業しているマシンの中に仮想マシン(VirtualBox) を作って、
操作してくれる人(Vagrant) に、超便利なツール(Docker) をインストールしてもらって
そのツールを使ってデータベース(PostgreSQL)を構築する。 みたいなことをやります。
各ツールをインストール
まずは、仮想環境を構築するために VirtualBox を インストール
次に仮想環境を管理してくれる Vagrant を インストール
Vagrantfile を設定し、仮想マシンを立ち上げる
仮想マシンに入れるOSはVagrant Cloudの一覧に載っています。
こんな感じで色々ありますが、今回はubuntu/xenial64でマシンを立ち上げます。
以下のコマンドを実行
vagrant init
今回は任意のIPで仮想マシンを作成するように設定してみます。
ついでに仮想マシンとローカル(ホスト)の任意の場所同士がアクセスできるように
設定したいのでVagrantfileを編集します。
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/xenial64"
config.vm.network "private_network", ip: "192.168.11.29"
config.vm.synced_folder ".", "/srv/", type: "nfs"
end
Vagrant.configure("2") do |config| ~ end の間に設定を書きます。
config.vm.box = "ubuntu/xenial64" ・・・BOXはubuntu/xenial64で起動してね
config.vm.network "private_network" ・・・ホストマシンからしかアクセスしないよ
ip: "192.168.11.29" ・・・IPは 192.168.11.29 に設定してね
config.vm.synced_folder ".", "/srv/"
・・・ホストマシンのVagrantfileがある場所(.)を仮想マシンの/srv/の下にマウントしてね
type: "nfs" ・・・ NFS マウントしてね。
synced_folderに指定したホストマシンのディレクトリと仮想マシンのディレクトリを設定
同じディレクトリとして扱えるようにすることをマウントと呼びます。
仮想マシンが作成されるとき(vagrant upしたとき)に、このマウントをするのですが
そのときのスピードがNFS マウントした方が断然早いらしいです。
それと、Vagrantfileの" "内は定型じゃないので自分の環境で好きに変えてください。
Vagrantfileの編集が終わったら以下のコマンドを実行します。
vagrant up
これで仮想マシンが作成されて起動しましたー!本当に起動してるか確認してみます。
VirtualBoxを起動すると…ちゃんと実行中になってます。
このマシンにsshで繋いでみます。以下のコマンドを実行
vagrant ssh
おーっ!繋がりました!本当に仮想マシンにマウントされてるのかな~?
では、ホストのtedkumaディレクトリに画像ファイルを入れてみて、仮想マシンで見えるか確認します。
/srv/の下がVagrantfile置いてる場所と同じになってるはずなので移動してみます。
cd /srv
ls
見えてますー!ちゃんと設定通りマシンが立ち上がってるのが確認できました。
Docker をインストールする
上のイラストで色々な環境と言ってますが、dockerではこれをコンテナと呼びます。
pythonの開発環境のコンテナ、ポスグレ環境のコンテナ、nodeの開発環境のコンテナ…
というようにdocker上に色々なコンテナを立ち上げることができます。
Dockerを0から勉強するからDockerインストールの箇所を引用させて頂きました。
一旦ルートに戻って
cd /
HTTPS経由でリポジトリを使用できるようにパッケージをインストールする
sudo apt-get install -y
Dockerの公式GPGキーを追加
curl -fsSL https://apt.dockerproject.org/gpg | sudo apt-key add -
OK
key IDが58118E89F3A912897C070ADBF76221572C52609Dであることを確認
apt-key fingerprint 58118E89F3A912897C070ADBF76221572C52609D
pub 4096R/2C52609D 2015-07-14
Key fingerprint = 5811 8E89 F3A9 1289 7C07 0ADB F762 2157 2C52 609D
uid Docker Release Tool (releasedocker) docker@docker.com
非公式リポジトリ(docker用リポジトリ)の追加
sudo add-apt-repository "deb https://apt.dockerproject.org/repo/ ubuntu-$(lsb_release -cs) main"
Dockerをインストールする
aptパッケージを更新する
sudo apt-get update
Dockerの最新バージョンをインストール
sudo apt-get -y install docker-engine
正しくインストールされているか確認
docker -v
Docker version 17.05.0-ce, build 89658be ※ちゃんとバージョン出てくればOK
Unable to find image 'hello-world:latest' locally Hello from Docker! To generate this message, Docker took the following steps: To try something more ambitious, you can run an Ubuntu container with: Share images, automate workflows, and more with a free Docker ID: For more examples and ideas, visit:お試し hello-worldイメージをダウンロードして、コンテナ内で実行。
sudo docker run hello-world
latest: Pulling from library/hello-world
9db2ca6ccae0: Pull complete
Digest: sha256:4b8ff392a12ed9ea17784bd3c9a8b1fa3299cac44aca35a85c90c5e3c7afacdc
Status: Downloaded newer image for hello-world:latest
This message shows that your installation appears to be working correctly.
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
$ docker run -it ubuntu bash
https://hub.docker.com/
https://docs.docker.com/engine/userguide/
※こんなことを言ってます。(Google翻訳さん)
Docker Hubにはオフィシャルなものから個人の方が作成したものまで様々なコンテナのイメージが
公開されています。Gitでいうところのgit clone的な感じでdocker pullして使うことが出来ます。
…で、dockerはそのイメージからコンテナを作成します。
Docker-Compose をインストールする
Install Docker Compose のLinuxタブを引用しています。Docker Composeの最新バージョンをダウンロード
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
実行可能なアクセス許可をバイナリに適用します。
sudo chmod +x /usr/local/bin/docker-compose
ちゃんとインストールされているかバージョンを確認
docker-compose --version
docker-compose version 1.21.2, build a133471 ※ちゃんとバージョン出てくればOK
ポスグレのコンテナを立ち上げる(DB作る)
さて、大詰めです。ディレクトリの中にdbというディレクトリを作成し、
docker-compose.ymlという名前でヤムルファイルを作成します。
docker-compose.ymlの中身はこんな感じで書きました。
version: '3'
services:
db:
container_name: postgres
image: postgres:latest
ports:
- "5432:5432"
volumes:
- ./db:/docker-entrypoint-initdb.d
environment:
- POSTGRES_USER=password
- POSTGRES_PASSWORD=password
- POSTGRES_DB=postgres
networks:
- default
volumes:
yarn_cache:
driver: 'local'
先に動かしてみます。
docker-compose.ymlファイルのあるディレクトリに移動してから
cd /srv
以下のコマンドを実行 (-dはデーモンで起動するというオプション)
sudo docker-compose up -d db
そうするとCreating postgres ... done!出来ましたー!コンテナが立ち上がりましたー!
本当に立ち上がったか確認してみます。
sudo docker ps
この画面見るとdocker-compose.ymlで設定した内容が分かると思います。設定した内容の他に、
作成されたコンテナにCONTAINER ID(ユニークID)が割り振られ、CREATEDで47秒前に作成されたよ
STATUSでUP…起動中だよというのがわかります。
volumeというのはマウントされる領域を指しているのですが、./dbは先ほど追加したdbディレクトリ
対する/docker-entrypoint-initdb.dという場所は、データ置き場です。
docker-entrypoint-initdb.dにデータを置いておくとDBのデータとして処理してくれます。
だから、ローカルのdb = データ置き場 ってことでマウントしてね って書いてます。
じゃあ、本当にポスグレ使えるようになってるのか確認してみます。
docker-compose.ymlに書いたDB名、ID、パスワードでテスト接続すると...無事繋がりました
Docker使用してDBを作成するに関しては以上です。
コマンドやDockerの特性に関しては全く触れず申し訳ありません。
丁寧に解説して下さっているページがたくさんありますので、そちらでご確認頂くようお願いします。
以下はその他参考にさせて頂いたページです。
Dockerメモ より sudo なしでdockerコマンドを叩けるようにする
Vagrant入門から実践まで より 仮想マシンのメモリを増やす