【Linux/bash】catコマンドでファイルを作成する

catってファイルの中身を見る時に使ってたけど、
コマンドライン上でファイルの中身も書きながら
ファイルの作成もできるってことで、コマンド例をメモ。

このコマンドで「test.txt」という新たなファイルを作成し、
ファイルの内容を次の行から書くことができる

cat << EOF > test.txt

「>」がファイルの中身を記述する部分

cat << EOF > test.txt
>

ファイルの中身を書いて「EOF」(End Of File」と入力してEnterすると
記述した内容のファイルが作成される

cat << EOF > test.txt
>Hello World!
>Hello World!
>Hello World!
>EOF

「ll」コマンドでファイルができてることを確認

ll
total 4
-rw-rw-r-- 1 ec2-user ec2-user 17 Jan 31 01:18 test.txt

いつもの使い方の「cat」コマンドでファイルの中身を確認

cat test.txt
Hello World!
Hello World!
Hello World!

CLI上でちょっとしたファイルとか、コピペでファイル作る時に便利ですね!

【Docker】Networkを分けてコンテナを作成

ローカルPCでコンテナを立てる際にも、プロジェクトごとにDockerのnetworkは分けておいた方がいいですよね。

ということでまずは現状のnetworkを確認してみる

docker network ls

デフォルトでは↓のようなnetworkになってるハズ
f:id:daylambsbecomelions:20210124112234p:plain

「bridge」というのが物理構成に置き換えるならスイッチにあたります。
なのでnetworkを分ける時はまずこのスイッチをもう一台作成する(ここでは仮で「bridge2」とします)

docker network create bridge2

これでもう一度networkを確認してみると、
f:id:daylambsbecomelions:20210124113443p:plain

ちゃんとbridge2というnetworkが追加されています。
後はコンテナを立ち上げる時に「--net」でnetworkを指定して起動する。

docker run -d -it -p 9999:80 --name test-container --net bridge2 nginx:latest

立ち上がったコンテナをinspectしてみると、

docker container inspect test-container

f:id:daylambsbecomelions:20210124114442p:plain

ちゃんと「bridge2」のnetworkでコンテナが立ち上がってることが確認できました!

【AWS】EC2にDockerを入れてコンテナを表示させてみる

AWSのEC2にDockerをインストールしてWebサーバーコンテナを立ち上げブラウザから表示させてみたので手順をメモ

※EC2のElasticIPやSecurityGroupなどの設定は完了しており、外部からアクセスできる状態の前提

まずはコマンドラインにてEC2にアクセス

f:id:daylambsbecomelions:20210123161101p:plain

EC2上でdockerをインストール

sudo yum update -y
sudo amazon-linux-extras install docker
(↑Amazon linux2でのみ有効なコマンド。linux1の場合は普通にsudo yum install docker -y。他OSに合わせて適宜変更)

Dockerを立ち上げる

sudo systemctl start docker

ec2-user(ユーザー名)をdockerグループに追加する

sudo usermod -a G docker ec2-user

dockerを再起動して一度EC2から抜ける

sudo systemctl restart docker
exit

再度EC2にアクセスしてdockerを立ち上げるとsudoなしでdockerコマンドが実行可能になる

sudo systemctl start docker

任意のポートでnginxのコンテナを立ち上げる
(以下だと9999番ポート、testというコンテナ名でnginxの公式イメージで立ち上げ)

docker run -d -it --name test -p 9999:80 nginx:latest

セキュリティグループで指定したポートを許可して、まずはEC2側に通してあげる設定が必要
f:id:daylambsbecomelions:20210123170417p:plain

指定したポートでEC2にアクセス(↑の例の場合だと「自分のドメイン:9999」)
https~だと443ポートでのアクセスになるためhttp~:9999でアクセスする

f:id:daylambsbecomelions:20210123171010p:plain

無事表示されました~!

【Java】springMVC リクエストパラメータの取得方法

画面から送られてきたリクエストパラメータの中身を確認しようと、
Eclipseデバッグモードでサーバーを立ち上げてブレイクポイントで止めて、
「request」変数にカーソルを当ててみた。
f:id:daylambsbecomelions:20210122143141p:plain

なんじゃなんじゃコレはー長すぎ階層深すぎどこに入ってんのかわからんよコレじゃ!

ってことでパッとリクエストパラメータだけ抜き取る方法を調べてみた。

request.getParameterMap()

結論コレで取れましたって話。めでたしめでたし。。

【AWS】EC2にhttpsで繋がらない場合の対処法

EC2(Amazon Linux 2)を立ち上げて80, 443, 22それぞれアクセスできるセキュリティグループも作成してインスタンスにアタッチ。
apacheもインストールしてとりあえず画面が表示されるか確認しよう。
インスタンス一覧から対象のインスタンスを選択して、下部「詳細」から「オープンアドレス」をクリック!

f:id:daylambsbecomelions:20210116163622p:plain

「このサイトにアクセスできません」

あれ?おかしいな。試しに「http」にしてみるとちゃんとapacheの画面が表示される。
どうやら「オープンアドレス」をクリックしてページを開くと、勝手に「https」で開くらしく、httpsの設定が足りない模様。

Amazon Linux 2で立ち上げたインスタンスなら以下でできるようなので実施。
docs.aws.amazon.com

無事出ました!

f:id:daylambsbecomelions:20210116163311p:plain
apatch_test

【laradock】nginx | laravel | mysql構成でphp artisan migrateで失敗する問題の解決方法

以下を参考にLaradockで環境構築した際に「php artisan migrate」でこけた時のメモ
qiita.com

問題

「docker-compose up」で立ち上げはうまくいったけど、プロジェクトディレクトリで「php artisan migrate」実行時、以下のようなエラーが発生。

 Illuminate\Database\QueryException  : SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = laravel and table_name = migrations and table_type = 'BASE TABLE')

  at /var/www/src/vendor/laravel/framework/src/Illuminate/Database/Connection.php:669
    665|         // If an exception occurs when attempting to run a query, we'll format the error
    666|         // message to include the bindings with SQL, which will make this exception a
    667|         // lot more helpful to the developer instead of just the database's errors.
    668|         catch (Exception $e) {
  > 669|             throw new QueryException(
    670|                 $query, $this->prepareBindings($bindings), $e
    671|             );
    672|         }
    673|

  Exception trace:

  1   PDOException::("SQLSTATE[HY000] [2002] Connection refused")
      /var/www/src/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  2   PDO::__construct("mysql:host=127.0.0.1;port=3306;dbname=laravel", "root", "root", [])
      /var/www/src/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  Please use the argument -v to see more details.

