20210415のdockerに関する記事は12件です。

WordPress開発環境をwp-envで簡単に作る

npmの @wordpress/env を使うとメチャクチャ簡単にDockerでWP環境が作れました。 基本的に公式ドキュメント通りに設定するだけです。 @wordpress/env をインストール # グローバルに入れるか npm -g i @wordpress/env # ローカルプロジェクトに入れる npm i @wordpress/env --save-dev WP環境の立ち上げ wp-env start おしまい なんですが個人的に必要な設定など 入れておくと便利な設定 .wp-env.json に設定を書きます { // ローカルのテーマを同期 "themes": [ "./wordpress/wp-content/themes/my_themes" ], "mappings": { // テーマ以外に同期させたいフォルダ、ファイルの設定 // アップロードしたファイルも同期させる "wp-content/uploads": "./wordpress/wp-content/uploads", // DBのDumpデータをインポートしたいので同期 "import.sql": "./import.sql" }, // 使いたいプラグインを入れる "plugins": [ "https://downloads.wordpress.org/plugin/advanced-custom-fields.5.9.5.zip", "https://downloads.wordpress.org/plugin/no-category-base-wpml.zip", "https://downloads.wordpress.org/plugin/wp-pagenavi.2.93.4.zip", "https://downloads.wordpress.org/plugin/contact-form-7.5.4.zip", "https://downloads.wordpress.org/plugin/flamingo.2.2.1.zip", "https://downloads.wordpress.org/plugin/favicon-rotator.zip", "https://downloads.wordpress.org/plugin/all-in-one-seo-pack.4.1.0.1.zip", "https://downloads.wordpress.org/plugin/custom-post-type-ui.1.9.0.zip", "https://downloads.wordpress.org/plugin/taxonomy-terms-order.1.5.7.5.zip", "https://downloads.wordpress.org/plugin/custom-post-type-permalinks.3.4.4.zip", "https://downloads.wordpress.org/plugin/really-simple-csv-importer.zip", "https://downloads.wordpress.org/plugin/rs-csv-importer-media-addon.1.1.0.zip", "https://downloads.wordpress.org/plugin/tinymce-advanced.5.6.0.zip" ] } DBのインポート npx wp-env run cli wp db import import.sql ※こちらの記事は自ブログからの転載です
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DockerでNext.js with-typescript-eslint-jest

環境 ProductName: Mac OS X ProductVersion: 10.15.7 BuildVersion: 19H524 Docker version 20.10.5, build 55c4c88 docker-compose version 1.28.5, build c4eb3a1f Docker準備 FROM node:14.16.1-alpine3.13 WORKDIR /usr/src/app docker-compose.yml version: '3' services: node: build: context: . dockerfile: Dockerfile volumes: - ./:/usr/src/app command: sh -c "cd app && npm run dev" ports: - '3000:3000' create-next-appコマンドをインストール $ docker-compose run --rm node npm install create-next-app create-next-appコマンドを実行 templateをwith-typescript-eslint-jest プロジェクト名をapp $ docker-compose run --rm node npx create-next-app --example with-typescript-eslint-jest app docker-compose up $ docker-compose up http://localhost:3000 にアクセス
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

JetsonXavierのDocker上でYOLOを走らせる

備忘録 https://ngc.nvidia.com/catalog/containers/nvidia:l4t-pytorch ここのimageを使用する pip3 install -U pipをする? yoloのrequirement.txtをそのままpip installすると、torchとpytorchのバージョンが変わってしまうため、txtから削除 txtから、pyyaml, opencvのバージョンも削除 --runtime nvidiaを忘れると、torchが動かない xtermを入れる docker-compose
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ローカル環境にDockerを使用しLaravelをgitからclone後、php artisan migrateのエラーでハマった件

どうも、初心者プログラマーTKOです。 今回は新しいdocker環境を試そうと今まで作っていたLaravelアプリをgitからcloneした際に、php artisan migrateのエラーではまった件について話させていただきます。 新規Laravelプロジェクト 初期設定 リポジトリをクローン後 $ docker-compose up -d --build $ docker-compose exec app bash # composer install これで設定したローカルのポート番号にアクセスするとLaravelの画面が表示されます。 ここから mysqlのDockerfileで設定した MYSQL_DATABASE=laravel_local MYSQL_USER=phper MYSQL_PASSWORD=*** MYSQL_ROOT_PASSWORD=*** の値を参考にホスト側の.envファイルを設定します。 DB_PORT=3306 DB_DATABASE=laravel_local DB_USERNAME=phper DB_PASSWORD=*** その後 # cp .env.example .env # php artisan key:generate 後はマイグレーションで終わり と思ったのですが、、、 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 /work/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 Doctrine\DBAL\Driver\PDO\Exception::("SQLSTATE[HY000] [2002] Connection refused") /work/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDO/Exception.php:18 2 Doctrine\DBAL\Driver\PDO\Exception::new(Object(PDOException)) /work/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:42 Please use the argument -v to see more details. 出ました!予想外のエラー、、、 とりあえず何らかのキャッシュが残っているんだろうなと思い # php artisan config:clear # composer dump-autoload を試してみましたが解決せず DBが登録されていないのかと思いDB内に入るも $ docker-compose exec db bash # mysql -u phper -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.0.22 MySQL Community Server - GPL Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. 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 | | laravel_local | +--------------------+ 2 rows in set (0.02 sec) ちゃんと登録されている、、、 調べたところ .envの DB_HOST=127.0.0.1 が DB_HOST=db だそうです! なるほど、dockerはコンテナ同士で通信してるからローカルのIPアドレスを指定しても意味ないってことですね。 以後気をつけます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

dockerのノート

