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

PythonスクリプトをDockerコンテナ化して、世界にこんにちは、する

この記事の目的 Pythonで記述された"Hello World"スクリプトをPythonの実行環境とともにDockerコンテナ化して、Docker Engineがインストールされた環境であればHello Worldで切るようにします。 何を始めるにもまずは世界にこんにちはしなきゃね('ω')。 実行環境 Windowsの仕様 エディション:Windows 10 Home バージョン:20H2 OS ビルド:19042.867 エクスペリエンス:Windows Feature Experience Pack 120.2212.551.0 Docker Desktop 3.2.2 Docker 20.10.5 build 55c4c88 まずはPythonの開発環境を作成 ホストのWindows 10にPythonの実行環境を直接インストールしたくないし、せっかくDocker Desktopインストールしたので、Pythonの開発用コンテナをダウンロードして使用する。 なんだかんだでNumpy使うだろうし、Anacondaコンテナを使用することにする。(この辺はお好みで。) 今回は公式のanaconda3コンテナを使用することにした。 https://hub.docker.com/r/continuumio/anaconda3 まずはDockerイメージを取得する。コマンドは次の通り。 PS> docker pull continuumio/anaconda3 Docker pullコマンドの詳細は公式サイトをご確認ください。 完了したらイメージが取得できたか、確認する。 PS> docker images REPOSITORY TAG IMAGE ID CREATED SIZE continuumio/anaconda3 latest 5e5dd010ead8 4 months ago 2.71GB (2.71GBもあった。もっと小さいイメージにすればよかった。) 次にDockerイメージからコンテナを作成します。Docker runコマンドを使用すると、イメージからコンテナの作成と実行を同時にやってくれます。こんな感じです。コマンドの引数の意味は公式ドキュメントをご参考ください。 PS > docker run --interactive --tty continuumio/anaconda3 bash (base) root@a5a6df15c938:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var (base) root@a5a6df15c938:/# exit exit PS > Docker runコマンドの公式ドキュメントはこちら。 ソースコードはホストのWindows 10のVisual Studio Codeを使いたいので共有フォルダをマウントします。 -vオプションでホストのパスとコンテナのパスを設定します。 PS > docker run --interactive -v C:\Users\<ユーザー名>\Development\docker:/mnt/docker --tty continuumio/anaconda3 bash (base) root@c29714605d16:/# ls /mnt/ docker (base) root@c29714605d16:/# ls /mnt/docker/ Python版Hello Worldの開発 PythonでHello Worldを開発します。今回のHwllo Worldは力作だ('ω')。 hello_world.py # coding: UTF-8 print('Hello World!!') Dockerコンテナ上で実行します。動いた。 (base) root@c29714605d16:/mnt/docker/python# python hello_world.py Hello World!! (base) root@c29714605d16:/mnt/docker/python# 実行用のDockerfileの作成 力尽きたのでまた明日。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【インストール不要】Dockerでffmpegコマンドを使う!

はじめに ffmpegは動画の編集や変換などをおこなえるフリーソフトです。 ただ、一般的にffmpegを利用するにはffmpegをインストールする必要があるのですが、 ffmpegをインストールするのは面倒!という人のためにdockerを使用したffmpegコマンドの使用方法を紹介します。 dockerでffmpeg docker run -it --rm jrottenberg/ffmpeg:3.2-alpine [ffmpegのオプションなど] 便利コマンド カラーバー映像作成 docker run -v $(pwd):$(pwd) -w $(pwd) -it --rm jrottenberg/ffmpeg:3.2-alpine -f lavfi -i smptehdbars=1920x1080:d=10 -f lavfi -i sine=frequency=1000:d=10 output.mp4
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【JavaScript】分割代入について

配列やオブジェクトの値を分割して代入したいときに有効 配列 sample.js const array = [1, 2, 3]; // e0...array[0]...e1...array[1]...e2...array[2]............ const [e0, e1, e2] = array; console.log(e0)// 1 console.log(e1)// 2 console.log(e2)// 3 オブジェクト オブジェクトを変数に代入するときに分割して代入することができる sample.js const obj = {a: 10, b: 20, c: 30}; const {a, c} = obj; console.log(a); // 10 console.log(c); // 30 動作確認 docker run -it --rm node:lts-alpine sh /# vi test.js # ファイルをコピペ /# node test.js
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker上にOCaml+Coqの環境を構築して動かしてみるまで

はじめに CoqをDocker上にインストールしたのでその手順をまとめます。 CoqのコードはOCamlに変換できるので、変換したコードをOCamlから呼び出してみます。 Dockerのインストールは済んでいる前提で進めていきます。 OPAMのインストール OCaml、CoqをインストールするためにまずOPAMをインストールします。 OPAMはOCamlのパッケージマネージャです。 OPAMをインストールするとOCamlは自動的に入りますが古いバージョンなので新しいバージョンを別にインストールします。 Alpine Linuxのコンテナを起動します。 $ docker run -it alpine コンテナ内でOPAMをインストールします。 # apk update # apk add alpine-sdk ncurses m4 opam # opam --version 2.0.7 # ocaml --version The OCaml toplevel, version 4.08.1 OPAMを初期化します。 DockerにOPAMを入れるときは'--disable-sandboxing'を付ける必要がありそうなので付けておきます。 https://github.com/ocaml/opam/issues/3498 '-y'は質問をすべてyesで答えて問題ないと思ったため付けています。対話的に選択したいなら外してください。 # opam init -y --disable-sandboxing eval $(opam env)を実行するように表示されるので 実行します。 # eval $(opam env) [WARNING] Running as root is not recommended rootで実行しているので警告が出ますがこのまま進めます。 OCamlのインストール OPAMを使えばOCamlの複数のバージョンを切り替えることができます。 現在インストール済みのバージョンはopam switchで確認できます。 # opam switch [WARNING] Running as root is not recommended # switch compiler description -> default ocaml-system.4.08.1 default 新しいバージョンをインストールします。(そこそこ時間がかかります) # opam switch create 4.11.2 再びeval $(opam env)を実行します。 # eval $(opam env) [WARNING] Running as root is not recommended 新しいバージョンがインストールされたことを確認します。 # opam switch [WARNING] Running as root is not recommended # switch compiler description -> 4.11.2 ocaml-base-compiler.4.11.2 4.11.2 default ocaml-system.4.08.1 default Coqのインストール OPAMからCoqをインストールする方法は以下を参考にしましたので、同じように進めます。 参考:https://coq.inria.fr/opam-using.html Coqのインストールには結構時間がかかります。 # opam install opam-depext # opam-depext -y coq # opam pin -y add coq 8.13.1 Coqがインストールされたことを確認します。 # coqc --version The Coq Proof Assistant, version 8.13.1 (April 2021) compiled on Apr 5 2021 10:33:10 with OCaml 4.11.2 CoqのコードをOCamlに変換する まずCoqのコードを用意します。 'id.v'という名前でファイルを作成し、関数idを定義します。 関数idは引数をそのまま返す関数です。 id.v Definition id (A:Set)(x:A) := x. Require Extraction. Extraction "id.ml" id. 簡単に説明をすると、1行目が関数idを定義しています。 2、3行目では関数idをOCamlに変換し'id.ml'のファイル名で保存しています。 'id.v'をcoqcで実行します。 # coqc id.v # ls id.glob id.mli id.vo id.vos id.ml id.v id.vok # cat id.ml (** val id : 'a1 -> 'a1 **) let id x = x 変換したコードをOCamlから呼び出す OCamlのコードを用意します。 ファイル名は'hello_coq.ml'とします。 hello_coq.ml let () = print_endline "Hello";; print_endline (Id.id "Coq!!");; 'id.ml'と'hello_coq.ml'をコンパイルします。 mliファイルが存在する場合、一緒にコンパイルします。 # ocamlopt -c id.mli id.ml # ocamlopt -c hello_coq.ml # ocamlopt -o hello_coq id.cmx hell_coq.cmx # ./hello_coq Hello Coq!! おわりに Coqをインストールして、OCamlから実行できるところまでできました。 ただし、Coqは定理証明支援システムなのでプログラムを証明するところからが本番です。 OCamlへの変換もCoqとOCamlでは数値やリストの型が異なるので、それぞれの変換方法を記述していく必要があります。 大変そうですがCoqと仲良くなりたいなと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Jupyter notebook (Docker) で親ディレクトリのファイルを絶対パスで取得できない件について

はじめに Jupyter notebookをDocker環境で使っており、テキストファイルを読み込もうとしたのですが、パスが見つからず困っていたのでまとめます。 親ディレクトリをたどって、特定のファイルを読み込む必要があったので、絶対パスを指定していたがパスが見つからず、親のディレクトリのファイルが読み込めない?そんなことあると思っていましたがそんなわけはありませんでした。 環境 python3.8 Docker jupyter notebook 問題 ディレクトリ構成がこのようになっている状態で、 /  ├ experiments/ ├ python ├ A.py ├ dict ├ file.txt  ├ library/ A.pyからfile.txtが存在していればファイルを読み込む処理をしようとしていた。 if os.path.exists('/experiments/dict/file.txt') しかし、file.txtがあるはずなのに読み込んでくれなかった。 解決策 Jupyter画面でrootに見えていた場所が実際には違っていて、絶対パスが正しく指定できていなかった。 私はここがrootの位置だと思っていた。 しかし、pwdコマンドでディレクトリを調べたところ pwd # 出力された結果 '/home/jovyan/data/experiments/python' となっていた。/home/jovyan/data/を指定していなかった。 docker-compose.ymlでボリュームを volumes: - ./experiments:/home/jovyan/data としていたので、Jupyter上にはパスがなく勘違いしていたのが原因だった。 このようにファイルパスを指定しなおして読み込めるようになりました。 if os.path.exists('/home/jovyan/data/experiments/python') 最後に 読み込みでどうするんだろうとなることがしばしばあります。 調べてもこのJupyter問題は簡単に見つからなかったのでまとめました。 もしかしたら、絶対パスを指定するところで詰まる人は少ないのかも?
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【ペチオブ】仮想環境ハンズオン 第5回 Docker Compose編

Docker Composeハンズオン ハンズオン資料 Linux基礎編 VirtualBoxハンズオン Vagrantハンズオン Dockerハンズオン Docker Composeハンズオン 今回の目的 今回の目的は、VirtualBox上にVagrantを使ってUbuntu OSのインストール、PHPの実行環境の構築を行います。 YouTube版 【ペチオブ】仮想環境ハンズオン 第5回 Docker Compose編 動画を高評価、チャンネル登録いただけるとより多くの方へオススメ表示されるので良いと思った方はご協力いただけるとありがたいです? 完成版 完成版はGitHubにプッシュしてます。 概要 Composeは、複数コンテナのDockerアプリケーションを定義して実行するためのツールです。 Docker単体だとコンテナ毎にコマンドやオプションをたくさん指定する必要がありましたが、複数のコンテナに対して実行できます。 ハンズオン $ mkdir docker-compose-handson $ cd docker-compose-handson サンプルソースをgit cloneしておく $ git clone https://github.com/ucan-lab/infra-handson-shop shop php/Dockerfile $ mkdir php $ vim php/Dockerfile FROM php:7.4-apache-buster ENV DB_HOST=db ENV DB_NAME=shop ENV DB_USER=phper ENV DB_PASS=secret RUN apt-get update RUN docker-php-ext-install pdo_mysql DB_HOST=db ここだけDockerハンズオンと異なります。 コンテナ名ではなく、サービス名で接続できます。 mysql/Dockerfile Dockerハンズオンと同じDockerfileを作ります。コピペしてきてもokです。 $ mkdir mysql $ vim mysql/Dockerfile FROM mysql:8.0 ENV MYSQL_DATABASE=shop ENV MYSQL_USER=phper ENV MYSQL_PASSWORD=secret ENV MYSQL_ROOT_PASSWORD=secret COPY ./my.cnf /etc/my.cnf mysql/my.cnf Dockerハンズオンと同じmy.cnfを作ります。コピペしてきてもokです。 $ vim mysql/my.cnf [mysqld] character_set_server = utf8mb4 # 文字コード collation_server = utf8mb4_ja_0900_as_cs # 照合順序 docker-compose.yml $ vim docker-compose.yml version: "3.8" services: web: build: ./php ports: - 8200:80 volumes: - ./shop:/var/www/html db: build: ./mysql volumes: - db-storage:/var/lib/mysql volumes: db-storage: YAML (ヤムル) YAML 公式 YAML wiki yamlの書き方 YAML Ain't a Markup Language インデント(字下げ)を使って、データの階層構造を表現する。 そのため、インデントが崩れると実行できなくなるので注意する。 docker-compose.yml オプション説明 version https://docs.docker.com/compose/compose-file 現時点の最新バージョンは3.8 バージョン2系の記述は古いので注意 services コンテナを定義します。 web, db サービスを定義(サービス≒コンテナ) build Dockerfile が存在するディレクトリを指定する https://docs.docker.com/compose/compose-file/#build ports ポートを公開します。(ポート転送) ホストのポート:コンテナのポート volumes ホストパスまたは名前付きボリュームをマウントします。 environment コンテナ内で使用できる環境変数を追加します。 サービスのコンテナをビルド $ docker-compose build Building web ... Successfully built b85983a00e56 Successfully tagged docker-compose-handson_web:latest Building db ... Successfully built 4077115f617f Successfully tagged docker-compose-handson_db:latest サービスのコンテナを作成、開始 $ docker-compose up -d Starting docker-compose-handson_web_1 ... done Starting docker-compose-handson_db_1 ... done -d, --detach Detached mode: Run containers in the background, print new container names. バックグラウンドでコンテナが起動します。 コンテナの一覧 $ docker-compose ps Name Command State Ports -------------------------------------------------------------------------------------------- docker-compose-handson_db_1 docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp docker-compose-handson_web_1 docker-php-entrypoint apac ... Up 0.0.0.0:8200->80/tcp 補足1: Name 補足: db がサービス名、docker-compose-handson_db_1 がコンテナ名です。 db サービスは 3306/tcp, 33060/tcp のポートが起動してます。 補足2: Command Commandに書かれてるコマンドが現在実行中、または最後に実行されたコマンドが表示されています。 補足3: State コンテナのステータスです。 db, webサービスが起動(State: Up)していることを確認します。 補足4: Ports db 3306: 従来のMySQLプロトコルポート 33060: Xプロトコルと呼ばれるMySQLの新しい接続方式のプロトコルポート web 0.0.0.0:8200->80: ホスト側の8200ポートへアクセスするとwebコンテナの80ポートへ MySQL 初期データ設定 dbコンテナのmysqlコマンドを実行してMySQLへログインします。 $ docker-compose exec db bash $ mysql -u $MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE テストデータを入れます。 create table shop.items ( id int primary key auto_increment, name varchar(30) comment '商品名', stock int default 0 comment '在庫数' ) comment='商品テーブル'; INSERT INTO shop.items (name, stock) VALUE ("Apple", 10); INSERT INTO shop.items (name, stock) VALUE ("Bad Apple", 1); 動作確認 http://127.0.0.1:8200 ショップアプリがphpを実行してmysqlからデータの取得や更新が行えていればokです。 さいごに お疲れ様でした! Docker Compose ハンズオンいかがでしたでしょうか。 コンテナをまとめて起動、停止できる docker-compose はとても便利ですね。 ボリュームやネットワークの設定も簡単に行えるようになりました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Jetson AGX Xavier をdocker 経由でセットアップ

