20210809のdockerに関する記事は11件です。

Dockerのコンテナ操作をRLoginで行うための方法

はじめに Windowsでのターミナルとしては、TeraTermやRLoginなどが有名ですが、こういった使い慣れたターミナルでDockerコンテナにアクセスする方法はないものかと調べたところ、少し工夫することで実現できたので記事にまとめたいと思います。 動作確認環境 Windows10 Home wsl2 Docker Desktop for Windows Ubuntu20.04 LTS RLogin 仕組み Dockerコンテナへ直接RLoginでアクセスすることはできませんが(ssh接続ではないため)、DockerEngineを動かしているLinux(Ubuntu)に対しssh接続することでRLoginでコンテナ操作できるようになります。 ローカル環境へのアクセスのため、パスワードのみ版の操作でも問題ないですが、調査のため鍵認証版も試してみたので合わせて方法を掲載したいと思います。 どちらか片方を実行することでRLoginから接続できるようになります。 方法(パスワードのみ版) # 以下はすべてUbuntuでの操作です # 下記ファイルにアクセスし、PasswordAuthenticationの部分の設定をyesに変更します sudo vi /etc/ssh/sshd_config # ホスト鍵を生成する sudo ssh-keygen -A # sshを起動する sudo service ssh restart 方法(鍵認証版) # ホスト側(Windows側)での準備--------------- # C:\Users\{ユーザー名}\に移動する cd C:\Users\{ユーザー名}\ # 鍵の置き場を作る mkdir .ssh cd .ssh # 鍵を作成する(確認等が表示されるので、Enterを続けて入力する。パスワードは不要) ssh-keygen -t rsa -b 4096 -f 鍵の名前 # 秘密鍵と公開鍵ができていることを確認する # .pubと付いている方が公開鍵 ls # 公開鍵の中身を確認する。中身をコピーする cat {鍵の名前}.pub # ubuntu側での設定-------------------------- # ホスト鍵を生成する sudo ssh-keygen -A # sshを起動する sudo service ssh restart # 公開鍵をセットする # ホームディレクトリへ移動 cd # 鍵を配置するための場所を用意する mkdir .ssh chmod 700 .ssh/ cd .ssh # 公開鍵をセットする # authorized_keysというファイルを生成し、中に先程コピーした公開鍵の内容を貼り付けする # もしすでにauthorized_keysが存在し、中に別の公開鍵が登録されている場合は、新しい行に貼り付ければ大丈夫です vi authorized_keys # 権限の変更 chmod 600 authorized_keys SSHを常時起動する(共通) この操作はパスワードのみ版、鍵認証版どちらの操作の場合も必要です。 sudo service ssh restart こちらの操作がパソコン再起動の度に必要になるため、自動化します。 Win+Rキーを同時押しして、shell:startupを入力してEnterを押します。 自動起動用のファイルを格納するフォルダが表示されるので、wsl2ssh.batという内容のファイルを作成し、以下をファイル内に貼り付けます。 以後はパソコン再起動の度に自動的にsshが再起動します。 wsl -d Ubuntu-20.04 -u root -- service ssh restart RLoginでのUbuntuへのアクセス ※xterm-colorにしておくと、カラフルな配色となり見やすくなります ※UserNameやPasswordはUbuntuのものを適時入力下さい 参考ページ
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[03] EFK (Elasticsearch + Fluentd + Kibana) の構築 ... Dockerコンテナの立ち上げ(説明あり)