はじめ dockerのノート コンテナの学習やっていく M1 Macの場合はこちらの記事を参考に Rosettaとやらをインストールしてdocker を利用する。 softwareupdate --install-rosetta M1 Macで通らなかった動作しなかったコマンドについては 動かなかった旨を残しておきますが、どうやらnginx程度はちゃんと動く模様。 あると便利なコマンド watch コマンド brew install watch でインストールできる。 コマンドの実行結果を常に監視したい時に便利 watch -t "docker ps" 実行環境 M1 MacBook macOS Big Sur version 11.2 MacBook Air (M1, 2020) Apple M1 メモリ 16GB SSD 256GB Docker version 20.10.3, build 48d30b5 または Windows 10 SurfaceBook docker の操作コマンド 基本 プロセスを表示 docker ps イメージを取得 (Pull) # nginx を取得する。 docker pull nginx イメージを表示 (List) docker images イメージの履歴を表示 (History) docker history nginx イメージを削除 (Delete Docker Image) docker rmi nginx docker images nginx を操作 nginxサーバーのコンテナを取得して起動して停止する例 # nginx のdockerイメージを取得する。 docker pull nginx # nginx のdocker イメージを起動する。 docker run -p 80:80 --name nginx nginx # 作動中のコンテナ一覧を表示 (List) docker ps # Webページをcurlを使って取得 curl localhost:80 # nginx コンテナを停止 docker stop nginx # 停止中のコンテナも全て一覧表示 docker ps --all # nginx コンテナを削除 docker rm nginx # 停止中のコンテナも全て一覧表示 docker ps --all nginx を操作(バックグラウンド) nginxサーバーのコンテナを取得してバックグランド起動して停止する例 # nginx のdockerイメージを取得する。 docker pull nginx # nginx のdocker イメージを起動する。 docker run --detach -p 80:80 --name nginx nginx # 作動中のコンテナ一覧を表示 (List) docker ps # Webページをcurlを使って取得 curl localhost:80 # nginx コンテナを停止 docker stop nginx # 停止中のコンテナも全て一覧表示 docker ps --all # nginx コンテナを削除 docker rm nginx # 停止中のコンテナも全て一覧表示 docker ps --all nginx の操作(nginx内を探索する) nginxのConfigファイルを見つける # nginx のdocker イメージを起動する。 docker run --detach -p 80:80 --name nginx nginx # 作動中のコンテナ一覧を表示 (List) docker ps # Webページをcurlを使って取得 curl localhost:80 # sh でコンテナに乗り込む docker exec -it nginx sh # ファイルを探索する find / -type d -name nginx | xargs grep -r html # nginx コンテナを停止 docker stop nginx # 停止中のコンテナも全て一覧表示 docker ps --all # nginx コンテナを削除 docker rm nginx # 停止中のコンテナも全て一覧表示 docker ps --all nginx を操作する(トップページを上書きする) nginx のデフォルトページを「Hello,World」に書き換える。 # nginx のdocker イメージを起動する。 docker run --detach -p 80:80 --name nginx nginx # 作動中のコンテナ一覧を表示 (List) docker ps # Webページをcurlを使って取得 curl localhost:80 # sh でコンテナに乗り込む docker exec -it nginx sh # ファイルを探索する find / -type d -name nginx | xargs grep -r html # 格納先されているデフォルトのWebページを表示 cat /usr/share/nginx/html/index.html # Hello,Worldで上書き echo "Hello World" > /usr/share/nginx/html/index.html # sh から抜ける exit # Webページをcurlを使って取得 「Hello,World」と表示されていればOK curl localhost:80 # nginx コンテナを停止 docker stop nginx # 停止中のコンテナも全て一覧表示 docker ps --all # nginx コンテナを削除 docker rm nginx # 停止中のコンテナも全て一覧表示 docker ps --all docker rmi と docker rmの違い docker イメージを削除するのは rmi docker コンテナを削除するのは rm 他、コンテナのデバッグに使えそうなコマンド コンテナのログを表示 (Log) コンテナ内の実行ログを確認できる。 例) localhost:80にcurlした時に残るnginxコンテナのログ 172.17.0.1 - - [21/Feb/2021:13:07:45 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.64.1" "-" docker logs nginx コンテナのメタデータを見る (Inspect Docker container) docker inspect nginx 起動中のコンテナから自作イメージを作成 # nginx のdockerイメージを取得 docker pull nginx # カレントディレクトリに「Hello World2」と記載したindex.htmlを用意 echo "Hello World2" > $(pwd)/index.html # nginx イメージを用いてhelloという名前でコンテナをバックグランドで実行 # この時 ワーキングディレクトリをボリュームマウント docker run -d --volume "$(pwd)":/usr/share/nginx/html -p 80:80 --rm --name hello nginx # curl を実行して動作確認 curl localhost > Hello World2 # コンテナ内のログを確認 # 直前のcurl のログが見える docker logs hello > 172.17.0.1 - - [28/Feb/2021:13:34:07 +0000] "GET / HTTP/1.1" 200 13 "-" "curl/7.64.1" "-" # helloコンテナからイメージを作成 docker commit hello hello_world # イメージ一覧を表示 # オリジナルイメージ、hello_worldが作成できていることを確認 docker images > hello_world latest d7e0f64fec8f 6 seconds ago 126MB
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerのhttp_proxyで詰まった話

概要 proxy環境下でdockerを使うために設定をしていたとき、http_proxy,https_proxyがどうしても上手く読み込めてなかったので何をして何が原因で何をしたのかをここに残す。 設定時 DockerはLinuxシステムの環境変数にあるhttp_proxyやhttps_proxyとは別に、専用のproxy設定を施す必要がある。 なのでこのサイトを参考に設定をした。 そのときのconfファイルの設定内容はこんな感じ。(実際の接続先URLは載せるわけにはいかないので、例として架空のurlを用いる) /etc/systemd/system/docker.service.d/http-proxy.conf [Service] Environment="HTTP_PROXY=http://aaaa:admin!@example.ad.jp:8080" のように書き込んだ。 これでdocker pull イメージ名を実行したところ以下のようなエラーが出力された。 Error response from daemon: Get https://registry-1.docker.io/v2/: proxyconnect tcp: dial tcp: lookup https on xxx.xxx.xxx.xxx:xx: no such host 解決策 http://aaaa:admin!@example.ad.jp:8080の!をURLエンコードしてやればよい。 どうやらLinuxにおいて!(エクスクラメーションマーク)は特別な意味を持つ記号で、通常の'(シングルクォーテーション)を用いたエスケープが効かないそうだ。 ※¥(円マーク)でエスケープはできたがURLにそのまま残ってしまう↓ http://aaaa:admin¥!@example.ad.jp:8080 ↑この場合PWの一部として円マークが認識されてしまう ※参考ページ: bashに !' で event no found と怒られた理由を考えてみる - https://qiita.com/Qutjl/items/6e0056853c94011d245b URLなので%21のようにエンコードすればどうにかなるんじゃねと思い、やってみたところできてたっぽい (この時上記に関係ないエラーが発生して、それを勘違いして最初はこの方法でもできてないと思った) ↓URLエンコードバージョン /etc/systemd/system/docker.service.d/http-proxy.conf [Service] Environment="HTTP_PROXY=http://aaaa:admin%21@example.ad.jp:8080" ちなみにdocker infoを実行することでDockerに関する情報が出力される。先ほどのProxy設定情報も出力される。 [root@hogehoge ~]# docker info ~中略~ HTTP Proxy: http://xxxxx:xxxxx@example.ad.jp:8080 HTTPS Proxy: https://xxxxx:xxxxx@example.ad.jp:8080 ~中略~ エスケープしても上のようにusername@passwordが伏字になってしまうことがある。 しかしsystemctl show docker --property EnvironmentでProxy設定情報を確認すると Environment=HTTP_PROXY=http://aaaa:admin%21@example.ad.jp:8080 HTTPS_PROXY=https://aaaa:admin%21@example.ad.jp:8080 このようにエクスクラメーションマークがエスケープされて登録されていることがわかる。 なぜ伏字になるのかは不明。 余談 上にも書いたが、URLエンコードで対応してもエラーが発生した。このエラーは以下のようなものだった Get https://registry-1.docker.io/v2/: proxyconnect tcp: tls: first record does not look like a TLS handshake 上手くTLSのコネクションがはれていないのかなと思いググってみた。 すると以下のページに答えが載っていた。 VagrantをProxy経由で利用する - https://qiita.com/daichannel/items/08e074a01e8ab41d52f7#docker 単純にHTTPS_PROXYに設定するURLのスキームをhttpにすれば良いだけだった。 (なぜhttpsではダメなのかは不明。これでいいのか感が否めない・・・) /etc/systemd/system/docker.service.d/https-proxy.conf [Service] Environment="HTTPS_PROXY=http://aaaa:admin%21@example.ad.jp:8080" 余談2 今回は通常のURLエンコードでどうにかなったが、場合によっては%を2回続けないと反映されないらしい。 上記のhttps-proxy.confを例にすると /etc/systemd/system/docker.service.d/https-proxy.conf [Service] Environment="HTTPS_PROXY=http://aaaa:admin%%21@example.ad.jp:8080" このようにエクスクラメーションマークを変換する際は%%21と%を2回続けると上手くいくこともあるらしい。 どうやらsystemctlでは%ダブルで$や%などの特殊文字をエスケープしているらしい(?) 参考ページ:https://forums.docker.com/t/proxy-settings-do-not-work-for-either-etc-default-docker-or-systemd-drop-ins/68891/17 結論 systemctlのconfファイルに用いる!はLinuxにおける通常のエスケープ方法が効かないことがわかった。 Linuxシステムにおいて!は扱いが特殊なので、そもそもURLなどに混ぜるべきではないと思った。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Catalyst 9300 Docker の上で ThousandEyes Agent の起動と設定