ちなみ VirtualBox + Mac は後述のflash.shが何回やっても成功しなかった flash.sh の中身を見ていると、途中でUSBが切断するタイミングがあり、そのタイミングでロストする https://qiita.com/notitle420/items/786e1293e6a776338c55 この記事の特徴 docker 使っている chroot が失敗する問題対応 SDK Manager のdocker image をDL してload 公式: https://docs.nvidia.com/sdk-manager/docker-containers/index.html sudo docker load -i ./sdkmanager-1.4.1.7402_docker.tar.gz sudo docker tag sdkmanager:1.4.1.7402 sdkmanager:latest DLとインストール docker に入る sudo docker run -it --privileged -v /dev/bus/usb:/dev/bus/usb/ --name JetPack_NX_Devkit --entrypoint /bin/bash sdkmanager 以下全部コンテナの中 chroot が失敗する 2021/03/21現在フルでインストールをすると nvidia/nvidia_sdk/JetPack_4.5.1_Linux_JETSON_AGX_XAVIER/Linux_for_Tegra/nv_tegra/nv-apply-debs.sh の if [ "${#pre_deb_list[@]}" -ne 0 ]; then LC_ALL=C PYTHONHASHSEED=0 chroot . dpkg -i --path-include="/usr/share/doc/*" "${pre_deb_list[@]}" # ここ fi で落ちる。原因は binfmtsの設定が無く aarch64のバイナリが動かせる設定になっていないため mata strings mo nakute otiru sudo apt update sudo apt install vim binfmt-support binutils sudo vim /usr/share/binfmts/qemu-aarch64 内容は下記の通り package qemu-user-static interpreter /usr/bin/qemu-aarch64-static flags: OC offset 0 magic \x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7\x00 mask \xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff binfmt-support. sudo mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc/ sudo update-binfmts --enable qemu-aarch64 これで有効化し enableになったらOK update-binfmts --display qemu-aarch64 qemu-aarch64 (enabled): package = qemu-user-static type = magic offset = 0 magic = \x7f\x45\x4c\x46\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7\x00 mask = \xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff interpreter = /usr/bin/qemu-aarch64-static detector = イメージ作成 sdkmanager --cli install --logintype devzone --product Jetson --target P2888-0001 --targetos Linux --version 4.5.1 --license accept --staylogin true --datacollection enable To initiate login process open https://static-login.nvidia.com/service/default/pin?user_code=45610295 in a browser (can be done on a different machine) and login with your NVIDIA Developer account. SDK Manager will start once done. Login user code: 45610295. (valid for: 10 minutes). ? SDK Manager is waiting for you to complete login. 1) Generate a new login user code 2) Cancel login Answer: --version: インストールバージョン 2021/03/13 の最新は 4.5.1 https://developer.nvidia.com/embedded/jetpack でバージョンが見れる --target: Jetson の型番に合わせて変更 AGX Axevia は P2888-0001 --exitonfinish 公式のマニュアルにはこちらがついているがエラー時も終了して使いづらいのでオプションを付けないほうが良い Jetson SDK Jetson SDK Component 両方チェックしてDLする 最後にInstall の確認が出るがNoを選択 Authenticating with NVIDIA server... Login succeeded. Loading user information... User information loaded successfully. Loading server data... Server data loaded successfully. Session initialized... Installation of this software is under the terms and conditions of the license agreements located in /opt/nvidia/sdkmanager/Eula/ ===== INSTALLATION COMPLETED SUCCESSFULLY. ===== - Drivers for Jetson: Installed - File System and OS: Installed - Device Mode Host Setup in Flash: Skipped - Flash Jetson AGX Xavier 16GB/32GB: Skipped - Device Mode Host Setup in Target SDK: Skipped - DateTime Target Setup: Skipped - CUDA Toolkit for L4T: Skipped - cuDNN on Target: Skipped - TensorRT on Target: Skipped - OpenCV on Target: Skipped - VisionWorks on Target: Skipped - VPI on Target: Skipped - NVIDIA Container Runtime with Docker integration (Beta): Skipped - Multimedia API: Skipped - NVIDIA Nsight Systems: Skipped ===== Installation completed successfully - Total 15 components ===== ===== 2 succeeded, 0 failed, 0 up-to-date, 13 skipped ===== 書き込み cd nvidia/nvidia_sdk/JetPack_4.5.1_Linux_JETSON_AGX_XAVIER/Linux_for_Tegra/ sudo ./flash.sh jetson-xavier mmcblk0p1 リカバリーモードじゃなくて通常起動しているこんなエラーがでる ############################################################################### # L4T BSP Information: # R32 , REVISION: 5.1 ############################################################################### Error: probing the target board failed. Make sure the target board is connected through USB port and is in recovery mode. 書き込みはむちゃくちゃ時間がかかるので、放置中にスリープしないように注意する Ubuntu のスリープ禁止は 設定→電源→自動サスペンド をオフにする
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerで権威DNSサーバーのPowerDNS Authoritative Server+PowerDNS-Adminを動かしてみた 2021年版