本シリーズのトップページ https://qiita.com/robozushi10/items/68dc5f8c2df38f160fda はじめに 職場1 で「CI/CD ログ」や「CLI および Webアプリログ」の収集と可視化の導入の話が出てきた. また、自宅で K8s の学習をする中で Fluentd という単語が頻繁に出てきていた. そこで自宅の Ubuntu 18.04 マシンで docker-compose を用いて、 下図・下表のような Elasticsearch + Fluentd + Kibana (EFK) 環境を構築して検証し、 これらソフトの知見を得ることにした. 本項では以下を記す. ・docker-compose.yml を使って下図の立ち上げるための設定の詳細を挙げる 構成 図 表 No サービス ホスト側ポート コンテナ側ポート 備考 1 Nginx 21337 80 採用バージョン v1.20.0.Fluentd のテストのために導入しているだけである.本表 No 2 の Fluentd(24224) へログを配送する. 2 Fluentd 24224 24224 採用バージョン v1.13.1.受信したログを本表 No 3 の Fluentd(34224)へ転送する. 3 Fluentd 34224 34224 採用バージョン v1.13.1.受信したログを Elasticsearch へ書き込みする. 4 Elasticsearch 29200 29200 採用バージョン v7.14.ログ格納のためのデータストア.日本語検索をするための analysis-kuromoji 導入あり. 5 Kibana 29601 29601 採用バージョン v7.14.Elasticsearch の視覚化 留意次項 次の設定は職場環境を想定したためである. ・Fluentd を 2つ配置していること ・Elasticsearch のコンテナ側ポートを 9200 以外にしていること. ・Kibana のコンテナ側ポートを 5601 以外にしていること.   手順 1. ファイル構成 コード全文を Git clone で取得する $ git clone -b Qiita-02 git@github.com:robozushi10/qiita-efk.git $ cd qiita-efk.git $ tree . --charset=c . |-- PV | |-- elasticsearch | | `-- config | | `-- elasticsearch.yml ... Elasticsearch の挙動パラメータ定義 | |-- fluentd | | |-- etc | | | `-- fluent.conf ......... Fluentd 24224ポートでの待ち受け定義 | | `-- log ..................... バッファログ出力先ディレクトリ | |-- fluentd2 | | |-- etc | | | `-- fluent.conf ......... Fluentd 34224ポートでの待ち受け定義 | | `-- log ..................... バッファログ出力先ディレクトリ | `-- kibana | `-- config | `-- kibana.yml .......... Kibana の挙動パラメータ定義 |-- README.md |-- assets | |-- elasticsearch | | `-- Dockerfile .............. 日本語検索のための analysis-kuromoji のインストールあり | |-- fluentd2 | | `-- Dockerfile .............. Elasticsearch プラグインのインストールあり | `-- nginx | `-- Dockerfile .............. jwilder/dockerize を使って Fluentd, Elasticsearch, Kibana の起動を待つ | K8s での ReadinessProbe の挙動に近いはず `-- docker-compose.yml 2. 各ファイルの詳細 ファイル全文は以下から入手できる. ここでは重要と思われる点についてのみ記す. $ git clone -b Qiita-02 git@github.com:robozushi10/qiita-efk.git docker-compose.yml 留意点をコード内にコメントとして記した. docker-compose.yml の Nginx について 略 # ⬇️ Nginx は Fluentd のテストのために導入しただけである nginx: image: nginx:1.20.0 build: assets/nginx container_name: myfld_nginx ports: - "21337:80" # ⬇️ ログ出力先を fluentd にする logging: driver: "fluentd" options: fluentd-address: "localhost:24224" tag: "docker.{{.Name}}" # ⬇️ jwilder/dockerize コマンドを使って、0.5秒周期で最大2分間まで、 # Fluentd, Elasticsearch, Kibana の起動を待つ. HTTP 応答 200 なら起動完了とみなす. # なお、jwilder/dockerize は Dockerfile の中でインストールをしている. command: > dockerize -wait tcp://fluentd:24224 -wait tcp://fluentd2:34224 -wait tcp://kibana:29601 -wait tcp://elasticsearch:29200 -timeout 2m -wait-retry-interval 0.5s /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf depends_on: - fluentd - elasticsearch - kibana 略 docker-compose.yml の Fluentd について fluentd: image: fluent/fluentd:v1.13-1 container_name: myfld_fluentd restart: always command: > /usr/bin/fluentd -c /fluentd/etc/fluent.conf -v ports: - "127.0.0.1:24224:24224" - "127.0.0.1:24224:24224/udp" volumes: # ⬇️ バッファリングしたデータファイルが保存される - ./PV/fluentd/log:/fluentd/log # ⬇️ fluent.conf の配置先である. # fluent.conf の中で 34224 への転送設定や転送周期、フィルタ条件などを定義している. - ./PV/fluentd/etc:/fluentd/etc fluentd2: image: fluent/fluentd:v1.13-1 build: assets/fluentd2 container_name: myfld_fluentd2 restart: always command: > /usr/bin/fluentd -c /fluentd/etc/fluent.conf -v ports: - "127.0.0.1:34224:34224" - "127.0.0.1:34224:34224/udp" volumes: - ./PV/fluentd2/log:/fluentd/log # ⬇️ fluent.conf の配置先である. # fluent.conf の中で 34224 からのログ転送を許可している. - ./PV/fluentd2/etc:/fluentd/etc docker-compose.yml の Elasticsearch について 略 elasticsearch: image: elasticsearch:7.14.0 build: assets/elasticsearch container_name: myfld_elasticsearch_fluentd2 ports: # ⬇️ コンテナ側ポートを 29200 にするためには、ここの定義を変えるだけでは不十分だった. # そのために、./PV/elasticsearch/config/elasticsearch.yml で 29200 を指定した. - "29200:29200" environment: - "ES_JAVA_OPTS=-Xms1g -Xmx1g" ulimits: memlock: soft: -1 hard: -1 volumes: # ⬇️ 公式手順では JVM パラメータは環境変数で設定できるようだが、当方の場合は切り替えできず. # docker-compose.yml の記載ミスの疑いが高いが、仕方なく設定ファイル elasticsearch.yml # を配置する方法にした. - ./PV/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml # ⬇️ ローカルボリュームを使うと Java で Exception が生じてしまう. (2021/08 時点では理由不明) # 外付け SSD でマウントしているからなのだろうか. 本記事とは全く別のコンテナでも同現象が起きた. # - ./PV/elasticsearch/data:/usr/share/elasticsearch/data - myfld_elasticsearch_fluentd2_vol:/usr/share/elasticsearch/data # - "./PV/elasticsearch/config/jvm.options.d:/usr/share/elasticsearch/config/jvm.options.d/" depends_on: - fluentd - fluentd2 略 volumes: myfld_elasticsearch_fluentd2_vol: docker-compose.yml の Kibana について 略 kibana: image: kibana:7.14.0 container_name: myfld_kibana_fluentd2 ports: # ⬇️ コンテナ側ポートを 29601 にするためには、ここの定義を変えるだけでは不十分だった. # そのために、./PV/kibana/config/kibana.yml で 29601 を指定した. - "29601:29601" # ⬇️ 環境変数だと Kibana サーバのポート変更ができず. # そのためにホスト側から /usr/share/kibana/config/kibana.yml をマウントしている. # environment: # - ELASTICSEARCH_URL=http://elasticsearch:29200 volumes: - ./PV/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml depends_on: - fluentd - fluentd2 - elasticsearch assets/elasticsearch/Dockerfile ## FROM elasticsearch:7.14.0 ## プロキシサーバを使う場合 # ENV http_proxy="http://proxy.co.jp:8080" # ENV https_proxy="http://proxy.co.jp:8080" # ⬇️ 下記コマンドを使って日本語検索プラグイン analysis-kuromoji をインストールした. RUN elasticsearch-plugin install analysis-kuromoji assets/fluentd2/Dockerfile Fluentd の Elasticsearch プラグインをインストールする. FROM fluent/fluentd:v1.13-1 USER root RUN gem install fluent-plugin-elasticsearch assets/nginx/Dockerfile コンテナ起動確認ツールである jwilder/dockerize をインストールする FROM nginx:1.20.0-alpine ## プロキシサーバを使う場合 # ENV http_proxy="http://proxy.co.jp:8080" # ENV https_proxy="http://proxy.co.jp:8080" ENV DOCKERIZE_VERSION v0.6.1 RUN apk add --no-cache openssl \ && wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \ && tar -C /usr/local/bin -xzvf dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \ && rm dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz PV/elasticsearch/config/elasticsearch.yml ## 公式ドキュメント: https://www.elastic.co/guide/en/elasticsearch/reference/7.14/important-settings.htm ## 参考記事: http://www.tech-joy.work/article/a20180527115811.html ## ⬇️ 今回は Elasticsearch コンテナは 1個なので single-node と記述する. ## [doc] https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery-settings.html discovery.type: "single-node" ## ⬇️ ヒープのみ使用しスワップは使わない. ## Dockerでの運用だとどうなるのか不明だが、true としている人が多いので定義をしてみる. ## swapoff -a を恒久設定しておく. bootstrap.memory_lock: true ## ⬇️ クラスタ名. 目的に応じたクラスタ名が良いとはある. cluster.name: "docker-cluster" ## ⬇️ どの NIC から待ち受けするかを定義する. 0.0.0.0 の場合は全ての NIC となる. ## [doc] https://www.elastic.co/guide/en/elasticsearch/reference/7.14/modules-network.html network.host: 0.0.0.0 ## ⬇️ HTTP Client との通信用ポート. 指定が無ければ 9200-9300 のポートを使う. ## [doc] https://www.elastic.co/guide/en/elasticsearch/reference/7.14/modules-network.html http.port: 29200 ## ⬇️ 「xpack.monitoring.enabled: true」は deprecated とある. ## 代わりに下記を使えば良いのだと思う. ## [doc] https://www.elastic.co/guide/en/elasticsearch/reference/current/monitoring-settings.html xpack.monitoring.collection.enabled: true ## ⬇️ watcher は通知に関する設定である. ## [doc] https://www.elastic.co/guide/en/elasticsearch/reference/7.14/notification-settings.html xpack.watcher.enabled: true ## ⬇️ インデックス削除のときに「*」による指定を認めない(true). ## [doc] https://www.elastic.co/guide/en/elasticsearch/reference/7.14/index-management-settings.html action.destructive_requires_name: true PV/fluentd/etc/fluent.conf 24224 ポートからの入力に対する挙動を定義する ## ⬇️ 24224 ポートからの入力を待ち受ける <source> @type forward port 24224 </source> ## ⬇️ docker-compose.yml にてタグを定義していたはずである <match docker.myfld_nginx> #.......... フィルタ条件のタグを「docker.myfld_nginx」に絞ってしまう @type forward buffer_type file #.................................... ファイルバッファにする buffer_path /fluentd/log/fluentd-nginx.*.buffer #..... バッファファイルの出力先 flush_interval 1s #................................... 1秒ごとにバッファをフラッシュする <server> name aggregate2 host fluentd2 #..................................... 転送先マシンの名前 port 34224 #........................................ 転送先のポート </server> </match> PV/fluentd2/etc/fluent.conf 34224 ポートからの入力を監視し、該当するタグであれば標準出力させる <source> @type forward port 34224 </source> <match docker.**> @type stdout </match> PV/kibana/config/kibana.yml docker-compose.yml にて環境変数を設定してみたが挙動変わらず. そのために設定ファイルに直書きした. # # ** THIS IS AN AUTO-GENERATED FILE ** # # Default Kibana configuration for docker target server.host: "0" server.port: "29601" server.shutdownTimeout: "5s" elasticsearch.hosts: [ "http://elasticsearch:29200" ]   3. Dockerイメージビルドとコンテナ起動を行う $ cd qiita-efk.git $ docker-compose build --no-cache $ docker-compose up -d 4. Kibana にアクセスする 上記 3 でのコンテナ起動が完了するまで (4分間ほど) 待機してから 次の URL にアクセスして Kibana の Dev Tools が起動していれば OK. ・http://localhost:29601/app/dev_tools#/console 5. Nginx のログが Fluentd 34224ポート に配送されていることを確認する Fluentd の挙動確認になってしまうが、記しておく. 5-1. Fluentd 34224 ポートの標準出力を監視する $ docker-compose -f logs fluentd2 5-2. WEB-UI から http://localhost:21337 にアクセスする 上記 5-1 のコンソールに対して、Nginx のアクセスログが出力されていることを確認する。   以上 参考書籍およびサイト 書籍 nginx実践入門 「Docker/Kubernetes 実践コンテナ開発入門 山田 明憲」 データ分析基盤構築入門[Fluentd,Elasticsearch,Kibanaによるログ収集と可視化] 検索だけじゃない Elasticsearch 入門+ URL 一言 https://qiita.com/sanyamarseille/items/1c4c31547502791ecac6 https://www.elastic.co/guide/en/elastic-stack-get-started/current/get-started-docker.html https://qiita.com/suzuki_y/items/6365799485fa3973b916 https://qiita.com/sugikeitter/items/f3b2c57bf8bbdc47a8bc https://github.com/sugikeitter/elasticsearch-kibana-docker/blob/master/docker-compose.yml https://gitya107.hatenablog.com/entry/2018/06/15/170334 http://ittoo.jugem.jp/?eid=737 https://qiita.com/kaibadash@github/items/9cfb532696dc8711e408 日本語検索を可能にする https://qiita.com/mserizawa/items/8335d39cacb87f12b678 日本語検索を可能にする https://github.com/deviantony/docker-elk ELK を構築するための docker-compose が公開されている https://dev.classmethod.jp/articles/es-01/ index, document, type の説明が簡潔に RDMS に例えられていて良かった http://www.tech-joy.work/article/a20180527115811.html /etc/elasticsearch/elasticsearch.yml の記述例と説明あり https://qiita.com/Esfahan/items/3c07bfbb57c7098e9531 3台に Elasticsearch を導入した場合の手順あり https://stackoverflow.com/questions/52621299/date-is-not-appending-to-elasticsearch-index-name-while-using-td-agent fluent.conf で %Y%m%d 展開できない問題の対策である https://wyukawa.hatenablog.com/entry/2019/07/03/162511 Elasticsearch 7 からはタイプが無くなるので、fluent.conf での記述方法が記されている   オンプレ環境での組込み機器開発向け DevOps 業務 ↩
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

GCE上にkaggle Dockerを構築してGCSをマウントした

0.Intro エラくハマりました。。。GCEもきちんと使ったことないのもありますが何というか勝手が違いますね(何との比較?) 1.GCE構築 デフォルトのus-central1(アイオワ)で構築しようと思いました。最初は最近使えるようになったと話題のA100を割り当てたりしてみたのですがそもそも、多分ビギナーだからでしょうか、割り当てしてらもえず。P100ならどうかと思ったのですがこちらもだめ。仕方なくT4×4にて妥協(?)。 皆様はMarketplaceから持ってきておられますが、何故かGPUの割り当てがないと言われます。 よって一からGCE立てて環境を作ることにしました。個人的にGPUの割り当てにハマりました。GPUの割り当てはいくつかあるのですが、どうやら というNVIDIAA (型番) GPUs というのがいわゆるインスタンスにGPU割り当てる時に設定する項目のようです隣のVirtual Workstationは「仮想ワークステーション(NVIDIA GRID)を有効にする」を有効にした時に消費される割り当てのようです。 今回はOSはubuntu20.04にしました。ディスクは200Gとしています。(実は一回けちって50Gにしたところディスクが足りないと怒られてやり直している) GCPのリソース不足でゾーンをus-central1-bに切り替えてやっとこさ構築完了。 GCEを構築できたら NVIDIA Docker って今どうなってるの? (20.09 版) を参考にNVIDIA Dockerを入れます。ホストのubuntuには CUDA Toolkit 11.1 Update 1 Downloads を入れています。もちろんインストールの仕方は上記にあるようにドライバだけです。 kaggle dockerのインストール仕方は特に変わったところはありません。あちこちにあるチュートリアルのままです。 kaggle dockerをビルド後起動 docker run --rm --gpus all -it kaggle/python-gpu-build /bin/bash で起動しコンテナに入れることを確認。 2.GCSマウント GCEのローカルだけでは心許ないのでGCSをマウントしたいと思います。 ※こちらを参考にしました。 上記サイトに記載のシェルをコピーして作成し実行、gcsfuseをインストールします。 その後に gcloud auth application-default login を実行しブラウザから認証します。 その後環境変数を設定。 export GOOGLE_APPLICATION_CREDENTIALS=~/.config/gcloud/application_default_credentials.json ここまできたらようやく目的のバケットをマウント出来ます。 gcsfuse -o allow_other {バケット名} /media/data このときに「 -o allow_other」オプションがないとコンテナ内でpermission deniedで怒られます。 またこのオプションを使うには /etc/fuse.conf というファイル内の # mount_max = 1000 user_allow_other と「user_allow_other」のコメントを外して有効化してください。 ※セキュリティ上の問題も指摘されています。ここは自己責任で。 ここまできてやっとこさ docker run --rm --gpus all -v /media/:/media/ -it kaggle/python-gpu-build /bin/bash GCE上のKaggle DockerにGCSをマウントしアクセスできました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[02] EFK (Elasticsearch + Fluentd + Kibana) の構築 ... Dockerコンテナの立ち上げ(説明なし)

本シリーズのトップページ https://qiita.com/robozushi10/items/68dc5f8c2df38f160fda はじめに 職場1 で「CI/CD ログ」や「CLI および Webアプリログ」の収集と可視化の導入の話が出てきた. また、自宅で K8s の学習をする中で Fluentd という単語が頻繁に出てきていた. そこで自宅の Ubuntu 18.04 マシンで docker-compose を用いて、 下図・下表のような Elasticsearch + Fluentd + Kibana (EFK) 環境を構築して検証し、 これらソフトの知見を得ることにした. 本項では以下を記す. ・docker-compose.yml を使って下図の立ち上げるための手順 構成 図 表 No サービス ホスト側ポート コンテナ側ポート 備考 1 Nginx 21337 80 採用バージョン v1.20.0.Fluentd のテストのために導入しているだけである.本表 No 2 の Fluentd(24224) へログを配送する. 2 Fluentd 24224 24224 採用バージョン v1.13.1.受信したログを本表 No 3 の Fluentd(34224)へ転送する. 3 Fluentd 34224 34224 採用バージョン v1.13.1.受信したログを Elasticsearch へ書き込みする. 4 Elasticsearch 29200 29200 採用バージョン v7.14.ログ格納のためのデータストア.日本語検索をするための analysis-kuromoji 導入あり. 5 Kibana 29601 29601 採用バージョン v7.14.Elasticsearch の視覚化 留意次項 次の設定は職場環境を想定したためである. ・Fluentd を 2つ配置していること ・Elasticsearch のコンテナ側ポートを 9200 以外にしていること. ・Kibana のコンテナ側ポートを 5601 以外にしていること.   手順 1. GitHub からタグ「Qiita-02」を指定して clone する $ git clone -b Qiita-02 git@github.com:robozushi10/qiita-efk.git 2. Dockerイメージビルドとコンテナ起動を行う $ cd qiita-efk $ docker-compose build --no-cache $ docker-compose up -d 3. Kibana にアクセスする 上記 2 でのコンテナ起動が完了するまで (4分間ほど) 待機してから 次の URL にアクセスして Kibana の Dev Tools が起動していれば OK. ・http://localhost:29601/app/dev_tools#/console   以上 参考書籍およびサイト 書籍 nginx実践入門 「Docker/Kubernetes 実践コンテナ開発入門 山田 明憲」 データ分析基盤構築入門[Fluentd,Elasticsearch,Kibanaによるログ収集と可視化] 検索だけじゃない Elasticsearch 入門+ URL 一言 https://qiita.com/sanyamarseille/items/1c4c31547502791ecac6 https://www.elastic.co/guide/en/elastic-stack-get-started/current/get-started-docker.html https://qiita.com/suzuki_y/items/6365799485fa3973b916 https://qiita.com/sugikeitter/items/f3b2c57bf8bbdc47a8bc https://github.com/sugikeitter/elasticsearch-kibana-docker/blob/master/docker-compose.yml https://gitya107.hatenablog.com/entry/2018/06/15/170334 http://ittoo.jugem.jp/?eid=737 https://qiita.com/kaibadash@github/items/9cfb532696dc8711e408 日本語検索を可能にする https://qiita.com/mserizawa/items/8335d39cacb87f12b678 日本語検索を可能にする https://github.com/deviantony/docker-elk ELK を構築するための docker-compose が公開されている https://dev.classmethod.jp/articles/es-01/ index, document, type の説明が簡潔に RDMS に例えられていて良かった http://www.tech-joy.work/article/a20180527115811.html /etc/elasticsearch/elasticsearch.yml の記述例と説明あり https://qiita.com/Esfahan/items/3c07bfbb57c7098e9531 3台に Elasticsearch を導入した場合の手順あり   オンプレ環境での組込み機器開発向け DevOps 業務 ↩
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker Grafana + STRAVA Plugin install

やりたいこと Mac上のParallelsにインストールしたCentOS8にGrafana on Dockerを構築しSTRAVAのデータを表示させる 参考にした手順 DockerおよびDocker Composeのインストール https://qiita.com/cyberblack28/items/0b0ec02bce67a16e2f17 Docker Grafanaのインストール https://techexpert.tips/ja/grafana-ja/ubuntu-linux%E3%81%B8%E3%81%AEgrafana-docker%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/ mkdir -p /var/lib/grafana/strava chown -R 472:472 /var/lib/grafana docker run -d -p 3000:3000 -v /var/lib/grafana:/var/lib/grafana -e "GF_SECURITY_ADMIN_PASSWORD=******" -e "GF_STRAVA_DS_DATA_PATH=/var/lib/grafana/strava" grafana/grafana コンテナに環境変数がセットされていることを確認する [root@localhost ~]# docker exec -it e00b0c56473c /bin/bash bash-5.1$ set | grep GF GF_PATHS_CONFIG=/etc/grafana/grafana.ini GF_PATHS_DATA=/var/lib/grafana GF_PATHS_HOME=/usr/share/grafana GF_PATHS_LOGS=/var/log/grafana GF_PATHS_PLUGINS=/var/lib/grafana/plugins GF_PATHS_PROVISIONING=/etc/grafana/provisioning GF_SECURITY_ADMIN_PASSWORD=******* GF_STRAVA_DS_DATA_PATH=/var/lib/grafana/strava STRAVAのデータの取得 https://grafana.com/grafana/plugins/grafana-strava-datasource/ [root@localhost ~]# docker exec -it e00b0c56473c /bin/bash bash-5.1$ grafana-cli plugins install grafana-strava-datasource ✔ Downloaded grafana-strava-datasource v1.3.0 zip successfully Please restart Grafana after installing plugins. Refer to Grafana documentation for instructions if necessary. bash-5.1$ exit [root@localhost ~]# docker stop e00b0c56473c e00b0c56473c [root@localhost ~]# docker start e00b0c56473c e00b0c56473c Configre -> Data Sources -> Add data source -> (Find Name)STRAVA STRAVAのMyアプリケーションで認証コールバックドメインに接続しているGrafanaのFQDNかIPを入れること(ポート3000は不要だった) Save & Test -> Connect With STRAVA -> Save & Testと操作しないとうまく登録できなかった。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails の Dockerイメージを軽量化してみる

鉄板すぎる話ですが、自分の手元で確かめたかったのでメモに残します。 Alpine Linux を利用する RUN 命令などを削減する マルチステージビルド 全部盛り 何もしない状態 Docker ドキュメント を参考に作成。 FROM ruby:2.6.8 RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs RUN mkdir /app WORKDIR /app COPY Gemfile /app/Gemfile COPY Gemfile.lock /app/Gemfile.lock RUN gem install bundler:2.2.16 RUN bundle install COPY . /app COPY dockerfiles/rails/entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000 CMD ["rails", "server", "-b", "0.0.0.0"] サイズは1GB超え。 $ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE vocabook_api_app latest 005fb8bfbdae 4 minutes ago 1.11GB Alpine Linux を利用する Alpine Linux は、コンテナでよく登場する軽量な Linux ディストリビューション。 apk というパッケージマネージャを利用するため、サブコマンドやパッケージ名を修正。 FROM ruby:2.6.8-alpine3.14 RUN apk update -qq && apk add --no-cache build-base postgresql-dev nodejs RUN mkdir /app WORKDIR /app COPY Gemfile /app/Gemfile COPY Gemfile.lock /app/Gemfile.lock RUN gem install bundler:2.2.16 RUN bundle install COPY . /app COPY dockerfiles/rails/entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000 CMD ["rails", "server", "-b", "0.0.0.0"] 何もしない状態から 300MB 削減。 $ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE vocabook_api_app latest 24268673b3c8 43 seconds ago 799MB RUN 命令などを削減する RUN や COPY などの命令によってレイヤと呼ばれる中間イメージが作成される。 命令数を減らすことで生成されるレイヤを削減し、イメージの軽量化を図る。 FROM ruby:2.6.8 RUN apt-get update -qq && \ apt-get install -y build-essential libpq-dev nodejs && \ mkdir /app WORKDIR /app COPY Gemfile Gemfile.lock /app/ RUN gem install bundler:2.2.16 && bundle install COPY . /app COPY dockerfiles/rails/entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000 CMD ["rails", "server", "-b", "0.0.0.0"] この程度の命令数ではサイズは変わらず。 $ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE vocabook_api_app latest 3b3100aef7b1 About a minute ago 1.11GB マルチステージビルド bundle installで分けている記事があったので参考に試してみる。 パッケージをインストールするステージ、そのパッケージをコピーして持ってくるステージに分ける。 FROM ruby:2.6.8 AS builder RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs RUN mkdir /app WORKDIR /app COPY Gemfile /app/Gemfile COPY Gemfile.lock /app/Gemfile.lock RUN gem install bundler:2.2.16 RUN bundle install FROM ruby:2.6.8 AS runner RUN apt-get update -qq && apt-get install -y libpq-dev nodejs RUN mkdir /app WORKDIR /app COPY --from=builder /usr/local/bundle /usr/local/bundle COPY . /app COPY dockerfiles/rails/entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000 CMD ["rails", "server", "-b", "0.0.0.0"] 何もしていない状態から 20MB 程度減らすことができた。 $ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE vocabook_api_app latest 376df67aec60 35 minutes ago 1.09GB history コマンドでレイヤのサイズを見てみると、確かに 20MB くらい削減されている。 上:何もしないとき | 下:マルチステージビルド <missing> 4 hours ago RUN /bin/sh -c bundle install # buildkit 103MB buildkit.dockerfile.v0 <missing> 11 minutes ago COPY /usr/local/bundle /usr/local/bundle # b… 86.4MB buildkit.dockerfile.v0 マルチステージビルドは、コンパイルしてバイナリを生成するようなケースだと分かりやすく効果が出そう。 全部盛り FROM ruby:2.6.8-alpine3.14 AS builder RUN apk update -qq && \ apk add --no-cache build-base postgresql-dev nodejs && \ mkdir /app WORKDIR /app COPY Gemfile Gemfile.lock /app/ RUN gem install bundler:2.2.16 && bundle install FROM ruby:2.6.8-alpine3.14 AS runner RUN apk update -qq && \ apk add --no-cache postgresql-dev nodejs && \ mkdir /app WORKDIR /app COPY --from=builder /usr/local/bundle /usr/local/bundle COPY . /app COPY dockerfiles/rails/entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000 CMD ["rails", "server", "-b", "0.0.0.0"] めっちゃ小さくなった。何もしない状態の半分近くまで小さくなっている。 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE vocabook_api_app latest 4aebe416674b 2 minutes ago 588MB history を見てみると、apk addのところで差分が出ていそうなので、build-base を最終イメージに持ってこなかったのが良かったみたい。 <missing> 6 minutes ago RUN /bin/sh -c apk update -qq && apk add… 354MB buildkit.dockerfile.v0 <missing> 6 hours ago RUN /bin/sh -c apk update -qq && apk add --n… 547MB buildkit.dockerfile.v0 参考 いつも助かります。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DockerにPostgre環境を作ってSpring bootで利用する

