【備忘録】【Docker奮闘記:2】Postgres9.3イメージ取得＆コンテナ作成

ひょー！色々ドタバタしてて前回から1年以上経ってるお久しぶりです


#はじめに
この備忘録は、Docker for Windows(コミュニティ版)インストール時のメモ書きです。
・Dockerのインストール　[前回の記事](https://qiita.com/manamiTakada/items/c1394e5e3358802a9446)　
・コンテナの作成	←イマココ
・PostgreSQLの設定
・Pythonプログラムからアクセス

今回は、Docker上にPostgres9.3のコンテナを作って、pgAdmin4から接続するところまでです。

#OS
Windows 10 Pro 64bit
Docker 18.03.1-ce

#手順
###postgresイメージの取得

ではpostgreSQLのイメージを探しに行きます。
まずは下記URLにアクセス。
https://store.docker.com/

以降、このメモを作成していたときのスクリーンショットです。
現在とはレイアウトが異なります…。
![4-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236851/64e228b5-cb21-d1f4-e771-00687275f964.png)

検索窓に「postgres」と入力して、ゾウさんマークを探します。:elephant:
![4-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236851/7eba2fcd-3c63-a884-e5f9-2acb09b0a7d7.png)

一覧からゾウさん:elephant:を選ぶと、該当のイメージのページに遷移します。
画面右の「View Available Tags」から、利用可能なタグを見ることができます。
![4-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236851/eb00ad47-504d-356d-b519-ec08d0b93052.png)

タグの一覧の中から…
![4-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236851/290413c1-bf9f-e185-445a-d8ce38a89040.png)

今回は「9.3」のタグを利用してみます。
![4-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236851/2e589cd5-5783-5e7d-3d1c-907915bc3aed.png)



利用したいイメージとタグがわかったので、Dockerからイメージを取得しに行きます。
PowerShellを起動して
![4-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236851/8eb444d7-aea3-6df2-593e-5c27a052caf8.png)

```
docker image pull postgres:9.3
```

暫し待つ…
![4-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236851/4e7b8fac-32c5-a314-1a17-c604135b40ab.png)


すべてのステータスがCompleteになると、
ダウンロードのダイジェストが表示されて再び入力待ちになります。
![4-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236851/23ace79c-b623-190d-7fe8-750562f21507.png)

これでイメージ取得完了～

###コンテナ作成
続いてコンテナ作成していきます。
今回の設定はこんな感じにしてみました↓
![4-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236851/199a89c5-91b1-ee50-528c-ae70e4370573.png)
ひとまず、ポートはデフォルトから別の無害そうなポートに移してます。
（自身の環境で開いてるポートを使ってください）

この設定値を元に、container runコマンドを組み立てます。

```
docker container run --name [コンテナ名] -e POSTGRES_PASSWORD=[パスワード] -p [ポートフォワード]:[ポート] -d [コンテナイメージ]:[イメージタグ]
```

↑これが↓こう

```
docker container run --name postgres9.3 -e POSTGRES_PASSWORD=postgres -p 55432:5432 -d postgres:9.3
```


これでポーンとやったらコンテナが作成されるのですが、
スクリーンショットを取り忘れていたという失態…:upside_down:


コンテナの一覧やステータスは、以下のコマンドで確認できます。

▼コンテナ一覧取得

```
docker container ls
```

▼コンテナのステータス確認

```
docker container stats [コンテナ名]
```

###pgAdmin4インストール
続いてはpgAdminを入れていきます。
下記URLにアクセス。
https://www.pgadmin.org/

Download → Windows → 最新バージョンのリンクから、
exe形式のインストーラをダウンロードします。（またスクショ忘れました:punch:


v3.1のインストーラをダウンロードしたexeを実行していきます～
![5-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236851/2c2b3031-46d6-88c1-012f-b87d0bfa5aa9.png)

ライセンスについて読んだら、I accept the agreement で Next
![5-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236851/a3cbfdbd-e4dc-3f5a-e1bf-42ecf3faa548.png)

今回はそのままの設定でNextしました。
![5-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236851/2e0fef88-2e27-a2c5-b325-4a7a3532838c.png)

名前もそのままNext
![5-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236851/5a1cd668-c4ec-48d5-b5e3-3154768fc943.png)

実行前に、設定を再確認します。
問題なければInstall
![5-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236851/d6e8db48-c6e9-3d86-6f94-110e643c14f3.png)

Launch pgAdmin4にチェックを入れて、そのまま動作確認してみます。
![5-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236851/53f839c9-3d0c-4618-a24e-b5ff1881f82a.png)

ブラウザが起動して、pgAdmin4の画面が表示されました～
![5-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236851/ebb82338-d01a-55d7-911c-e4918653a503.png)


###pgAdmin4から、Dockerコンテナの上のPostgresにアクセス
せっかくなので、そのまま接続情報を作成します。
左のメニューを右クリックして、
   Create → Server
と選びます。
![5-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236851/50bff2d7-338f-c8b5-1442-60dd723b25b6.png)


本記事の上の方で作成したコンテナに対する接続設定をしていきます。
2つ目のタブ[Connection]を開いて、以下の通りに入力します。
![5-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236851/5f338244-2541-3cc7-22d7-a0900306de53.png)

無事、pgAdminからDocker上のPostgresにアクセスできました～
![5-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236851/48d06f77-7947-6b36-0e9d-edd25e0fca83.png)

####接続情報の名前について
基本的には何でも良いのですが、私の場合は
　DB名:ポート:ユーザ名
と書くことが多いです。
postgresユーザはpostgresにしかつながないので、
 DBバージョン:ポート:postgres
としています。
運用フェーズに入ったら真っ先に消える接続情報なので、
まぁこれでもいいかなぁと。
皆さんどうやって決めてるんですかね？？


以上！！

##次回の記事の前フリ
###ユーザ作成
デフォルトで作成されるpostgresユーザ、postgresDBをそのまま使うのは好きじゃないので、
これから作るDB用のスーパーユーザを作っちゃいます。

というわけで、まずはユーザ作成します。
postgresユーザでログインしている状態で、[Login/Group Roles]を右クリックして、
　Create → Login/Group Roles
![5-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236851/8d19f7c7-6b0c-bdba-9bee-5b0413330788.png)

ユーザ名を[db01admin]として、ユーザを作成します。(またスクショ忘れました:wave:

Generalタブ：　Name：db01admin
Definitionタブ：　password：db01admin
Privilegesタブ： ↓
![5-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236851/29a4d01d-ba51-b313-f936-299cc12f6289.png)
でSaveします。


今作成したdb01adminユーザ用の接続情報を作成します、
左のメニューを右クリックして、
   Create → Server
と選びます。
設定値はpostgresユーザとほぼ同じですが、[Username]には[db01admin]とします。
これは作成したユーザ情報をあとから見ている図↓
![5-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236851/e0777cdf-6e06-f5fa-d0b5-e48c009d640f.png)

作成できたら、一旦postgresユーザの接続は切断します。
![5-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236851/931b0068-c9d4-9069-4d19-6904d96dc5da.png)



###DB作成
db01adminユーザ用の接続情報をダブルクリックしてログインします。
Databasesを右クリックして、
   Create → Database
と選びます。
![5-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236851/356b41b9-ece4-1317-6ca3-899c831ea907.png)


新しいデータベースをdb01とします。
設定は左のタブからこんな感じにしました。↓
Generalタブ:
![5-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236851/3af66473-500f-4638-05b7-d0aed333eaac.png)

Definitionタブ:
![5-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236851/5b94219d-0a4c-a36a-8e6b-1bc7e2c6c3de.png)
ここで、[Collation]や[Character type]に日本語utf8が選べない事に悶々とする。

Securityタブ:
![5-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236851/ff9c2fbd-94d0-70a6-dacc-9b43092ec9f8.png)

Parametersタブ:
![5-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236851/6d86048e-5ee5-32b2-0e1a-e656c47950ac.png)

SQLタブでは、ここまでの設定がSQLとして表示されます。
![5-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236851/e8a1b190-c05d-1f2d-8dfd-7b58a1395bbf.png)
普通はこれでSaveすればDBは作成されるのですが…

ウィザードからは日本語utf8を指定できなかったので、
SQLを直に流してみようとした結果が↓
![5-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236851/3ba0d2f4-162c-ef83-847d-ae6a8c49bb75.png)

日本語だめなの！？
おかしいなーと思ってコーレーションの一覧出してみたものの
![5-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236851/ead51e06-48ec-94a3-c1f1-e0b8f9f6b4fa.png)
私の好きなja_JP.utf8の文字はなく…


調べてみると、
Postgresのコーレーション周りはOSに依存している
→今のPostgresが稼働しているOSはLinux…
→そのLinuxはDockerのコンテナに乗っている…
→コンテナはDLしてきたDockerイメージから生成している…


ので、Dockerイメージを変更して、Linuxにロケール設定を追加しないとならない！！

？？？？？:thinking::thinking::thinking::thinking::thinking:

次回、Dockerfileを作ってイメージを変更する！
ここからが調べる時間かかったー:sob::sob::sob: