dockerでaddress already in use系のエラーまとめた

ec2で、compose upしたら、docker userland proxy: listen tcp 0.0.0.0:3306: bind: address already in use

以前mysqlを、startしてのままだったから、

sudo service mysqld stop

した。再度ビルド。→いけた。

エラーログ

Successfully built 3d6d830af6eb
Successfully tagged myapp_web:latest
[kaz@ip- myapp]$ docker-compose up
Starting myapp_db_1 ... error

ERROR: for myapp_db_1  Cannot start service db: driver failed programming external connectivity on endpoint myapp_db_1 (164291723aa5c8697b7d43762b39dead2754087eda2e4b0df98a62f57cf9957b): Error starting userland proxy: listen tcp 0.0.0.0:3306: bind: address already in use

ERROR: for db  Cannot start service db: driver failed programming external connectivity on endpoint myapp_db_1 (164291723aa5c8697b7d43762b39dead2754087eda2e4b0df98a62f57cf9957b): Error starting userland proxy: listen tcp 0.0.0.0:3306: bind: address already in use
ERROR: Encountered errors while bringing up the project.

Address already in use - bind(2) for "127.0.0.1" port 3000 (Errno::EADDRINUSE)

新しくdockerコンテナを作ったときに、rails sをしたら出力されたエラー。

とりあえず解決したい場合

別ポートで立ち上げる

rails s -p 3001

f:id:kaz08:20210207143003j:plain

authorized_keys とは?

今理解していること →pubの内容を保存しておく場所

~/.ssh/authorized_keys: Holds a list of authorized public keys for servers. When the client connects to a server, the server authenticates the client by checking its signed public key stored within this file

security.stackexchange.com

上によると、pubの内容を保存しておく場所。クライアントがサーバーに接続した時、authorized_keyを元にして、接続を許可するか判断をする。

f:id:kaz08:20210206085453j:plain

ssh known_hostsとは

まとめるとknown_hostsとは「公開鍵認証のSSHでログインしたサーバのホスト鍵を記録し,次回からのホスト認証で利用されるファイル」である.

https://a-mochan.hatenablog.com/entry/2019/12/20/141036#:~:text=まとめるとknown_hostsとは,されるファイル」である.

3項目に別れている

・サーバー名(ip)

・keyのtype

・暗号化された情報

ここにip
ssh-rsa 
AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==

参考:

Host Key

SSH接続エラー回避方法:.ssh/known_hostsから特定のホストを削除する/削除しないで対処する3つの方法 - Qiita

What is actually in known_hosts?

What is the difference between authorized_keys and known_hosts file for SSH?

f:id:kaz08:20210206085453j:plain

ec2内にgit cloneしようとしたら、Cloning into 'myapp'... Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.

[kazumawada@ip-10-0-0-197 rails]$ git clone git@github.com:kazumawada/myapp.git
Cloning into 'myapp'...
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
[kazumawada@ip-10-0-0-197 rails]$ git remote set-url origin https://kazumawada@github.com/kazumawada/myapp.git 
fatal: not a git repository (or any of the parent directories): .git
[kazumawada@ip-10-0-0-197 rails]$ cd
[kazumawada@ip-10-0-0-197 ~]$ cd ~/.ssh
[kazumawada@ip-10-0-0-197 .ssh]$ vi config

github-[ユーザー名]がポイント!

Host github-kazumawada
  Hostname github.com
  User git
  IdentityFile ~/.ssh/ec2_git_rsa

sshでcloneする際も、git@github-[ユーザー名]:ユーザー名/リポ名

[kazumawada@ip-10-0-0-197 .ssh]$ ssh -T git@github-kazumawada
Hi kazumawada! You've successfully authenticated, but GitHub does not provide shell access.
[kazumawada@ip-10-0-0-197 .ssh]$ cd
[kazumawada@ip-10-0-0-197 ~]$ cd /var/www/rails
[kazumawada@ip-10-0-0-197 rails]$ git clone git@github-kazumawada:kazumawada/myapp.git
Cloning into 'myapp'...
remote: Enumerating objects: 40, done.
remote: Counting objects: 100% (40/40), done.
remote: Compressing objects: 100% (31/31), done.
remote: Total 1893 (delta 22), reused 18 (delta 9), pack-reused 1853
Receiving objects: 100% (1893/1893), 26.29 MiB | 8.76 MiB/s, done.
Resolving deltas: 100% (1072/1072), done.
[kazumawada@ip-10-0-0-197 rails]$ ls
myapp
[kazumawada@ip-10-0-0-197 rails]$ 

githubの鍵もグリーンになった f:id:kaz08:20210219105952p:plain

*本当にその鍵が使われているかどうかは、sshでcloneして見ればいいことがわかった。他の方法はもちろんあるかもしれないけど、分かればどんな方法でもいいから、深追いはしない。

参考

qiita.com

f:id:kaz08:20210207143003j:plain

Circle CI(CI/CD )とは

できること
mainにマージされたら自動でサーバーへSSHしてコードをデプロイ

Sass型のCI/CDサービス。

sass: software as a service( Notin, Netflix, Spotify etc。インターネットでアクセスできるサービスのこと)

CI/CD
・CI(継続的インテグレーション)とは、ソフトウェアの変更を常にテストしながら統合することを指します。

・CD(継続的デリバリー)とは自動で本番環境にリリースする開発手法のことです。CI/CDの仕組みがあると、テスト・ビルド・デプロイというフローを自動化することができます。

,,, rspecは書く必要あるの??

例えばすべてのテストがパスしない限り、masterへマージさせないってことができたり、pushして問題がなければ自動デプロイができるようにすることができます。

なるほど。rspecの結果を元にして、circle ciが判断するのか。

Dockerを実行環境としている。

ビルド、テスト、デプロイができる

ymlファイルで設定できる CI/CDの設定は全て .circleci/config.yml に記載します

Github連携が前提(Github action?) pushしたら、circle ciがコンパイルなり、テストなりをする。

f:id:kaz08:20210305172457p:plain

参考

cre8cre8.com

journey.prog-8.com

blog.adachin.me

f:id:kaz08:20210207143003j:plain

proxyとは

f:id:kaz08:20210222170616p:plain

・セキュリティ

・アプリケーションゲートウェイ

・LANの中と外の間に位置して、外部とのやりとりを代行して行う機能

外部との通信をするときに、proxyサーバーを間に立たせることで、不正アクセスを防ぐ役割を持つ。

TCP/IP, ポート, HTTPをまとめた。

ポートとは, TCP/IPとは

tcp/ip方式で通信します。

・ip(internet protcol)はアドレス。とりあえずlanを使って送りつける。(tcpに安全面は任せる)

tcpは、ネットワーク上で「正しくデータが送られたことを保証する仕組み」を定めたもの。ipに、情報をくっつけて送信。受け取ったかどうかの確認もする。

この両方が組み合わさって、パケットを、正しく相手に送り届ける仕組みがある。

HTTPはネットワーク(TCP/IP)のサービス

http: webページの転送に利用するプロトコル(ポート番号は80と決まっている)

ネットワーク上のサービス(HTTPなど)は、ポート番号で識別する

一つのサーバー内には、nginxだったり、アプリケーション、DBなど複数のサービスがある。IPアドレスだと、これら全体の場所を指定するだけで、サーバー内の特定のサービスを指定することはできない。そこで使われるのがポート番号。

パケット「あなた宛のパケットですー」

サーバー「http, ftp, talent etcあるけど、どれ宛??」

パケット 「汗」

ipアドレスでコンピューターを指定し、ポート番号で通信相手となるサービス(アプリケーション)を指定する。