docker PostgreSQLを起動してアクセスする

dockerでPostgreSQLのコンテンをコンテナイメージから起動します。

PostgreSQLのコンテナイメージを取得

docker pull postgres

タグを指定しない場合、デフォルトの”latest”が設定されます。

コンテナイメージの確認

❯ docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
postgres            latest              adf2b126dda8        8 days ago          313MB
ubuntu              latest              1d622ef86b13        4 weeks ago         73.9MB

上記の”postgres”が取得したPostgreSQLのコンテナイメージです。

コンテナ起動

# create dir
mkdir /data/postgres
# docker run
docker run -d \
    --name postgres \
    -e POSTGRES_PASSWORD=postgres \
    -p 5432:5432 \
    -v /data/postgres:/var/lib/postgresql/data \
    postgres

PostgreSQLを起動するには、”-e”オプションを指定して環境変数の”POSTGRES_PASSWORD”に初期パスワードを設定します。※起動だけなら、このパスワードの設定でOKです。

その他オプションでは、”-v”オプションを指定して、PostgreSQLのデータ保存先としてホストマシンの”/data/postgres”を指定しており、”-p”オプションを指定してホストマシンとのポート接続を指定しています。

クライアントからアクセス

以下の初期設定でPostgreSQLへアクセスします。

HOST:コンテナのIPアドレス
PORT:5432
DATABASE:postgres
USER:postgres
PASSWORD:postgres

※パスワードは、コンテナ起動時に環境変数に指定した値となります

Gitの各領域(working directory,staging area,repo)とコマンドの関係図

Gitの各領域とコマンドの関係図を掲載します。

Gitの領域について

作業ディレクトリ(working directory)

実際にコードを修正する作業領域。ローカルのディレクトリを開いて見えるコードやファイルはこの作業ディレクトリです。git addコマンドでステージング領域へファイルを登録します。

ステージング領域(staging area/index)

Gitには「ステージング領域」または「インデックス」と呼ばれるものがあります。これは、コミットを完了する前にコミットをフォーマットして確認できる中間領域です。git commitコマンドでローカルリポジトリへステージング領域にあるファイルを一括登録します。

ローカルリポジトリ(local repository)

ローカルのGitリポジトリです。コミットごとの変更した差分が保存されます。git pushコマンドでリモートリポジトリへコミット内容を送信します。

リモートリポジトリ(remote repository)

ローカルリポジトリの変更点を保持します。一般的には、GitHub、GitLab、BitbucketといったGitのホスティングサービス上に構築され、複数の開発者がリモートリポジトリをコピー(clone)元として、ローカルリポジトリを構築します。

git addを省略してgit commtする

“git add”を省略して”git commit”を行うには、オプション”-a”をつけます。

git addを省略してcommitする

git commt -m "ignore git add" -a

“git add .”を入力するか、オプション”-a”をつけるかの違いとなります。

※オプション”-m”はcommtメッセージ

fish shellのコマンド置換は”`”バッククォートや”$()”ドルマークカッコでなく”()”を使う

タイトルの通り、fish shellでの、コマンド置換方法にについて、記載しています。

shやBashでは、”`”バッククォートや”$()”ドルマークカッコで記載しますが、
fish shellでは、”()”カッコで記載します。

fish shellのバージョンは3.1.2で実行しています。公式チュートリアルURL

fish shellのコマンド置換

コマンド置換では、あるコマンドの出力を別のコマンドの引数として使用します。他のシェルとは異なり、fishはコマンド置換にバックティックを使用しません。代わりに、括弧を使用します。

コマンド

echo In (pwd), running (uname)

実行例

> echo In (pwd), running (uname)
In /home/ubuntu, running Linux

コマンド出力結果を変数に設定

変数”os”に”uname”の出力結果を代入します。

> set os (uname)
> echo $os
Linux

“ダブルクォート内に指定

コマンド置換で日付をファイル名として指定します。

> touch "testing_"(date +%Y%m%d)".txt"
> ls *.txt
testing_20200517.txt

Python Flaskを使ってREST APIを作成する

PythonのフレームワークであるFlaskを使って、GETメソッドとPOSTメソッドに応答するシンプルなREST APIを作成します。

Flaskモジュールインストール

pipでFlaskモジュールをインストールします。

pip install flask flask_restful

Flaskを使ったREST APIのサンプルコード

サンプルコードの仕様

/ GET
クエリパラメータに指定した、nameとageをJSON形式で返却します。

パラメータ
name:必須チェック
age:型チェック(int)

/ POST
クエリパラメータに指定した、q_paramとフォームに指定したf_paramをJSON形式で返却します。

パラメータ
q_param:型チェック(int)※URLから取得
f_param:チェックなし※フォームから取得


実行方法

上記、サンプルコードを”flask_api.py”という名前で保存して以下のコマンドを実行します。

実行コマンド

python flask_api.py

実行結果

$ python flask_api.py 
 * Serving Flask app "flask_api" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 280-531-524
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

ワーニングメッセージ(Flaskビルドインサーバーは開発用サーバーであり、本番環境では利用しない)が表示されていますが、URL”127.0.0.1″のポート”5000″でflaskが起動しています。


GET実行例

Curlコマンドで結果を確認します。

正常系

“name”に”Taro”、”age”に”88″を指定します。
※”127.0.0.1″は、”localhost”に置き換えて下さい

$ curl localhost:5000?name='Taro'\&age=88
{
    "name": "Hello Taro!",
    "age": 88
}

URLに指定したパラメータが返却できています。

異常系

Curlコマンドのオプション”-i”でHTTPヘッダ情報も表示します。

“name”入力なし。必須チェックエラー。

