PostgreSQLのよく使うコマンド

とりまこんな感じで。ちょいとMySQLのコマンドを例に書いたりしてます。2年くらいかけて濃密にしていこうかと思ってます。記事一個書いておくとあとで追記できるから書いてます。最初は情報少なくてすみません。

接続

psql -h localhost -U dev -d postgres -p 54321

psqlコマンドにパスワードを付けて、実行時にパスワードを聞かれないようにしたい場合。MySQLだと実行時に-pHOGEと書けば良いがPostgreSQLは下記のように環境変数に入れることで同じことが実現できる。

export PGPASSWORD=HOGE
psql -h host -U user -d dev

またクライアントがインストールされていない環境やインストールしたくない環境でDockerイメージを通してPostgresに接続する場合は以下のようにする。networkをhostにすることで同一ホスト上でポートを開けて立ち上がっているDockerコンテナのPostgresにも接続できる。

docker run -ti --rm --network="host" -e PGPASSWORD=HOGE postgres:alpine psql -U dev -p 1234 -h 0.0.0.0 -d name

テーブル一覧

SHOW TABLES 相当

\d

テーブル詳細

DESC 相当

\d table_name

データベース切り替え

\c db_name

データベース一覧

\l

コマンドからのSQL実行

psql -h host -U user -d dev -c "SELECT TRUE;"

空文字の判定

SELECT CASE WHEN length(text) > 0 THEN text ELSE text2 END FROM example;

Dockerでコンテナネットワークを作成する

ネットワークを使うことで、特定のネットワークに参加していれば特定のコンテナへ通信できるようにしたりができそう。通常はデフォルトネットワークに所属するんだけど、その辺をわかりやすく分割したり、ミスを防ぐために個人的には本番で使っている。(ここで作成したネットワークには --network で指定ができる。)

docker network create my_network

ネットワークを削除するときは

docker network rm my-network

でいける。オーバーレイネットワークを作る場合はこう。多分これはかなり使う。

docker network create -d overlay hoge

http://docs.docker.jp/swarm/networking.html

UbuntuでNFSサーバーを作る

NFSとは

  • Network File Systemといって分散ファイルシステム的なやつ
  • 一つのディスクに複数台のサーバーから書き込みとかできる

Swarmクラスタを作ったんだけど、特定のコンテナがどうしても中に書き込みしたくてたまらないというのでNFSが必要になった。NFSなんて作ったことないけど仕方ない。

ちょうどあまり仕事させてないSwarmのマネージャーノードがあったので、そこにNFSを立ち上げることにした。

サーバー側 (10.0.0.1)

sudo apt install nfs-kernel-server
sudo vi /etc/exports

接続先を指定する。以下には共有するパス、接続を許可するホスト、オプションの順に記載する。

/share 10.0.0.2(rw,sync,no_root_squash,no_subtree_check)

10.0.0.0/8 とかみたいに範囲指定ができる。0.0.0.0はダメっぽいらしいが特に試してはいない。

サーバーを起動したら終わり

sudo systemctl start nfs-server
sudo systemctl enable nfs-server

rpcinfo -p で確認したら2049で空いているのを確認できた。

クライアント側 (10.0.0.2)

sudo apt install nfs-common

マウントする

sudo mount -t nfs 10.0.0.1:/share /home/user/share

うまく接続できない場合は下記のようなコマンドで疎通できるか確認するといいかも。

telnet 10.0.0.1 2049

参考

GCPのUbuntuのVMインスタンスに追加ディスクを接続する

以下はGUIでいけます

  1. GCPの管理画面から永続ディスクを作成
  2. VMインスタンスに作成したディスクを接続
  3. VMインスタンスの再起動

ここからCUIでいきます。まず、接続されたディスクの情報を以下で調べる。

sudo lsblk -f

フォーマットする

sudo mkfs -t ext4 /dev/sdb

以下のようにして起動後にマウントするようにします。これはUUIDがxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxというディスクを /hoge にマウントするという例です。末尾に突っ込めばそれで良いのでecho hoge >> /etc/fstab でもいけるかも。

UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx       /hoge   ext4   defaults        0 0

メモ

一時的なマウントであれば

sudo mount /dev/sdb /hoge

でいけて、フォーマットされていなければ

mount: /hoge: wrong fs type, bad option, bad superblock on /dev/sdb, missing codepage or helper program, or other error.

と言われる。 あと、Ansibleで設定できるようにしたいし、ディスクの付け替えも考慮していろいろ知識を蓄積していきたい。

参考

Docker Swarm modeのノードに対してラベルを付与する

docker nodeコマンドを利用してノードに対してラベルが付与できるそうです。このコマンドはマネージャーノードから実行ができます。ラベルの確認には方法が見つからなかったけど、inspectで確認できるのでとりあえずこれでいきます。

$ docker -H manager-node inspect NODE_ID | jq -r '.[].Spec'
{
  "Labels": {},
  "Role": "manager",
  "Availability": "active"
}

次にラベルを追加します

docker -H manager-node node update --label-add type=files NODE_ID

追加されましたね

$ docker -H manager-node inspect NODE_ID | jq -r '.[].Spec'
{
  "Labels": {
    "type": "files"
  },
  "Role": "manager",
  "Availability": "active"
}

削除します

docker -H manager-node node update --label-rm type NODE_ID

消えました

$ docker -H manager-node inspect NODE_ID | jq -r '.[].Spec'
{
  "Labels": {},
  "Role": "manager",
  "Availability": "active"
}

ラベルは様々な事に使えます。例えば特定のラベルを指定してデプロイなどができます。今回は特定のラベルが付与されたノードはファイルを扱うことに長けたノードで、ファイルを扱うコンテナはそのノードで動かすみたいなことに使いました。

参考

Google Domainsに移行するとメール丸ごと転送できる

Google Domainsに移行しました。セキュリティやサポートも良いので、同じ金額を払うなら良いもの、Googleの方が良いかなと思っています。

独自ドメインのメールってあまり使ってなくて、使っててもダミー的な感じで、転送できればそれでいいと思っています。なので、いちいちメールサーバー作って転送かけてたんですが、Google Domainsを使っている場合は最初からこの機能がついています。

ワイルドカードを指定してドメインに来るメールを全て転送といったこともできます。

Google DomainsのネームサーバとGoogle Cloud DNSは別物で、私はAPIでDNSをいじる関係上Cloud DNSを使用しているのですが、Cloud DNSからMXレコードをGoogleのメールサーバーに向けることで使えるので、Google Domainsで管理しているドメインは、このサービスの対象になります。

と、この記事は寝ながらスマホで書いてみました。

Dockerコンテナで動くNginxのproxy_passでホストの名前解決をする

openrestyのDockerイメージを作ってプロキシサーバーを作ってみたいと思った。とりあえず proxy_pass でプロキシしよ!

server {
  listen 80;
  location / {
    proxy_pass http://abc.exmaple.com.my_network;
  }
}

ファーw

test_proxy.1.abcdefg@swarm-worker-02    | 2020/02/21 13:21:58 [error] 6#6: *2 no resolver defined to resolve abc.exmaple.com.my_network, client: 10.0.0.2, server: , request: "GET / HTTP/1.1", host: "abc.example.com"

Dockerには内蔵DNSサーバがあるらしく、127.0.0.11:53 で動いているらしいのでそこを指定すれば名前解決ができるようだ

Docker デーモンは内蔵 DNS サーバを動かし、ユーザ定義ネットワーク上でコンテナがサービス・ディスカバリを自動的に行えるようにします。コンテナから名前解決のリクエストがあれば、内部 DNS サーバを第一に使います。リクエストがあっても内部 DNS サーバが名前解決できなければ、外部の DNS サーバにコンテナからのリクエストを転送します。割り当てできるのはコンテナの作成時だけです。内部 DNS サーバが到達可能なのは 127.0.0.11 のみであり、コンテナの resolv.conf に書かれます。ユーザ定義ネットワーク上の内部 DNS サーバに関しては ユーザ定義ネットワーク用の内部 DNS サーバ をご覧ください。