これはなに? こちらの絵が、やりたいことです! Catalyst9300 に ThousandEyes のDockerエージェントをインストールして設定して動作確認します。Catalyst9300上の Docker アプリのホストの仕方の参考にもなります。 ThousandEyes いろんなところに配置したソフトウェアエージェントを使って、任意のポイント間を任意のテストトラフィックを発生させて、そのネットワークのサービスレベルを可視化、それがクラウドポータルからめちゃくちゃ簡単にできるという、サウザンドアイズという会社およびサービスがありました。いろんなところにお目々? があるという感じですね。実際にはお目々は見ているというより、何かを発生させる(TracerouteしたりWebにHTTPしたり拠点間でRTP出したり)のでちょっとミスリーディングかも。実際に流れているものを監視する手法をパッシブモニタリング(受動型監視)、能動的にテストを行ってその結果から品質を可視化する手法をアクティブモニタリング(能動型監視)とよびますが、サウザンドアイズの中心となる特徴はアクティブモニタリングの方になります。 で、2020年に某シスコシステムズに買収・統合されてその統合具合が注目されていました。 サウザンドアイズのエージェントには、全世界に配置してくれているクラウドエージェント、自分で好きなところ(ラズパイとか仮想マシンとか)に配置するエンタープライズエージェント、パソコンにインストールするクライアントエージェントといったタイプがありますが、どこにお目々を置きますか?という選択が必要で、基本的にはお目々の数やテストの数に応じてお金がかかるという感じです。 ThousandEyes on Cisco Ciscoルーターやスイッチでは、以前からアプリケーションホスティングという仕組みを使って、装置の上に任意のアプリケーションを立ち上げることができており、サウザンドアイズのエージェントをホストするソリューションがありました。データセンターにサウザンドアイズ用の仮想マシンを専用に作ったり、もちろんラズパイを配置したりといった、物理的な部分が節約できることと、ネットワーク装置そのものからテストトラフィックが発生しているように作れるため、特に拠点間比較などネットワークの切り分けと組み合わせてトラブルシュートがわかりやすくなるといった利点がありました。 クラウドエージェント エンタープライズエージェント ... OVA/OVF, Hyper-V, Nuc/ラズパイ, Cat9K/ISR/ASR, JUNOS, Linux Package, Docker, AWS Marketplaceなどなど <== ここの話 エンドポイントエージェント Docker タイプの ThousandEyes エージェントを Catalyst9300 上に立ち上げる 私も過去に、ThousandEyesのエージェントをCatalystに以前ホストして遊んでいたことがあるんですが、前はKVMベースのものしかなくて、しかも限られたCatalystのApp-hosting用のリソースを使ってしまって、動くには動いてたんですが取り回しに苦労したんですよね。 それが今ではCatalyst9300のApp-hositngのDockerの上で動くThousandEyesのDockerタイプのエージェントがリリースされていて、さらに公式のリリースノートにもサポートが明記されていたので、重い腰を上げてほとんど自分用のメモとして残しておくことにしました。 Catalyst 9300 のDockerコンテナでThousandEyesエージェントが動く IOS XE App-hostingの機能を使って設定 オプションのSSDが不要でBootflashだけでよくなった(以前のKVMエージェントだとSSDが必要だった) ※ちなみにオプションのSSDってこれ... 普通買いませんよね... 私持ってますが 敷居が低い! Catalyst9300 持ってたら試せる!(あとライセンス?) ThousandEyesエージェントはここからダウンロード Release Notes for Cisco Catalyst 9300 Series Switches, Cisco IOS XE Amsterdam 17.3.x ThousandEyes Enterprise Agentの新バージョンを紹介します。これは、アプリケーション ホスティング機能を使用してシスコ デバイス上で動作する Docker ベースの組み込みアプリケーションです。Enterprise Agent は、SSD とブートフラッシュの両方で使用できます。 Programmability Configuration Guide → Application Hosting を参照してください。 (ネットワークアドバンテージ) Programmability Configuration Guide, Cisco IOS XE Amsterdam 17.3.x 以前の Cisco IOS XE リリースでは、ThousandEyes はサードパーティの KVM (Kernel-based Virtual Machine) アプライアンスとして SSD 上でサポートされていました。 Cisco IOS XE Amsterdam 17.3.3では、新バージョンのThousandEyes Enterprise Agentが導入されています。これは、アプリケーション ホスティング機能を使用してシスコ デバイス上で動作する、Docker ベースの組み込みアプリケーションです。Enterprise Agentは、SSDとブートフラッシュの両方で利用可能です。Enterprise Agentは、ブラウザテスト(ページロードとトランザクション)を除くすべてのテストをサポートしています。 ※関係ないけど DeepL めちゃくちゃ便利ですね! やってみましょう 1. 準備〜インストール 1.1 IOSバージョンを新しくしておく Cat9300TMT02#sh ver | i IOSXE Cisco IOS Software [Bengaluru], Catalyst L3 Switch Software (CAT9K_IOSXE), Version 17.5.1, RELEASE SOFTWARE (fc3) * 1 41 C9300-24P 17.05.01 CAT9K_IOSXE INSTALL * 1.2 ブートフラッシュをきれいにしておく Cat9300TMT02#show install summary [ Switch 1 ] Installed Package(s) Information: State (St): I - Inactive, U - Activated & Uncommitted, C - Activated & Committed, D - Deactivated & Uncommitted -------------------------------------------------------------------------------- Type St Filename/Version -------------------------------------------------------------------------------- IMG C 17.05.01.0.144 -------------------------------------------------------------------------------- Auto abort timer: inactive -------------------------------------------------------------------------------- Cat9300TMT02#install remove inactive 1.3 ファイルをCatalystのbootflashにコピー Cat9300TMT02#sh flash: | i thousand 179 178872320 Apr 06 2021 19:03:14.0000000000 +00:00 thousandeyes-enterprise-agent-3.0.cat9k.tar 1.4 TARファイルをインストール Cat9300TMT02#app-hosting install appid <name> package bootflash:thousandeyes-enterprise-agent-3.0.cat9k.tar うまくいけば DEPLOYED となる。 この例では を thousandeyes_enterprise_agent としてます。 Cat9300TMT01#show app-hosting list App id State --------------------------------------------------------- thousandeyes_enterprise_agent DEPLOYED デプロイされた状態 Actiavateはまだ Startはまだ 2. 内部〜外部ネットワークの設定 ネットワークの設定をしていきます。 フロントパネルポートのVLAN(スイッチポート)を引っ張ってきてトランクで内部アプリにつなぎ込む <==今回はこちら フロントパネルポートのルーテッドインターフェースをNATして内部に内部アプリにつなぎ込む ※参考 Application Hosting on Front-Panel Trunk and VLAN Ports 2.1 Vlan と AppGigabitEthernet インターフェースの接続 Cat9300TMT02#sh run int gi 1/0/24 ! interface GigabitEthernet1/0/24 switchport access vlan 10 ! interface Vlan10 ip address 10.71.154.50 255.255.255.248 ! interface AppGigabitEthernet1/0/1 switchport trunk allowed vlan 10 switchport mode trunk 2.2 AppGigabitEthernet と 内部アプリの接続, Dockerの設定 設定は見た目通り、比較的ストレートでわかりやすいです。 app-hosting appid TEApp app-vnic AppGigabitEthernet trunk vlan 10 guest-interface 0 guest-ipaddress 10.71.154.51 netmask 255.255.255.248 app-default-gateway 10.71.154.50 guest-interface 0 app-resource docker prepend-pkg-opts run-opts 1 "-e TEAGENT_ACCOUNT_TOKEN=<ThousandEyesPortalのToken>" <=== ThousandEyesのクラウドポータルから取得 run-opts 2 "--hostname Cisco-TEDocker" name-server0 208.67.222.222 ※ThousandEyesのトークンはこちらから取得しておきます 3. Dockerの起動と確認 3.1 Dockerのアクティベートと起動 Lifecycle for an Applicationを意識しながら、Applicationを立ち上げていきます。 こちらは、覚えておくと何かと便利なコマンドです(マニュアルからの抜粋)。 Device# app-hosting install appid iox_app package usbflash1:my_iox_app.tar.tar Device# app-hosting activate appid iox_app Device# app-hosting start appid iox_app Device# app-hosting stop appid iox_app Device# app-hosting deactivate appid iox_app Device# app-hosting uninstall appid iox_app Deployed => Activated => Running やっていきます。 Cat9300TMT02#app-hosting activate appid thousandeyes_enterprise_agent thousandeyes_enterprise_agent activated successfully Current state is: ACTIVATED Cat9300TMT02#sho app-hosting list App id State --------------------------------------------------------- thousandeyes_enterprise_agent ACTIVATED Cat9300TMT01# Cat9300TMT01#app-hosting start appid thousandeyes_enterprise_agent thousandeyes_enterprise_agent started successfully Current state is: RUNNING いい感じに立ち上がっていることを確認。 Cat9300TMT02#show app-hosting detail appid TEApp App id                 : TEApp Owner                  : iox State                  : RUNNING Application   Type                 : docker   Name                 : thousandeyes/enterprise-agent   Version              : 3.0   Description          :    Path                 : flash:thousandeyes-enterprise-agent-3.0.cat9k.tar   URL Path             :  Activated profile name : custom Resource reservation   Memory               : 500 MB   Disk                 : 1 MB   CPU                  : 1850 units   CPU-percent          : 25 %   VCPU                 : 1 Attached devices   Type              Name               Alias   ---------------------------------------------   serial/shell     iox_console_shell   serial0   serial/aux       iox_console_aux     serial1   serial/syslog    iox_syslog          serial2   serial/trace     iox_trace           serial3 Network interfaces    --------------------------------------- eth0:    MAC address         : 52:54:dd:2d:a8:e2    IPv4 address        : 10.71.154.51    IPv6 address        : ::    Network name        : mgmt-bridge-v10 Docker ------ Run-time information   Command              :    Entry-point          : /sbin/my_init    Run options in use   : -e TEAGENT_ACCOUNT_TOKEN=TOKEN_NOT_SET --hostname=$(SYSTEM_NAME) --cap-add=NET_ADMIN --mount type=tmpfs,destination=/var/log/agent,tmpfs-size=140m --mount type=tmpfs,destination=/var/lib/te-agent/data,tmpfs-size=200m -v $(APP_DATA)/data:/var/lib/te-agent -e TEAGENT_PROXY_TYPE=DIRECT -e TEAGENT_PROXY_LOCATION= -e TEAGENT_PROXY_USER= -e TEAGENT_PROXY_AUTH_TYPE= -e TEAGENT_PROXY_PASS= -e TEAGENT_PROXY_BYPASS_LIST= -e TEAGENT_KDC_USER= -e TEAGENT_KDC_PASS= -e TEAGENT_KDC_REALM= -e TEAGENT_KDC_HOST= -e TEAGENT_KDC_PORT=88 -e TEAGENT_KERBEROS_WHITELIST= -e TEAGENT_KERBEROS_RDNS=1 -e PROXY_APT= -e APT_PROXY_USER= -e APT_PROXY_PASS= -e APT_PROXY_LOCATION= -e TEAGENT_AUTO_UPDATES=1 -e TEAGENT_ACCOUNT_TOKEN=<YOUR_TOKEN> --hostname Cisco-TEDocker   Package run options  : -e TEAGENT_ACCOUNT_TOKEN=TOKEN_NOT_SET --hostname=$(SYSTEM_NAME) --cap-add=NET_ADMIN --mount type=tmpfs,destination=/var/log/agent,tmpfs-size=140m --mount type=tmpfs,destination=/var/lib/te-agent/data,tmpfs-size=200m -v $(APP_DATA)/data:/var/lib/te-agent -e TEAGENT_PROXY_TYPE=DIRECT -e TEAGENT_PROXY_LOCATION= -e TEAGENT_PROXY_USER= -e TEAGENT_PROXY_AUTH_TYPE= -e TEAGENT_PROXY_PASS= -e TEAGENT_PROXY_BYPASS_LIST= -e TEAGENT_KDC_USER= -e TEAGENT_KDC_PASS= -e TEAGENT_KDC_REALM= -e TEAGENT_KDC_HOST= -e TEAGENT_KDC_PORT=88 -e TEAGENT_KERBEROS_WHITELIST= -e TEAGENT_KERBEROS_RDNS=1 -e PROXY_APT= -e APT_PROXY_USER= -e APT_PROXY_PASS= -e APT_PROXY_LOCATION= -e TEAGENT_AUTO_UPDATES=1 Application health information   Status               : 0   Last probe error     :    Last probe output    :  3.2 ThousandEyesポータルから確認 ThousandEyesのポータルサイトから、Catalyst9300上のエージェントが確認できます。これで基本的には各種テストや確認はすべてブラウザから行えるようになりました。 そのほか 今回は、ラボにあったCatalyst9300に設定してみましたが、どうやらマニュアルによるとこちらのエージェントが標準組み込みになりそうな気配です。LANスイッチがクラウドからの設定で自在にアクティブモニターをでき、各種ネットワークサービスの品質を可視化できる世界はもうすぐそこにあることを感じました。楽しみですね! Programmability Configuration Guide, Cisco IOS XE Amsterdam 17.3.x ThousandEyes Enterprise Agent には、BrownField と GreenField の 2 種類があります。既存のデバイスについては、BrownfieldバージョンをThousandEyesウェブサイトからダウンロードできます。ただし、新しいデバイスは、ブートフラッシュにGreenFieldアプリケーションがロードされた状態で出荷されます。 気が向いたら、ルーテッドポートとNATの組み合わせでもやってみたいと思います。今時のCatalystはNATが出来るんですねぇ〜? Supported Network Types Cisco IOSネットワークアドレス変換(NAT)について Cisco IOS XE Gibraltar 16.12.1搭載のCatalyst 9300シリーズ スイッチおよびC9300L Catalyst 9400シリーズ スイッチ(Cisco IOS XE Amsterdam 17.1.1搭載 これらのプラットフォームでは、フロントパネルのデータポートとAppGigabitEthernetポートに適用されるハードウェアデータポート機能によってNATがサポートされています。 最後まで読んで頂き、ありがとうございました!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Catalyst 9300 Docker 上で ThousandEyes Agent の起動と設定