$ curl -i localhost:5000
HTTP/1.0 400 BAD REQUEST
Content-Type: application/json
Content-Length: 67
Server: Werkzeug/1.0.1 Python/3.6.4
Date: Mon, 04 May 2020 15:00:57 GMT

{
    "message": {
        "name": "Name cannot be blank!"
    }
}

“name”指定するが、値を入れない。必須チェックエラー。

$ curl -i localhost:5000?name=
HTTP/1.0 401 UNAUTHORIZED
Content-Type: application/json
Content-Length: 43
Server: Werkzeug/1.0.1 Python/3.6.4
Date: Mon, 04 May 2020 15:06:03 GMT

{
    "message": {
        "name": "Name cannot be blank! 2"
    }
}

上記は、abort処理で表示しているエラー。HTTPレスポンスコードは、15行目で指定した”401“が返却されています。

“age”を文字型で入力。タイプエラー。

$ curl -i localhost:5000?name='Taro'\&age=aaa
HTTP/1.0 400 BAD REQUEST
Content-Type: application/json
Content-Length: 68
Server: Werkzeug/1.0.1 Python/3.6.4
Date: Mon, 04 May 2020 15:08:52 GMT

{
    "message": {
        "age": "Age cannot be converted"
    }
}

POST 実行例

正常系

URLパラメータとして”q_param”に”100″を指定し、Curlのオプション”-d”でフォームのパラメータとして、”f_param”に”form_parameter”を指定します。

$ curl -X POST localhost:5000?q_param=100 -d f_param=form_parameter
{
    "post": "Hello World!",
    "qParam": 100,
    "fParam": "form_parameter"
}

URLの文字列、フォームからそれぞれ値が取得できています。

異常系

“q_param”を文字型で入力。タイプエラー。

$ curl -X POST localhost:5000?q_param=query -d f_param=form_parameter
{
    "message": {
        "q_param": "q_param is numbers"
    }
}

公式ドキュメント

上記のサンプルコードは、公式ドキュメントの内容から記載しています。

詳細や最新情報は公式ドキュメントを参照ください

Dockerよく使うコマンド

内容コマンド
Dockerサービス起動sudo service docker start
Dockerサービス停止sudo service docker stop
コンテナ表示dockr ps -a
コンテナ削除docker rm {CONTAINER ID}
コンテナ全削除docker rm $(docker ps -aq)
コンテナ起動
(フォアグラウンド)
docker run -it –rm ubuntu:18.0.4 /bin/bash
コンテナ起動
(バックグラウンド/デタッチド)
docker run -d -p 80:80 nginx:latest nginx -g ‘daemon off;’
または
docker run -d -it –name ubuntu-os ubuntu
バックグラウンドで起動中の
コンテナに接続
docker exec -it {CONTAINER ID} /bin/bash
または
docker attach {CONTAINER ID} /bin/bash
コンテナ停止docker stop {CONTAINER ID}
コンテナ全停止docker stop $(docker ps -q)
コンテナイメージ表示docker images
コンテナイメージ削除docker rmi {IMAGE ID}
コンテナイメージ全削除docker rmi $(docker images -q)
コンテナイメージ取得docker pull ubuntu
docker pull ubuntu:18.0.4
Dockerfileからコンテナイメージの
ビルド
docker build -t tagname .
※{CONTAINER ID},{IMAGE ID}は、適宜置き換える

Dockerサービス起動

sudo service docker start

※上記は、AmazonLinux2の場合

Dockerサービス停止

sudo service docker stop

※上記は、AmazonLinux2の場合


コンテナ表示

dockr ps -a

※オプション”-a”または”–all”でコンテナを全てを表示(オプションなしだと起動中のコンテナのみ表示)

コンテナ削除

docker rm {CONTAINER ID}

コンテナ表示時に表示されたコンテナIDを指定する

コンテナ全削除

docker rm $(docker ps -aq)

※オプション”-aq”でコンテナ全てのコンテナIDを表示


コンテナ起動(フォアグラウンド)

docker run -it --rm ubuntu /bin/bash

※オプション”–rm”はコンテナの終了時に、自動的にコンテナをクリーンアップする

コンテナ起動(バックグラウンド/デタッチド)

docker run -d -p 80:80 nginx:latest nginx -g 'daemon off;'
または
docker run -d -it --name ubuntu-os ubuntu

※オプション”-d”でデタッチド(バックグラウンド実行)、”-p”でホスト:コンテナのポート指定。オプション”–name”でコンテナの名前を指定する。

バックグラウンドで起動中のコンテナに接続

docker exec -it {CONTAINER ID} /bin/bash
または
docker attach {CONTAINER ID} /bin/bash

※”exec”コマンドを利用した場合、コンテナからログアウトしてもコンテナは停止しない
 ”attach”コマンドを利用した場合、コンテナからログアウトするとコンテナは停止する

コンテナ停止

docker stop {CONTAINER ID}

※コンテナIDはdocker psで確認

コンテナ全停止

docker stop $(docker ps -q)

※オプション”-q”で起動中のコンテナIDを表示


コンテナイメージ表示

docker images

ここで表示されるイメージIDを利用する

コンテナイメージ削除

docker rmi {IMAGE ID}

コンテナイメージ全削除

docker rmi $(docker images -q)

※オプション”-q”でイメージIDのみを表示する

コンテナイメージ取得

docker pull ubuntu
docker pull ubuntu:18.0.4

※上記は、”ubuntu”のコンテナイメージを取得。tag指定なしだと、デフォルトタグの”tag: latest”が指定される。

Dockerfileからコンテナイメージ作成

docker build -t tagname .

※”.”(ドット)は、カレントディレクトリにあるDockerfileを指定している