解決方法

「.env」ファイルのDB設定はデフォルトで以下のようになっており、

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

「DB_HOST=127.0.0.1」はDBが同コンテナに同居する場合は問題ないが、コンテナが分かれている場合はDBコンテナのIPアドレスを設定し、さらにmysql側でWebサーバー側からアクセスするユーザーを作成してやる必要がある。コレ普通だったら当たり前なことなんだけど、なんとなくLaradockならdocker-compose upする時にその辺うまいこと勝手にやってくれるのかなとか思ってたんですけどね。

手順

まず以下コマンドでworkspaceコンテナに接続し、IPアドレスを確認

docker exec -it laradock_workspace_1 bash
hostname -i
172.19.0.4 172.18.0.2

次にDBコンテナに接続し、workspaceからアクセスするユーザーを作成し、全権限を付与

docker exec -it laradock_mysql_1 bash
mysql -u root -p
Enter password: root
mysql> use mysql;
mysql> CREATE USER root@172.19.0.4 IDENTIFIED BY 'root';
mysql> CREATE USER root@172.18.0.2 IDENTIFIED BY 'root';
mysql> GRANT ALL PRIVILEGES ON * . * TO root@172.19.0.4;
mysql> GRANT ALL PRIVILEGES ON * . * TO root@172.18.0.2;

それからDBコンテナ側のIPアドレスを確認し、

mysql> exit
root@c0bd97a0915b:/# hostname -i
172.19.0.3

確認したDBコンテナのIPアドレスを「.env」ファイルのDB_HOSTに書き込む。

DB_CONNECTION=mysql
DB_HOST=172.19.0.3
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=root

この状態でコンテナを再起動し、

docker-compose stop
docker-compose up -d nginx mysql

プロジェクトディレクトリで「php artisan migrate」を実行

docker exec -it laradock_workspace_1 bash
root@fca294aa9d0a:/var/www# cd src/
root@fca294aa9d0a:/var/www/src# php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.06 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.05 seconds)

無事成功しました!

【laradock】DockerでLaravel環境をサクッと構築!Laradockって何が凄い!?

Laravel x Dockerと言えば「Laradock」!いやーそのまんまですね。
でもコレ、なめてはいけないシロモノです。