これはなに? こちらの絵が、やりたいことです! Catalyst9300 に ThousandEyes のDockerエージェントをインストールして設定して動作確認します。Catalyst9300上の Docker アプリのホストの仕方の参考にもなります。 ThousandEyes いろんなところに配置したソフトウェアエージェントを使って、任意のポイント間を任意のテストトラフィックを発生させて、そのネットワークのサービスレベルを可視化、それがクラウドポータルからめちゃくちゃ簡単にできるという、サウザンドアイズという会社およびサービスがありました。いろんなところにお目々? があるという感じですね。実際にはお目々は見ているというより、何かを発生させる(TracerouteしたりWebにHTTPしたり拠点間でRTP出したり)のでちょっとミスリーディングかも。実際に流れているものを監視する手法をパッシブモニタリング(受動型監視)、能動的にテストを行ってその結果から品質を可視化する手法をアクティブモニタリング(能動型監視)とよびますが、サウザンドアイズの中心となる特徴はアクティブモニタリングの方になります。 ※参考 Cisco IOS を活用した “見える化”の階段 2013年 アクティブモニタリングとパッシブモニタリングの組み合わせについてごちゃごちゃ書いてます :-) で、2020年に某シスコシステムズに買収・統合されてその統合具合が注目されていました。 サウザンドアイズのエージェントには、全世界に配置してくれているクラウドエージェント、自分で好きなところ(ラズパイとか仮想マシンとか)に配置するエンタープライズエージェント、パソコンにインストールするクライアントエージェントといったタイプがありますが、どこにお目々を置きますか?という選択が必要で、基本的にはお目々の数やテストの数に応じてお金がかかるという感じです。 ThousandEyes on Cisco Ciscoルーターやスイッチでは、以前からアプリケーションホスティングという仕組みを使って、装置の上に任意のアプリケーションを立ち上げることができており、サウザンドアイズのエージェントをホストするソリューションがありました。データセンターにサウザンドアイズ用の仮想マシンを専用に作ったり、もちろんラズパイを配置したりといった、物理的な部分が節約できることと、ネットワーク装置そのものからテストトラフィックが発生しているように作れるため、特に拠点間比較などネットワークの切り分けと組み合わせてトラブルシュートがわかりやすくなるといった利点がありました。 クラウドエージェント エンタープライズエージェント ... OVA/OVF, Hyper-V, Nuc/ラズパイ, Cat9K/ISR/ASR, JUNOS, Linux Package, Docker, AWS Marketplaceなどなど <== ここの話 エンドポイントエージェント Docker タイプの ThousandEyes エージェントを Catalyst9300 上に立ち上げる 私も過去に、ThousandEyesのエージェントをCatalystに以前ホストして遊んでいたことがあるんですが、前はKVMベースのものしかなくて、しかも限られたCatalystのApp-hosting用のリソースを使ってしまって、動くには動いてたんですが取り回しに苦労したんですよね。 それが今ではCatalyst9300のApp-hositngのDockerの上で動くThousandEyesのDockerタイプのエージェントがリリースされていて、さらに公式のリリースノートにもサポートが明記されていたので、重い腰を上げてほとんど自分用のメモとして残しておくことにしました。 Catalyst 9300 のDockerコンテナでThousandEyesエージェントが動く IOS XE App-hostingの機能を使って設定 オプションのSSDが不要でBootflashだけでよくなった(以前のKVMエージェントだとSSDが必要だった) ※ちなみにオプションのSSDってこれ... 普通買いませんよね... 私持ってますが 敷居が低い! Catalyst9300 持ってたら試せる!(あとライセンス?) ThousandEyesエージェントはここからダウンロード Release Notes for Cisco Catalyst 9300 Series Switches, Cisco IOS XE Amsterdam 17.3.x ThousandEyes Enterprise Agentの新バージョンを紹介します。これは、アプリケーション ホスティング機能を使用してシスコ デバイス上で動作する Docker ベースの組み込みアプリケーションです。Enterprise Agent は、SSD とブートフラッシュの両方で使用できます。 Programmability Configuration Guide → Application Hosting を参照してください。 (ネットワークアドバンテージ) Programmability Configuration Guide, Cisco IOS XE Amsterdam 17.3.x 以前の Cisco IOS XE リリースでは、ThousandEyes はサードパーティの KVM (Kernel-based Virtual Machine) アプライアンスとして SSD 上でサポートされていました。 Cisco IOS XE Amsterdam 17.3.3では、新バージョンのThousandEyes Enterprise Agentが導入されています。これは、アプリケーション ホスティング機能を使用してシスコ デバイス上で動作する、Docker ベースの組み込みアプリケーションです。Enterprise Agentは、SSDとブートフラッシュの両方で利用可能です。Enterprise Agentは、ブラウザテスト(ページロードとトランザクション)を除くすべてのテストをサポートしています。 ※関係ないけど DeepL めちゃくちゃ便利ですね! やってみましょう 1. 準備〜インストール 1.1 IOSバージョンを新しくしておく Cat9300TMT02#sh ver | i IOSXE Cisco IOS Software [Bengaluru], Catalyst L3 Switch Software (CAT9K_IOSXE), Version 17.5.1, RELEASE SOFTWARE (fc3) * 1 41 C9300-24P 17.05.01 CAT9K_IOSXE INSTALL * 1.2 ブートフラッシュをきれいにしておく Cat9300TMT02#show install summary [ Switch 1 ] Installed Package(s) Information: State (St): I - Inactive, U - Activated & Uncommitted, C - Activated & Committed, D - Deactivated & Uncommitted -------------------------------------------------------------------------------- Type St Filename/Version -------------------------------------------------------------------------------- IMG C 17.05.01.0.144 -------------------------------------------------------------------------------- Auto abort timer: inactive -------------------------------------------------------------------------------- Cat9300TMT02#install remove inactive 1.3 ファイルをCatalystのbootflashにコピー Cat9300TMT02#sh flash: | i thousand 179 178872320 Apr 06 2021 19:03:14.0000000000 +00:00 thousandeyes-enterprise-agent-3.0.cat9k.tar 1.4 TARファイルをインストール Cat9300TMT02#app-hosting install appid <name> package bootflash:thousandeyes-enterprise-agent-3.0.cat9k.tar うまくいけば DEPLOYED となる。 この例では を thousandeyes_enterprise_agent としてます。 Cat9300TMT01#show app-hosting list App id State --------------------------------------------------------- thousandeyes_enterprise_agent DEPLOYED デプロイされた状態 Actiavateはまだ Startはまだ 2. 内部〜外部ネットワークの設定 ネットワークの設定をしていきます。 フロントパネルポートのVLAN(スイッチポート)を引っ張ってきてトランクで内部アプリにつなぎ込む <==今回はこちら フロントパネルポートのルーテッドインターフェースをNATして内部に内部アプリにつなぎ込む ※参考 Application Hosting on Front-Panel Trunk and VLAN Ports 2.1 Vlan と AppGigabitEthernet インターフェースの接続 Cat9300TMT02#sh run int gi 1/0/24 ! interface GigabitEthernet1/0/24 switchport access vlan 10 ! interface Vlan10 ip address 10.71.154.50 255.255.255.248 ! interface AppGigabitEthernet1/0/1 switchport trunk allowed vlan 10 switchport mode trunk 2.2 AppGigabitEthernet と 内部アプリの接続, Dockerの設定 設定は見た目通り、比較的ストレートでわかりやすいです。 app-hosting appid TEApp app-vnic AppGigabitEthernet trunk vlan 10 guest-interface 0 guest-ipaddress 10.71.154.51 netmask 255.255.255.248 app-default-gateway 10.71.154.50 guest-interface 0 app-resource docker prepend-pkg-opts run-opts 1 "-e TEAGENT_ACCOUNT_TOKEN=<ThousandEyesPortalのToken>" <=== ThousandEyesのクラウドポータルから取得 run-opts 2 "--hostname Cisco-TEDocker" name-server0 208.67.222.222 ※ThousandEyesのトークンはこちらから取得しておきます 3. Dockerの起動と確認 3.1 Dockerのアクティベートと起動 Lifecycle for an Applicationを意識しながら、Applicationを立ち上げていきます。 こちらは、覚えておくと何かと便利なコマンドです(マニュアルからの抜粋)。 Device# app-hosting install appid iox_app package usbflash1:my_iox_app.tar.tar Device# app-hosting activate appid iox_app Device# app-hosting start appid iox_app Device# app-hosting stop appid iox_app Device# app-hosting deactivate appid iox_app Device# app-hosting uninstall appid iox_app Deployed => Activated => Running やっていきます。 Cat9300TMT02#app-hosting activate appid thousandeyes_enterprise_agent thousandeyes_enterprise_agent activated successfully Current state is: ACTIVATED Cat9300TMT02#sho app-hosting list App id State --------------------------------------------------------- thousandeyes_enterprise_agent ACTIVATED Cat9300TMT01# Cat9300TMT01#app-hosting start appid thousandeyes_enterprise_agent thousandeyes_enterprise_agent started successfully Current state is: RUNNING いい感じに立ち上がっていることを確認。 Cat9300TMT02#show app-hosting detail appid TEApp App id                 : TEApp Owner                  : iox State                  : RUNNING Application   Type                 : docker   Name                 : thousandeyes/enterprise-agent   Version              : 3.0   Description          :    Path                 : flash:thousandeyes-enterprise-agent-3.0.cat9k.tar   URL Path             :  Activated profile name : custom Resource reservation   Memory               : 500 MB   Disk                 : 1 MB   CPU                  : 1850 units   CPU-percent          : 25 %   VCPU                 : 1 Attached devices   Type              Name               Alias   ---------------------------------------------   serial/shell     iox_console_shell   serial0   serial/aux       iox_console_aux     serial1   serial/syslog    iox_syslog          serial2   serial/trace     iox_trace           serial3 Network interfaces    --------------------------------------- eth0:    MAC address         : 52:54:dd:2d:a8:e2    IPv4 address        : 10.71.154.51    IPv6 address        : ::    Network name        : mgmt-bridge-v10 Docker ------ Run-time information   Command              :    Entry-point          : /sbin/my_init    Run options in use   : -e TEAGENT_ACCOUNT_TOKEN=TOKEN_NOT_SET --hostname=$(SYSTEM_NAME) --cap-add=NET_ADMIN --mount type=tmpfs,destination=/var/log/agent,tmpfs-size=140m --mount type=tmpfs,destination=/var/lib/te-agent/data,tmpfs-size=200m -v $(APP_DATA)/data:/var/lib/te-agent -e TEAGENT_PROXY_TYPE=DIRECT -e TEAGENT_PROXY_LOCATION= -e TEAGENT_PROXY_USER= -e TEAGENT_PROXY_AUTH_TYPE= -e TEAGENT_PROXY_PASS= -e TEAGENT_PROXY_BYPASS_LIST= -e TEAGENT_KDC_USER= -e TEAGENT_KDC_PASS= -e TEAGENT_KDC_REALM= -e TEAGENT_KDC_HOST= -e TEAGENT_KDC_PORT=88 -e TEAGENT_KERBEROS_WHITELIST= -e TEAGENT_KERBEROS_RDNS=1 -e PROXY_APT= -e APT_PROXY_USER= -e APT_PROXY_PASS= -e APT_PROXY_LOCATION= -e TEAGENT_AUTO_UPDATES=1 -e TEAGENT_ACCOUNT_TOKEN=<YOUR_TOKEN> --hostname Cisco-TEDocker   Package run options  : -e TEAGENT_ACCOUNT_TOKEN=TOKEN_NOT_SET --hostname=$(SYSTEM_NAME) --cap-add=NET_ADMIN --mount type=tmpfs,destination=/var/log/agent,tmpfs-size=140m --mount type=tmpfs,destination=/var/lib/te-agent/data,tmpfs-size=200m -v $(APP_DATA)/data:/var/lib/te-agent -e TEAGENT_PROXY_TYPE=DIRECT -e TEAGENT_PROXY_LOCATION= -e TEAGENT_PROXY_USER= -e TEAGENT_PROXY_AUTH_TYPE= -e TEAGENT_PROXY_PASS= -e TEAGENT_PROXY_BYPASS_LIST= -e TEAGENT_KDC_USER= -e TEAGENT_KDC_PASS= -e TEAGENT_KDC_REALM= -e TEAGENT_KDC_HOST= -e TEAGENT_KDC_PORT=88 -e TEAGENT_KERBEROS_WHITELIST= -e TEAGENT_KERBEROS_RDNS=1 -e PROXY_APT= -e APT_PROXY_USER= -e APT_PROXY_PASS= -e APT_PROXY_LOCATION= -e TEAGENT_AUTO_UPDATES=1 Application health information   Status               : 0   Last probe error     :    Last probe output    :  3.2 ThousandEyesポータルから確認 ThousandEyesのポータルサイトから、Catalyst9300上のエージェントが確認できます。これで基本的には各種テストや確認はすべてブラウザから行えるようになりました。 そのほか 今回は、ラボにあったCatalyst9300に設定してみましたが、どうやらマニュアルによるとこちらのエージェントが標準組み込みになりそうな気配です。LANスイッチがクラウドからの設定で自在にアクティブモニターをでき、各種ネットワークサービスの品質を可視化できる世界はもうすぐそこにあることを感じました。楽しみですね! Programmability Configuration Guide, Cisco IOS XE Amsterdam 17.3.x ThousandEyes Enterprise Agent には、BrownField と GreenField の 2 種類があります。既存のデバイスについては、BrownfieldバージョンをThousandEyesウェブサイトからダウンロードできます。ただし、新しいデバイスは、ブートフラッシュにGreenFieldアプリケーションがロードされた状態で出荷されます。 気が向いたら、ルーテッドポートとNATの組み合わせでもやってみたいと思います。今時のCatalystはNATが出来るんですねぇ〜? Supported Network Types Cisco IOSネットワークアドレス変換(NAT)について Cisco IOS XE Gibraltar 16.12.1搭載のCatalyst 9300シリーズ スイッチおよびC9300L Catalyst 9400シリーズ スイッチ(Cisco IOS XE Amsterdam 17.1.1搭載 これらのプラットフォームでは、フロントパネルのデータポートとAppGigabitEthernetポートに適用されるハードウェアデータポート機能によってNATがサポートされています。 最後まで読んで頂き、ありがとうございました! PS: ライセンスゥゥゥ!? はこの記事では特に深追いしませんが、なんかあるらしいので気になった方は、そちらの方面に聞いてみてください。 Ordering Guide for Customers with Existing Catalyst 9000 Deployments to Request ThousandEyes Credits https://www.cisco.com/c/en/us/products/collateral/switches/catalyst-9000/nb-06-cat-9k-og-cte-en.html
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