Springbootの勉強のため、Dockerで作成したPostgre環境に接続してアプリケーションを作成します。 環境:Windows10 sts-4.10.0.RELEASE Docker version 20.10.6 docker-compose version 1.29.1 →この記事のGitHubリポジトリ https://github.com/jirentaicho/springbootsample ブランチ:qiita ※docker-compose.ymlなどはdevフォルダに格納しております。 最終的なフォルダ構成 フォルダ構成をみる C:. │ .classpath │ .gitignore │ .project │ HELP.md │ mvnw │ mvnw.cmd │ pom.xml │ readme.md │ ├─.mvn │ └─wrapper │ maven-wrapper.jar │ maven-wrapper.properties │ MavenWrapperDownloader.java │ ├─.settings │ org.eclipse.core.resources.prefs │ org.eclipse.jdt.apt.core.prefs │ org.eclipse.jdt.core.prefs │ org.eclipse.m2e.core.prefs │ org.eclipse.wst.common.component │ org.eclipse.wst.common.project.facet.core.xml │ org.eclipse.wst.validation.prefs │ org.springframework.ide.eclipse.prefs │ ├─dev │ │ docker-compose.yml │ │ │ └─postgres │ └─setup │ 1-ddl.sql │ 2-dml.sql │ ├─src │ ├─main │ │ ├─java │ │ │ └─com │ │ │ └─volkruss │ │ │ │ AnicomApplication.java │ │ │ │ ServletInitializer.java │ │ │ │ │ │ │ ├─application │ │ │ │ ├─controller │ │ │ │ │ InitializeController.java │ │ │ │ │ RegisterController.java │ │ │ │ │ │ │ │ │ └─request │ │ │ │ AnimationRequest.java │ │ │ │ │ │ │ ├─domain │ │ │ │ ├─entity │ │ │ │ │ AnimationEntity.java │ │ │ │ │ AnimationRepository.java │ │ │ │ │ │ │ │ │ ├─mapper │ │ │ │ │ │ AnimationMapper.java │ │ │ │ │ │ │ │ │ │ │ └─impl │ │ │ │ │ AnimationMapperImpl.java │ │ │ │ │ │ │ │ │ ├─model │ │ │ │ │ Animation.java │ │ │ │ │ │ │ │ │ └─service │ │ │ │ │ AnimationService.java │ │ │ │ │ │ │ │ │ └─Impl │ │ │ │ AnimationServiceImpl.java │ │ │ │ │ │ │ └─infrastructure │ │ │ └─repository │ │ │ AnimationJpaRepository.java │ │ │ AnimationRepositoryImpl.java │ │ │ │ │ ├─resources │ │ │ │ application.properties │ │ │ │ │ │ │ ├─static │ │ │ └─templates │ │ │ index.html │ │ │ register.html │ │ │ │ │ └─webapp │ └─test │ └─java │ └─com │ └─volkruss │ AnicomApplicationTests.java │ └─target ├─classes │ │ application.properties │ │ │ ├─com │ │ └─volkruss │ │ │ AnicomApplication.class │ │ │ ServletInitializer.class │ │ │ │ │ ├─application │ │ │ ├─controller │ │ │ │ InitializeController.class │ │ │ │ RegisterController.class │ │ │ │ │ │ │ └─request │ │ │ AnimationRequest.class │ │ │ │ │ ├─domain │ │ │ ├─entity │ │ │ │ AnimationEntity.class │ │ │ │ AnimationRepository.class │ │ │ │ │ │ │ ├─mapper │ │ │ │ │ AnimationMapper.class │ │ │ │ │ │ │ │ │ └─impl │ │ │ │ AnimationMapperImpl.class │ │ │ │ │ │ │ ├─model │ │ │ │ Animation.class │ │ │ │ │ │ │ └─service │ │ │ │ AnimationService.class │ │ │ │ │ │ │ └─Impl │ │ │ AnimationServiceImpl.class │ │ │ │ │ └─infrastructure │ │ └─repository │ │ AnimationJpaRepository.class │ │ AnimationRepositoryImpl.class │ │ │ └─templates │ index.html │ register.html │ ├─generated-sources │ └─annotations ├─generated-test-sources │ └─test-annotations ├─m2e-wtp │ └─web-resources │ └─META-INF │ │ MANIFEST.MF │ │ │ └─maven │ └─com.volkruss │ └─anicom │ pom.properties │ pom.xml │ └─test-classes └─com └─volkruss AnicomApplicationTests.class Postgre環境の準備 Dockerを使ってpostgre環境を準備します。以前仕事では共通のDBサーバーがあって、スキーマを作るなどしてみんなで同じものを共有していました。 しかし、ある時から個人のローカルにDockerでDB環境作るようになってから、お構いなしにDBをぶっ壊したりしていました。 というわけでDockerでPostgre環境を用意します。 docker-compose.yml version: '3' services: postgre: image: postgres:latest ports: - 5432:5432 container_name: my_postgre volumes: - ./postgres/data:/var/lib/postgresql/data # 初期化用のシェルを格納しておきます。 - ./postgres/setup:/docker-entrypoint-initdb.d environment: POSTGRES_USER: misaka POSTGRES_PASSWORD: mikoto 最初にsqlを実行するdocker-entrypoint-initdb.dに対して、postgres/setupフォルダをマウントしています。ここにsqlファイルを置くと最初に実行されます。 先頭に番号を振って実行順番を制御しています。 もし、Postgre環境を作り直したい時は以下のフォルダを削除します。 ./postgres/data (権限で消せないとか出たらpowershellで消してあげます rm -r data) 以下のコマンドでコンテナを立ち上げます docker-compose up -d STSでプロジェクト作成 以下のようにプロジェクトを作成しました。 データベースの接続設定 以下のファイルを修正して、コンテナのPostgreデータベースに接続するようにします。 anicom\src\main\resources\application.properties spring.datasource.driver-class-name=org.postgresql.Driver spring.datasource.url=jdbc:postgresql://localhost:5432/misaka spring.datasource.username=misaka spring.datasource.password=mikoto Viewを表示する 今、プロジェクトを実行すると、リクエストに対して何の設定も行っていないため、以下のようなページが表示されます。 まずは/にアクセスしたときにページを表示させるようにしていきます。 controllerの作成を行います。 controllerクラスには@Controllerアノテーションを付けます。このアノテーションをつけることで、HTMLなどのViewを返すことができます。 今回は/にアクセスしたときに、index.htmlを返すようにしています。 InitializeController.java package com.volkruss.application.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class InitializeController { @GetMapping("/") public String getIndex() { return "index"; } } index.htmlを作成します。 anicom\src\main\resources\templates\index.html index.html <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>アニメコム</title> </head> <body> <p>お気に入りのアニメとキャラクターを登録しよう</p> </body> </html> これで実行すると以下のような画面が表示されています。 リクエストの情報をコントローラーが受け取ってViewを返すということができるようになりました。 データベースのレコードを表示する 次はデータベースからレコードを取得して、表示させます。 EntityととRepositoryとModelを作成します。 設定の見直し Entityは実際のテーブルの構造と紐づいていますので、そのままテーブルの構造を反映させます。 アクセサについては簡略化させたいので、lombokを利用します。pom.xmlに以下を追加します。 あと、プロジェクト作成時にJPAを追加してなかったので、jpaの依存も追加します。 pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- 追加 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.8</version> <scope>provided</scope> </dependency> <!-- もう一個追加 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> </dependencies> SpringToolSuite4.iniに以下を追記します。 -javaagent:lombokのパス\lombok.jar -vmarges -javaagent:lombok.jar Entityの作成 ようやくEntityクラスを作成できます。テーブルの構造と紐づけたいので以下のようにします。 AnimationEntity.java package com.volkruss.domain.entity; import java.util.Date; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.SequenceGenerator; import javax.persistence.Table; import lombok.Getter; import lombok.Setter; @Setter @Getter @Entity @Table(name = "m_animation") public class AnimationEntity{ @Id @Column(name = "id") @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "m_animation_id_seq") @SequenceGenerator(name = "m_animation_id_seq",sequenceName = "m_animation_id_seq",initialValue = 1,allocationSize = 1) private int id; @Column(name = "title") private String title; @Column(name = "broadcast_start") private Date broadcast_start; @Column(name = "broadcast_end") private Date broadcast_end; @Column(name = "created_at") private Date created_at; @Column(name = "updated_at") private Date updated_at; } Modelの作成 続いてModelを作成します。現在放送中かどうかを返せるようなメソッドを定義しました。 Animation.java package com.volkruss.domain.model; import java.util.Date; import lombok.Getter; import lombok.Setter; @Setter @Getter public class Animation { private int id; private String title; private Date broadcast_start; private Date broadcast_end; /** * <P> * 現在放送中かどうかを返します。 * </p> * * @return 放送期間が現在時刻の範囲ならばTrue / そうでない場合はfalse */ public boolean isBroadNow() { // 日付の範囲内の場合True Date today = new Date(); return today.after(broadcast_start) && today.before(broadcast_end); } } Repositoryの作成 AnimationEntityを取得するJpaRepositoryを継承したAnimationJpaRepositoryインターフェースを作成します。必要最低限のデータアクセスに関するメソッドが提供されているので、こちらを利用します。 そして、AnimationJpaRepositoryを利用するAnimationRepositoryを作成します。 AnimationJpaRepositoryから取得したEntityをModelに変換して返却します。 この時に変換するのにAnimationMapperクラスを用意します。 AnimationJpaRepositoryの作成 SQL文を書かなくてもEntityを利用することでデータアクセスができるようになります。 そのために、JpaRepositoryを継承したインターフェースを作成します。 AnimationJpaRepository.java package com.volkruss.infrastructure.repository; import org.springframework.data.jpa.repository.JpaRepository; import com.volkruss.domain.entity.AnimationEntity; public interface AnimationJpaRepository extends JpaRepository<AnimationEntity,String>{ } AnimationRepositoryの作成 AnimationJpaRepositoryとAnimationMapperを利用して、Animationモデルを返すクラスです。 インターフェースは適宜作成しておきます。 AnimationRepositoryImpl.java package com.volkruss.infrastructure.repository; import java.util.List; import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import com.volkruss.domain.entity.AnimationEntity; import com.volkruss.domain.entity.AnimationRepository; import com.volkruss.domain.mapper.AnimationMapper; import com.volkruss.domain.model.Animation; @Repository public class AnimationRepositoryImpl implements AnimationRepository { @Autowired private AnimationJpaRepository animationJpaRepository; @Autowired private AnimationMapper animationMapper; @Override public List<Animation> getAll() { List<AnimationEntity> lists = animationJpaRepository.findAll(); return lists.stream().map(animationMapper::toAnimation).collect(Collectors.toList()); } } AnimationMapperの作成 EntityをModelに変換するクラスを作成します。 こちらもインターフェースを適宜作成しておきます。 AnimationMapperImpl.java package com.volkruss.domain.mapper.impl; import org.springframework.stereotype.Component; import com.volkruss.domain.entity.AnimationEntity; import com.volkruss.domain.mapper.AnimationMapper; import com.volkruss.domain.model.Animation; @Component public class AnimationMapperImpl implements AnimationMapper{ /** * {@inheritDoc} */ @Override public Animation toAnimation(AnimationEntity entity) { Animation animation = new Animation(); animation.setTitle(entity.getTitle()); animation.setBroadcast_start(entity.getBroadcast_start()); animation.setBroadcast_end(entity.getBroadcast_end()); return animation; } } Serviceの作成 今回は取得するだけなので、repositoryからモデルを取得します。 AnimationServiceImpl.java package com.volkruss.domain.service.Impl; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.volkruss.domain.entity.AnimationRepository; import com.volkruss.domain.model.Animation; import com.volkruss.domain.service.AnimationService; @Service public class AnimationServiceImpl implements AnimationService{ @Autowired private AnimationRepository animationRepository; @Override public List<Animation> getAnimationList() { return animationRepository.getAll(); } } コントローラーの修正 controllerからserviceを利用してモデルを取得して、その結果をViewに反映させるように修正します。 InitializeController.java package com.volkruss.application.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import com.volkruss.domain.model.Animation; import com.volkruss.domain.service.AnimationService; @Controller public class InitializeController { @Autowired private AnimationService animationService; @GetMapping("/") public String getIndex(Model model) { List<Animation> animations = animationService.getAnimationList(); // modelに値を設定してViewで利用できるようなる model.addAttribute("animations",animations); return "index"; } } Viewの修正 Animationモデルを受けっているので、Viewで表示していきます。 モデルのisBroadNowメソッドを利用して、放送中かどうかを判定しています。 index.html <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>アニメコム</title> </head> <body> <p>お気に入りのアニメとキャラクターを登録しよう</p> <table> <thead> <tr> <th colspan="2">アニメ情報</th> </tr> </thead> <tbody th:each="animation : ${animations}"> <tr> <td:block th:if="${animation.isBroadNow()}"> <td th:text="放送中">放送中</td> </td:block> <td:block th:if="${!animation.isBroadNow()}"> <td th:text="放送していません">放送していません</td> </td:block> <td th:text="${animation.title}">タイトル</td> <td th:text="${#strings.substring(animation.broadcast_start,0,10)}">放送開始日</td> </tr> </tbody> </table> </body> </html> 以下のように表示されていれば、データベースからレコードを取得して、Viewに表示するというところまでできました。 見た目も素晴らしいですね(笑) 登録処理を作成する サクッと登録処理を作成します。 コントローラーの修正 コントローラーに登録時ページへのマッピング情報を追加します。 モデルにリクエストクラスのインスタンスを設定しています。 このリクエストクラスは、HTMLのフォームの内容と紐づいております。 InitializeController.java package com.volkruss.application.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import com.volkruss.application.request.AnimationRequest; import com.volkruss.domain.model.Animation; import com.volkruss.domain.service.AnimationService; @Controller public class InitializeController { @Autowired private AnimationService animationService; @GetMapping("/") public String getIndex(Model model) { List<Animation> animations = animationService.getAnimationList(); // modelに値を設定してViewで利用できるようなる model.addAttribute("animations",animations); return "index"; } //追加 @GetMapping("/register") public String getRegister(Model model) { model.addAttribute("animationReqeust", new AnimationRequest()); return "register"; } } リクエストクラスの作成 formに紐づくリクエストクラスを作成します。 package com.volkruss.application.request; import java.util.Date; import org.springframework.format.annotation.DateTimeFormat; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @Setter @Getter @NoArgsConstructor public class AnimationRequest { private String title; @DateTimeFormat(pattern = "yyyy-MM-dd") private Date broadcast_start; @DateTimeFormat(pattern = "yyyy-MM-dd") private Date broadcast_end; } Viewの作成 register.htmlを追加します。ここでformを作成してPOSTにてデータを送信できるようにします。 register.html <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>アニメコム</title> </head> <body> <form th:action="@{register}" th:object="${animationReqeust}" method="POST" > <div> <label>タイトル</label> <input type="text" th:field="*{title}" required> </div> <div> <label>放送開始</label> <input type="date" th:field="*{broadcast_start}" required> </div> <div> <label>放送終了</label> <input type="date" th:field="*{broadcast_end}" required> </div> <button type="submit">登録する</button> </form> </body> </html> ついでにこのViewへのリンクをindex.htmlに作成します。 index.html <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>アニメコム</title> </head> <body> <p>お気に入りのアニメとキャラクターを登録しよう</p> <table> <thead> <tr> <th colspan="2">アニメ情報</th> </tr> </thead> <tbody th:each="animation : ${animations}"> <tr> <td:block th:if="${animation.isBroadNow()}"> <td th:text="放送中">放送中</td> </td:block> <td:block th:if="${!animation.isBroadNow()}"> <td th:text="放送していません">放送していません</td> </td:block> <td th:text="${animation.title}">タイトル</td> <td th:text="${#strings.substring(animation.broadcast_start,0,10)}">放送開始日</td> </tr> </tbody> </table> <!-- 追加 --> <a href="/register" th:href="@{/register}">新規登録する</a> </body> </html> コントローラーの作成 次にformの値を受け取る必要があるのでコントローラーを新しく作成します。 今回は妥当性確認処理などを省いて、フォームからの値を登録してトップページにリダイレクトさせています。 RegisterController.java package com.volkruss.application.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.PostMapping; import com.volkruss.application.request.AnimationRequest; import com.volkruss.domain.service.AnimationService; @Controller public class RegisterController { @Autowired private AnimationService animationService; @PostMapping("/register") public String register(AnimationRequest request,Model model) { animationService.insert(request); return "redirect:/"; } } 登録ロジックの作成 insert処理を作成します。 まずはserviceクラスを修正します。 モデルを作成してrepositoryに渡します。 AnimationServiceImpl.java package com.volkruss.domain.service.Impl; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.volkruss.application.request.AnimationRequest; import com.volkruss.domain.entity.AnimationRepository; import com.volkruss.domain.model.Animation; import com.volkruss.domain.service.AnimationService; @Service public class AnimationServiceImpl implements AnimationService{ @Autowired private AnimationRepository animationRepository; @Override public List<Animation> getAnimationList() { return animationRepository.getAll(); } // 追加 @Override public void insert(AnimationRequest request) { Animation animation = create(request); animationRepository.insert(animation); } // 追加 /** * <P> * リクエストからモデルを作成します。 * </P> * @param request * @return */ private Animation create(AnimationRequest request) { Animation animation = new Animation(); animation.setTitle(request.getTitle()); animation.setBroadcast_start(request.getBroadcast_start()); animation.setBroadcast_end(request.getBroadcast_end()); return animation; } } repositoryの修正 Mapperを利用してmodelをentityに変換したら、JPAのsaveメソッドを使ってデータベースにレコードを登録します。 AnimationRepositoryImpl.java package com.volkruss.infrastructure.repository; import java.util.List; import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import com.volkruss.domain.entity.AnimationEntity; import com.volkruss.domain.entity.AnimationRepository; import com.volkruss.domain.mapper.AnimationMapper; import com.volkruss.domain.model.Animation; @Repository public class AnimationRepositoryImpl implements AnimationRepository { @Autowired private AnimationJpaRepository animationJpaRepository; @Autowired private AnimationMapper animationMapper; /** * {@inheritDoc} */ @Override public List<Animation> getAll() { List<AnimationEntity> lists = animationJpaRepository.findAll(); return lists.stream().map(animationMapper::toAnimation).collect(Collectors.toList()); } // 追加 /** * {@inheritDoc} */ @Override public void insert(Animation animation) { AnimationEntity entity = animationMapper.toAnimationEntity(animation); animationJpaRepository.save(entity); } } Mapperの修正 modelをentityに変換します。 idはシーケンスを利用しているので勝手に連番が付与されます。 AnimationMapperImpl.java package com.volkruss.domain.mapper.impl; import java.util.Objects; import org.springframework.stereotype.Component; import com.volkruss.domain.entity.AnimationEntity; import com.volkruss.domain.mapper.AnimationMapper; import com.volkruss.domain.model.Animation; @Component public class AnimationMapperImpl implements AnimationMapper{ /** * {@inheritDoc} */ @Override public Animation toAnimation(AnimationEntity entity) { Animation animation = new Animation(); animation.setTitle(entity.getTitle()); animation.setBroadcast_start(entity.getBroadcast_start()); animation.setBroadcast_end(entity.getBroadcast_end()); return animation; } // 追加 /** * {@inheritDoc} */ @Override public AnimationEntity toAnimationEntity(Animation animation) { AnimationEntity entity = new AnimationEntity(); if(Objects.nonNull(animation.getId())) { entity.setId(animation.getId()); } entity.setTitle(animation.getTitle()); entity.setBroadcast_start(animation.getBroadcast_start()); entity.setBroadcast_end(animation.getBroadcast_end()); return entity; } } 確認 登録ページ 登録後  終わりに 取得と登録のみですができました。 本当なら妥当性確認などの処理も入ってきます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

