- 投稿日:2021-06-15T23:09:38+09:00
docker-compose でstatic IPが効かなくなった
Windows でdocker のCompose のバージョンが 2.0.0 beta3 で発生する。 Use Docker Compose V2 にチェックがついているとdocker-compose でstatic IPが効かなくなる。 実際に現象を再現してみた。 docker-compose.yml version: '3.7' networks: test_net: driver: bridge ipam: driver: default config: - subnet: 192.168.200.0/24 services: web1: image: nginx:1.21.0 networks: test_net: ipv4_address: 192.168.200.99 web2: image: nginx:1.21.0 networks: test_net: ipv4_address: 192.168.200.55 上記の docker-compose を起動し、「docker network inspect」 で中身を見ると。。。 [ { "Name": "staticip_test_net", ・・・省略 "Containers": { "a3ab1409bc037753f51d6a0e5f77418b0ffefca9e9ba8b909113fe473c6dba32": { "Name": "staticip_web2_1", "EndpointID": "f0d078ccc32079a014764c0165a0e5910afb4c6b6dcbc8fa10a0156823abf7fc", "MacAddress": "02:42:c0:a8:c8:03", "IPv4Address": "192.168.200.3/24", "IPv6Address": "" }, "c5df265fe1ed684f62b0287da6d48a5cb40c98b78d40fce344734dc8805cb76b": { "Name": "staticip_web1_1", "EndpointID": "7d76f0ef4d4024fe2b5ed68c6534793b233333d90f0b7945f8b26ec696346946", "MacAddress": "02:42:c0:a8:c8:02", "IPv4Address": "192.168.200.2/24", "IPv6Address": "" } }, "Options": {}, "Labels": { "com.docker.compose.network": "test_net", "com.docker.compose.project": "staticip", "com.docker.compose.version": "1.0-alpha" } } ] 192.168.200.99 と 192.168.200.55になってない。ちゃんと動くようにするには、Use Docker Compose V2 にチェックを外すのが正解だ。いつチェック入れたのか・・・ 設定後に再度docker-compose を起動したネットワーク構成は下記の通りになる。 [ { "Name": "staticip_test_net", ・・・省略 "Containers": { "6f00d4bb2e5ce7c458ec4f74b95fa86a48448eb691f36ce52612605307906c85": { "Name": "staticip_web2_1", "EndpointID": "8ba37672b74c698586cd83d3e19663ac99a276e51542243d366daf538aeb1e6d", "MacAddress": "02:42:c0:a8:c8:37", "IPv4Address": "192.168.200.55/24", "IPv6Address": "" }, "b3a8fb91b2f7b6723aeedb3d0f3171a42077aeebe2ad8d15edb4c0ca30cf4f5b": { "Name": "staticip_web1_1", "EndpointID": "0e5023e90143f97ba6b50a6a98e4b8edc5cbc4dbf465a93f1afa7e71ca42f35d", "MacAddress": "02:42:c0:a8:c8:63", "IPv4Address": "192.168.200.99/24", "IPv6Address": "" } }, "Options": {}, "Labels": { "com.docker.compose.network": "test_net", "com.docker.compose.project": "staticip", "com.docker.compose.version": "1.29.2" } } ] ちゃんとIPアドレスが指定された。めでたしめでたし。
- 投稿日:2021-06-15T22:49:23+09:00
laradockで複数プロジェクトの環境構築をする
【Laravel】Laradockで複数プロジェクトを動かす手順 https://laradock.io/getting-started/#B 公式と上の記事を参考にlaradockの開発環境をしてみました。 その記録として、残しておこうと思います。 1プロジェクトに1laradockで増やしていくことを前提とした内容です。 workspace |_app |_laradock |_source この環境構築の際にものすごくエラーがでたので、エラーだけをまとめた記事を別で作りました。合わせて参考にしていただければ幸いです。 laradock環境構築のエラーと解決策 Laradockをgit cloneする $ git clone https://github.com/Laradock/laradock.git laradock envファイルを編集 まずは基本的な設定から。 $ cd laradock $ cp .env.example .env 以下の部分を変えてください。バージョンはお好みで。 APP_CODE_PATH_HOST=../app DATA_PATH_HOST=.app/data COMPOSE_PROJECT_NAME=app PHP_VERSION=7.3 MYSQL_VERSION=5.7 confファイルを編集 $ cd nginx/sites $ cp laravel.conf.example app.conf コピーして内容を変更します。 下記引用しました。こちらに沿ってください。 larave.conf.exampleではlaravelというフォルダで動かすようにかかえれているので、そのlaravel部分をproject1という風に書き換えます。 またproject1.testだとchromeで動かなかったりするのでproject1.localとしています。 (https://pensuke.work/posts/laradock-multiproject/) また「hostsの設定を行う」という手順もありますが、現在設定はしていますが、自分の環境では上手くいってないので、割愛します。 (個別で設定してるのにlocalhostでも表示されてしまうのです…) こちらも引用させていただきます。 Nginxでdocker上のサイト設定は行いましたが、これだけではローカルPC上で http://project1.local/にアクセスしてもなにも表示されません。 hostsの最下部に追記しましょう。 編集ファイル: /private/etc/hosts 127.0.0.1 project1.local ::1 project1.local DBの設定 $ cd mysql/docker-entrypoint-initdb.d/ $ cp createdb.sql.example createdb.sql この中のファイルを以下のように編集します CREATE DATABASE IF NOT EXISTS `app` COLLATE 'utf8_general_ci' ; GRANT ALL ON `app`.* TO 'default'@'%' ; コメントアウトを外し、2ヶ所変更します。 mysqlコンテナを立ち上げ、DBの内容を確認しましょう $ docker-compose up -d mysql $ docker exec -it laradock_mysql_1 bash # mysql -u root -p Enter password: Server version: 5.7.34 MySQL Community Server (GPL) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | default | | mysql | | performance_schema | | sys | | app | +--------------------+ 6 rows in set (0.00 sec) 自分の作りたいDB名がはいってたらOKです。 アプリを作る or プロジェクトをgit cloneして残りのコンテナを起動 自分の場合はgit cloneしました。 新しく作る場合は他でも紹介されているので割愛します。 $ docker-compose exec --user=laradock workspace bash # git clone URL git cloneしてきた場合は.envファイルをコピー&venderファイルを作成してください $ docker exec -it laradock_workspace_1 bash # cd app # cp .env.example .env # composer install プロジェクト内の.envファイルがテキストエディタなどで保存できない場合は、 権限を確認して、変更してください。 これを # ls -l total 1604 drwxr-xr-x 14 root root 4096 Jun 3 10:27 app -rw-r--r-- 1 root root 1686 Jun 3 10:27 artisan 省略 こう # chown -R laradock:laradock /var/www # ls -l total 1604 drwxr-xr-x 14 laradock laradock 4096 Jun 3 10:27 app -rw-r--r-- 1 laradock laradock 1686 Jun 3 10:27 artisan 省略 laravelプロジェクトの.envファイルを編集 laradockのmysqlコンテナを立ち上げる前に設定したDB名にしましょう。 DB_DATABASE=app migrateする /var/www# cd app # php artisan migrate マイグレーションできない時はmysqlの権限を確認してください $ docker exec -it laradock_mysql_1 bash # /var/lib/mysql# ls -l ちなみにファイル構成はこんな感じでつくったDBが入ってます root@5120d5325290:/var/lib/mysql# ls auto.cnf ca.pem client-key.pem ib_buffer_pool ib_logfile1 ibtmp1 performance_schema public_key.pem server-key.pem app ca-key.pem client-cert.pem default ib_logfile0 ibdata1 mysql private_key.pem server-cert.pem sys 権限がmysql以外になってたら、mysqlに変えましょう -rw-r----- 1 1000 1000 56 Jun 3 09:47 auto.cnf -rw------- 1 1000 1000 1676 Jun 3 09:47 ca-key.pem -rw-r--r-- 1 1000 1000 1112 Jun 3 09:47 ca.pem 省略 # chown -R mysql:mysql /var/lib/mysql root@5120d5325290:/var/lib/mysql# ls -l total 188484 -rw-r----- 1 mysql mysql 56 Jun 3 09:47 auto.cnf -rw------- 1 mysql mysql 1676 Jun 3 09:47 ca-key.pem これでOK! 再度migrateしましょう webページが表示されるか確認 ここまできたらあと少しです! コンテナを全て立ち上げ、webページが表示されるか見てみましょう。 $ docker-compose up -d nginx mysql APP KEYを作成する 最後にlaravelのエラー画面が出ていたら、APP KEYを作成してください。 # php artisan key:generate Application key set successfully. # php artisan config:cache Configuration cache cleared! Configuration cached successfully! これでlaravelが使えるようになっているはずです!
- 投稿日:2021-06-15T22:37:51+09:00
dockerのmysqlがメモリ不足で落ちたらホストのmysqlもkillされてた
初投稿。 自身のメモも兼ねてこれから書いていく。 何が起きたか 知らない間にoom-killerがmysqlをkillしていた oom-killer (out-of-memory killer): メモリが不足した場合に、適当(適切?)なサービスを選択して問答無用にkillしてくるやつらしい 前提 conoha vpsを使用(メモリ1G) いくつかのwebサービスをvps上に公開 iPadで開発しているので、開発環境もvps上にあり、ssh接続してvimでプログラミングしている vps上の開発環境はdockerを利用 経緯 前提に記載の通り、お金をケチって開発環境と本番環境をひとつのvps上において個人開発をしている。 メモリが1Gのプランなので、docker内で少し重い処理をしたりdocker imageをビルドしまくってたりするとメモリがギリギリになることが多々ある状態。 dockerのmysqlでエラーコード137が発生 普段通り開発を進めていると、dockerのmysqlとアプリとの接続がよく切れるように。 ログを見ると docker mysql exited with code 137 メモリ不足のため落ちてしまっているよう。 dockerを再起動したり不要なプロセスをkillしたりして凌いでいた(vpsのプランを上げる発想はない)。 本番のアプリでエラーが発生 リリース済みアプリでエラーが出ていると利用者のメールにて発覚。 調べてみるとDBにアクセスできていない状態で、本番側のmysqlが落ちていた。 oom-killerという存在を知る dockerのmysqlが落ちることは認識していたが、本番環境のmysqlは触ってないし、なぜ落ちていたのかわからないでいた。 ポートがバッティングしているのかと確認したが、dockerのポートも開いておらず。 とりあえずmysqlを再起動して復帰したのち、とりあえずdockerが落ちないようにする方法を調べていると、その過程でoom-killerという存在を知る。 メモリが枯渇すると、osがメモリを消費しているサービスを良しなに選択してkillし、メモリを確保するらしい。 topコマンドでメモリ使用状況を確認しても、本番環境のmysqlは特に問題なさそうだったが、ログを調査しきれていないので詳しくはわかっていないが、 dockerでメモリを過剰に使用 mysqlのdockerがメモリ不足で落ちる ホストのoom-killerも動き、何故かmysqlが狙われてkillされる という流れが起きているぽい(1度だけじゃなく何度も遭遇) 対策 メモリ削減のためmy.confに追記 メモリをなるべく消費しなければoom-killerの対象ではなくなるはずなので、 本番環境とdocker双方のmysqlの設定を見直す。 # /etc/my.conf performance_schema = off table_definition_cache = 400 performance_shcema いろんな情報が見れる設定らしい(詳しくまだ調べてない)が、メモリをかなり食うらしい。 offにしてメモリ消費量を減らす。 table_definition_cache これもメモリ対策でよく取り上げられているぽい。 デフォルト2000らしいが、400にしている方が多いので倣う。 oom-killerの対象からmysqlを外す ちゃんと調べられてないが、任意のサービスをoom-killerの対象から外せるらしい。 DBは絶対に落とせないサービスの一つなので、調べて設定しよう。 本番と開発でサーバを分ける そもそもだが、開発中にdockerのリビルドやコード不備によるメモリ使用量増はやり得るはずなので、 それが本番環境に影響を与えるのはそもそも不味い。 多少お金がかかっても開発は開発用で別途サーバを用意しましょう(戒め)。 awsのec2で従量課金にすれば少しは費用が抑えられる認識。 まとめ docker使っとけば何をしても棄てれば許されると思って本番環境と開発環境を一つのサーバで運用してしまっていたが、 メモリ枯渇で本番環境に影響を与えてしまうとは思ってなかった。 開発環境は本番環境から外だししましょう。
- 投稿日:2021-06-15T20:03:26+09:00
laradock環境構築のエラーと解決策
laradockで環境構築したらエラーの見本市かな?というくらいにエラーが出たのでその時のエラーと解決策をまとめました。 色んなエラーが出たので参考までにどうぞ! プロジェクトフォルダをVScode等で書き換えようとするとエラーになる でもvimだったら変更できる、という方は権限の問題です。 workspaceのソースコードのあるディレクトリで、権限を確認してください /var/www/app$ ls -l /var/www/app$ ls -l total 1600 drwxr-xr-x 14 root root 4096 Jun 3 10:27 app -rw-r--r-- 1 root root 1686 Jun 3 10:27 artisan drwxr-xr-x 3 root root 4096 Jun 3 10:27 bootstrap -rw-r--r-- 1 root root 2153 Jun 3 10:27 composer.json -rw-r--r-- 1 root root 313747 Jun 3 10:27 composer.lock drwxr-xr-x 2 root root 4096 Jun 3 10:27 config drwxr-xr-x 5 root root 4096 Jun 3 10:27 database -rw-r--r-- 1 root root 1275 Jun 3 10:27 package.json (省略) このような感じでrootになっていたら全てのファイルをlaradockに変える必要があります。 これで解決 /var/www# chown -R laradock:laradock /var/www /var/www以下の権限をlaradockに変更することで、コンテナ外のVScodeからでも保存できます。 root@09e56af218da:/var/www/source# ls -l total 1604 drwxr-xr-x 14 laradock laradock 4096 Jun 3 10:27 app -rw-r--r-- 1 laradock laradock 1686 Jun 3 10:27 artisan drwxr-xr-x 3 laradock laradock 4096 Jun 3 10:27 bootstrap -rw-r--r-- 1 laradock laradock 2153 Jun 3 10:27 composer.json -rw-r--r-- 1 laradock laradock 313747 Jun 3 10:27 composer.lock drwxr-xr-x 2 laradock laradock 4096 Jun 3 10:27 config drwxr-xr-x 5 laradock laradock 4096 Jun 3 10:27 database -rw-r--r-- 1 laradock laradock 1275 Jun 3 10:27 package.json (省略) 良い感じ! しかしこのようになっている人は、コンテナに入るコードが違っている可能性があります。laradockユーザーでコンテナに入ってください。 $ docker-compose exec --user=laradock workspace bash MySQLのインストールバージョンを間違えた&Permission deniedで.laradock/data/mysqlが消せない 人間、間違えてはいけない時こそ間違えるんですよねぇ(遠い目) ほんとは5.7がよかったのにやってしまった $ docker-compose exec mysql mysql --version mysql Ver 8.0.23 for Linux on x86_64 (MySQL Community Server - GPL) $ cat .env | grep DATA_PATH_HOSTで探した場所にdockerの情報がはいっていて、これを消さないとここから過去のデータを引き継いでしまいます。 Dockerさんすごい賢い $ cat .env | grep DATA_PATH_HOST DATA_PATH_HOST=~/.laradock/data $ rm -rf ~/.laradock/data/mysqlこれができなかったら $ sudo rm -rf ~/.laradock/data/mysqlこっちで消し去ってください。 $ docker rmi laradock_mysql $ docker rm (mysqlコンテナID) $ docker ps -a mysqlコンテナもイメージも消し去り、それを確認してください そして今度は、laradockの.envファイルを正しく修正してください。 その後もう一度mysqlコンテナを立ち上げて、バージョンを確認してください。 $ docker-compose up -d mysql $ docker-compose exec mysql mysql --version mysql Ver 14.14 Distrib 5.7.31, for Linux (x86_64) using EditLine wrapper 作るDBの名前を間違えた $ docker-compose up -d mysql $ docker exec -it laradock_mysql_1 bash # mysql -u root -p Enter password: mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | default | | dev_db_1 | | mysql | | performance_schema | | sys | +--------------------+ 6 rows in set (0.00 sec) DB作ったし、内容確認… dev_db_1じゃないの、違う名前がいいの… そんな時も解決方法は上記MySQLのバージョンを間違えた場合と同じようにイメージとdataを消し去ってから再度コンテナを作り直して下さい。 Fatal error: require(): Failed opening required '/project/vendor/autoload.php' (include_path='.:') in /project/artisan on line 18 いざlaravel動かすぞ〜と思った矢先、動かせない そんな時はこれで解決 /var/www/app# $ composer install git cloneしたアプリだとvenderがないのでエラーが起こるようです。 インストールできたらOK! Package manifest generated successfully. 87 packages you are using are looking for funding. Use the `composer fund` command to find out more! SQLSTATE[HY000]: General error: 1017 Can't find file: './app/migrations.frm' (errno: 13 - Permission denied) マイグレーションしようとしたらこんなエラーが SQLSTATE[HY000]: General error: 1017 Can't find file: './app/migrations.frm' (errno: 13 - Permission denied) こちらも権限がないため書き込みができない状態になっています。 自分のMySQLディレクトリの権限がどうなってるか確認しましょう $ docker exec -it laradock_mysql_1 bash # cd var # cd lib # cd mysql /var/lib/mysql# ls auto.cnf ca.pem client-key.pem ib_buffer_pool ib_logfile1 ibtmp1 performance_schema public_key.pem server-key.pem app ca-key.pem client-cert.pem default ib_logfile0 ibdata1 mysql private_key.pem server-cert.pem sys データベースの内容と諸々のファイルがでてきたらここのディレクトリです。 /var/lib/mysql# ls -l total 188484 -rw-r----- 1 1000 1000 56 Jun 3 09:47 auto.cnf -rw------- 1 1000 1000 1676 Jun 3 09:47 ca-key.pem -rw-r--r-- 1 1000 1000 1112 Jun 3 09:47 ca.pem -rw-r--r-- 1 1000 1000 1112 Jun 3 09:47 client-cert.pem -rw------- 1 1000 1000 1680 Jun 3 09:47 client-key.pem drwxr-x--- 2 1000 1000 4096 Jun 3 09:47 default -rw-r----- 1 1000 1000 1359 Jun 3 09:47 ib_buffer_pool -rw-r----- 1 1000 1000 50331648 Jun 3 10:24 ib_logfile0 省略 全部が1000になっていますね、これを全てmusqlに変更しましょう。 これで解決 # chown -R mysql:mysql /var/lib/mysql 権限を確認 # ls -l total 188484 -rw-r----- 1 mysql mysql 56 Jun 3 09:47 auto.cnf -rw------- 1 mysql mysql 1676 Jun 3 09:47 ca-key.pem 省略 これでいけそうですね。 mysqlコンテナから抜けてworkspaceコンテナからapp直下にはいり、migrateを実行してください docker exec -it laradock_workspace_1 bash # php artisan migrate webページを開くと、No application encryption key has been specified.となる workspaceコンテナの内部で、APP KEYを作成してください。 # php artisan key:generate Application key set successfully. # php artisan config:cache Configuration cache cleared! Configuration cached successfully! 参考 【Laravel】Laradockで複数プロジェクトを動かす手順 https://laradock.io/getting-started/#B Laradock環境MySQLで新しいDBを追加する Laradock で mysql がうまく動作しない時は ( mysqlコンテナが起動しない、migration 出来ない) [MySQL]権限の確認と付与 hostsファイルの場所 Windows10 No application encryption key has been specified.となったときの対応方法 MySQL, copying tables files gives rise to “ERROR 1017 (HY000): Can't find file:” even though its there there ERROR 1017 (HY000): Can’t find file: ‘./….frm’ (errno: 13) – MySQL error. How to fix? mysqlを5.5 -> 5.6にバージョンアップしたら、Can't find file: './mysql/plugin.frm' (errno: 13 - Permission denied)で起動こける 既にあるLaradock環境をそのままに複数のLaradock環境を構築する(Windows) docker-composeとdockerコマンドまとめ Laradock nginxでの404 not found Laravelのエラー:Fatal error: require(): Failed opening required '/project/vendor/autoload.php' (include_path='.:') in /project/artisan on line 18 LaradockでLaravel+Docker環境構築(mac)
- 投稿日:2021-06-15T19:33:37+09:00
『docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?』と出た時の対応。
■この記事を読む対象者 docker初学者向けの記事です。 ■環境 Amazon Linux2 ■エラーが起きたあらまし dockerのドキュメント(https://matsuand.github.io/docs.docker.jp.onthefly/engine/install/linux-postinstall/) を見つつdocker設定 → 起動しようとしたら『docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?』と出て、一向にdockerを起動できなくなってしまったので、その時の対応履歴を残します。 ■原因 まず、今回どうしてこのエラーが発生してしまったか? ですが、dockerのドキュメントに沿って、docker起動どうやってたっけ・・・と調べつつ進めていると、なぜか知らないうちにdockerのリモートアクセスの設定を行っていました。 今回のエラーの原因はdockerの外部アクセスを許可するための設定(リモートアクセス)で /etc/docker/の配下にdaemon.jsonを作成していました。 また、sudo systemctl edit docker.service コマンドで、これまたリモートアクセスをしていました。 つまり、リモートアクセスしないのに、2重でリモートアクセスの設定を行っていました。 ■対処方法 /etc/docker/の配下に作成していたdaemon.jsonファイルを削除。 sudo systemctl edit docker.service コマンドをもう一度行い、ファイルの中身を綺麗に消しました。 あとは sudo service docker stop して sudo service docker start で再度dockerを起動 sudo docker run hello-world コンテナ作成 docker info でもdockerが起動できたことが確認できます。 ■おわり この記事がお役に立ったら幸いです。 どこか間違っている箇所ありましたらご指摘ください。
- 投稿日:2021-06-15T17:57:40+09:00
DockerでMySQLコンテナがRestartingになる現象
発生した事象 Remove MYSQL_USER="root" and use one of the following to control the root user password: - MYSQL_ROOT_PASSWORD - MYSQL_RANDOM_ROOT_PASSWORD ログにこんなのが出てステータスはRestartingのまま。 解決方法 バージョンを固定する。 Dockerfile FROM mysql:5.6 ↓ FROM mysql:5.6.XX
- 投稿日:2021-06-15T16:57:59+09:00
各言語のDockerコンテナでIPアドレスを解決したい場合の代替コマンド
みなさん、Dockerは使ってますか?Dockerをドカドカ使っていると、 「社内のHTTP APIを呼びたいのに、なぜかホスト名をIPアドレスに解決できない」 「本番環境のではなく開発環境のHTTP APIを呼んでしまっている(っぽい)」 なんて、ことが稀によく発生します。 一方で、定石に従ってDockerイメージを作っていると、 「Dockerイメージには最小限のバイナリしか入れていないので hostもnslookup も使えない。だからホスト名がどう解決されているかも分からない。」 なんてことも起きがち。 そこで、最小限のコンテナに docker exec した時にホスト名解決を(雑に)確認できるコマンドを紹介します。 getent glibc に含まれるコマンドです。 $ getent hosts qiita.com 2406:da14:add:902:68c3:7e8d:a9c:949e qiita.com 2406:da14:add:900:8bc:d6f3:591c:eb91 qiita.com 2406:da14:add:901:3a2b:2b27:a25f:7360 qiita.com Ruby $ ruby -rresolv -e 'puts Resolv.getaddress ARGV[0]' qiita.com 54.92.41.140 Python $ python3 -c 'import sys, socket; print(socket.gethostbyname(sys.argv[1]))' qiita.com 54.250.97.111h
- 投稿日:2021-06-15T16:57:59+09:00
Dockerコンテナ内でIPアドレスを解決したい場合の代替コマンド
みなさん、Dockerは使ってますか?Dockerをドカドカ使っていると、 「社内のHTTP APIを呼びたいのに、なぜかホスト名をIPアドレスに解決できない」 「本番環境のではなく開発環境のHTTP APIを呼んでしまっている(っぽい)」 なんて、ことが稀によく発生します。 一方で、定石に従ってDockerイメージを作っていると、 「Dockerイメージには最小限のバイナリしか入れていないので hostもnslookup も使えない。だからホスト名がどう解決されているかも分からない。」 なんてことも起きがち。 そこで、最小限のコンテナに docker exec した時にホスト名解決を(雑に)確認できるコマンドを紹介します。 getent glibc に含まれるコマンドです。 $ getent hosts qiita.com 2406:da14:add:902:68c3:7e8d:a9c:949e qiita.com 2406:da14:add:900:8bc:d6f3:591c:eb91 qiita.com 2406:da14:add:901:3a2b:2b27:a25f:7360 qiita.com Ruby $ ruby -rresolv -e 'puts Resolv.getaddress ARGV[0]' qiita.com 54.92.41.140 Python $ python3 -c 'import sys, socket; print(socket.gethostbyname(sys.argv[1]))' qiita.com 54.250.97.111h
- 投稿日:2021-06-15T13:55:44+09:00
Rails × Docker環境内でmysqlサーバーに接続するまでの流れ
SQLの学習目的で、Dockerコンテナ内でSQLサーバーに接続する際に生じたエラーの原因とその解決方法を記します。 1. コンテナ内に接続 → ERROR 2002 (HY000) ~ (2) → ERROR 2002 (HY000) ~ (111) docker-compose exec web bundle exec /bin/bash root@b671078fa536:/myapp# mysql ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) root@b671078fa536:/myapp# mkdir /var/run/mysqld root@b671078fa536:/myapp# touch /var/run/mysqld/mysqld.sock root@b671078fa536:/myapp# mysql ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111) ERROR 2002 (HY000) ~ (2) このエラーは、mysqlに接続する為のソケットが存在しない事に由来している(らしい)。 なので上記コードでソケットを作成している。 ERROR 2002 (HY000) ~ (111) このエラーは、mysqlが起動していないことが原因(らしい)。 $ docker-compose ps Name Command State Ports ------------------------------------------------------------------------------------------- myapp_chrome_1 /opt/bin/entry_point.sh Up 0.0.0.0:4444->4444/tcp myapp_db_1 docker-entrypoint.sh --def ... Up 0.0.0.0:3306->3306/tcp, 33060/tcp myapp_web_1 entrypoint.sh bash -c rm - ... Up 0.0.0.0:3000->3000/tcp myapp_db_1は起動しているけどな? ここで少し時間を有する。思考錯誤の結果、以下の記事を参考にしました。 コンテナ指定接続 → mysqlサーバーへログイン 結果として自分の場合は、コンテナを指定してログインする事でmysqlサーバーへ正常にログインできるようになりました。 $ docker exec -it myapp_db_1 bash # コンテナ指定でログイン root@d9ca806f810a:/# mysql -u root # mysqlサーバーにログイン Enter password: Welcome to the MySQL monitor. Commands end with ; or \g.# 正常にログイン!! Your MySQL connection id is 8 Server version: 8.0.25 MySQL Community Server - GPL Copyright (c) 2000, 2021, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | myapp_development | | myapp_test | | mysql | | performance_schema | | sys | +--------------------+ DB名を指定してログインする事で時間節約 $ docker exec -it myapp_db_1 bash root@d9ca806f810a:/# mysql -u root -p myapp_development Enter password: Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 10 Server version: 8.0.25 MySQL Community Server - GPL Copyright (c) 2000, 2021, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> select works.title, SUM(footprints.counts) as total_footprint_counts from works inner join footprints where works.id = 1; +--------------+------------------------+ | title | total_footprint_counts | +--------------+------------------------+ | Blade Runner | 1 | +--------------+------------------------+ 1 row in set (0.00 sec) やはりDocker周辺は知識不足により、難しく感じました。
- 投稿日:2021-06-15T12:42:50+09:00
Docker+mongodb+nextjsで開発環境を構築してみたよ
Nextjsのexamplesにある、mongooseを使った環境をDockerで構築しました。 https://github.com/vercel/next.js/tree/master/examples/with-mongodb-mongoose Docker関連のファイル作成 bash touch {Dockerfile,docker-compose.yml,.dockerignore} Dockerfile FROM node:15 WORKDIR /app docker-compose.yml version: "3" services: node: build: context: . container_name: nodecon tty: true ports: - "3000:3000" environment: - NODE_ENV=development - CHOKIDAR_USEPOLLING=true volumes: - ./src:/app mongo: image: mongo container_name: mongo-container environment: - MONGO_INITDB_ROOT_USERNAME=myuser - MONGO_INITDB_ROOT_PASSWORD=mypassword volumes: - mongo-db:/data/db volumes: mongo-db: dockerを起動する bash docker-compose run --rm node /bin/bash Nextjsのexampleを取得する コンテナ内に入れていれば、root@864f3dd6a631:/app# のような表記がターミナルに表示されると思います。 コンテナ内でcreate-next-appを実行する bash npx create-next-app --example with-mongodb-mongoose . ls で確認するとファイルがいっぱいできた。 localフォルダのsrcにも同じものができていることを確認。 一旦exitでコンテナから抜ける .envファイルの作成 src/.env.local.exampleファイルがあると思うので、.envにファイル名を変更し、修正する。 参考[https://docs.mongodb.com/manual/reference/connection-string/] .env MONGODB_URI=mongodb://<username>:<password>@<host>:<port>/test?authSource=admin username,passwordにはdocker-compose.ymlファイルで指定したものを入れる。 ipaddressには、IPアドレスでも良いが、Docker内で名前解決してくれるようなので、サービス名を入れる。 はmongodbのデフォルトポートである、27017を入れる。 今回の例では、以下のようになった。 .env MONGODB_URI=mongodb://myuser:mypassword@mongo:27017/test?authSource=admin Dockerファイルの修正 Dockerfile FROM node:15 WORKDIR /app + COPY ./src/package.json . + ARG NODE_ENV + RUN if [ "$NODE_ENV" = "development" ]; \ + then npm install; \ + else npm install --production; \ + fi docker-compose version: "3" services: node: build: context: . + args: + NODE_ENV: development container_name: nodecon tty: true ports: - "3000:3000" environment: - NODE_ENV=development - CHOKIDAR_USEPOLLING=true volumes: - ./src:/app + - /app/node_modules mongo: image: mongo container_name: mongo-container environment: - MONGO_INITDB_ROOT_USERNAME=myuser - MONGO_INITDB_ROOT_PASSWORD=mypassword volumes: - mongo-db:/data/db + depends_on: + - mongo volumes: mongo-db: 本番環境を見越して環境変数を用意してみた。特になくても良いと思う。 - app/node_modulesはlocalファイルのnode_modulesがなくても良いように設定した。 先にmongodbを起動させるため、depends_onを設定。 Dockerコンテナの作成 bash docker-compose build bash docker-compose up -d mongodbとnodeの2つのコンテナが立ち上がっていることを確認 bash docker ps nodeコンテナに入る bash docker exec -it <container_name> /bin/bash ここではnodeのコンテナ名で入る。docker-compose.ymlファイルで指定したコンテナ名nodeconを指定する。 nodeコンテナ内でnexjsを起動 bash npm run dev http://localhost:3000/ を開いて表示されることを確認 ブラウザで適当にPetを追加する DBの確認 ローカルからdbコンテナに入る bash docker exec -it <db_container_name> /bin/bash dbにログイン bash mongo -u <username> -p <password> dbを確認 bash > show dbs dbの変更 bash > use test データの確認 bash > db.pets.find() 先ほど入力した値が表示されることを確認。 自動的にサーバが立ち上がるよう設定する 毎回 コンテナ内に入って npm run dev は面倒なので、docker-compose up 時に起動するようにする。 docker-compose.yml services: node: ... depends_on: - mongo + command: npm run dev bash docker logs nodecon 起動ログが表示されていることを確認。 以上でどないでっしゃろ?
- 投稿日:2021-06-15T09:51:46+09:00
Amplifyの開発環境をdockerで作成
概要 AWS Amplifyの開発環境のdocker-compose.ymlとDockerfileを作成しました。 なぜ作ったか? 久しぶりにローカルでAmplifyでの開発を行おうとすると、nodeやpythonが古かったり、amplify pushにはpipenv、pip3が必要だと言われたりで環境を整えるのに時間がかかってしまったので、開発環境のdocker化を行いました。 前提条件 amplifyでの開発をローカル環境で行なっている。 Dockerfileの作成 node.jsとpythonが入っているイメージを使用します。 Dockerfile FROM nikolaik/python-nodejs:python3.8-nodejs12 # amplify CLI RUN npm install -g @aws-amplify/cli WORKDIR /var/www/app docker-compose.ymlの作成 docker-compose.yml version: '3' services: amplify: build: ./ ports: - "8080:8080" - "20002:20002" volumes: - .:/var/www/app - ~/.aws/:/root/.aws/ tty: true command: "npm run serve" ビルドとコンテナ立ち上げ 上記の2ファイルをローカル環境のamplifyプロジェクトの直下におきます。 $ docker-compose build でビルドして $ docker-compose up でコンテナを立ち上げればローカル環境が立ち上がります。 この状態でlocalhost:8080をブラウザで開くと、起動を確認できます。 $ docker-compose exec amplify bash でコンテナの中に入り、 amplify pushを叩くこともできました。
- 投稿日:2021-06-15T01:17:07+09:00
csvファイルをデータベースに取り込む方法_試行錯誤2(未解決)_『OSS-DB標準教科書』4
はじめに 『オープンソースデータベース標準教科書 -PostgreSQL-(Ver.2.0.0)Kindle版』を使ってPostgreSQLの操作を学習中です。 この教科書の 4.演習 --4.2演習2:郵便番号データベース を進めています。 つまずいたこと DB(DBeaver/PostgreSQL)にCSVファイル(郵便番号データ)をインポートしDB内の「テーブル zip」のレコードデータにしたい。が、エラーになってインポートできない。 環境 ホストPC:Windows10 GUI DBツール:DBeaver 仮想化ソフト:VirtualBox ゲストPC:Vagrant(=CentOS7=仮想マシン) コンテナ型仮想環境:Docker CUI DBクライアント:PostgreSQL エラーが出るまでの流れ 1)テーブル作成(郵便番号データ用の表定義) PostgreSQL(DBeaverのSQLエディタに書く) CREATE TABLE zip ( lgcode char(5), oldzip char(5), newzip char(7), prefkana text, citykana text, areakana text, pref text, city text, area text, largearea integer, koaza integer, choume integer,smallarea integer, change integer, reason integer ); (引用元:宮原徹; 喜田紘一. オープンソースデータベース標準教科書 -PostgreSQL-(Ver.2.0.0) (Kindle の位置No.1327-1331). LPI-Japan. Kindle 版.) 全部で15カラム。(カラム=列) 実行画面↓ ↓ first_turorialの上で右クリック ↓ 「更新」をクリック ↓ zipテーブルが表示された! 実行成功! 2)郵便番号csvデータを用意 一)郵便局HPから下記をダウンロード 「住所の郵便番号(CSV形式) 読み仮名データの促音・拗音を小書きで表記するもの(例:ホッカイドウ) 全国一括」 二)郵便番号データの文字コードをANSIからUTF-8へ変更 郵便番号csvデータのファイルを右クリック ↓ プログラムから開く ↓ 「メモ帳」を選択 ↓ ファイル ↓ 名前を付けて保存 ↓ 文字コードをANSIからUTF-8に変更して「保存」 (PostgreSQLの文字コードがUTF-8なので、そちらに合わせた。合わせないと、PostgreSQLで扱うときに文字化けしてしまう。) 3)DBeaverでcsvをインポート DBeaverのDBナビゲーター中のzipテーブルの上で右クリック ↓ 「データのインポート」 ↓ ↓ 「KEN_ALL.CSV」ファイルを選択して ↓ 以下、ほぼデフォルトの状態で「開始 or 次へ」。 ↓ ↓ ↓ ※ここに「Data load setting - Transfer auto-generated columns」って書いてある! ※「Do Commit after row insert:125000」の表記が気になる。デフォルトだと「Use Transactions」にチェックが付いていたが、外して「次へ」。 ↓ ↓ 4)エラー1 発生!! 【エラー文】 Error occurred during Create target metadata 理由: SQLエラー [42701]: ERROR: column "0" of relation "zip" already exists 【エラー文の意味】 ターゲットメタデータの作成中にエラーが発生しました。 SQLエラー42701(意味は「列の重複」) 「"zipテーブル" に "0カラム" を加えようとしているけど、もう既に存在してるよ」 という意味。同じ名前のカラムを同一のテーブルに2つ以上作れません。 (参考:Just do IT -2020/5/29記事) ・メタデータとは?→本体であるデータに関する付帯情報が記載されたデータ。データのためのデータ。 (参考:メタデータとは?データ管理に使えるメタデータの意味やメリットを解説!-Udemyメディア) ↓ とりあえず「×」 ↓ 下図の赤丸部分の数字が行数分(12万強)まで増えて... ↓ 5)エラー2 発生!! 【エラー文】 Error occurred during batch insert (you can disable batch insert in order to skip particular rows). 理由: SQLエラー [42701]: バッチ 0 INSERT INTO first_tutorial.zip ("01101","060 ","0600000",ホッカイドウ,サッポロシチュウオウク,イカニケイサイガナイバアイ,北海道,札幌市中央区,以下に掲載がない場合,"0","0","0","0","0","0") VALUES (1101,64.0,640941,'ホッカイドウ','サッポロシチュウオウク','アサヒガオカ','北海道','札幌市中央区','旭ケ丘',0,0,1,0,0,0) はアボートしました: ERROR: column "0" specified more than once 位置: 122 このバッチの他のエラーは getNextException を呼び出すことで確認できます。 【エラー文の意味】 ・バッチ挿入中にエラーが発生しました (特定の行をスキップするためにバッチ挿入を無効にすることができます)。 ・42701=列の重複 ・列「0」が複数回指定されている →csvファイルの読み込みは、バッチ処理扱いになるのね。 →エラー1 同様「0」が指摘されている・・・。 ↓ 「スキップ」をクリックしてふと気づくと、 ↓ 列の中身がこうなっていました。 前回同様、必要な15カラム以外の赤枠部分のカラムが追加されてしまっています。 なぜこの部分がカラム扱いになってしまうのでしょうか?? 因みに、zipテーブルの中身は下画面のとおり「データなし」の状態です。 ↓ ここで2通り、次に試す方法を考えました。 その1)DBeaverのDBナビゲータ内の「列」に表示されている、不要なカラムをすべて「削除」ボタンで削除する せっかっくGUIを使っているのだし、DBeaverの機能を使って削除してみる。(OSS-DBの資格取得のための学習とは外れるが、ものは試しで。) その2)TRUNCATEを実行し、そのうえでzipテーブルを削除する。その後あらためて一からzipテーブル作成する 前回作業の最後に、作成したzipテーブルをDBeaverの「削除」ボタンをクリックすることで削除した。その後、今回の作業を始めた。「削除」ボタンではなく、SQL文の「TRUNCATE(テーブルのすべての行を削除する)」を実行しなくてはならなかった?「削除」ボタンと「TRUNCATE」は同じ動作になるのか?動作に違いはあるのか? (TRUNCATEについて参考:『OSS教科書 OSS-DB Silver Ver.2.0.対応』p212) その1)DBeaverのDBナビゲータ内の「列」に表示されている、不要なカラムをすべて「削除」ボタンで削除する まずはこの方法をやってみます。 ポチポチ削除して、DBeaverの「ファイル>上書き保存」をクリックすると こんな画面が出ました。 「削除」をクリックすることで ALTER TABLE first_tutorial.zip DROP COLUMN "01101"; ALTER TABLE first_tutorial.zip DROP COLUMN "060 "; ALTER TABLE first_tutorial.zip DROP COLUMN "0600000"; ALTER TABLE first_tutorial.zip DROP COLUMN ホッカイドウ; ALTER TABLE first_tutorial.zip DROP COLUMN サッポロシチュウオウク; ALTER TABLE first_tutorial.zip DROP COLUMN イカニケイサイガナイバアイ; ALTER TABLE first_tutorial.zip DROP COLUMN 北海道; ALTER TABLE first_tutorial.zip DROP COLUMN 札幌市中央区; ALTER TABLE first_tutorial.zip DROP COLUMN 以下に掲載がない場合; ALTER TABLE first_tutorial.zip DROP COLUMN "0"; というSQL文が実行されていたことがわかりました。 (ALTER TABLE:テーブル定義の変更) 「持続する」をクリック。 ↓ これで、求めていたzipテーブルの土台が出来上がりました。 次は、 ①もう一度csvファイルをインポートして、レコードを挿入してみます。 それでもエラーが出たら、 その次は ②「エラー2」の原因を探してテーブルの内容を修正したうえで、 もう一度csvファイルをインポートして、レコードを挿入してみます。 黒澤さんからアドバイス 「Dbeaverのインポート機能に問題があると仮定した方が良いかも」 とアドバイスいただきました。 上記①②を試すのを取りやめ、まず、以前黒澤さんより 「そもそもlinux(Vagrant)上にcsvファイルが格納されていないのが問題では? こういうのでファイルをアップロードできる」 と教えていただいた記事 (【Windows10版】Virtualbox × Vagrant WinSCPクライアントでFTP接続してみた。@silversink8888 ) を見ながら、WinSCPでCSVファイルをアップロードしてみます。 〇〇次の記事〇〇にまとめます。 メモ 【今回使ったデータ型】 型名 説明 char(n)、character(n) 空白で埋められた固定長の文字列 text 可変長の文字列 integer、int 数値型。通常使用する整数。サイズは4バイト。範囲は-2147483648から+2147483647。 (参考:『OSS教科書 OSS-DB Silver Ver.2.0対応』p213-214) (参考:PostgreSQL 8.3.7文書-第 8章データ型) 参考 ・PostgreSQL 8.3.7文書 付録 A. PostgreSQLエラーコード