dockerのimage名を変更する

概要 dockerを使用するときに、image名を自分用に変更したい場合があります。 その場合に利用できます。 使用方法 # docker tag <変更前のimage名> <変更後のimage名> #例 docker tag nginx:1.18.0 hogehoge/nginx:1.18.0
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

RHEL 7.6にDocker環境を作る w/ 社内プロキシやCA証明書

はじめに 社内プロジェクトでDockerを使いたいけどプロキシやら社内CA証明書やら設定しなきゃ...というのを毎回調べるのが面倒になるので手順をメモ。 手順 Subscription manager への登録 参考: RedHat Customer Portal - Subscription Management コマンドを使用する # 色んなパターンがあるので適切な方法で。 sudo subscription-manager register --username=yourusername --password=yourpassword sudo subscription-manager register --activationkey=hogehoge --org=fugafuga --proxy=http://inhouse.proxy.example.com:8080 追加yumリポジトリの有効化 参考: RedHat Customer Portal - リポジトリを有効にする sudo subscription-manager repos --enable=rhel-7-server-extras-rpms Dockerのインストール sudo yum install docker -y Dockerへの環境変数(プロキシ関係)の設定 sudo systemctl edit docker viが起動するのでプロキシ関係の設定を次のように追加 [Service] Environment=http_proxy=http://inhouse.proxy.example.com:8080 Environment=https_proxy=http://inhouse.proxy.example.com:8080 Environment=HTTP_PROXY=http://inhouse.proxy.example.com:8080 Environment=HTTPS_PROXY=http://inhouse.proxy.example.com:8080 大文字小文字のどっちの変数名を見てるかわからなかったので、とりあえず両方設定。多分片方だけでいい。 (オプション)dockerコマンドをsudoなしで使えるようにする ユーザをdockerグループに追加するとできるようになる。 参考: Manage Docker as a non-root user sudo groupadd docker sudo usermod -aG docker some-user 実行後にユーザの再ログインがいるかも。 CA証明書のインストール CA証明書ファイルをsomeCert.crtとするとこんな感じ。 参考: RedHat Customer Portal - 4.14. 共有システムの証明書の使用 sudo cp someCert.crt /etc/pki/ca-trust/source/anchors/ sudo update-ca-trust extract 上記は全リポジトリ(というかRHEL全体)で有効なCA証明書になる。特定のリポジトリのみに必要なCA証明書なら次のページを参考に設定を。 Docker-docs-ja - 証明書をリポジトリのクライアント認証に使用 Dockerの起動 sudo systemctl start docker sudo systemctl enable docker Dockerの動作確認 docker run --rm hello-world --rmオプションつけておくと停止後にコンテナが自動で消える。動作確認後はどうせ不要なコンテナなのでつけておくと吉。 お疲れさまでした 多分これで動くと思いますが、なんかおかしなことしてたらマサカリください。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