VSCode + Remote Container でtypescriptの開発環境を試す。

1. はじめに 転職によって、これまで主で開発していたC++に加えて、他の言語でのソフトウェア開発も実施する必要が生じました。 勉強のため、自分の個人利用するUbuntuに開発環境をDockerで整えようと思ったのですが、開発ではいちいち「コンテナにログインして〜」をやりたくない(コンテナを意識したくない)と思いました。 SW開発環境の現場では、Dockerに慣れていない人もいるので、開発環境の配布を意識するならば、Dockerを意識させたくない、という気持ちもあります。 そのため、VSCodeからDockerコンテナの生成&そのままコーディングができるRemote-Containersをお試ししてみようと思います。 例として、typescriptの環境を構築します。 2. 参考ページ Microsoft社提供のNode.js & TypeScript Microsoft社がGithub上でMITライセンスで公開しているdevcontainerのサイト。基本的な使い方はこのページに記載されています。 【図解】VScodeのRemote Container拡張機能とは?わかりやすく Remote Containerの構成をわかりやすく図解していただいています。全体像を把握する際に参考にさせていただきました。 UbuntuにVSCodeをインストールする3つの方法 UbuntuへのVSコードのインストール方法を参照しました。 VSCodeのRemote-ContainerでReact(Node.js+TypeScript)環境をサクッと構築する。 今回の検証内容は、ほぼこちらのページに記載されている内容をベースとしています。 3. 動作環境 3.1 ホストサーバ OS : Ubuntu 20.04 CPU : Intel(R) Pentium(R) CPU G4560 @ 3.50GHz RAM : 8GB Software Docker : 20.10.5 VSCode : 1.59.0 前提事項 参考ページ[3]に記載されるMicrosoft社のリポジトリからVSCodeをインストールしています。 参考ページ[4]に記載されるVSCodeプラグインのDockerとRemote-Containers、日本語化はインストール済みとしています。 4. おためし 4.1. Microsofts社のdevcontainer 適当にプロジェクトフォルダを定めて、VSCodeの「フォルダを開く」からフォルダを開く。 ここでは「typescript-dev」というフォルダで作業します。typescriptフォルダは空フォルダです。 「表示」→「コマンドパレット」を開きます。 コマンドパレットに「type」と入力して、補完される「Node.js & TypeScript」を選択します。選択すると、Node.jsのバージョンを聞かれるので、defaultの16を選択します。 プロジェクトフォルダにtypescriptのremote container関連のコンフィグがダウンロードされます。 VSCode左下にある「><」みたいなボタンを押下して、「Reopen in Container」を押下します。 押下すると、VSCodeがtypescript開発用のdockerコンテナを生成します。 左側のツリーが下図のようになり、コンテナ内での開発環境を示すようになります。 ターミナルでコンテナの稼働状態を確認すると、以下のようになります。 $ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f1b712497ba1 vsc-typescript-dev-845af54d9de0baec27ffa4e44fac638d-uid "/bin/sh -c 'echo Co…" 4 minutes ago Up 4 minutes blissful_ishizaka $ docker image ls (必要な箇所のみ) REPOSITORY TAG IMAGE ID CREATED SIZE vsc-typescript-dev-845af54d9de0baec27ffa4e44fac638d-uid latest 153522c4976f 15 hours ago 1.12GB mcr.microsoft.com/vscode/devcontainers/typescript-node 0-16 74a984db505d 4 days ago 1.12GB VSCode左下にある「><」みたいなボタンを押下して、「Show Container Log」を押下して、コンテナ起動までのログを確認すると、build -> runの順で起動がしていることがわかります。 起動時に、ホスト側のプロジェクトフォルダを/workspace以下にマウントしているようです。 VSCode右下のターミナルエリアで、「+」を押下するとコンテナ内ターミナルを開くことができます。 (中略) Run: docker build -f /(プロジェクトdirのパス)/typescript-dev/.devcontainer/Dockerfile -t vsc-typescript-dev-845af54d9de0baec27ffa4e44fac638d --build-arg VARIANT=16 /(プロジェクトdirのパス)/typescript-dev/.devcontainer (中略) Run: docker run --sig-proxy=false -a STDOUT -a STDERR --mount type=bind,source=/(プロジェクトdirのパス)/typescript-dev,target=/workspaces/typescript-dev --mount type=volume,src=vscode,dst=/vscode -l vsch.local.folder=/(プロジェクトdirのパス)/typescript-dev -l vsch.quality=stable -l vsch.remote.devPort=0 --entrypoint /bin/sh vsc-typescript-dev-845af54d9de0baec27ffa4e44fac638d-uid -c echo Container started VSCodeのツリーからプロジェクトフォルダ直下にHelloWorld.tsファイルを作成し、以下のようなHelloWorldを記述します。 console.log("HelloWorld! TypeScript."); VSCode上部の「実行」→「デバッグなしで実行」を実行したとき、デバッグコンソールエリアに「HelloWorld! TypeScript.」が表示されれば成功です。 または、ターミナルエリアでコマンドでコンパイルすることもできます。 node ➜ /workspaces/typescript-dev $ ls HelloWorld.ts node ➜ /workspaces/typescript-dev $ tsc HelloWorld.ts node ➜ /workspaces/typescript-dev $ ls HelloWorld.js HelloWorld.ts node ➜ /workspaces/typescript-dev $ nodejs HelloWorld.js HelloWorld! TypeScript. node ➜ /workspaces/typescript-dev $ 終了するときは、VSCode左下にある「><」みたいなボタンを押下して、「リモート接続を終了する」を押下することで終了できます。 コンテナはstop状態となる。(rmはされない) 4.2. 所感 使用してみたところ、そのまま使うと、毎回Docker buildが実行されて、コンテナイメージが増得てしまうことが微妙に感じました。 ただし、これはdevcontainer.jsonの設定でdockerComposeFileを指定すればよさそうです。 ↑ docker-compose.ymlでimageを指定できるのですが、指定したimageをベースにVSCodeがさらにdocker buildしてしまう状態です。UIDに基づいてbuildが走っているっぽいのですが、原因がよくわからないです。(ご存知の方がいらっしゃいましたら教えていただきたく。。。) ただ、VSCodeの「Reopen in Container」でコンテナを開かなくても動作中のコンテナにattachすることもできるので、その方式でも良い気がします。 4.3. Attachでコンテナ接続 フォルダ内のファイル構成は以下のような感じです。 docker-compose.ymlで指定するimageは4.1.で利用したMicrosoft社提供のイメージを使用します。 $ tree ../typescript-dev/ ../typescript-dev/ ├── HelloWorld.ts └── docker-compose.yml 0 directories, 2 files $ cat docker-compose.yml version: '3' services: develop-env: image: mcr.microsoft.com/vscode/devcontainers/typescript-node:0-16-buster volumes: - ./:/workspace/ command: sleep infinity VSCodeを開き、プロジェクトのフォルダを開きます。 docker-compose.ymlファイルで右クリック→「Compose Up」でコンテナを起動させます。 VSCode左下にある「><」みたいなボタンを押下して、「Attach to Running Container...」を選択します。 どのコンテナにアタッチするか問われるので、コンテナを選択します。 選択後、コンテナにアタッチした状態で別ウィンドウでVSCodeが開きます。 コンテナにアタッチしたVSCodeにて、プロジェクトフォルダを開けば開発ができる。 終わりするときは、docker-compose.ymlファイルで右クリック→「Compose Down」でコンテナを停止&削除させます。 5. おわりに Remote Container便利ですね。巷でみなさんが活用されているのがよくわかりました。 docker-compose.yml指定時のdevcontainerの挙動(再度buildが走る)がちょっとよくわからないです。。。 Attachが使えるだけでもすごく便利です。既存の開発環境コンテナにVSCode Serverを入れ込みたいくらいです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails+Docker+MySQLのアプリをHerokuへデプロイする手順とエラーになったポイント