前書き 2018年に投稿した内容では古くてそのままでは動作しなくなっているので2021年版として改めて検証も兼ねてメモを残しておきます。 動作環境 ホストOS: Ubuntu Server 20.04 LTS Docker CE: Docker version 20.10.5 Docker-Compose: docker-compose version 1.28.6 Dockerコンテナ環境で動かす理由 Dockerコンテナの特徴と利点が有用であれば使ってみるのも有りだと思います。 ホストOS側とコンテナ分離する事でホストOS側への影響が少ない 構築したコンテナ環境を他の別環境に移設やバックアップがしやすい Kubernetesなどのクラウド・コンテナオーケストレーション環境に展開出来る 背景 DNSの実装と言えば古くからBINDが使われていますが、昨今では脆弱性が度々発覚してセキュリティ的に運用が難しい状況にあります。 BINDに代わるDNSの実装が他にもあり主要なLinuxディストリビューションでも公式パッケージ化されて最新バージョンにも追随しています。 権威DNSサーバー PowerDNS Authoritative Server コンテンツサーバーとも呼ばれる自組織や他組織のゾーンを管理しているDNSサーバーです。 一般の利用者がドメイン検索で使用するキャッシュDNSサーバーと呼ばれるフルリゾルバーのDNSサーバーが権威DNSサーバーのルートサーバーから順繰りに問い合わせてドメイン検索する仕組みがDNSです。 今回はBINDではなくPowerDNS Authoritative Serverを使用します。一部TLDでも採用されています。 ゾーンの管理にSQLite3やMySQLなどのDBを利用して、WebインターフェースによるGUI操作が出来ます。 ローカルホスト側のリゾルバ設定 ubuntuの場合、systemdでDNSの53番ポートがサービス起動していて、他のDNSサービスとは競合してしまうので、名前解決のローカルリゾルバは動作させたまま53番ポートのListenを無効化させます。 /etc/systemd/resolved.conf [Resolve] DNSStubListener=no $ cd /etc $ sudo ln -sf ../run/systemd/resolve/resolv.conf resolv.conf $ sudo systemctl restart systemd-resolved クラウドのインスタンス環境などの場合はローカルリゾルバを変更せずに、Dockerコンテナ側の1053番ポートなどの別のサーピスポート番号で動作しているので、クラウド側のセキュリティグループ設定でグルーバルIPアドレス側の53番ポートとNAT変換させます。 pdns/docker-compose.yml ports: - 1053:53/tcp - 1053:53/udp PowerDNS(pdns)コンテナの設定 PowerDNSの公式Dockerが提供されているので利用します。 このPowerDNS(pdns)コンテナには権威DNS(Auth)、フルリゾルバ(Recursor)、ロードバランサ(dnsdist)の3つのサービスが提供されています。 今回は権威DNS(Auth)だけ利用しますが設定等は3つとも用意しています。 docker-compose設定 適当なディレクトリにDocker-composeファイルを作成します。 $ mkdir -p pdns $ cd pdns pdns/docker-compose.yml version: '2.0' services: recursor: image: powerdns/pdns-recursor-master container_name: pdns_recursor environment: - PDNS_RECURSOR_API_KEY ports: - "2053:53" - "2053:53/udp" - "8082:8082" volumes: - ./recursor.d/recursor.conf:/etc/powerdns/recursor.d/recursor.conf dnsdist: image: powerdns/dnsdist-master container_name: pdns_dnsdist environment: - DNSDIST_API_KEY links: - recursor - auth ports: - "3053:53" - "3053:53/udp" - "5199:5199" - "8083:8083" volumes: - ./conf.d/dnsdist.conf:/etc/dnsdist/conf.d/dnsdist.conf auth: image: powerdns/pdns-auth-master container_name: pdns_auth environment: - PDNS_AUTH_API_KEY ports: - "1053:53" - "1053:53/udp" - "8081:8081" volumes: - powerdns:/var/lib/powerdns - ./pdns.d/pdns.conf:/etc/powerdns/pdns.d/pdns.conf volumes: powerdns: driver: local 各種設定ファイル類はカレントディレクトリ以下に配置してPowerDNS(pdns)コンテナ側にマウントさせています。次に各設定ファイルを作成します。 PowerDNS設定ファイルの作成 権威DNS(Auth) $ mkdir -p pdns.d pdns.d/pdns.conf local-address=0.0.0.0,:: launch=gsqlite3 gsqlite3-dnssec gsqlite3-database=/var/lib/powerdns/pdns.sqlite3 include-dir=/etc/powerdns/pdns.d master=no # マスターの場合=yes slave=no # スレーブの場合=yes allow-axfr-ips=1.2.3.4 # zoneの転送許可IPアドレス番号 version-string=powerdns 権威DNSサーバーは1つのMasterサーバーと複数のSlaveサーバーで構成されますが、PowerDNSではこれを明確に設定します。 ドメインのZone転送はSlaveサーバー側に限定してZone情報が他に漏洩しないようにZone転送許可するIPアドレス番号を記述します。 バージョン表示の応答も詳細を隠しておきます。 フルリゾルバ(Recursor) $ mkdir -p recursor.d recursor.d/recursor.conf local-address=0.0.0.0,:: include-dir=/etc/powerdns/recursor.d ロードバランサ(dnsdist) $ mkdir -p conf.d conf.d/dnsdist.conf setLocal('0.0.0.0') -- this example code goes well with the docker-compose.yml file in pdns.git -- it assumes you create example.com in the auth -- resolver = require 'dnsdist-resolver' -- resolver.servers.auth = {pool='auths'} -- resolver.servers.recursor = {pool='recursors'} -- maintenance = resolver.maintenance -- addAction('example.com', PoolAction('auths')) -- addAction(AllRule(), PoolAction('recursors')) includeDirectory('/etc/dnsdist/conf.d') 環境設定 各APIのkeyを設定します。 pdns/.env PDNS_RECURSOR_API_KEY=[Recursorのkey文字列] DNSDIST_API_KEY=[dnsdistのkey文字列] PDNS_AUTH_API_KEY=[Authのkey文字列] PowerDNS(pdns)コンテナ起動 以上で必要な設定ファイルが用意出来たので、docker-composeコマンドでPowerDNS(pdns)コンテナを起動させます。 $ docker-compose up -d PowerDNS-Admin PowerDNS用のフロントエンドのGUIツールでは活発に開発されているのがPowerDNS-Adminです。 各種ユーザー認証にも対応していて複数ドメインとユーザー管理が出来るのが特徴です。画面表示はpoweradminと違って日本語には対応していませんが、特に難しい事は無く使えると思います。 PowerDNS-Admin(powerdns_admin)コンテナの設定 docker-compose設定 適当なディレクトリにDocker-composeファイルを作成します。 $ mkdir -p PowerDNS-Admin $ cd PowerDNS-Admin PowerDNS-Admin/docker-compose.yml version: "3" services: app: image: ngoduykhanh/powerdns-admin:latest container_name: powerdns_admin ports: - "9191:80" logging: driver: json-file options: max-size: 50m environment: - SQLALCHEMY_DATABASE_URI=http://pdns_auth_1:8081 - GUNICORN_TIMEOUT=60 - GUNICORN_WORKERS=2 - GUNICORN_LOGLEVEL=DEBUG - OFFLINE_MODE=True # True for offline, False for external resources volumes: - pda-data:/data volumes: pda-data: driver: local networks: default: external: name: pdns_default PowerDNS-Adminのコンテナ起動 $ docker-compose up -d Web設定画面 PowerDNS-AdminのGUI画面は、サービスポート番号が9191番なのでブラウザで指定すれば表示されます。最初はアカウント作成のログイン画面になります。 「 http:// localhost:9191 」 また、Dockerコンテナのホスト側にサービスポートをブリッジしていますので、localhostの部分はDockerコンテナを実行しているホスト側のIPアドレス番号になります。 動作確認 権威DNSサーバーの一般的な動作確認をdigコマンドでサーバーホストの内部と外部の両方から行います。 キャッシュ除外の為、digコマンドオプション+norecを付けます。 正引き:dig +norec @[localhost] example.jp A 逆引き:dig +norec @[localhost] -x [IPアドレス番号] バージョン表示:dig +norec @[localhost] chaos version.bind txt Zone転送:dig +norec @[localhost] axfr +multi バージョンは非表示で、Zone転送が許可されたSlaveサーバーのIPアドレス番号限定を確認します。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