curl の無い container (alpine) 内から POST リクエストを送る方法 / Fire POST request without curl

https://www.reddit.com/r/bash/comments/2vt3p1/make_a_post_request_without_curl/coksadc/ ここにあった。 netcat (nc) を使えば良い? (他のやり方もありそうとはいえ) 以下は GET の場合だが。 % docker run -it alpine:3.9.4 sh -c 'echo -e "GET / HTTP/1.0\nHost: example.com\n\n" | nc example.com 80' HTTP/1.0 200 OK Accept-Ranges: bytes Age: 556620 Cache-Control: max-age=604800 Content-Type: text/html; charset=UTF-8 Date: Thu, 15 Apr 2021 00:23:33 GMT Etag: "3147526947" Expires: Thu, 22 Apr 2021 00:23:33 GMT Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT Server: ECS (sjc/4E76) Vary: Accept-Encoding X-Cache: HIT Content-Length: 1256 Connection: close <!doctype html> <html> <head>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

クラウドネイティブを目指してファイルI/Oを切り離すレポジトリを作った

オンプレ Docker-Compose から GCP へ移行したいけど、クラウドネイティブじゃないんだなぁ 皆さん、ローカル/Single Instance環境からGCPへの移行、苦労していませんか? 例えば SQL Database や、ローカルデータをアプリケーションデータと密結合にしていると、Kubernetes や、Google App Engine などのクラウドネイティブ環境へ移行するのが大変辛くなります。 実際、私は画像をローカルに保存してそれに合わせた処理をしていたところ、Google Cloud Storage への移行が大変つらいことになっています。 今回は、開発時にそういったガバをなくすために、そもそもアプリケーションと I/O 処理を Docker-Compose 上で 分離することを目指し、簡単な File I/O のための Dockerfile を作ります。 つまりどうするってことだってばよ Docker-Compose ファイルがこうあるとします。 version: "3" services: api: build: . ports: - 8080:8080 # api 内に PostgreSQL と Local File の処理がくっついている これを version: "3" services: # DB を切り離します dev_db: build: containers/postgres ports: - 5565:5432 volumes: - "dev_db_volume:/var/lib/postgresql/data" environment: POSTGRES_USER: sample-user POSTGERS_PASSWORD: sample-password POSTGRES_INITDB_ARGS: "--encoding=UTF-8" POSTGRES_DB: picpage_db restart: always # Local File を外部に写します local_fs: build: containers/local_fs ports: - 5577:5577 volumes: - "./fstorage:/local_fs" # api は上2つを依存に含めることで参照します。 api: build: . ports: - 8080:8080 depends_on: - dev_db volumes: dev_db_volumes local_fs を書こう、書かねばならぬ DB に関しては PostgreSQL などあるのでちょうど良いんですが、Cloud Storage の代替となるものがなかったので、書きます。ついでに golang の勉強もちょっとします。 出来たもの 使い方は以下アプリディレクトリに対して、こんな感じ (詳細はREADMEへ) /app |- containers |- docker-compose.yml `- app.py など mkdir containers git clone https://github.com/MokkeMeguru/golang-local-fs containers/local_fs docker-compose build docker-compose run --service-port local_fs # Env: # (env.Env) { # LocalFileRoot: (string) (len=9) "/local_fs", # OverWriteFile: (bool) false # } # [GIN] 2021/04/14 - 18:15:17 | 200 | 432.861µs | 172.24.0.1 | GET "/files/samplebra.png" # [GIN] 2021/04/14 - 18:15:26 | 200 | 675.812µs | 172.24.0.1 | GET "/files/samplebra.png" 実際にブラウザ (~localhost:5577~) で画像を確認すると、こんな感じに見えます。 締め このレポジトリを使ってくれ、というよりかは、どうせ開発するなら、 ステートフル環境とステートレス環境は早めに分離しておけ 、ということです。 オブジェクト指向プログラミングが強力な世の中では、同じドメインのオブジェクト型 (ex. ファイル) が、クラウドとローカルで噛み合わなくなることがあります。それへの対策として、はじめから分離することを前提にコーディングを行うことが重要です。 終わり Notice 特に Clean Architecture のタグをつけている理由は、 いくら外部 I/O を外側に追いやっても、内部オブジェクトがどうしよもなく外部に依存してしまうことがある ということへの注意喚起です… 例えば、画像ファイルの場合、ローカルでは (ファイルですから) java.io.File として管理したいと思います。ところが、Google Cloud Storage の利用を考えると、 java.io.InputStream の方が適切となります。 なぜかというと、~java.io.File~ はストレージ上にあるファイルを指し示すのですが、 Google Cloud Storage が提供するのは、 InputStream で表されるメモリの上の()バイト列だからです。これを一旦 tempFile へ I/O するのは非効率ですし、tempFile の有効期限などの問題も面倒となります。 上記例のため、たとえどんなアーキテクチャをこねくり回しても、クラウドとローカルの差をはじめから意識して設計・コーディングを行う必要性があると言えます。 あと、今回作った local_fs レポジトリは golang の Clean Architecture をベースに作っています。とはいえオーバテクノロジーなのでだいぶ削っていますが
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む