- 投稿日:2020-03-29T23:39:51+09:00
Dockerで構築するEthereum PET-SHOP TRUFFLE BOXES(その3)
その1、その2からの続きでで、ETHEREUM PET SHOP チュートリアルをやっていきます。
Creating a user interface to interact with the smart contract
今度は、UIの作成です。
最初に見たように、基本的な画面は表示されるようになっています。
チュートリアルのUI変更の最初としては、/src/js/app.js の、データを読み込んでいるinit() が、initWeb3() を呼び出しているので、これに手を入れていくとのこと。まずは、web3のインスタンス作成。web3とは、web3 JavaScript library。これを使って、Ethereum ブロックチェーンとやりとりをします。
次は、スマートコントラクトのインスタンス作成です。
これは、truffle-contract ライブラリが行います。まずやりたいのは、Adoption に接続して、getAdopters() を呼び出すことで、これをmarkAdopted Functionで行います。
養育引受済みのペットは、adoptボタン(引受ボタン)を使用不可にして、文字を「Success」にします。
console.log(err.message);
で、コンソールログ出力が可能です。最後に、adopt() で引受ける処理を作成します。
これらを記載した、app.js は下記のようになります。
app.jsApp = { web3Provider: null, contracts: {}, init: async function() { // Load pets. $.getJSON('../pets.json', function(data) { var petsRow = $('#petsRow'); var petTemplate = $('#petTemplate'); for (i = 0; i < data.length; i ++) { petTemplate.find('.panel-title').text(data[i].name); petTemplate.find('img').attr('src', data[i].picture); petTemplate.find('.pet-breed').text(data[i].breed); petTemplate.find('.pet-age').text(data[i].age); petTemplate.find('.pet-location').text(data[i].location); petTemplate.find('.btn-adopt').attr('data-id', data[i].id); petsRow.append(petTemplate.html()); } }); return await App.initWeb3(); }, initWeb3: async function() { // Modern dapp browsers... if (window.ethereum) { App.web3Provider = window.ethereum; try { // Request account access await window.ethereum.enable(); } catch (error) { // User denied account access... console.error("User denied account access") } } // Legacy dapp browsers... else if (window.web3) { App.web3Provider = window.web3.currentProvider; } // If no injected web3 instance is detected, fall back to Ganache else { App.web3Provider = new Web3.providers.HttpProvider('http://localhost:7545'); } web3 = new Web3(App.web3Provider); return App.initContract(); }, initContract: function() { $.getJSON('Adoption.json', function(data) { // Get the necessary contract artifact file and instantiate it with truffle-contract var AdoptionArtifact = data; App.contracts.Adoption = TruffleContract(AdoptionArtifact); // Set the provider for our contract App.contracts.Adoption.setProvider(App.web3Provider); // Use our contract to retrieve and mark the adopted pets return App.markAdopted(); }); return App.bindEvents(); }, bindEvents: function() { $(document).on('click', '.btn-adopt', App.handleAdopt); }, markAdopted: function(adopters, account) { var adoptionInstance; App.contracts.Adoption.deployed().then(function(instance) { adoptionInstance = instance; return adoptionInstance.getAdopters.call(); }).then(function(adopters) { for (i = 0; i < adopters.length; i++) { if (adopters[i] !== '0x0000000000000000000000000000000000000000') { $('.panel-pet').eq(i).find('button').text('Success').attr('disabled', true); } } }).catch(function(err) { console.log(err.message); }); }, handleAdopt: function(event) { event.preventDefault(); var petId = parseInt($(event.target).data('id')); var adoptionInstance; web3.eth.getAccounts(function(error, accounts) { if (error) { console.log(error); } var account = accounts[0]; App.contracts.Adoption.deployed().then(function(instance) { adoptionInstance = instance; // Execute adopt as a transaction by sending account return adoptionInstance.adopt(petId, {from: account}); }).then(function(result) { return App.markAdopted(); }).catch(function(err) { console.log(err.message); }); }); } }; $(function() { $(window).load(function() { App.init(); }); });Interacting with the dapp in a browser
では、ブラウザでdappを使用します。
最初は、MetaMask のインストールから説明が始まりますが、ここではインストールされているものとして、スキップします。チュートリアルでいうと、6.まで終わっている状態です。
その状態で、MetaMaskをganacheのネットワークに接続するわけですが、http://127.0.0.1:7545 ではなく、HTTP://10.200.10.1:7545 に接続します。eここまで来ると、ローカルサーバを起動して、dapp を使うことができるということで、その仕組みとして、lite-server が使用されているとのことです。
では、改めて、ブラウザでアプリを開いてみます。
チュートリアルでは、npm run dev を叩くとなっていますが、docker-compose で起動時にこれを実行することになっています。
いったん、Docker 環境を抜けます。/usr/src/app # exit
そして、起動しなおします。
$ docker-compose down $ docker-compose up -dhttp://localhost:8003/
あれ、全部Successになってる・・・最後がイマイチですが、とりあえず、ここまでがチュートリアルでした。
Docker を使用して、開発する流れはできたかなと思います。
次は何をすれば良いのだろう・・・
- 投稿日:2020-03-29T23:13:15+09:00
組み込み系からWeb系へのスキルチェンジ【随時更新】
はじめに
組み込みの開発しかほぼしたことしかない中で、Web系のスキルを身に着けるためにやったことをメモっておきます。
現状のWeb系のスキル。
- Perl/PHP/javascript/HTML5:ちょっと使えるレベル
- セキュアド:取得済
- ネスペ:一通り勉強はした(受かってはいない)
- github/Slack:プライベートで少し使ってるレベル(
業務?シャガイノサービスナンテシヨウキンシデスヨ)書籍
- TECHNICAL MASTER はじめてのPHPプロフェッショナル開発 PHP7対応 :チーム開発に即した形(もちろん会社やプロジェクトにもよるだろうけど)で書かれてたので、PLをやるのに役立ちそうだったので購入。推奨動作環境はMacOSで書かれています。
環境構築
手持ちがWindows10 homeしかなくDockerを入れれないので、VirtualBox+Ubuntuベースで環境構築しました。
Windows10にVirtualBoxとUbuntuをインストール
Windows10にVirtualBoxとUbuntuをインストールを参考にしました。
Ubuntuのバージョンは2020/3/22時点で最新のLSTの「Ubuntu 18.04.4 LTS」を使用しましたが、手順はほぼ一緒です。設定変更
- VirtualBoxの[設定]-[一般]-[高度]-[クリップボードの共有]と[ドラッグ&ドロップ]を「双方向」に
- VirtualBox上のUbuntu 18.04の画面サイズを自動で切り替えられるようにする
- ubuntsの右クリックで新規ファイルを作成できるようにする: Ubuntu 18.04の右クリックメニューから「空のドキュメント」を作成する
Docker
VirtualBox に Ubuntu 18.04 と Docker をインストールしたメモを参考にインストール。バージョンは19.03.8。
追加でdocker-composeをインストール
$ sudo apt install docker-composePHP
一旦、書籍1.に合わせてPHP7.2を入れる。
Ubuntu 16.04 で PHP 7.2 を使う手順MySQL
UbuntuにMySQLをインストールを参考にインストール。
バージョンは14.14。$ sudo apt install mysql-server mysql-client //rootユーザ設定 $ sudo mysql_secure_installationVisual Studio Code
簡単にUbuntuにVSCode (Visual Studio Code) をインストールする方法を参考にインストール。
バージョンは1.43.2。日本語化
Visual Studio Code のユーザーインタフェイス(UI) 表示を日本語にする
PHP IntelliSense
以下を参考に導入。
setting.jsonの設定は、LinuxのPHPのインストール先に合わせて以下になります。
~/.config/Code/User/setting.json{ "php.validate.enable": false, "php.suggest.basic": false, "php.executablePath": "/usr/bin/php" }うまくいかなかったとこ
Dcokerでdocker-entrypoint-initdb.dをマウントするときにPermission deniedエラーがでる。
docker-compose.ymlに以下を追加したら、エラーがでるようになった。(全文は書籍の内容なので割愛します。)
docker-compose.ymlvolumes: - ./Docker/mysql/sqls:/docker-entrypoint-initdb.d$ docker-compose up Creating network "phpbookapp_default" with the default driver Creating php-book-app-db ... Creating php-book-app-db ... done Attaching to php-book-app-db php-book-app-db | 2020-03-29 01:19:13+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.29-1debian10 started. php-book-app-db | 2020-03-29 01:19:13+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' php-book-app-db | 2020-03-29 01:19:13+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.29-1debian10 started. php-book-app-db | ls: cannot open directory '/docker-entrypoint-initdb.d/': Permission denied php-book-app-db exited with code 2解決策
ホスト側のディレクトリにgroupとotherの読み取り・実行権限がなかったのが原因でした。。。
- 投稿日:2020-03-29T22:48:14+09:00
VSCode+docker-compose+php(xdebug)の環境構築のポイント
はじめに
ありふれた記事なのではあるが一発では起動できない。。
なので基本的なところは他の記事に譲るとして、必ずデバッグする為のポイントを上げてみた。1. VSCodeにPHPDebugをインストール
インストール後にF5などで
RUN and Debug
を起動してlaunch.jsonを適当に作る。launch.json{ "port": 19000, "pathMappings": { "/var/www/workspace/php_loach":"/Users/xxx/workspace/project/php_loach" } }注)他にも必要な項目はあるが、わかりやすく、
port
とpathMappings
だけ取り上げた。他の記事で確認してほしい。
portはxdebugで指定するportと合わせる。webでアクセスするportとは違う。
pathMappingsのディレクトリは、projectのドキュメントルートを指定。dockerとローカルは同じディレクトリを指定。2. サーバ側にxdebugをインストール
Dockerfileでxdebugをインストールする。(詳細は他の記事で確認してほしい)
そしてxdebug.iniを用意する。xdebug.ini; Enable xdebug extension module zend_extension=/usr/lib64/php/modules/xdebug.so ; xdebug xdebug.remote_enable = 1 xdebug.remote_enable = 1 xdebug.default_enable = 1 xdebug.remote_host = docker.for.mac.localhost xdebug.remote_port = 19000 xdebug.remote_handler=dbgp xdebug.remote_mode=req xdebug.remote_autostart = Onこんな感じの。(詳細は他の記事で確認してほしい)
ここのremote_portとlaunch.jsonのportをあわせる。
docker-composeのportは全く関係ない。docker-composeはアクセス用のportを書くところでxdebugのportは書かない。無視。3. VSCodeのdebugを起動
launch.jsonを正しく設定してあると、F5を押しただけで、下のバーがオレンジに変わってXdebugが起動する。
そして、止めたいところでコードの左側にブレイクポイント(赤いマーク)をつける。4. クライアント側の設定を忘れない
これ、忘れがち。。
ブラウザなら虫マークのdebugの拡張を追加して、虫マークを緑にする。
POSTMANなどでAPIのエンドポイントにアクセスするときは、エンドポイントの最後に
XDEBUG_SESSION_START=true
を追加する。
http://localhost:9001/api/getUser?XDEBUG_SESSION_START=true
これを忘れるとブレイクポイントで止まらない!!終わりに
自分のハマりポイントを上げてみた。これですんなりと動いたのでこれ以外は思い浮かばない。。
もし、他にハマりポイントがあれば教えてほしい。
- 投稿日:2020-03-29T22:46:59+09:00
MySQLからcsvを出力する
環境
mysql : Ver 8.0.19 for Linux on x86_64 (MySQL Community Server - GPL)
SELECT文でcsvファイルを出力する
SELECT * FROM hoge INTO OUTFILE '/output/hoge.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'dockerでMYSQLコンテナ立ち上げている場合、
OUTFILE
をマウント位置にすると良いcsvファイルを出力する際にエラーを吐いた場合
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statementデータの入出力エラー
MySQLの設定を確認
mysql> SELECT @@global.secure_file_priv; +---------------------------+ | @@global.secure_file_priv | +---------------------------+ | NULL | +---------------------------+このNULLがダメらしい
設定を変更して解決する
DockerでMySQLコンテナを立ち上げて.sqlファイルからDBを作る
立ち上げているコンテナは上の通りなので、my.cnf
に以下を追記[mysqld] secure-file-priv = ""コンテナ再起動で設定を反映させてると設定欄のNULLが消える
mysql> SELECT @@global.secure_file_priv; +---------------------------+ | @@global.secure_file_priv | +---------------------------+ | | +---------------------------+これでSELECT文でcsvファイルが吐き出せるようになっているはず
参考資料
MySQLのバージョン確認方法
MySQLのSELECT文でcsvを出力する
MySQLでCSV出力しようとしたら --secure-file-priv option のエラーになった
MySQLでCSVファイルを使って結果出力やデータ入力を行う方法
- 投稿日:2020-03-29T22:32:48+09:00
DockerToolboxでOracle環境構築ではまったことメモ
容量足りないエラー
イメージ作成時に容量エラーとなる。
VMの仮想ディスクサイズを変更する。
とりあえず40GBくらいにしておきたい。vmdkだと拡張できないのでvdiに複製してから拡張する。
複製&拡張はグローバルメニューから実施。拡張後にvmdkに戻してアタッチするもVMが起動しないので、
拡張後のvdiのままでアタッチしてみたら起動した。共有フォルダのマウントがうまくいかない
[問題]
データ領域に共有フォルダをマウントしたいのだが何度やっても
下記のようにうまくいかない。[oracle@2f26fe3ef960 ~]$ df -h Filesystem Size Used Avail Use% Mounted on overlay 37G 6.2G 29G 18% / tmpfs 64M 0 64M 0% /dev tmpfs 999M 0 999M 0% /sys/fs/cgroup shm 4.0G 0 4.0G 0% /dev/shm /dev/sda1 37G 6.2G 29G 18% /etc/hosts tmpfs 1.8G 284M 1.5G 16% /opt/oracle/oradata tmpfs 999M 0 999M 0% /proc/asound tmpfs 999M 0 999M 0% /proc/acpi tmpfs 999M 0 999M 0% /proc/scsi tmpfs 999M 0 999M 0% /sys/firmware[原因]
VM側のVirtualBoxの共有フォルダ設定ミス。
というかインストール後の初期設定で入るフォルダパスに"?"とか入っているのが問題。
変更後、default側で認識していることを確認すること。DockerコンテナにOracle Database 19c をインストールして、Windows 側から接続
Dockerでファイル共有をするための、VirtualBoxの設定
- 投稿日:2020-03-29T22:10:58+09:00
Dockerコンテナ内部からホストにアクセスする方法
いつ使うのか?
Dockerコンテナを開発環境として、コンテナのホストOSで動いているサービスと通信したいときに、コンテナ内部からホストにアクセスするためのIPアドレスを調べる。
以下は、下記のDockerfileからビルドしたコンテナを具体例として説明する。
FROM ruby:2.6 RUN ln -fs /usr/share/zoneinfo/Asia/Tokyo /etc/localtime RUN apt-get update -qq && \ apt-get install -y vim docker build --tag example-ruby-dev .方法
OS X/Winの場合
公式のドキュメントによって、DockerのバージョンがCEの18.03以上の場合、"host.docker.internal"といったDNS名でデフォルトで設定されて。そうすると、下記のコマンドを使って、コンテナを立ち上げた上で、"Ping -a host.docker.internal"などの方法で、ホストのIPアドレスを調べる。
docker container run -it example-ruby-dev /bin/bashLinuxの場合
Linux版のDockerでは、上述のようなデフォルト設定がまだないので、上記のコマンドを使って、コンテナを立ち上げた上で、以下のコマンドで、ホストのIPアドレスを調べる。
ip route show default | awk '/default/ {print $3}'後書
ホストにアクセスするIPアドレスをDockerから発行することではなく、最初から特定な値で指定したい場合、@ijufumiさんの記事で述べた設定方法を参考してください。
- 投稿日:2020-03-29T20:45:30+09:00
Dockerコマンド - 基本操作
はじめに
Dockerでよく利用するであろうコマンドを、イメージ操作/コンテナ操作ごとに分けて簡単にメモりました。
・Dockreのバージョン : 19.03.6
イメージ操作系
・イメージ検索
docker search [options] <検索キーワード>[options]
--limit=<検索結果表示数>
→表示する検索結果数を絞る--filter stars=<最低スター数>
→スター数で検索フィルターをかける・イメージ取得
docker image pull [options] <リポジトリ名[:タグ名]>[options]
-a
→全てのタグを含むイメージ取得・イメージ一覧
docker image ls [options][options]
-q
→イメージIDのみ表示・イメージビルド
docker image build [option] -t <イメージ名[:タグ名]> <Dockerfileの配置ディレクトリ>[option]
-f
→使用するDockerfileの名前を指定-pull=true
→強制的にベースイメージを取得・イメージタグ付け
docker image tag <元のイメージ名[:タグ名]> <新しイメージ名[:タグ名]>・イメージ公開
docker image push <リポジトリ名[:タグ名]>・イメージ削除
docker image rm [options] <イメージ名[:タグ名]>[option]
-f
→強制的にイメージ削除コンテナ操作系
・コンテナ作成
docker container run [option] <イメージ名[:タグ名]> <コマンド>[option]
-d
→コンテナをバックグラウンドで実行-i
→ホストの入力をコンテナの標準出力につなげる-t
→コンテナの標準出力をホストの標準出力とつなげる-p <ホストのポート番号>:<コンテナのポート番号>
→<ホストのポート番号>から<コンテナのポート番号>へポートフォワーディング-v <ホスト側ディレクトリ>:<コンテナ側ディレクトリ>
→<ホスト側ディレクトリ>と<コンテナ側ディレクトリ>が共有される--name <コンテナ名>
→コンテナに名前を付ける・コンテナ一覧
docker container ls[option]
-q
→イメージIDのみ表示・実行中のコンテナ内でコマンド実行
docker container exec [option] <コンテナ名/コンテナID> <コンテナ内で実行するコマンド>[option]
-d
→コマンドをバックグラウンドで実行-i
→ホストの入力をコンテナの標準出力につなげる-t
→コンテナの標準出力をホストの標準出力とつなげる・コンテナ-コンテナ間/コンテナ-ホスト間でファイルコピー
docker container cp <ホストのコピー元 or コンテナ名:コンテナ内のコピー元> <コンテナ名:コンテナ内のコピー先 or ホストのコピー先>・コンテナ停止
docker container stop <コンテナ名/コンテナID>・現在のコンテナからイメージ作成
docker container commit <コンテナ名/コンテナID> <リポジトリ[:タグ名]>・コンテナ再起動
docker container restart <コンテナ名/コンテナID>・コンテナ削除
docker container rm <コンテナ名/コンテナID>
- 投稿日:2020-03-29T20:23:06+09:00
Dockerで構築するEthereum PET-SHOP TRUFFLE BOXES(その2)
その1からの続きでで、ETHEREUM PET SHOP チュートリアルをやっていきます。
Writing the smart contract
バックエンドとして動作するスマートコントラクト、Adoption.sol を作成していきます。
記述結果はこのようになります。
Adoption.solpragma solidity ^0.5.0; contract Adoption { address[16] public adopters; // Adopting a pet function adopt(uint petId) public returns (uint) { require(petId >= 0 && petId <= 15); adopters[petId] = msg.sender; return petId; } // Retrieving the adopters function getAdopters() public view returns (address[16] memory) { return adopters; }Compiling and migrating the smart contract
コンパイルは、
$ truffle compile
を叩きます。Docker環境の中で。これがポイント。
普通にやるのであれば、docker-compose up で起動中の環境を、Ctrl+Cで終了。
改めて、$ docker-compose up -dでバックグラウンド起動。
この状態で、Docker内のshellに入ります。
下記の、「truffle」は、docker-compose.yml で、services:の下で指定している名前。$ docker-compose run truffle sh /usr/src/app #こんな感じで表示されますので、truffle compile を実行します。
/usr/src/app # truffle compile You can improve web3's peformance when running Node.js versions older than 10.5.0 by installing the (deprecated) scrypt package in your project Compiling your contracts... =========================== > Compiling ./contracts/Adoption.sol > Artifacts written to /usr/src/app/build/contracts > Compiled successfully using: - solc: 0.5.16+commit.9c3226ce.Emscripten.clang成功です。
続いてマイグレーション。マイグレーションファイルを使って、ネットワークにデプロイします。
元々準備されている、migrations/1_initial_migration.js は、trrfle プロジェクトを作成した際に作られるもので、Migrations.sol をデプロイするということだけを書いているのですね。
そこで、Adoption.sol をデプロイするための、2_deploy_contracts.js を作ります。やっている内容は、対象が違うだけで、1_initial_migration.js と同じです。
2_deploy_contracts.jsvar Adoption = artifacts.require("Adoption"); module.exports = function(deployer) { deployer.deploy(Adoption); };マイグレートする前には、ganache が起動していることを確認しておきます。
RPC SERVER
HTTP://10.200.10.1:7545
です。
そして、コンパイル時に、Docker環境に入っていると思いますので、実行します。
/usr/src/app # truffle migrate You can improve web3's peformance when running Node.js versions older than 10.5.0 by installing the (deprecated) scrypt package in your project Compiling your contracts... =========================== > Everything is up to date, there is nothing to compile. Starting migrations... ====================== > Network name: 'development' > Network id: 5777 > Block gas limit: 0x6691b7 2_deploy_contracts.js ===================== Deploying 'Adoption' -------------------- > transaction hash: 0x60f8967bc9aff355dac281fe96576362ea57bcc8b461466ee6eb19e7df645b76 > Blocks: 0 Seconds: 0 > contract address: 0xb25D78Fc89CE462816Aa4596e93b9a31CAfC176E > block number: 7 > block timestamp: 1585479243 > account: 0xc55F3d6C444ca88f529F3413EDEd85a39e38609C > balance: 99.98329494 > gas used: 239915 > gas price: 20 gwei > value sent: 0 ETH > total cost: 0.0047983 ETH > Saving migration to chain. > Saving artifacts ------------------------------------- > Total cost: 0.0047983 ETH Summary ======= > Total deployments: 1 > Final cost: 0.0047983 ETH成功です。ganacheの画面でも、current block が増加し、最初のアカウントのetherが減少しています。
Testing the smart contract
次は、テストを書いていきます。テストは、JavaScript でも、Solidity でも書けるそうです。チュートリアルでは、Solidity で書いていきます。
Adoption.sol は、
- address[16] public adopters
- function adopt(uint petId) public returns (uint)
- function getAdopters() public view returns (address[16] memory)
のPublic 変数、Functionがありますので、それらをテストします。チュートリアルに従って記述していくと、下記のようになります。
TestAdoption.solpragma solidity ^0.5.0; import "truffle/Assert.sol"; import "truffle/DeployedAddresses.sol"; import "../contracts/Adoption.sol"; contract TestAdoption { // The address of the adoption contract to be tested Adoption adoption = Adoption(DeployedAddresses.Adoption()); // Testing the adopt() function function testUserCanAdoptPet() public { uint returnedId = adoption.adopt(expectedPetId); Assert.equal(returnedId, expectedPetId, "Adoption of the expected pet should match what is returned."); } // Testing retrieval of a single pet's owner function testGetAdopterAddressByPetId() public { address adopter = adoption.adopters(expectedPetId); Assert.equal(adopter, expectedAdopter, "Owner of the expected pet should be this contract"); } // Testing retrieval of all pet owners function testGetAdopterAddressByPetIdInArray() public { // Store adopters in memory rather than contract's storage address[16] memory adopters = adoption.getAdopters(); Assert.equal(adopters[expectedPetId], expectedAdopter, "Owner of the expected pet should be this contract"); } // The id of the pet that will be used for testing uint expectedPetId = 8; //The expected owner of adopted pet is this contract address expectedAdopter = address(this); }コンソールはDocker環境に入っていると思いますので、そこでテストを実行します。
/usr/src/app # truffle test You can improve web3's peformance when running Node.js versions older than 10.5.0 by installing the (deprecated) scrypt package in your project Using network 'development'. Compiling your contracts... =========================== > Compiling ./test/TestAdoption.sol > Artifacts written to /tmp/test-2020229-61-u4mbmv.pjgpm > Compiled successfully using: - solc: 0.5.16+commit.9c3226ce.Emscripten.clang TestAdoption ✓ testUserCanAdoptPet (140ms) ✓ testGetAdopterAddressByPetId (147ms) ✓ testGetAdopterAddressByPetIdInArray (164ms) 3 passing (10s)成功しました。
Creating a user interface to interact with the smart contract
では、UIの作成に入っていきます。
(いったん公開して、その3に続けていきます。)
- 投稿日:2020-03-29T15:11:46+09:00
docker-composeで起動してるMySQLがうまく終了しなくなってたのを直した
概要
私が頻繁に使っているローカル開発環境用の
docker-compose.yml
に含まれるMySQLが気づいたらちゃんと終了しなくなっていて、たまにデータをぶっ壊していたから直しました。原因
mysqlコンテナを
command: bash-c 'ほげほげ'
で起動していたら、PID1で起動するもんで、終了時のkillをうまくハンドリングできずに、mysqlのプロセスまでkillが届かず落ちなくて、タイムアウトでホストから落とされていた(データ壊す危険)。docker-compose.ymlにやったこと
initオプションを指定して
/dev/ihit
越しに起動してあげればこいつがちゃんとハンドリングしてくれます。
3.5だったので、3.7へバージョン上げて、下記のようにinit: true
を指定しました。version: '3.7' services: mysql: image: mysql:5.7 init: true command: bash -c ' touch /var/log/mysql/general.log && chown mysql:mysql /var/log/mysql/general.log && tail -f /var/log/mysql/general.log & /entrypoint.sh mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --general-log=true --general-log-file=/var/log/mysql/general.log --sql-mode=ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION --innodb-use-native-aio=0'before
指定していなかった時代
root@4b13f5625011:/# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 05:53 ? 00:00:00 bash -c touch /var/log/mysql/general.log && chown mysql:mysql /var/log/mysql/general.log && tail -f /var/log/mysql/general.log & /entrypoint.sh mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --general-log=true --general-log-file=/var/log/mysql root 7 1 0 05:53 ? 00:00:00 bash -c touch /var/log/mysql/general.log && chown mysql:mysql /var/log/mysql/general.log && tail -f /var/log/mysql/general.log & /entrypoint.sh mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --general-log=true --general-log-file=/var/log/mysql mysql 8 1 5 05:53 ? 00:00:00 mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --general-log=true --general-log-file=/var/log/mysql/general.log --sql-mode=ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION --innodb-use-native-aio=0 root 14 7 0 05:53 ? 00:00:00 tail -f /var/log/mysql/general.log root 65 0 0 05:53 pts/0 00:00:00 bash root 71 65 0 05:53 pts/0 00:00:00 ps -efafter
指定した時代
root@8771d0333475:/# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 06:00 ? 00:00:00 /sbin/docker-init -- docker-entrypoint.sh bash -c touch /var/log/mysql/general.log && chown mysql:mysql /var/log/mysql/general.log && tail -f /var/log/mysql/general.log & /entrypoint.sh mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --general- root 7 1 0 06:00 ? 00:00:00 bash -c touch /var/log/mysql/general.log && chown mysql:mysql /var/log/mysql/general.log && tail -f /var/log/mysql/general.log & /entrypoint.sh mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --general-log=true --general-log-file=/var/log/mysql root 9 7 0 06:00 ? 00:00:00 bash -c touch /var/log/mysql/general.log && chown mysql:mysql /var/log/mysql/general.log && tail -f /var/log/mysql/general.log & /entrypoint.sh mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --general-log=true --general-log-file=/var/log/mysql mysql 10 7 2 06:00 ? 00:00:00 mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --general-log=true --general-log-file=/var/log/mysql/general.log --sql-mode=ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION --innodb-use-native-aio=0 root 13 9 0 06:00 ? 00:00:00 tail -f /var/log/mysql/general.log root 67 0 1 06:00 pts/0 00:00:00 bash root 73 67 0 06:00 pts/0 00:00:00 ps -ef結果
こうするとホストから
Ctrl + C
を叩き込んでもタイム・アウトすることなく、素直に落ちてくれるようになりました。参考
- Dockerの--initフラグについて https://christina04.hatenablog.com/entry/docker-init
- 投稿日:2020-03-29T12:39:16+09:00
[Docker] PHP 5.6 + MySQL 5.6の環境をDockerで作る方法
PHP 5.6 + MySQL 5.6の環境をDockerで作る方法
こんにちは、ITエンジニアの田中です。
今回は、PHP 5.6 + MySQL 5.6の環境をDockerで作る方法を説明します。この記事の対象者
PHP7.4がすでにリリースされているこの2020年に、
2014年8月28日リリースされたPHP5.6の環境が必要になった希少なあなたに向けて書いた記事です。
過去のアプリケーションのリファクタリングをするときには有益です。構築される環境
- PHP 5.6.40
- Apache/2.4.25 (Debian)
- mysql Ver14.14 Distrib 5.6.47
前提環境
- dockerインストール済み
私の環境
- mackbookフォルダ構成
root/ ├ app/ │ └ public (Web公開されるパス) ├ config/ │ └ php/php.ini (phpで使用する設定ファイル) ├ data/ (mysqlのデータ) ├ initdb.d (コンテナーを作成するときに実行されるSQL) └ docker-compose.yml └ DockerfileApache設定ファイルを取得・変更
Apacheの設定を変更し、公開フォルダを変更します。
■ 変更前
/var/www/html■ 変更後
/var/www/html/public下記の記事を参考にしてください。
https://qiita.com/eidera/items/19decbfc290b4776cfc3Dockerfileの作成
下記のDockerfileの内容をコピーして作成してください。
FROM php:5.6-apache # PHPのインストール RUN apt-get update \ && apt-get install -y \ libfreetype6-dev \ libjpeg62-turbo-dev \ libmcrypt-dev \ libpng-dev \ openssl libssl-dev \ libxml2-dev \ && docker-php-ext-install -j$(nproc) iconv mcrypt pdo_mysql mbstring xml tokenizer zip \ && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \ && docker-php-ext-install -j$(nproc) gd \ && docker-php-ext-install mysql \ && pear channel-update pear.php.net \ && pear upgrade-all \ && pear config-set auto_discover 1 \ && pear install DB # apacheのrewriteを有効にする RUN cd /etc/apache2/mods-enabled \ && ln -s ../mods-available/rewrite.load COPY /config/php/php.ini /usr/local/etc/php/php.ini WORKDIR /var/www/htmldocker-compose.ymlの作成
下記のdocker-compose.ymlの内容をコピーして作成してください。
web: container_name: web build: . ports: - "80:80" environment: # bargeでは、/usr/local/binも追加しておかないと起動できない。 PATH: ${PATH}:/usr/local/bin:/root/.composer/vendor/bin volumes: - ./app:/var/www/html - ./config/apache2/sites-available:/etc/apache2/sites-available links: - db db: image: mysql:5.6 container_name: mysql5.6 command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci --init-connect="SET NAMES utf8" --innodb_file_per_table=1 --innodb_file_format=BARRACUDA environment: MYSQL_ROOT_PASSWORD: rootpassword MYSQL_DATABASE: libary_beauty MYSQL_USER: local MYSQL_PASSWORD: password volumes: - "./data:/var/lib/mysql" - "./initdb.d:/docker-entrypoint-initdb.d" ports: - "13306:3306"テスト用のPHPファイル
下記のtest.phpの内容をコピーして作成してください。
そして、app/publicの下に置いてください。<?php echo "<h1>これはテストです!</h1>";buildして起動
> docker-compose build > docker-compose upテスト実行
下記のURLにアクセスしてください!
http://localhost/test.php太字で表示されれば成功です!
終わりに
わかりにくい部分があれば、コメントください!
これからも役立つ情報を公開していくのフォローお願いします!
- 投稿日:2020-03-29T07:41:46+09:00
Docker上に動画エンコード環境を作るまで(CMcut4U)
はじめに
普段はWindows10上にavisynthととaviutilを利用して自動CMカットバッチをキックしつつtsファイルのエンコードを行っているが、動画エンコード部分を別PCに切り出せないかなと思い、色々と試行錯誤したメモ書き。
CMカットもしたいため、まずはPCを購入する前にVMWare上に環境を作成し実験した。
CMcut4Uを使用させていただいた。
このプログラムはフレーム単位のカットではなく秒単位のカットとなっているため、CMがほぼ一定フレーム残る仕様となっている。環境情報
Windows10 Home
CPU: i7-7700 CPU @3.60GHz
メモリ: 16.0GBVMWare 14
Tera Term 4.86
Xming 6.9.0.31
WinSCP 5.5.4環境構築
インストール方法は省略。少なくともWindowsから操作したい場合はTera Term、Xming、WinSCPは必須(代替製品でもOK)。
Ubuntuのインストール
同じく省略。適宜ユーザを作成。
Ubuntuの設定
この項ではまだTeratermからの接続はできないため、Ubuntu上から設定を行う。
rootユーザのパスワード設定
作成したユーザにてログインし、下記コマンドでrootユーザのパスワードを設定する。
$ sudo passwd rootssh許可
Windowsからsshで接続できるようにするための設定。
まずはパッケージをインストール。apt-get update apt-get install aptitude aptitude install sshインストール後、/etc/ssh/sshd_configに「PermitRootLogin yes」を追記
vi /etc/ssh/sshd_config PermitRootLogin yessshを再起動
/etc/init.d/ssh restart以降で特筆しない限りrootユーザでの作業とする。
Teraterm、Xmingの設定
この項はTeratermから操作をするための設定。Teratermを利用しない場合はスキップ可能。
Teratermの設定
設定 -> SSHポート転送 より、「Xクライアントアプリケーションの転送」にチェックを入れる。
設定 -> 設定の保存 より、設定情報を保存。
Xmingの設定
Xmingをインストールしたフォルダ内の「X0.hosts」を編集する。
デフォルトでは「localhost」のみが設定されているため、構築したUbuntuのIPを追記する。X0.hostslocalhost 192.168.xxx.xxx設定後、Xmingを再起動。
Ubuntuの設定
出力ディスプレイの設定を行う。
ログオフしても設定が消えないよう「.bashrc」にDISPLAY設定を追記する。
追記するIPはWindowsマシンのIPを追記する。# cat export DISPLAY=192.168.yyy.yyy:0 >> /root/.bashrcXmingの動作確認
Teratermにて新しいセッションでUbuntuにログインする。
その後デフォルトでインストールされているであろうfirefoxを起動してみる。
(GUIを利用しているアプリケーションならなんでもいい)# firefox &WindowsマシンにFirefoxが表示されれば設定完了。
Docker、Docker-composeのインストール
Dockerのインストール
ここではstableをインストールする。
# apt-get update # apt-get install -y apt-transport-https ca-certificates curl software-properties-common # curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - # apt-key fingerprint 0EBFCD88 # add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable" # apt-get install -y docker-ceインストール後にバージョン情報が表示されれば成功。
# docker --version Docker version 19.03.8, build afacb8b7f0Docker-composeのインストール
インストールするバージョンによりパスが異なるため、リリース情報より予め確認すること。
下記コマンドはversion 1.26.0-rc3をインストールする場合のものとなる。Docker-compose_1.26.0-rc3# curl -L https://github.com/docker/compose/releases/download/1.26.0-rc3/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose # chmod +x /usr/local/bin/docker-composeインストール後にバージョン情報が表示されれば成功。
# docker-compose --version docker-compose version 1.26.0-rc3, build 46118bc5dockerfile、docker-composeを作成
まずはベースとなるディレクトリを作成する。今回は「/data/encoder」とする。
# mkdir -p -m 775 /data/encoder/volumes/work_area # touch /data/encoder/docker-compose.yml # touch /data/encoder/encoderdockerfile
必要なソフトウェアをインストールしたりビルドしたりしているだけ。不要なファイル、ディレクトリは最後に削除。
apt-getでは人がわかりやすいように敢えて分けている。一部設定を変更する必要があるため、設定ファイル(/opt/CMcut4U/const.rb)をsedで置換している。
設定ファイルのバックアップは取っていないため、必要であれば追記すること。FROM ubuntu:18.04 LABEL version="1.0" LABEL description="動画エンコード用サーバ" WORKDIR /var/tmp #作業用ディレクトリを作成 #日本語フォントをインストール #Rubyのインストール #wav-file(Ruby)のインストール #pythonのインストール #ffmpeg & mpvのインストール #opencvのビルド&インストール #CMcut4Uをインストール #ゴミ掃除 RUN mkdir -m 775 /work_area && \ apt-get update && \ apt install -y fonts-takao && \ fc-cache -fv && \ apt install -y ruby && \ apt install -y ruby-gtk2 && \ gem install wav-file && \ apt install -y python-dev python-numpy && \ apt install -y ffmpeg && \ apt install -y mpv && \ apt install -y cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev && \ apt install -y libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev && \ mkdir -m 775 /work_area/opencv && \ git clone https://github.com/opencv/opencv.git /work_area/opencv && \ mkdir -m 775 /work_area/opencv_contrib && \ git clone https://github.com/opencv/opencv_contrib.git /work_area/opencv_contrib && \ cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local /work_area/opencv && \ make && \ make install && \ mkdir -m 775 /opt/CMcut4U && \ git clone https://github.com/kaikoma-soft/CMcut4U.git /opt/CMcut4U && \ echo PATH="$PATH:/opt/CMcut4U" >> /root/.bashrc && \ mkdir -m 775 /work_area/video /work_area/mp4 /work_area/logo /work_area/work /work_area/TS && \ cat /opt/CMcut4U/const.rb | sed -i -e 's/1280x720/1920x1080/g' /opt/CMcut4U/const.rb && \ cat /opt/CMcut4U/const.rb | sed -i -e 's/Top =.*/Top = "\/work_area"/g' /opt/CMcut4U/const.rb && \ cat /opt/CMcut4U/const.rb | sed -i -e 's/$ffmpeg_bin =.*/$ffmpeg_bin ="ffmpeg"/g' /opt/CMcut4U/const.rb && \ rm -rf /work_area/opencv/* && \ rmdir /work_area/opencv && \ rm -rf /work_area/opencv_contrib/* && \ rmdir /work_area/opencv_contrib && \ rm -rf /var/tmp/*docker-compose
dockerファイルに「encoder」を指定している。
一部ウィンドウにて設定する必要があるため、Display情報を引っ張ってきている。
DISPLAYに設定するIPはwindowsホストのIPを指定すること。docker-compose.ymlversion: '3' services: container1: build: context: . dockerfile: encoder environment: - DISPLAY=192.168.XXX.XXX:0 volumes: - ./volumes/work_area:/work_area - /tmp/.X11-unix:/tmp/.X11-unix tty: true command: bash -c "/bin/bash"イメージビルド
dockerファイルを見るとわかる通り、opencvをビルドしているためそれなりの時間がかかる。
cd /data/encoder docker-compose build起動 & ログイン
ビルドまで完了したので、あとは起動して中に入るだけ。
cd /data/encoder docker-compose up docker-compose start docker exec -it encoder_container1_1 /bin/bashtsファイル、出力されるファイルについて
上記設定を実施すると、全て「work_area」上で完結するようになっている。
ホストのubuntu上では下記の通り。
/data/encoder/volumes └─/work_area ├─/logo ・・・ロゴファイルを配置するディレクトリ ├─/mp4 ・・・エンコードされたファイルが保存されるディレクトリ ├─/TS ・・・エンコード対象を配置するディレクトリ ├─/video ・・・利用しない └─/work ・・・エンコード中に利用されるディレクトリTSファイルを配置する場合はTSディレクトリ配下に配置するのだが、直接ファイルを配置するとうまく動作しない。
必ず「~/TS/番組名/xx.ts」となるようにすること。/data/encoder/volumes └─/work_area ├─/TS ・・・エンコード対象を配置するディレクトリ | └─/BANGUMI_A | └─/hogehoge.ts ・ ・ ・ロゴファイルの作成
一旦「cmcuterAll.rb」を実行する。この時ロゴファイルの存在しないため、エラーで止まる。
# cmcuterAll.rbその後、作者様のサイトの通り、ロゴファイルを作成する。
ここでディスプレイを使った操作があるが、上記設定によりWindowsホスト上にスクリーンが表示される。なお、この環境でのロゴ作成コマンドは下記となる。
# logoAnalysisSub.py --dir /work_area/BANGUMI_A/BS11_isekai/SS再度「cmcuterAll.rb」を実行すればエンコードが開始される。
# cmcuterAll.rbエンコード時間とか
15分のアニメを実行した結果、下記の通りとなった。
エンコード時間 容量 CMカット率 約24分 1.9GB -> 93.2MB △ 仕様通り、CMカット処理は秒単位での処理となっているため数フレームずつCMが残っている。
一方、CM部分が丸々残るということはなかった。
仮にCM部分が丸々残る場合は「fixGUI.rb」を使って手直しをすることができる。
また、cmcuterAll.rbのオプションにて、エンコードはせずcmカットに必要な計算までで止める機能もある。
これを前提にすれば無駄にエンコード時間を使わずに済む。オプションについては作者様のサイト参照のこと。
まとめ
TSファイルをエンコードする環境をDockerファイルに構築することができた。
常にDocker環境を動かす必要性は全く無いので、親となっているubuntuでshell+cron使って定期バッチにし、TSディレクトリにtsファイルがある場合のみDocker起動してcmcuterAll.rbをキックする・・・くらいでいいと思う。参考/配布先
- 投稿日:2020-03-29T06:36:54+09:00
Docker+Git Hub+VSCodeだけで仮想環境を完結させる
Dockerの環境作りが出来たので忘れないうちに記事にします。
いちからDocker+Git Hub+VSCodeで環境を全部GitHubに乗せてみました。
これでいつPCがぶっ壊れても大丈夫ですね。イメージ図
全体像はこんな感じ
ローカルとDockerでプログラムやgitのコピーも考えたのですが、面倒だったのでこうしました
環境
macOS Catalina 10.15.3
あるとよい前提知識
git/GitHub
VSCodeDockerのインストール
公式サイトからDockerのアカウントを作ってログインし、DockerHubからダウンロードしてインストールします。
https://hub.docker.com/editions/community/docker-ce-desktop-mac詳しくはこちらで
参考:https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81GitHubのSSH認証
SSH認証を使うので、公開鍵を登録しておきましょう。
詳しくはこちらで
参考:https://qiita.com/shizuma/items/2b2f873a0034839e47ceDockerfileの作成
DockerfileというものでDocker は作られます。
今回のDockerfileはこちら。ちなみに拡張子はありません。
DockerfileFROM ubuntu:18.04 RUN apt-get update RUN apt-get install -y git RUN apt-get install -y python3 RUN apt-get install -y python3-pip COPY requirements /root/python/requirements RUN pip3 install -r /root/python/requirements/common.txtベースがUbuntu
pythonなどをインストール
requirementsのフォルダをDockerにコピーして
それを参照してpip installを実行
というファイルになります。requirementsは普通にpip installで参照する形式
GitHubに公開しているので
git clone git@github.com:XM03/docker-test.git
でもOKこのファイルを元にDockerのモト(Docker image)を作ります
Dockerを使う
ターミナルを開いて先ほどのDockerfileのあるディレクトリに行って
docker build . -t docker_test # . で現在ディレクトリのDockerfileを参照 -tでタグ付け
でdocker image(仮想環境)をビルドします。
docker run -it docker_test bash # -itは入力を受け付けターミナルを表示 bashはおまじない
でdockerを動かします。
SSH鍵のコピー
ファイルのコピーはローカル→Dockerが
docker cp local_dir ID:docker_dir
Docker→ローカルが
docker cp ID:docker_dir local_dir
です。まず先ほどと別窓でターミナルを開いて
docker psでContainerIDを確認します
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES dc46470c4b2c docker_test "bash" 16 minutes ago Up 16 minutes 0.0.0.0:5000->5000/tcp zen_heisenberg a49624f5e200 ubuntu "/bin/bash" 5 hours ago Up 5 hours elastic_leakey左にあるのがID
IDは基本的に最初の1~3文字だけ使います
IDがa49624f5e200だった場合はdocker cp ~/.ssh/. a4:/root/.sshと入力してSSHのKEYをローカルPCからdockerに移動します。
このように.
を使うと複数選択できます。
これでDockerからGitHubにアクセス出来ます。※DockerfileでCOPYしても同じ事がさらに簡単に出来ますが
imageに秘密鍵が残るのが嫌だったので今回は不採用としました。あとは通常と同様に
git clone
します
もちろん他のコマンドも同様に使えます今回はこれを使ってみます。
cd root git clone git@github.com:XM03/docker-test.git cd docker-test python3 test.pyHello World! python ver:3.6.9 (default, Nov 7 2019, 10:44:02) [GCC 8.3.0] flask ver:0.12.2無事pythonもflaskもインストールできている事が確認できるかと思います。
あとはVSCodeで編集できればミッションコンプリートですね
Bad ownerって出たら
git cloneでBad ownerって出たら
以下を打ち込めば上手く動くかと思われます。
chown root ~/.ssh/config
参考:https://stackoverflow.com/questions/51744040/docker-bad-owner-or-permissions-on-root-ssh-config
VSCode
Docker
Remote - Containers
の拡張機能をダウンロードします。Dockerのタブで動いているDockerが表示されているのでAttach Visual Studio Codeを選ぶと
開くことができます。あとはworkspaceに追加してあげればOKです。
rootで追加すると色々見やすくて良いです。先ほどのファイルがあるので、それを編集すればOKです
Dockerを閉じると全てのデータは消えるので必ずpushしましょう
逆にいうと必ずpushする癖がつくはずです。以上でミッションコンプリートとなります。
FLASKでHello World!の表示までやってみる
環境変数とgit cloneを加えてDockerfileを以下のようにします。
ちなみにDockerはキャッシュを積極的に使い、GitHubの更新が反映されないためgit cloneをここに入れるのはあまり推奨されない。
今回はほとんど更新がない奴なのでOK。Dockerfile
FROM ubuntu:18.04 RUN apt-get update RUN apt-get install -y git RUN apt-get install -y python3.7 RUN apt-get install -y python-pip COPY requirements /root/python/requirements RUN pip install -r /root/python/requirements/common.txt ENV FLASK_APP=hello.py ENV FLASK_DEBUG=1 RUN git clone https://github.com/miguelgrinberg/flasky.gitプログラムはO`REILLYの教科書から参照します。
三章のaのプログラム(Hello World)を使いますdocker build . -t docker_testbuildは同じ
docker run -it -p 5000:5000 docker_test bash-p:portを5000で固定し動かします。
root@dc46470c4b2c:/# ls bin boot dev etc flasky home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@dc46470c4b2c:/# cd flasky root@dc46470c4b2c:/flasky# git checkout 3a #三章のaプログラム ~~ 略 ~~ HEAD is now at e020af8 Chapter 3: Templates (3a) root@dc46470c4b2c:/flasky# flask run --host 0.0.0.0 * Serving Flask app "hello" * Forcing debug mode on * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger PIN: 295-074-713ホストを0.0.0.0にしないと外部からアクセス出来ないようなので指定しています。
あとはローカルのブラウザで
http://localhost:5000
を打ち込むと
Hello World!という文字を見ることが出来ます。
他の章のプログラムにするともう少し面白いかも知れませんね。おわりに
上記の流れで行えば動くはずです.いろいろ至らないところがあるかもしれませんが,その点はコメント等で指摘してくれると嬉しいです。
その他
Dockerの勉強はUdemyのこれがおすすめ。
英語も一緒に学べる。
https://www.udemy.com/course/learn-docker/learn/lecture/11057896VSCodeをjupyternotebookのように使える方法
https://qiita.com/surei/items/9f25d7efa7c67d55d98f
- 投稿日:2020-03-29T06:36:54+09:00
Docker+Git Hub+VSCodeだけで作る仮想環境を完結させる
Dockerの環境作りが出来たので忘れないうちに記事にします。
いちからDocker+Git Hub+VSCodeで環境を全部GitHubに乗せてみました。
ウェブ系じゃないけどDockerやってみたいって人向けの記事かも知れません。イメージ図
こんな感じで環境ごとGitHubに乗せちゃって
いつでもどこでも誰のPCでもベストな環境でプログラミング出来ちゃうって奴です。
環境
macOS Catalina 10.15.3
多少の前提知識
git/GitHub
VSCodeDockerのインストール
公式サイトからDockerのアカウントを作ってログインし、DockerHubからダウンロードしてインストールします。
https://hub.docker.com/editions/community/docker-ce-desktop-mac詳しくはこちらで
参考:https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81GitHubのSSH認証
SSH認証を使うので、keyを登録しておきましょう。
詳しくはこちらで
参考:https://qiita.com/shizuma/items/2b2f873a0034839e47ceDockerfileの作成
DockerfileというものでDocker は作られます。
今回のDockerfileはこちら。ちなみに拡張子はありません。
DockerfileFROM ubuntu RUN apt-get update RUN apt-get install -y git RUN apt-get install -y python3 RUN apt-get install -y python-pip COPY requirements /root/python/requirements RUN pip install -r /root/python/requirements/common.txtベースがUbuntu
pythonなどをインストール
requirementsのフォルダをDockerにコピーして
それを参照してpip installを実行
というファイルになります。requirementsは普通にpip installで参照する形式でOK。
このファイルを元にDockerのモト(Docker imageを作ります)
Dockerを使う
ターミナルを開いて先ほどのDockerfileのあるディレクトリに行って
docker build . -t docker_test # . で現在ディレクトリのDockerfileを参照 -tでタグ付け
でdocker image(仮想環境)をビルドします。
docker run -it docker_test bash # -itは入力を受け付けターミナルを表示 bashはおまじない
でdockerを動かします。
SSH KEYのコピー
ファイルのコピーはローカル→Dockerが
docker cp local_dir ID:docker_dir
Docker→ローカルが
docker cp ID:docker_dir local_dir
です。まず先ほどと別窓でターミナルを開いて
docker psでContainerIDを確認します
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES dc46470c4b2c docker_test "bash" 16 minutes ago Up 16 minutes 0.0.0.0:5000->5000/tcp zen_heisenberg a49624f5e200 ubuntu "/bin/bash" 5 hours ago Up 5 hours elastic_leakey左にあるのがID
IDは基本的に最初の2,3文字だけ使います
IDがa49624f5e200だった場合はdocker cp ~/.ssh/. a4:/root/.sshと入力してSSHのKEYをローカルPCからdockerに移動します。
このように.
を使うと複数選択できます。
これでDockerからGitHubにアクセス出来ます。
※DockerfileのCOPYを使うとimageに秘密鍵が残るのであんまり良くなさそう??
そうじゃなければそっちのが楽あとは通常と同様に
git clone
します
もちろん他のコマンドも同様に使えます
あとはVSCodeで編集できればミッションコンプリートですねVSCode
Docker
Remote - Containers
の拡張機能をダウンロードします。Dockerのタブで動いているDockerが表示されているのでAttach Visual Studio Codeを選ぶと
開くことができます。あとはworkspaceに追加してあげればOKです。
rootで追加すると色々見やすくて良いです。git cloneしたファイルがあるので、それを編集すればOKです
Dockerを閉じると全てのデータは消えるので必ずpushしましょう
逆にいうと必ずpushする癖がつくはずです。以上でミッションコンプリートとなります。
※なんか標準機能で色々もっと簡単に出来そうかも
FLASKでHello World!の表示までやってみる
環境変数とgit cloneを加えてDockerfileを以下のようにします。
ちなみにDockerはキャッシュを積極的に使うので、更新が反映されないためgit cloneをここに入れるのはあまり推奨されない。Dockerfile
FROM ubuntu:18.04 RUN apt-get update RUN apt-get install -y git RUN apt-get install -y python3.7 RUN apt-get install -y python-pip COPY requirements /root/python/requirements RUN pip install -r /root/python/requirements/common.txt ENV FLASK_APP=hello.py ENV FLASK_DEBUG=1 RUN git clone https://github.com/miguelgrinberg/flasky.gitプログラムはO`REILLYの教科書から参照します。
三章のaのプログラム(Hello World)を使いますdocker build . -t docker_testbuildは同じ
docker run -it -p 5000:5000 docker_test bash-p:portを5000で固定し動かします。
root@dc46470c4b2c:/# ls bin boot dev etc flasky home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@dc46470c4b2c:/# cd flasky root@dc46470c4b2c:/flasky# git checkout 3a #三章のaプログラム ~~ 略 ~~ HEAD is now at e020af8 Chapter 3: Templates (3a) root@dc46470c4b2c:/flasky# flask run --host 0.0.0.0 * Serving Flask app "hello" * Forcing debug mode on * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger PIN: 295-074-713ホストを0.0.0.0にしないと外部からアクセス出来ないようなので指定しています。
あとはローカルのブラウザで
http://localhost:5000
を打ち込むと
Hello World!という文字を見ることが出来ます。
他の章のプログラムにするともう少し面白いかも知れませんね。Dockerの勉強
Udemyのこれがおすすめ。
英語も一緒に学べる。
https://www.udemy.com/course/learn-docker/learn/lecture/11057896
- 投稿日:2020-03-29T01:05:08+09:00
Folding@Home をコンテナで動かす
はじめに
コロナウィルスの蔓延で先の見えない不安が続いていますが、
Folding@Homeというプロジェクトを、ASRock JapanさんがTwitterで紹介されていて、
少しでも貢献できればとはじめてみました。https://twitter.com/AsrockJ/status/1243107649094184960
Folding@Homeの詳しい紹介はこちらをご覧ください。
ネイティブのクライアントもありますが、Dockerコンテナも提供されており、
今回はDockerにて参加する方法を記載します。https://github.com/johnktims/folding-at-home
手順
- 適当なディレクトリに以下のファイルを用意します。
- Dcokerがインストールされ利用できる前提です。
docker-compose.yamlversion: '3.7' services: folding-at-home: image: johnktims/folding-at-home restart: always ports: - 7396:7396 command: > ## --user=ユーザー名(登録する場合はコメントを解除) --team=252872 ## ASRock Japan さん が開設されているチームです。 --gpu=false --smp=true --power=full --client-type=advanced
docker-compose.yaml
を設置したディレクトに移動します。
docker-compose up -d
と実行ブラウザより
http://127.0.0.1:7396/
にアクセスすると稼働状況が確認できます。以上で細々とですが処理が実行されていきます。
ひとつひとつは小さな力かもしれませんが、多くの人が集まれば大きな力になります。参考URL
https://qiita.com/Tayu0404/items/97fee464c58080b6c682
https://qiita.com/sot528/items/405daa9574e9c3a80841