この記事では、Herokuへのデプロイ手順と私が引っかかったエラーを書き留めています。 説明不足、理解不足なところもあるかと思いますので、その際はご教授いただけると嬉しいです。 バージョン Rails 6.1.3 Ruby 2.6.8 MySQL 8.0 ストレージ AWS S3 Herokuへのデプロイでエラーになったポイント 最終的に以下の2つのポイントが原因でHerokuデプロイ時にエラーが出ていました。 bundlerバージョンが違う Herokuではデフォルトのbundlerバージョンが指定されています。 Gemfile.lockの末尾で確認できるBUNDLED WITHが 2.〜の場合はbundler2.0.2が、 1.〜の場合はbundler1.17.3が 指定がない場合はbundler1.17.3のバージョンが使われます。 私の場合、Ruby 2.6を使用していたため、bundlerバージョン1.17.2が入っており、これがHerokuデフォルトのbundlerバージョンである1.17.3より古いバージョンであることが原因で、デプロイ時エラーになっていたことが考えられます。 また、Ruby2.6からbundlerは組み込みになったため、bundlerの追加はできても、組み込みのbundlerバージョン自体は削除できません。 そのため、原則はRubyに組み込まれているbundlerのバージョンのままHerokuにデプロイするのが良さそうです。 環境変数の未設定 これはHerokuの仕組みをよく理解していないことから起こったイージーミスでした。。 環境変数の設定は下記で順番に説明していきます。 また、すでにHerokuにはログインしている前提で話を進めていきます。 config/database.yml を設定する config/database.yml production: <<: *default database: <%= ENV['APP_DATABASE'] %> username: <%= ENV['APP_DATABASE_USERNAME'] %> password: <%= ENV['APP_DATABASE_PASSWORD'] %> host: <%= ENV['APP_DATABASE_HOST'] %> まずこのように環境変数を設定します。 なお、環境変数は任意の名前で設定します。 私の場合は「APP_DATABASE〜」としています。 Herokuにアプリを作成 $ heroku create アプリ名 これでHerokuにアプリが登録されます。 このアプリ名は世界中で名前がカブらないように設定しないとエラーになります。 $ heroku create また、アプリ名を指定しなければ、Herokuがカブらないアプリ名を自動で作成してくれます。 Herokuにデータベースを作成 $ heroku addons:create jawsdb:kitefin 私は開発環境でMySQL8.0を使用しており、本番環境でもバージョンを統一させるためにjawsDBを選択しました。 (ちなみにclearDBがMySQL5.7まで対応のためです) 今回は説明用のため無料プランであるkitefinを入力しています。 $ heroku addons:create jawsdb:kitefin -a herokuのアプリ名 --version=8.0 またこのように入力すればバージョンの指定もできます。 現在のjawsDB MySQLデフォルトのデータベースバージョンは8.0となっているため、コマンドで指定しなくても8.0がcreateされます。 Herokuに各環境変数をセットする 環境変数の設定作業はHeroku上からでも設定できますが、今回はコマンド入力で進めていきます。 Heroku上で設定する場合、Herokuのアプリを開き、Settingsの中の「Config Vars」というところから環境変数をAddできます。 データベースURL $ heroku config:get CLEARDB_DATABASE_URL まずはこちらのコマンドを入力し、DB接続情報を確認します。 表示された情報を元に下記コマンドでMySQL2のURLをセットします。 $ heroku config:set DATABASE_URL='mysql2://ユーザー名:パスワード@ホスト名/データベース名?reconnect=true' ユーザー名 続いて先程のユーザー名の部分をコピーして次のように変数をセットします。 $ heroku config:add APP_DATABASE='ユーザー名' -a アプリ名 パスワード $ heroku config:add APP_DATABASE_PASSWORD='パスワード' -a アプリ名 パスワードも同じように入力します。 ホスト名 $ heroku config:add APP_DATABASE_HOST='ホスト名' -a アプリ名 ホストも同じように入力します。 データベース名 $ heroku config:add APP_DATABASE_HOST='データベース名' -a アプリ名 続いてデータベース名も入力。 S3アクセスキーID AWS S3をストレージとして使用している場合も同じように環境変数を設定していきます。 $ heroku config:add AWS_ACCESS_KEY_ID='アクセスキーID' -a アプリ名 S3シークレットアクセスキー $ heroku config:add AWS_SECRET_ACCESS_KEY='アクセスキーID' -a アプリ名 もし、Google mapなどのAPIをアプリケーションで使っているなら、そちらのAPIキーも同じように入力していけばOKです。 Herokuにアプリをデプロイする 環境変数の設定ができたら、いよいよデプロイに入ります! $ git add . ステージング環境にaddします。 $ git commit -m "heroku first commit" ローカルリポジトリにコミットして $ git remote add heroku Herokuのgit URL Herokuと繋ぎます。 git URLはHerokuのアプリページの中のSettingsで確認することができます。 (コマンドを入力したあと、error: remote heroku already exists.と出たらすでにこの作業は完了しています。) https://git.heroku.com/アプリ名.git URLはこのようになっています。 $ git push heroku master あとはHerokuにpushすればアプリのデプロイは完了です。 ブランチを切って作業している場合は $ git push heroku ブランチ名:master こちらのコマンドでpushします。 最終的には環境変数の設定は以下のようになりました。 JAWSDB_URL以下の環境変数はデプロイ時に設定されたものです。 最後にrails db:migrate 上記の設定でデータベースの作成までが完了しているため、最後に $ heroku run rails db:migrate こちらのコマンドを入力すれば、デプロイしたアプリケーションが正常に起動するはずです! もし、エラーが出たときは、その都度 $ heroku logs --tail こちらのコマンドでlogを確認してエラーの原因を探ります。 また、エラーを確認するために便利なaddons(papertrailなど)も用意されていますので、ご興味の有る方は調べてみてください。 この記事が、Herokuデプロイで困っている方の助けになると嬉しいです。 また誤っている箇所があれば、ご指摘いただけると非常に助かります。 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

dokcer基礎勉強

