memo.log

技術情報の雑なメモ

RailsでDocker経由でPostgreSQLに接続できなかったときのメモ

Dockerの環境構築でcould not connect to server: Connection refusedのエラーが出た時の対処法 - Qiita https://qiita.com/yuki_0920/items/84e2ca260bfe13cf3072

→こちらの通り、 host をコンテナ名にする必要があった。

また、 Root ユーザーを手動で作成( superuser )する必要もあった。

【Dockerメモ①】コンテナ作成、起動、停止、ログインをコマンドで順を追って確認していく

よくそもそもの使い方を忘れるのでコマンドで順を追って確認するようにするメモ

確認すること

  • コンテナはイメージから作成できる
  • コンテナは起動と停止ができる
  • コンテナにログインするためには起動していないといけない
  • コンテナに保存したデータは、コンテナを停止しただけでは消えない。コンテナを削除すると消える

扱うコマンド

# Docker イメージの一覧
docker images

# イメージの作成
docker build -t [作成するイメージ名] [Dockerfileのあるディレクトリ] 

# コンテナの作成(起動はしない)
docker create --name [コンテナ名] [イメージID] 

# 起動しているDockerコンテナの一覧
docker ps 

# 存在するコンテナの一覧
docker ps -a

# コンテナの作成&起動&ログイン
docker run --name [コンテナ名] -it [イメージ名] [コマンド] 

# コンテナの起動
docker start [コンテナID] 

# コンテナの停止
docker stop [コンテナID] 

# 起動中のコンテナにログイン
docker exec -it [コンテナID] [コマンド] 

コマンドで確認

※ alias d="docker"

初期状態

コンテナ&イメージは無い

% docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZ
% docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

Dockerfile(とりまRubyのイメージを使うよってだけ)

% cat Dockerfile   
FROM ruby:2.7

イメージの作成

# イメージの作成
 % docker build -t my-image-ruby ./ 
# 確認
 % d images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
my-image-ruby       latest              cd155aa807df        2 weeks ago         842MB
ruby                2.7                 cd155aa807df        2 weeks ago         842MB

コンテナの作成

# コンテナの作成
 % d create --name my-ruby-container -it cd155aa807df
42463b9c2f4939c39169fee3774e9da1b84663963df543958dc116f6d5134c79
# 起動はしていない
 % d ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
 % d ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
42463b9c2f49        cd155aa807df        "irb"               6 minutes ago       Created                                 my-ruby-container

コンテナの起動

# ただし、すぐに終了する
## 同じstartでもコンテナが違うと停止しない
% docker start 42463b9c2f49 
42463b9c2f49

コンテナへの接続

% d exec -i -t 42463b9c2f49 bash
root@42463b9c2f49:/# hogehoge

コンテナの作成~起動~接続まで一発で

% d run --name my-ruby-container -it my-image-ruby bash

その他検証メモ(run や create するときのオプションについて)

今回のDockerイメージだと、コンテナの作成方法によっては、コンテナを起動してもすぐに落ちてしまうこともあるみたいなので作成時にオプションを気を使う必要があるみたい。あまり深入りはしていない。

run の場合

■start できる(-it または -t -dが必要)
docker run --name my-ruy-container2 -it my-image-ruby /bin/bash
→ 起動するとコンソールに入る。exitするとコンテナが停止する。
docker run --name my-ruy-container -t -d my-image-ruby /bin/bash
→ 起動するとコンソールには入らないが、起動したままになる。stop/start できる



■start できない
docker run --name my-ruy-container my-image-ruby /bin/bash
→ startしてもすぐ落ちる

docker run --name my-ruy-container3 -d my-image-ruby /bin/bash
→ startしてもすぐ落ちる

docker run --name my-ruy-container -t my-image-ruby /bin/bash
→ 起動して、コンソールに入った感じになるけど、コマンドが返ってこない。。シェルから抜けられない。
docker run --name my-ruy-container2 -i my-image-ruby /bin/bash
→コマンドが返ってこなくなる。。起動したかどうかも分からない。)

craete の場合

% d create --name my-ruby-container3 cd155aa807df bash
→作成できる、起動できない(すぐ落ちる)

% d create --name my-ruby-container3 -it cd155aa807df bash
→作成できる、起動できる

% d create --name my-ruby-container3 -t cd155aa807df bash
→作成できる、起動できる

参考

create — Docker-docs-ja 17.06 ドキュメント http://docs.docker.jp/v17.06/engine/reference/commandline/create.html

start — Docker-docs-ja 17.06 ドキュメント https://docs.docker.jp/engine/reference/commandline/start.html

Docker run リファレンス — Docker-docs-ja 17.06 ドキュメント https://docs.docker.jp/engine/reference/run.html

Dockerコマンド よく使うやつ - Qiita https://qiita.com/Esfahan/items/52141a2ad741933d7d4c#%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AB%E5%85%A5%E3%82%8B