NestJS+PostgreSQL(+pgAdmin4)の開発環境をDockerで構築する

はじめに NestJS + PostgreSQL(+ pgAdmin4)の開発環境を、dockerで構築する手順を紹介します。 バージョン情報 Docker : 19.03.13 Docker Compose : 1.27.4 Node.js : 14 PostgreSQL : 11.2 pgAdmin4 : 4.2 ディレクトリ構成 以下のような構成で作成します。 $ tree -L 2 . ├── api │   └── Dockerfile ├── app // コンテナ共有ディレクトリ │   └── [ project directory ] ├── db │   ├── pgadmin4 // DBサーバ接続永続化用ディレクトリ │   └── postgres // DBサーバデータ永続化用ディレクトリ └── docker-compose.yml Dockerfileの作成 公開されているNode.jsのdockerイメージを使い、PostgreSQLのライブラリを導入します。 ついでにちょっとしたファイル編集用にvimをインストールしておきます。 (主要なファイルは共有フォルダに置くので無くてもよい) FROM node:14 # share directory ENV ROOT="/app" # add path env ENV PATH $PATH:/usr/local/bin # set home directory RUN mkdir ${ROOT} WORKDIR ${ROOT} RUN apt-get update && apt-get upgrade -y # install lib (opt : vim) RUN apt-get install -y build-essential libpq-dev postgresql-client vim # install NestJS RUN npm install -g @nestjs/cli docker-compose.ymlの作成 NestJSアプリケーションを構成するコンテナ情報を記載します。 データベース操作用にpgAdmin4を入れてますが、端末に既に入ってたり、使用しないのであれば要らないです。 version: "3.7" services: api: build: api container_name: nest_api tty: true ports: - "3000:3000" volumes: - ./app:/app:delegated # share directory links: - db restart: always db: image: postgres:11.2 container_name: nest_db ports: - "5432:5432" volumes: - ./db/postgres/init.d:/docker-entrypoint-initdb.d - ./db/postgres/pgdata:/var/lib/postgresql/data environment: POSTGRES_USER: root # DB USER POSTGRES_PASSWORD: root # DB Password POSTGRES_INITDB_ARGS: "--encoding=UTF-8" hostname: postgres user: root restart: always pgadmin4: image: dpage/pgadmin4:4.2 container_name: pgadmin4 ports: - "8000:80" volumes: - ./db/pgadmin4:/var/lib/pgadmin environment: PGADMIN_DEFAULT_EMAIL: root # pgAdmin Address PGADMIN_DEFAULT_PASSWORD: root # pgAdmin Password hostname: pgadmin4 links: - db restart: always postgreSQL(pgAdmin4)に設定しているアドレス、パスワードはrootにしてますけど、そこは各自お任せします。 コンテナを作成&起動する 早速コンテナを作成、および起動します。 docker-compose build docker-compose up -d 起動後は、一応エラーがないか調べましょう。 (立ち上がらなかったら、原因調査に時間がかなり取られます) docker ps -a // 立ち上がってなかった場合、ログを見て原因調査 docker-compose logs コンテナにログインする 起動後はコンテナにログインし、プロジェクト作成の準備をします。 docker-compose exec api bash // 以下はログインした後にやってます。作業がやりやすいようにしてるだけなので必須ではないです。 echo 'export LS_OPTIONS='\''--color=auto'\' >> ~/.bashrc echo 'alias ll='\''ls $LS_OPTIONS -l'\' >> ~/.bashrc source ~/.bashrc PostgreSQLに接続できるか確認 一応、ちゃんと設定できているか確認。 psql -h db -U root -d postgres // rootを入力 Password for user root: psql (9.6.19, server 11.2 (Debian 11.2-1.pgdg90+1)) WARNING: psql major version 9.6, server major version 11. Some psql features might not work. Type "help" for help. // postgresのテーブルにログインできたら成功 postgres=# ん?なんか警告出てる。 クライアントとサーバ間のバージョン差異での警告みたい。 警告が出るだけで、特に問題ないからヨシ! ※ ヨシじゃねーだろ!って人は以下のコマンドでアップグレードしてください。 sh -c "echo 'deb http://apt.postgresql.org/pub/repos/apt/ stretch-pgdg main' > /etc/apt/sources.list.d/pgdg.list" wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - apt-get update apt-cache search postgresql | grep ^postgresql // postgresqlのバージョンが増えてるはずなので、対象のパッケージをインストールします。 // サーバ側を11で入れてるのでクライアントも11をインストールします。 apt-get install -y postgresql-client-11 NestJS新規プロジェクトを作成する コンテナ内でコマンドを発行します。 nest new [ New Project Name] // npm か yarn どっちを使用するか聞かれるので好みの方を選択する。 NestJS起動 作成したプロジェクトのディレクトリに移動して、NestJSを起動します。 cd [ Project directory ] // npm npm run start // yarn yarn run start 起動した後は、実際にブラウザで確認します。 localhost:3000にアクセスします。Hello Worldが表示されていたらOK おまけ: pgAdmin4の確認 pgAdmin4も接続確認してみます。 localhost:8000でアクセスできます。 アドレスとパスワードは、docker-compose.ymlに書いたrootで入ります。 ログインすると下記のような画面になります。 サーバを登録するための設定を行います。 Serversを選択した状態で右クリック→サーバの設定を行います。 サーバ名は自分が分かりやすい名前で。 Connectionタブでホスト名、ユーザ名、パスワードを入力して保存。 無事に接続できました。 最後に dockerコンテナでNestJSの開発環境を構築しました。 NestJSはAngularに似てるらしいです。 (触ったことがないので私は分かりません。ControllerとServiceはSpringに似てるなぁと思いました) ここからHTMLを返せるようにするもよし、TypeORMを入れるもよし。 どんどん使っていきましょ〜! 参考 NestJS公式 pgAdmin公式 水無瀬のプログラミング日記 - NestJS事始め
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Visual Studio Code 小技集(2021年卯月)