自前でLaravelをDockerで環境構築しようとするとどうしても単一のコンテナだけでやってしまったり、WebサーバーとDBサーバーのコンテナを分けるだけとか、vagrantとあんまり変わらん使い方になってしまいがちですが、Dockerの本質は「疎結合」であり、本来「1コンテナ = 1プロセス」で構成するのが基本です(厳密には子プロセスまでは意識する必要はないため「1コンテナ = 1ロール[役割]」という考え方もある)。


具体的に言うとWebサーバーならapache / nginxでひとつのコンテナ、nginxならphp-fpmも別コンテナ、beanstalkdなどのキューサービス、RedisなどのKVSソフト、当然mysqlなどのDBもそれぞれ別のコンテナで立ち上げ、そしてそれらを結合させる。各コンテナを用意し、それぞれ通信ができるようにポートフォーワーディングの設定などが必要なのですが、この辺を自分でやるのって想像してみただけでもハマりそうな匂いがプンプンして億劫になりますよね。


こういったことを一手に引き受けて、LaravelアプリケーションをDockerのベストプラクティスの仕様に合わせてサクッと構築してくれるのが「Laradock」です。上で例で挙げたようなサービスはもちろん、Laradockは以下のサービスをモジュールとして最初から備えており、それぞれ「docker-compose up」コマンドの引数として指定してやるだけでサービスコンテナの立ち上げ、設定まで行ってくれます。

adminer
aerospike
apache2
aws-eb-cli
beanstalkd
beanstalkd-console
caddy
cassandra
certbot
couchdb
docker-registry
docker-web-ui
DOCUMENTATION
elasticsearch
gearman
gitlab
grafana
graylog
haproxy
hhvm
ide-codiad
ide-icecoder
ide-theia
ide-webide
ipython
jenkins
jupyterhub
kibana
laravel-echo-server
laravel-horizon
logs
logstash
maildev
mailhog
manticore
mariadb
memcached
minio
mongo
mongo-webui
mosquitto
mssql
mysql
neo4j
nginx
percona
php-fpm
php-worker
phpmyadmin
portainer
postgres
postgres-postgis
rabbitmq
redis
redis-cluster
redis-webui
rethinkdb
selenium
solr
sonarqube
thumbor
traefik
varnish
workspace
zookeeper


例で挙げたようなサービスを立ち上げた場合の構成内容。dind(Docker in Docker)の仕組みで構築されており、サービスごとにコンテナが立ち上げられています。この例の場合、「docker-compose up -d nginx mysql redis beanstalkd」のコマンド1行でここまでやってくれる。コレを自分でやる場合の学習コストを考えると、世界中で一体どれくらいの工数削減を実現してるんだろうと、無意味な算用をしてみたくなります。

4c19ffb0100c        laradock_nginx                "/bin/bash /opt/star…"   19 hours ago        Up 19 hours                0.0.0.0:80-81->80-81/tcp, 0.0.0.0:443->443/tcp                                                           laradock_nginx_1
7cba96b93ed0        laradock_beanstalkd           "/usr/bin/beanstalkd"    19 hours ago        Up 19 hours                0.0.0.0:11300->11300/tcp                                                                                 laradock_beanstalkd_1
f3a3c996de61        laradock_php-fpm              "docker-php-entrypoi…"   19 hours ago        Up 19 hours                9000/tcp                                                                                                 laradock_php-fpm_1
3f75a6c6a2ba        laradock_workspace            "/sbin/my_init"          19 hours ago        Up 19 hours                0.0.0.0:3000-3001->3000-3001/tcp, 0.0.0.0:8080->8080/tcp, 0.0.0.0:2222->22/tcp, 0.0.0.0:8001->8000/tcp   laradock_workspace_1
6fe28f1f2743        docker:19.03-dind             "dockerd-entrypoint.…"   19 hours ago        Up 19 hours                2375-2376/tcp                                                                                            laradock_docker-in-docker_1
a4c2851706ca        laradock_mysql                "docker-entrypoint.s…"   25 hours ago        Up 19 hours                0.0.0.0:3306->3306/tcp, 33060/tcp                                                                        laradock_mysql_1
e4a432332ea8        laradock_redis                "docker-entrypoint.s…"   25 hours ago        Up 19 hours                0.0.0.0:6379->6379/tcp                                                                                   laradock_redis_1


具体的な構築方法はあちこちで書かれていますが、自分はこちらを参考にしました。是非お試しアレ!
qiita.com