前提 ・この記事を書いている筆者は駆け出しエンジニアで、Dockerを触ったことはありません。 ・この記事は、現時点では筆者の勉強用のメモ記事の為、正確な情報、最新な情報ではないので、予めご了承ください。 Dockerを勉強することになったきっかけ 会社の社内システムを作ることになり、環境構築をどうしようか悩み、どうせならdockerを使って環境構築し本番環境もdokcerで構築したいと思い、勉強を始めました٩( ᐛ )و Dockerとは何か? Dockerは、インフラ関係やDevOps界隈で注目されている技術の一つで、コンテナ型の仮想環境を作成、配布、実行するためのプラットフォームです。 Dockerは、Linuxのコンテナ技術を使ったもので、よく仮想マシンと比較されます。VirtualBoxなどの仮想マシンでは、ホストマシン上でハイパーバイザを利用しゲストOSを動かし、その上でミドルウェアなどを動かします。 それに対し、コンテナはホストマシンのカーネルを利用し、プロセスやユーザなどを隔離することで、あたかも別のマシンが動いているかのように動かすことができます。 そのため、軽量で高速に起動、停止などが可能な便利ツールです! dockerの歴史 勉強中です・・・ dokcerの使用場面 ・アプリケーションの開発環境 ・検証環境、本番環境 ・Webサーバー、DBサーバーの構築 ・各種アプリケーション Dockerのメリット Dockerのメリットはたくさんありますが、一番は、ミドルウェアのインストールや各種環境設定をコード化して管理できることではないでしょうか? これはInfrastracture as Code(IaC)と呼ばれていて、ソフトウェア開発で実施されてきた構成管理や自動化などを、サーバーの各種設定やミドルウェアのインストールなどにも適用したものです。 これらにより、以下のような利点が生まれます。 1、コード化されたファイルを共有することで、どこでも誰でも同じ環境が作れる。 2、作成した環境を配布しやすい。 3、スクラップ&ビルドが容易にできる。 Dockerコマンドの紹介 dockerコマンドとは? ・Docker run コマンドは複数のコマンドを統合している       docker pull イメージの取得  docker create コンテナの作成 docker start コンテナの起動 タグを指定している docker run hello-world:latest イメージの後ろにコンテナないで呼び出すコマンドを記載できる。 docker run docker/whalesay cowsay Hello!  pullしたイメージの一覧を確認することができる docker images イメージをコピーするコマンド docker tag 元のイメージ名 新しいイメージ名 イメージのタグを変更するコマンド docker tag 元のイメージ名 新しいイメージ名:タグ名 イメージの詳細情報を取得するコマンド docker inspect 対象のイメージ イメージの削除コマンド docker rmi イメージ名 [強制] docker rmi -f イメージ名 イメージの取得 docker pull イメージ名 dockerfile dockerfileとは? dockerfileからイメージを作ることをビルドと言う。 FROM 取得するイメージ:タグ RUN ビルドの際に実行する命令 CMM コマンド dockerfileからイメージをビルドするコマンド docker build -t (タグ名) .(ビルドコンテキストの位置) キャッシュを残さない方法 docker build —no-cache -t nginx . コンテナを立ち上げるコマンド docker run —name <コンテナの名前> -d -p <ホスト側のポート番号>:<コンテナ側のポート番号> <イメージ名> バインドマウントをしようする場合のコマンド Docker run —name <コンテナの名前> -d  \ -v <ホスト側のディレクトリ>:<コンテナ側のマウントポイント>:<オブション>  \ -p <ホスト側のポート番号>:<コンテナ側のポート番号> <イメージ名> Dockerコンテナを終了時にコンテナを削除するコマンド Docker run —name test -d ーーrm nginx ホストマシンのファイルをコンテナ内にコピーする方法 Docker cp <ホスト上のコピーしたいファイルパス> <コンテナ名>:<コピー先のパス> (逆を行いたい場合は以下を実行) Docker cp <コンテナ名>:<コンテナ上のコピーしたいファイルパス> <コピー先のパス> Dockerfileのaddは色々な機能があるので、使う時には調べてからしようする。 コンテナの作成時には、以下のコマンドを使用する。 Docker create —name <コンテナ名> -it  <イメージ名> /bin/bash コンテナの一覧を表示するコマンド Docker ps -a コンテナの中身を見るコマンド Docker inspect <コンテナ名> コンテナのシェルの接続方法 Docker exec -it <コンテナ名> /bin/bash Dockerのコンテナをイメージ化する Docker commit <コンテナ名> <イメージ名><タグ名> Automated Buildの概要 Githunのビルドコンテキスト(Dockerfileなど)を管理し、変更が確認出来次第自動的にDockerHubにビルドを実行する仕組みのこと (現在は有料プラン) ←その為、今回の学習には入れていません。 Docker machine Docker engineを搭載した仮装マシンの作成、起動、停止、再起動などを行えるツール。 ローカルだけでなく、リモートのクラウドサーバー上にもdockerホストを立ち上げることが可能。 Docker-machine ls で一覧を表示 Dockerホストの作成のしかた Docker-machine create —driver virtualbox <作成するホストの名前> Dockerホストに接続する方法 接続するためのコマンドを知ることができる Dokcer-machine env <ホストの名前> コマンドを実行すると以下のコマンドが出てくるので実行。 このコマンドでdockerホストの環境を作成したdocker-machineの環境に変更することができる。 eval $(docker-machine env docker-machine) 環境変更に成功するとACTIVEの欄に星マークが着く NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS docker-machine * virtualbox Running tcp://192.168.99.103:2376 v19.03.12 Dokcerホストへの環境ログイン方法 Docker-machine ssh <ホスト名> Docker-machineのIPアドレスの確認コマンド Docker-machine ip <ホスト名> Docker-machineのアクティブを消す方法 Docker-machine env -u コマンドを実行すると以下のコマンドが出てくるので実行。 このコマンドでdockerホストの環境を作成したdocker-machineの環境に変更することができる。 eval $(docker-machine env -u) Dockerネットワーク dockerネットワークとは? ホスト内のネットワークの確認 Docker network ls コンテナはデフォルトではdefaultのネットワークに属する ネットワークの詳細を知るには以下のコマンドを実行 Docker network inspect <ネットワーク名> コンテナのIPアドレスを確認する方法 Ip add show でぉるとのネットワーク環境ではDNSサーバーがないためにコンテナ名での通信を行うことができない。 ↓ユ ユーザー定義のbrifgeを作成することで可能になる ネットワーク作成コマンド Docker network create <ネットワーク名> 作成したネットワークにコンテナを接続する方法 Docker network connect <ネットワーク名> <コンテナ名> 最初から特定のネットワークに接続した状態のコンテナの作成方法 Docker run -itd —name alpine3 —network <ネットワーク名> <イメージ名> ネットワークからコンテナを切断する方法 Docker network disconnect <ネットワーク名> <コンテナ名> -p コマンドを指定することで外部から接続することが可能 Docker-machineホストのIPアドレスの確認方法 Docker-machine ip <ホスト名> dockerのデータ管理 ・volume Volumeのファイルの作成の仕方 Docker volume create <ファイル名> 用語 Dockerイメージ、Dockerコンテナ、Dockerリポジトリ、DockerHub、ホストOS、ゲストOS、ホスト型仮想化、コンテナ型仮想化,仮想化のオーバーヘッド、アプリケーション実行の再現性、OSの自由度、分離レベル,Dockerデーモン、Dockerクライアント,バインドマウンド、Kubernetes、パワーシェル、レジストリ、リポジトリ、タグ、ビルド、ファイルシステム、ストレージドライバ、AUFS、エイリアス標準入力、TTY、フォアグラウンド デーモン Linuxにおいて常駐型のプログラムのことをデーモンと言います。 例えば、Webサーバーのプログラムなどはデーモンとして起動し続け、クライアントからのリクエストがあった際に常に応答を返せるように常駐します。 リバースプロキシ クライアントとサーバの通信の間に入って、サーバの応答を代理(proxy)しつつ通信を中継する機能、あるいはその役割を担うサーバのことをリバースプロキシといいます。 環境変数 OSが設定値などを永続的に保存し、利用者や実行されるプログラムから設定・参照できるようにしたもの。
Dockerではコンテナ起動時に環境変数を設定することで、コンテナ起動時に外からアプリケーションで使用するパラメータや、パスワードといった秘匿情報を渡すことができます。 
 名前解決 IPネットワークにおいて、ドメイン名やコンピュータのホスト名、コンテナ名などからコンピューターが通信時に使用するIPアドレスを検索することを指す。
IPアドレスがわからないと異なるホスト間やコンテナ間で通信できないため、名前からIPアドレスを照会するためのシステムとしてDNSが使用されます。
また、DNSを使わずに名前解決する方法として、hostsと呼ばれる設定ファイルにホスト名とIPアドレスの対応を記載することで、hostsファイルを元に名前解決することもできます。 
 hostsファイル 手動でホスト名とIPアドレスの対応を管理するための設定ファイル。
名前解決のために使用される。 ブリッジネットワーク 同一のDockerホスト上でコンテナ間通信するために使用されるネットワークです。
同一のブリッジネットワークに属するコンテナ同士は相互に通信することができます。 
 デフォルトゲートウェイ 異なるネットワークに出る場合の出口となるIPアドレスのことをデフォルトゲートウェイと呼びます。
例えばインターネット上のサーバーのIPアドレスと通信する場合、PCはデフォルトゲートウェイを経由してインターネットに出て対象のサーバーと通信します。
この際デフォルトゲートウェイのIPを持つネットワーク機器は異なるネットワークと通信するためのルーティング情報(経路情報)が設定されている必要があります。 ループバックアドレス ホストが自分自身のホストを指す特殊なアドレスのことです。
127.0.0.1のアドレスがループバックアドレスを指します。
また通常localhostというホスト名は127.0.0.1を指します。 オーバーレイネットワーク 複数のDockerマシン(Dockerデーモンが動作するホスト)間で相互通信を可能にするためのネットワークをオーバーレイネットワークと言います。
ネットワーク上に存在するホストの情報や状態管理を行うためにキーバリューストア(データベース)が別途必要になります。
コースでは、Consulというキーバリューストアのソフトを仮想マシンにインストールして、オーバーレイネットワークを構築します。 参考資料 ↓Docker入門(第一回)~Dockerとは何か、何が良いのか~ https://knowledge.sakura.ad.jp/13265/ 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

WindowsでのUbuntu/Dockerを使った開発環境構築[2021] part2

はじめに この記事は前回の続きになっております。 気が向いたらそちらもご覧ください。 おさらい 現状、WindowsPC上にDocker DesktopとWSL2で動くUbuntuのインストールまで完了しました。 一応Ubuntu上でpythonを動かす最低限の設定もしていますが、これは念のためです(前の記事書いたときにそんな深く考えてなかった。。。) これからの流れ python3開発環境用のDockerfileの作成 起動する用のdocker-compose.ymlの作成 コンテナの起動 VSCodeでContainer内に入って開発 ここで力尽きたので、以下あとでちゃんと書きます。。。 python3開発環境用のDockerfileの作成 いい感じに作りましょう。 (あとでサンプル載せます) ポイントはrequirements.txtを使って必要なライブラリを管理しましょうというくらいですかね。 起動する用のdocker-compose.ymlの作成 今回の一番のポイント。 コンテナは、コードを実行せずに起動すると即終了します(たぶん)。 ymlファイルの中にstdin_open: trueを記述することです。 これで標準入出力をopenにしてコンテナが停止するのを防げます. (あとでサンプル載せます) コンテナの起動 composeファイルで楽したので、docker-compose up しましょう。 もしDockerfileを変更したりしたら、--buildもお忘れなく。 VSCodeでContainer内に入って開発 左に出ているRemote ExplorerでContainerを選択すると、入れます。 勢いでとりあえずメモ程度に走り書きしたので、随時更新していく予定でやんす。 あー夏休みーー。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む