Dockerコンテナの作成、起動〜停止まで - Qiita https://qiita.com/kooohei/items/0e788a2ce8c30f9dba53#4%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AE%E8%B5%B7%E5%8B%95

【Ruby】Rawソケットでイーサネットフレームをまるごと受信するメモ

RubyでRawソケットでイーサネットフレームを丸ごと受信するメモ。 Rawソケットを使ったプログラミングは以前ICMPは扱ったことがあったが、イーサネットフレーム全体の扱い方が分からなかった。

qiita.com

C言語のサンプルはたくさん出てくるけど、Rubyのサンプルや解説はなかなか出てこなかった。 どうやらソケットをバインドする時の値がポイントらしいのだが、なかなか深い部分を理解しないと難しいようで、サンプルを探していたら以下のコードを利用したら実現できた。

github.com

コードは以下の通り。 recvfrom で取得される文字列は値をASCIIコードで変換されているようなので、パケットのヘッダとしての値を取得するように変換する必要があるみたい。

実際に socket2.rb の中身を見るとソケットの扱い方を確認できるが、なかなか解読が大変なのでまた別途。

require_relative './socket2/lib/socket2.rb'
# https://github.com/prolaag/socket2

sock = Socket.new(Socket::AF_PACKET, Socket::SOCK_RAW, Socket::ETH_P_ALL)

sock.bind_if("eth1")

payload, _ = sock.recvfrom(1514)

# ASCII エンコードの文字列で格納される
# 実際にパケットの値として確認するには各ヘッダの値を数値(16進数)で取得する必要がある
# つまり、 ASCII -> 数値(String.ord) -> 16進数(Integer.to_s(16))の変換が必要
payloads = payload.chars
payloads.map! { |char| char.ord }
payloads.map! { |num| num.to_s(16) }

pp payloads

実行結果

上記の pp で出力した値が以下。WireSharkでパケットキャプチャした値と同一のものを取得出来ている。

["ff", "ff", "ff", "ff", "ff", "ff", "a", "b1", "a9", "1e", "67", "7a", "8", "6", "0", "1", "8", "0", "6", "4", "0", "1", "a", "b1", "a9", "1e", "67", "7a", "ac", "1f", "0", "1", "0", "0", "0", "0", "0", "0", "ac", "1f", "2", "65"]

f:id:kuredev:20201115231639p:plain

Raspberry Piでブリッジを構成するメモ

Raspberry Piでブリッジを構成するメモ brctl を利用

構成

f:id:kuredev:20210117163652p:plain

Raspberry PiのVesion

$ cat /etc/debian_version
10.6

手順

インストール

$ sudo apt-get install bridge-utils

ブリッジ設定

ブリッジのデバイスで以下を実施

# ブリッジを作成
$ sudo brctl addbr br-test
# ブリッジにインターフェースを追加
$ sudo brctl addif br-test eth0
$ sudo brctl addif br-test eth1
$ sudo ip link set up dev br-test
 # これするとインターフェースがIPとしての機能を失うらしい。ping 等疎通できなくなる。ただし ifconfig するとIPアドレスが出てくる。
$ brctl show 
bridge name     bridge id               STP enabled     interfaces 
br-test         8000.dca63291a7c7       no              eth0
                                                                             eth1

後はPCか左のデバイスからブリッジ越しのアドレスに向かって通信すればよい

その他メモ

ブリッジを構成すると、ブリッジ越しに到着するパケットのMACアドレスはブリッジデバイスのインターフェースではなく、ブリッジ越しのデバイス(上図でいうと、PCまたは左のラズパイ)のものが見える。

【Raspberry Pi】LANケーブルの接続

Raspberry Pi同士で接続するときはクロスケーブルでないと認識しない(インターフェースがアップしない)。 PCとRaspberry Piならどちらのケーブルでもアップする。 Auto MDIXだったらどちらでもアップすると思っているのだがなぜ…?

【Ruby】名前空間の使い方のメモ

Ruby名前空間の使い方のメモ:

  • モジュール内でクラスが呼ばれた場合、既に同名モジュールでクラスが定義されていたら、そのモジュールのクラスが呼ばれる
  • 同名モジュール外のクラスを呼ぶ場合は、 :: を一番左につけてトップレベルと明示する
# トップレベルの Test クラス
class Test
  def hello
    "Test#hello"
  end
end

module Kure
  # まだ Kure::Test が無いのでトップレベルの Test が呼ばれる
  puts Test.new.hello # => Test#hello
end

# Kure モジュール内の Test クラス
module Kure
  class Test
    def hello
      "Kure::Test#hello"
    end
  end
end

# 普通にトップレベルの Test が呼ばれる
puts Test.new.hello # => Test#hello

module Kure
  # Kure::Test が既に定義されているので Kure モジュール内で呼ばれた
  # Test クラスは Kure::Test が呼ばれる
  puts Test.new.hello # => Kure::Test#hello

  # :: を左に付けてトップレベルの Test クラスを明示的に呼ぶ
  puts ::Test.new.hello # => Test#hello
end