ふむふむなるほどね(分かったつもり)

server {
  listen 80;
  location / {
    resolver 127.0.0.11:53;
    proxy_pass http://abc.exmaple.com.my_network;
  }
}

参考

docker-composeで構成ファイルを指定する

デフォルトでは docker-compose.yml をターゲットに起動するようになっているが、ファイルを指定することができる。yamlファイルを一つの場所にまとめて管理している時に便利。前も書いた気がする。

docker-compose -f target.yaml up

CSSで行数を指定して省略記号を出力する

こういうやつ。box-orientline-clamp で表現できるやうだ。

.selector {
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 1;
}

上記のスクリーンショットのコードはこれ。

<style>
  div {
    margin: auto;
    width: 300px;
  }

  p {
    line-height: 1.5em;
    overflow: hidden;
  }

  p.case1 {
    height: 1.5em;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 1;
  }
  p.case2 {
    height: 3em;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 2;
  }
  p.case3 {
    height: 4.5em;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 3;
  }
</style>

<div>
  <h1>case1</h1>
  <p class="case1">春はあけぼの。やうやう白くなりゆく山ぎは、すこしあかりて、紫だちたる 雲のほそくたなびきたる。夏は夜。月のころはさらなり。やみもなほ、蛍の多く飛びちがひたる。また、 ただ一つ二つなど、ほのかにうち光りて行くもをかし。雨など降るもをかし。秋は夕暮れ。夕日のさして山の端いと近うなりたるに、烏の寝どころへ行く とて、三つ四つ、二つ三つなど、飛びいそぐさへあはれなり。まいて雁などの つらねたるが、いと小さく見ゆるはいとをかし。日入りはてて、風の音、虫の 音など、はたいふべきにあらず。 冬はつとめて。雪の降りたるはいふべきにもあらず、霜のいと白きも、また さらでもいと寒きに、火など急ぎおこして、炭もて渡るもいとつきづきし。 昼になりて、ぬるくゆるびもていけば、火桶の火も白き灰がちになりてわろし。枕草子</p>

  <h1>case2</h1>
  <p class="case2">春はあけぼの。やうやう白くなりゆく山ぎは、すこしあかりて、紫だちたる 雲のほそくたなびきたる。夏は夜。月のころはさらなり。やみもなほ、蛍の多く飛びちがひたる。また、 ただ一つ二つなど、ほのかにうち光りて行くもをかし。雨など降るもをかし。秋は夕暮れ。夕日のさして山の端いと近うなりたるに、烏の寝どころへ行く とて、三つ四つ、二つ三つなど、飛びいそぐさへあはれなり。まいて雁などの つらねたるが、いと小さく見ゆるはいとをかし。日入りはてて、風の音、虫の 音など、はたいふべきにあらず。 冬はつとめて。雪の降りたるはいふべきにもあらず、霜のいと白きも、また さらでもいと寒きに、火など急ぎおこして、炭もて渡るもいとつきづきし。 昼になりて、ぬるくゆるびもていけば、火桶の火も白き灰がちになりてわろし。枕草子</p>

  <h1>case3</h1>
  <p class="case3">春はあけぼの。やうやう白くなりゆく山ぎは、すこしあかりて、紫だちたる 雲のほそくたなびきたる。夏は夜。月のころはさらなり。やみもなほ、蛍の多く飛びちがひたる。また、 ただ一つ二つなど、ほのかにうち光りて行くもをかし。雨など降るもをかし。秋は夕暮れ。夕日のさして山の端いと近うなりたるに、烏の寝どころへ行く とて、三つ四つ、二つ三つなど、飛びいそぐさへあはれなり。まいて雁などの つらねたるが、いと小さく見ゆるはいとをかし。日入りはてて、風の音、虫の 音など、はたいふべきにあらず。 冬はつとめて。雪の降りたるはいふべきにもあらず、霜のいと白きも、また さらでもいと寒きに、火など急ぎおこして、炭もて渡るもいとつきづきし。 昼になりて、ぬるくゆるびもていけば、火桶の火も白き灰がちになりてわろし。枕草子</p>
</div>