初めに ご覧いただきありがとうございます。 この文書では、よく使いそうな小技を備忘録的に集めています。 ファイル関連 コード 改行コード 改行コードを確認 ファイルを選択すると、画面右下に、キャレットの位置(Ln 1,Col 1)、インデント数(Space: 2)、改行コード(LF)、ファイル形式(YAML)などが表示される。 Viewメニューから「Render Control Characters」をチェックしておくと、エディタ内でも表示される。表示形式は拡張機能により変更できる。 以下の表示は、「line-ending」拡張機能を入れてある場合。 改行コードを変更 右下の改行コード部分をクリックすると、上部に改行コードの選択プルダウンが表示される。 選択することで、ファイル内すべての改行コードが変換される。 その他 終りに 親記事:WSL2とVSCで作るWindowsでのDocker内開発環境(2021年睦月)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

QNAP NASをminecraft serverにしよう。

NASをminecraft serverにしよう QNAP NASはDockerが使えるため簡単にminecraft serverにできます。 24時間稼働させる場合などで割高なゲーミングPCなどを別途用意する必要がなくお手軽です。 外部の有料サーバーではないため維持費は電気代だけです。 設定は数分で完了。 用意するもの サーバー側 QNAP NAS (TS-253D) クライアント側 Minecraft java edition 1.16.5 サーバー側設定 WebBrowserでQNAPにログイン ContainerStationアプリを起動(DOCKER) Management->CreateタブでDOCKERのMincraftコンテナをCreate 起動後にpingが打てるか確認。ping 10.0.3.2 pingが通らない場合はIPをQNAPのネットワーク設定で仮想スイッチのIPなどを確認 仮想スイッチとDOCKERのマイクラコンテナにもIPが振られる。 https://www.qnap.com/ja-jp/how-to/tutorial/article/container-station-%E3%81%AE%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95 クライアント側 Minecraftのクライアントからは以下のサーバーにアクセス 10.0.3.2:25565または10.0.3.1:49165でサーバーに接続 QNAP内部の通信状態(例) マイクラサーバー 10.0.3.2:25565 仮想スイッチ 10.0.3.1:49165 10.0.3.2:49165から10.0.3.1:25565へPort Forwardingされる。 LAN側からセグメント10.0.3.xにアクセスできるようにしておく。 client PC->NAS->10.0.3.1:49165->10.0.3.2:25565となる。 client PCから10.0.3.xへの経路情報が必要。 その他 QNAPのContainerStationでマイクラのサーバーコンソロールコマンドを実行できる。 dockerで他のゲームサーバーを導入することも可能になるはず。 SteamCMDなども対応できるはず。QNAPのContainierStationにSteamCMDが多く存在している。 QNAP NAS (TS-253D) 今回使用した機器です。NAS用途だけで使うのは宝の持ち腐れかな。 拡張性があって10GbpsのLANカードもさすことができます。 SATA以外に拡張カードで高速なM.2カード(m-key)もサポートします。 Celeron CPUでゲームサーバーに最適。 Dockerが使えるため仮想化が容易に可能。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

