WSLを起動したらなぜかつながった…。 多分仮想ネットワークインターフェース周りが悪さをしていたものと思うが、深追いはしていない…。
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は扱ったことがあったが、イーサネットフレーム全体の扱い方が分からなかった。
C言語のサンプルはたくさん出てくるけど、Rubyのサンプルや解説はなかなか出てこなかった。 どうやらソケットをバインドする時の値がポイントらしいのだが、なかなか深い部分を理解しないと難しいようで、サンプルを探していたら以下のコードを利用したら実現できた。
コードは以下の通り。
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"]
Raspberry Piでブリッジを構成するメモ
Raspberry Piでブリッジを構成するメモ brctl を利用
構成
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】名前空間の使い方のメモ
- モジュール内でクラスが呼ばれた場合、既に同名モジュールでクラスが定義されていたら、そのモジュールのクラスが呼ばれる
- 同名モジュール外のクラスを呼ぶ場合は、
::
を一番左につけてトップレベルと明示する
# トップレベルの 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