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を指定している

AWS EC2(Amazon Linux)にDockerインストール、起動、停止

AWSのEC2を利用して、Dockerを起動します。

AWS EC2でインスタンスを起動する

今回は、以下のOSを指定しました。

・AMI

Amazon Linux 2 AMI (HVM), SSD Volume Type

・インスタンスタイプ

t2.micro

EC2(Amazon Linux)にDockerをインストール

EC2への接続の仕方については、ここでは記載していません。

OSバージョン確認

$ cat /etc/system-release
Amazon Linux release 2 (Karoo)

yumアップデート

sudo yum update -y

Dokcerインストール

Amazon Extras LibraryからDockerをインストール

sudo amazon-linux-extras install docker -y

Dockerインストール確認

Dokcerのバージョンを表示することで、インストールされているか確認します

$ docker --version
Docker version 19.03.6-ce, build 369ce74

無事バージョンが表示されました

Dockerの起動

$ sudo service docker start
Redirecting to /bin/systemctl start docker.service

Dockerグループにユーザーを追加

デフォルトの”ec2-user”ユーザーを追加します。

sudo usermod -a -G docker ec2-user

グループへの追加が終わったら、ログインし直してユーザー権限が反映されていることを確認します。

Dockerコマンド実行確認

ログインし直したら、dockerコマンドを実行してみます。infoオプションでDockerの情報を表示します。

$ docker info

Dockerの情報が表示できれば、sudoなしでdockerコマンドを実行できています。

Dockerを停止する

$ sudo service docker stop
Redirecting to /bin/systemctl stop docker.service

Git 特定のファイルをトラッキング対象外にする(ステージング領域(INDEX)から削除する)

git rm コマンドを利用して、ステージング領域(インデックス)のファイルを削除します。作業コピーのファイルを残したい場合、オプション”–cached”をつけて、実行します。

git rm --cached file_name

gitのステージング領域からの取消しについて

上記コマンドでは、git add でステージング領域(インデックス)にエントリしたファイルを削除します。

作業ツリー(ローカルファイル)も併せて削除したい場合は、–cachedオプションなしで実行します。

下記、gitコマンドとファイルの流れの中で、「作業ツリー」→「ステージング領域」の操作を取り消しできます。

gitコマンドとファイルの流れ

リモートリポジトリ

    ↑ push

ローカルリポジトリ

    ↑ commit

ステージング領域(インデックス)

    ↑ add   ・・・ここを取り消す

作業ツリー(ローカルファイル)

PythonでTwitterAPIを使ってツイートする

Requests、requests-oauthlibを使ってツイートします。twitterというモジュールがある事に後から気づきました。ドキュメントちょっと見た感じでは、使いやすそうな印象を感じました。

参考URL: requests-oauthlib , twitter



事前準備

Pythonモジュールをインストール

Twitter APIへツイート内容をHTTPRequestを送信するためのモジュール、Twitter APIを利用するための認証情報を保存するyamlファイルを扱うモジュールをインストールします。

pip install requests requests_oauthlib pyyaml


Twitter DevelopersからAPIKEYとACCESSTOKENを発行する

Twitter APIを利用するために、Twitter Developersへ登録しAPIKEYとACCESSTOKENを発行します。

Twitter Developers URL


アクセス情報をyamlファイルに保存する

Twitter APIを利用するための、APIKEY、ACCESS TOKENをyamlファイルに保存します。プログラムからこのファイルを読み込んで利用します。

API_KEY: "XXXXXXXXXXXXXXXXXXX"
API_SECRET_KEY: "XXXXXXXXXXXXXXXXXXX"
ACCESS_TOKEN: "XXXXXXXXXXXXXXXXXXX"
ACCESS_TOKEN_SECRET: "XXXXXXXXXXXXXXXXXXX"



サンプルプログラム

※yamlファイルのパスは環境に併せて修正してください


実行コマンド

プログラムを実行してツイートします。

python post_tweet.py

実行結果

https://twitter.com/fukahirer/status/1238738470639525888


正常系

Success.

異常系

Failed.
 - Responce Status Code : 401
 - Error Code : 89
 - Error Message : Invalid or expired token.


おまけ

PythonでTwitterAPIを使ってリプライする

パラメータにリプライするツイートのIDを”in_reply_to_status_id”キーで追加することでリツイートができます。

他のパラメータもあるので、詳細は公式ドキュメントを参照ください。

公式ドキュメントURL

サンプルプログラム

実行結果

https://twitter.com/khidnet/status/1238747528285188096

PostgreSQL よく使うコマンド

よく使うコマンドを記載します。


PostgreSQLの起動、停止

PostgreSQLの起動

pg_ctl start -D "C:\Program Files\PostgreSQL\11\data"

PostgreSQLの停止

pg_ctl stop -D "C:\Program Files\PostgreSQL\11\data"

PostgreSQLの起動確認

pg_ctl status -D "C:\Program Files\PostgreSQL\11\data"

psql ログイン

psql -U <USERNAME> -d <DB_NAME> -h <HOST> -p <PORT>

例)
psql -U postgres -d postgres -h localhost -p 5432

psql ログアウト

\q


ユーザーロール一覧

\du

データベース一覧

\l

現在のデータベースを確認

select current_database();

データベース切り替え

\c <DB_NAME>

スキーマ一覧

\l

現在のスキーマを確認

select current_database();

スキーマ切り替え

set search_path = <SCHEMA_NAME>;