QNAP NASをmincraft serverにしよう。

NASをmincraft serverにしよう

QNAP NASはDockerが使えるため簡単にmincraft serverにできます。
24時間稼働させる場合などで割高なゲーミングPCなどを別途用意する必要がなくお手軽です。
外部の有料サーバーではないため維持費は電気代だけです。
設定は数分で完了。

用意するもの

サーバー側
QNAP NAS (TS-253D)
クライアント側
Minecraft java edition 1.16.5

サーバー側設定

  1. WebBrowserでQNAPにログイン
  2. ContainerStationアプリを起動(DOCKER)
  3. Management->CreateタブでDOCKERのMincraftコンテナをCreate
  4. 起動後にpingが打てるか確認。ping 10.0.3.2

クライアント側

  1. Minecraftのクライアントからは以下のサーバーにアクセス
    10.0.3.2:25565または10.0.3.1:49165でサーバーに接続

QNAP内部の通信状態(例)

  • マイクラサーバー 10.0.3.2:25565
  • 仮想スイッチ 10.0.3.1:49165
  • 10.0.3.2:49165から10.0.3.1:25565へPort Forwardingされる。
  • LAN側からセグメント10.0.3.xにアクセスできるようにしておく。
  • client PC->NAS->10.0.3.1:49165->10.0.3.2:25565となる。
  • client PCから10.0.3.xへの経路情報が必要。

その他

  • QNAPのContainerStationでマイクラのサーバーコンソロールコマンドを実行できる。
  • dockerで他のゲームサーバーを導入することも可能になるはず。
  • SteamCMDなども対応できるはず。QNAPのContainierStationにSteamCMDが多く存在している。

QNAP NAS (TS-253D)

今回使用した機器です。NAS用途だけで使うのは宝の持ち腐れかな。

  • 拡張性があって10GbpsのLANカードもさすことができます。
  • SATA以外に拡張カードで高速なM.2カード(m-key)もサポートします。
  • Celeron CPUでゲームサーバーに最適。
  • Dockerが使えるため仮想化が容易に可能。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む