- 投稿日:2020-10-28T23:18:41+09:00
Windows Docker:WSLファイルでDisk圧迫された件
はじめに
Widnows10でDockerビルドを何回もやるとDiskは100%になってしまう現象がありました。
WSLのext4.vhdxファイルは100GB以上占めていることはわかりました。
状況
問題はWSL 2 based engineだとDisk解放されないようです。
解消方法
WSL 2 based engineを外す(Hyper-v backendを使う)
いまのところ、いったん下記のWSLを外して「Apply&Restart」をクリックして再起動
ext4.vhdxを消す
wsl --shutdown
wsl --list --verbose
削除:
wsl --unregister docker-desktop-data
wsl --unregister docker-desktop
以上
- 投稿日:2020-10-28T23:16:41+09:00
dockerを使って、少しずつ環境構築をしてみた
はじめに
新しいアプリケーションを作成するために、まだ使ったことのない技術を使おうと思い、環境構築において、dockerを用いることにした。
dockerとは
仮想環境を構築するためのツール。
dockerを使うメリット
- チーム開発では同じ開発環境を簡単に再現できる。
- コマンドだけで、毎回同じ環境を再現できる。 などなど
イメージ
DockerHubがらコマンドを用いてダウンロードすることで
コンテナ
仮想環境そのもの。
流れ
- アプリケーションのディレクトリを作成
- Dockerfileを作成
- Gemfileを作成
- Gemfile.lockを作成
- docker-compose.ymlを作成
- ターミナルでdockerコマンドを実行
- 投稿日:2020-10-28T22:02:02+09:00
AWS上にDockerで環境構築する
コンテナをAWSに送る3つの方法
・Dockerレジストリを使う(Docker hub)
・Dockerfileを送る
・Docker imageをtarにして送るホストのEC2にSSHでログインする
シェルを使う時にSSHでアクセスする。
SSHでログインすると、AWSのインスタンスにDockerをインストールすることなどができる。SSH・・・secure shell
secureにシェルを起動するssh -i xx.pem username@hostname
xx.pem ・・・ サーバーを立てた際にダウンロードした鍵ファイル
-i ・・・ 鍵ファイルを指定するためのオプション例)
ssh -i mydocker.pem ubuntu@ec2 ・・・ .amazonaws.comAWSのインスタンスにDockerをインストールする
・SSHでサーバーにアクセスする。
ssh -i xx.pem username@hostname
・パッケージをアップデート
sudo apt-get update
・ dockerをインストール
sudo apt-get install docker.io※sudo gpasswd -a ubuntu docker
dockerというグループを作り、そこにubuntuを入れることで、グループに属している人はdockerを使えるようになる。
ubuntuのサーバーでdockerを使う時は、基本的に必ずやる
(sudoを付けなくても実行できるようになる)Docker imageをtarにして送り、コンテナを作る
Docker imageをtarにして送る。
tarファイルに変換する
docker save イメージID > 任意のファイル名.tar
docker save fd867gy7fg > myimage.tarsftpでAWSにアクセスする
sftpでアクセスすることでファイルを転送させることができる。
sftp ・・・ Secure File Transfer Protocol
sftp -i xx.pem username@hostname
例)
ssh -i mydocker.pem ubuntu@ec2 ・・・ .amazonaws.com転送する
・put local/path [remote/path]
put temp_folder/myimage.tar /home/ubuntu
ローカルのファイルをリモートサーバー(EC2)にファイルを送る
※リモートのパスを指定しない場合、sftpでログインした場合のカレントディレクトリに転送される・get local/path [remote/path]
リモートサーバー(EC2)からファイルをとってくる。.tarからDocker imageに戻す
sshでAWSにアクセスし、docker loadでイメージに戻す。
・ssh -i xx.pem username@hostname
・docker load < ファイル名.tar
・docker run でコンテナにする。例)
docker load < myimage.tarDockerfileを転送する方法でコンテナを作る
・sftpでアクセスし、dockerfileを転送する。
sftp -i xxx.pem ubuntu@[hostname]
put local/path [remote/path]・sshでアクセスし、buildしコンテナを作る
ssh -i xxx.pem ubuntu@[hostname]
(新しくフォルダを作り、ビルドコンテクストを作りそこにDockerfileを置く)
docker build .
- 投稿日:2020-10-28T18:10:10+09:00
ubuntuのdockerコンテナ内でpingがないときは、"iputils-ping net-tools"をインストールするとよい
ubuntuのdockerコンテナ内でpingがないとき
$ ping ping: command not found以下をインストール
$ sudo apt-get update $ sudo apt-get install iputils-ping net-tools
- 投稿日:2020-10-28T18:05:17+09:00
docker push時のエラー解決メモ"unauthorized: incorrect username or password"
docker push時のエラー解決メモ
$ docker push xxx/yyy The push refers to repository [docker.io/xxx/yyy] dc63c2755f46: Preparing ... 644879075e24: Waiting unauthorized: incorrect username or passwordlogout/loginをやり直して解決した
$ docker logout $ docker login
- 投稿日:2020-10-28T17:58:13+09:00
OKI AI エッジコンピューター「AE2100」でOpenVINOのサンプルプログラムを動かしてみよう Ubuntuコンテナ版 (1)
※この記事はAE2100のUbuntuコンテナ(ubuntu_openvino_2020R3.tar)を対象としています。
要約
- この記事では、OKI AI エッジコンピューター「AE2100」の設定方法について説明します。
- AE2100(Ubuntuコンテナ)上でGUIアプリケーションを動作させるために必要なVcXsrv(X-Windowクライアント)の導入方法について解説します。
はじめに
AE2100は2020年9月にファームウェアがバージョンアップされており、あわせて、OpenVINO 2020R3を搭載したUbuntuコンテナがリリースされています。
これまで投稿してきた「OKI AIエッジコンピューター「AE2100」でOpenVINOのサンプルを動かしてみよう(1))~(3)」は、OpenVINO 2019R3.1が搭載されたCentOSコンテナを対象としていましたので、これをUbuntuコンテナ向けに修正した記事を順次投稿していきます。
Ubuntu版での初回となるこの記事では、AE2100を接続したウインドウズPCにVcxSrvを導入し、GUIアプリケーションの動作を確認します。
なお「OKI AIエッジコンピューター「AE2100」でOpenVINOのサンプルを動かしてみよう(1))」からの主な変更箇所は、電卓アプリのインストールにあたりapt-getコマンドを使用してXアプリケーションをインストールしている点です。環境
実行環境は、次の図のような構成を前提とします。
ウインドウズPCからAE2100へTeraTermによって接続、AE2100からインターネットへ接続が可能なことを確認してください。
なおAE2100のコンテナバージョンは「ubuntu_openvino_2020R3.tar」とします。
VcXsrv のインストール
VcXsrv はフリーの X Server クライアントであり、GUIアプリケーションの画面表示に用いられます。
ここではVcXsrvをウインドウズPCへインストールします。
WebブラウザよりSourceForge.netにアクセスし “VcXsrv” のインストーラーをダウンロードします。
https://sourceforge.net/projects/vcxsrv/
ダウンロードしたインストーラを実行すると次のような画面が出ます。
設定はそのままにし[Next]を押します。
インストール先のフォルダを確認・選択して「Install」をクリックします。
VcXsrvの起動
ウインドウズPCのスタートメニューからVcXsrv→Xlaunchを起動します。
設定はそのままにし「次へ」をクリックします。(”Multiple Window”を選択)
設定はそのままにし「次へ」をクリックします。(Start no clientを選択)
「Disable access control」のチェックを入れて「次へ」をクリックします。
Save configrationで設定を保存し、[完了]を押します。
以下の画像のような画面が出る場合、[アクセスを許可する]を押します。
そして、タスクバー右下にXlaunchのアイコンが表示されれば成功です。
AE2100のコンテナ設定
TeraTramでAE2100のホストOSにログインして、以下のコマンドでコンテナに入ります。
(コンテナが起動していない場合、「AE2100 シリーズ SDK 取扱説明書 ―DeepLearning 編―」(版数: 1.2) P.20を参考に起動させてください。)root@ae2100:~# docker exec -it ubuntu-openvino /bin/bash今回はXアプリケーションの電卓を動かします。
以下のコマンドでXアプリケーションをインストールします。# apt-get install x11-appsウインドウ表示先であるウインドウズPCのIPアドレスを指定します。
# export DISPLAY=192.168.100.101:0.0GUIアプリケーションの実行
AE2100のコンテナ内で以下のコマンドを入力します。
# xcalc &試しにボタンを押して計算をさせてみましょう。
例えば「8」「*」「8」と入力すると「64」と表示されます。
アプリケーションウインドウはPC上に表示されていますが、計算自体はAE2100でおこなわれています。
もし電卓が表示されない場合は、ウインドウズの「ファイアウォールとネットワーク保護」
を確認してください。
ウインドウズの「ファイアウォールとネットワーク保護」画面を開き、
「ファイアウォールによるアプリケーションの許可」を選択します。
設定変更ボタンを押し、下画面のようにVcXsrv windows xserverにチェックを入れOKボタンを押します。
まとめ
今回はAE2100に接続したPCのウインドウ表示設定をおこないました。
次回からはOpenVINOのサンプルプログラムを動かしていきます。以下の記事を掲載予定です。
- OKI AI エッジコンピューター「AE2100」でOpenVINOのサンプルプログラムを動かしてみよう Ubuntuコンテナ版 (2)
- OKI AI エッジコンピューター「AE2100」でOpenVINOのサンプルプログラムを動かしてみよう Ubuntuコンテナ版 (3)
以下はCentOSコンテナ版の記事です。
- OKI AI エッジコンピューター「AE2100」でOpenVINOのサンプルプログラムを動かしてみよう(1)
- OKI AI エッジコンピューター「AE2100」でOpenVINOのサンプルプログラムを動かしてみよう(2)
- OKI AI エッジコンピューター「AE2100」でOpenVINOのサンプルプログラムを動かしてみよう(3)
- 投稿日:2020-10-28T16:33:42+09:00
pmm(Percona Monitoring and Management )インストール手順
はじめに
QNAPの Container Station を利用して pmm(Percona Monitoring and Management ) をセットアップしてみたので,その作業記録です(簡潔すぎてすみません).
serverの設定
- 監視する側
- インターフェースはGrafanaなので,馴染みのある方も多いと思います
- 今回はQNAPの Container Station にて構築したため省略(数クリックでDockerコンテナを起動でき大変便利)
clientの設定
- 監視される側
- mysqlサーバはすでに導入済みであることを前提とする
pmm2-clientをyumインストール
sudo yum install pmm2-clientserverとの接続確認
<user>:<password>
の箇所はデフォルトではadmin:admin
.sudo pmm-admin config --server-insecure-tls --server-url=https://<user>:<password>@<server ip address>:443もし以下のようなエラーが出る場合は,上記コマンドに
--force
を付加して再度実行してみてください.Checking local pmm-agent status... pmm-agent is running. Registering pmm-agent on PMM Server... Failed to register pmm-agent on PMM Server: Node with name "xxxxxx" already exists..モニタリング設定投入
以下,いずれかの方法でモニタリング設定を投入する.
方法その1:MySQLユーザ名,パスワードを指定しての設定
# syntax sudo pmm-admin add mysql --username=<mysql user> --password=<mysql user password> --query-source=<query source> <service name> # example sudo pmm-admin add mysql --username=john --password=johnpass --query-source=perfschema mysqlserver001方法その2:ソケットを指定しての設定
Adding MySQL Service Monitoring
Note
It is also possible to add MySQL instance using UNIX socket with use of a special --socket flag followed with the path to a socket without username, password and network type:sudo pmm-admin add mysql --socket=/var/path/to/mysql/socketポート許可
clientのインバウンドに以下ポートを許可する必要がある.
環境に応じて,firewallなりセキュリティグループなりにポート許可設定を追加.The following ports must be open to enable communication between the PMM Server and PMM clients.
42000
For PMM to collect genenal system metrics.
42002
For PMM to collect MySQL server metrics.
42003
For PMM to collect MongoDB server metrics.
42004
For PMM to collect ProxySQL server metrics.
42005
For PMM to collect PostgreSQL server metrics.
Also PMM Server should keep ports 80 or 443 ports open for computers where PMM Client is installed to access the PMM web interface and the QAN agent.コンソール接続
ブラウザより
https://<server ip address>:443
にアクセス
初回ログイン時,パスワードの変更を求められる.
- 投稿日:2020-10-28T15:46:46+09:00
DockerでNuxt.jsを起動するまで 改訂版
実施環境
・macOS Catalina バージョン 10.15.6
・Docker Desktop Community Version 2.3.0.5この記事ではDockerのインストール方法は記述していません。
各自インストールした状態で記事を読み進めてください。Dockerの準備
- 準備するにあたって
- node.js や nuxt のフレームワークのインストールは docker のコンテナ内でおこなう
- docker を利用する事で、開発環境を共有したいときの時間を短縮できる
アプリを作成したい、好みのディレクトリに移動します。
私はMyNuxtApp
としました。まず、アプリケーションのディレクトリを作成し、
Docker関連のファイルを作成します。terminal(任意のディレクトリへ移動) cd ~/Applications mkdir MyNuxtApp cd MyNuxtApp touch Dockerfile
Dockerfile
DockerfileFROM node:12.16.1 RUN mkdir -p /usr/src/app WORKDIR /usr/src/appDockerfile編集後は保存を忘れずにお願いします。
また、ターミナルで編集しても良いです。terminaltouch Dockerfile && \ echo 'FROM node:12.16.1' >> Dockerfile && \ echo 'RUN mkdir -p /usr/src/app' >> Dockerfile && \ echo 'WORKDIR /usr/src/app' >> DockerfileDockerfile の準備ができたら、初期のDocker イメージを作成します。
今回はnuxt-test
という名前のイメージを作成します。
これから開発するアプリケーションの名前を入れると良いでしょう。terminaldocker build -t nuxt-test .
Docker イメージが作成できたらイメージからコンテナを作成し、コンテナ内に入ります。
コンテナ名はctr-nuxt-test
としています。terminaldocker run -it --rm --name ctr-nuxt-test -v "$PWD":/usr/src/app nuxt-test /bin/bashコンテナ内で nuxt-app をインストールしましょう。
nuxtコミュニティが公開しているcreate-nuxt-app
を利用します。
私はyarn を使用し、nuxt-test-web
という名前でアプリケーションを作成します。create-nuxt-appのオプションについては、
他記事を参照ください。terminal# yarn create nuxt-app nuxt-test-web ... create-nuxt-app v3.2.0 ✨ Generating Nuxt.js project in nuxt-test-web ? Project name: nuxt-test-web ? Programming language: JavaScript ? Package manager: Yarn ? UI framework: Bootstrap Vue ? Nuxt.js modules: Axios ? Linting tools: ESLint, Prettier ? Testing framework: None ? Rendering mode: Single Page App ? Deployment target: Static (Static/JAMStack hosting) ? Development tools: jsconfig.json (Recommended for VS Code if you're not using typescript) ? Continuous integration: GitHub Actions (GitHub only) ? What is your GitHub username?: Your Github Username ? Version control system: Git yarn run v1.22.0 ... ? Successfully created project nuxt-test-web To get started: cd nuxt-test-web yarn dev To build & start for production: cd nuxt-test-web yarn build yarn start上記のコマンドでもアプリケーションをビルドできますが、せっかくDockerを使うので、
docker-compose up
で起動するようにします。terminal(インストールが終了したら一旦、コンテナから出ます) # exit exitこの段階で、
~/Applications/MyNuxtApp/nuxt-test-web
というディレクトリにアプリケーションができています。ディレクトリ構造をご確認ください。MyNuxtApp |___ Dockerfile |___ nuxt-test-web (ここにNuxt.js アプリケーションが入っている)
nuxt-test-web
内のアプリケーションを1つ階層をあげて、MyNuxtApp
内に移します(docker利用のため)。
-n
コマンドは、移動元と移動先で同一名ファイルがあった時に上書きをせずに両方残すことができます。terminal(隠しファイルを除く全ファイルを移動) mv -n ~/Applications/MyNuxtApp/nuxt-test-web/* ~/Applications/MyNuxtApp (隠しファイルを移動) mv -n ~/Applications/MyNuxtApp/nuxt-test-web/.[^\.]* ~/Applications/MyNuxtApp
移動元のディレクトリ(nuxt-test-web)が空になっているか確認します。
空でない場合でも、削除して問題なければディレクトリを削除します。terminalls -al ~/Applications/MyNuxtApp/nuxt-test-web total 16 drwxr-xr-x 3 ryota staff 96 10 28 15:05 . drwxr-xr-x 27 ryota staff 864 10 28 15:05 .. -rw-r--r--@ 1 ryota staff 6148 10 28 15:05 .DS_Store rm -r ~/Applications/MyNuxtApp/nuxt-test-web
ディレクトリの整理が終わったら、Docker周りの設定をします。
terminal(初期のイメージを削除) docker images REPOSITORY TAG IMAGE ID CREATED SIZE ... nuxt-test latest b02d332b3a85 5 weeks ago 916MB ... docker rmi nuxt-test touch docker-compose.yml (compose のcommand スクリプトを書く。実行権限を付与する必要があります。) touch compose_command.bash chmod +x compose_command.bashdocker-compose.ymlversion: '3.7' services: web: container_name: ctr-nuxt-test build: context: . image: img-nuxt-test volumes: - .:/usr/src/app ports: - '3000:3000' environment: PORT: 3000 HOST: 0.0.0.0 command: './compose_command.bash'compose_command.bashyarn install && \ yarn dev
これでいよいよ準備完了です!実行の確認をしましょう。
(初回) docker-compose up --build (2回目以降) docker-compose up立ち上がったかどうか、localhost:3000 で確認してください!
自分で指定したプロジェクト名が表示されていればdocker compose での起動が成功です!
- 投稿日:2020-10-28T12:58:54+09:00
Dockerを使用してアプリケーションをコンテナー化する方法と、DockerComposeを使用して開発環境でアプリケーションを実行する方法
はじめに
Dockerは、最も人気のあるコンテナ化テクノロジーの1つです。使いやすく、開発者にとって使いやすいツールであり、他の同様のテクノロジーよりもスムーズで簡単に使用できるという利点があります。 2013年3月の最初のオープンソースリリース以来、Dockerは開発者や運用エンジニアから注目を集めています。 Docker Inc.によると、DockerユーザーはDocker Hubに1050億を超えるコンテナーをダウンロードし、580万のコンテナーをドッキングしました。このプロジェクトには、Githubに32Kを超えるスターが集まっています。
それ以来、Dockerが主流になり、10万を超えるサードパーティプロジェクトがこのテクノロジーを使用しており、コンテナ化スキルを持つ開発者の需要が高まっています。
このブログ記事では、Dockerを使用してアプリケーションをコンテナー化する方法と、DockerComposeを使用して開発環境でアプリケーションを実行する方法について説明します。 メインアプリとしてPythonAPIを使用します。
MetricFireの無料デモを予約して、Docker、Kubernetes、Pythonのセットアップを監視する方法を確認してください。
開発環境のセットアップ
開始する前に、いくつかの要件をインストールします。 ここではFlaskで開発されたミニPythonAPIを使用します。 FlaskはPythonフレームワークであり、APIのプロトタイプを迅速に作成するための優れた選択肢です。 私たちのアプリケーションはFlaskを使用して開発されます。 Pythonに慣れていない場合は、このAPIを作成する手順を以下に示します。
Python仮想環境を作成して、依存関係を他のシステム依存関係から分離しておくことから始めます。 その前に、人気のあるPythonパッケージマネージャーであるPIPが必要です。
インストールは非常に簡単です。次の2つのコマンドを実行する必要があります。
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py python get-pip.py参考までに、Python3がインストールされている必要があります。 次のように入力して、これを確認できます。
python --versionPIPをインストールした後、次のコマンドを使用して仮想環境をインストールします。
pip install virtualenv公式ガイドに従って、他のインストール方法を見つけることができます。 次に、仮想環境を作成する必要があるフォルダーのプロジェクトを作成し、それをアクティブ化します。 また、アプリ用のフォルダーとapp.pyというファイルを作成します。
mkdir app cd app python3 -m venv venv . venv/bin/activate mkdir code cd code touch app.py特定の都市の天気を表示する簡単なAPIを作成します。 たとえば、ロンドンの天気を表示したいとします。 ルートを使用してリクエストする必要があります:
/london/ukPIPを使用して「flask」および「requests」と呼ばれるPython依存関係をインストールする必要があります。 後でそれらを使用します:
pip install flask requests要件ファイルは次のようになります。
certifi==2019.9.11 chardet==3.0.4 Click==7.0 Flask==1.1.1 idna==2.8 itsdangerous==1.1.0 Jinja2==2.10.3 MarkupSafe==1.1.1 requests==2.22.0 urllib3==1.25.7 Werkzeug==0.16.0これはAPIの初期コードです。
from flask import Flask app = Flask(__name__) @app.route('/') def index(): return 'App Works!' if __name__ == '__main__': app.run(host="0.0.0.0", port=5000)テストするには、python app.pyを実行し、http://127.0.0.1:5000 /にアクセスする必要があります。 「AppWorks!」が表示されます。 Webページで。 openweathermap.orgのデータを使用するので、必ず同じWebサイトでアカウントを作成し、APIキーを生成してください。
次に、APIに特定の都市の気象データを表示させるための便利なコードを追加する必要があります。
@app.route('/<string:city>/<string:country>/') def weather_by_city(country, city): url = 'https://samples.openweathermap.org/data/2.5/weather' params = dict( q=city + "," + country, appid= API_KEY, ) response = requests.get(url=url, params=params) data = response.json() return data全体的なコードは次のようになります。
from flask import Flask import requests app = Flask(__name__) API_KEY = "b6907d289e10d714a6e88b30761fae22" @app.route('/') def index(): return 'App Works!' @app.route('/<string:city>/<string:country>/') def weather_by_city(country, city): url = 'https://samples.openweathermap.org/data/2.5/weather' params = dict( q=city + "," + country, appid= API_KEY, ) response = requests.get(url=url, params=params) data = response.json() return data if __name__ == '__main__': app.run(host="0.0.0.0", port=5000)127.0.0.1:5000/london/ukにアクセスすると、次のようなJSONが表示されるはずです。
{ "base": "stations", "clouds": { "all": 90 }, "cod": 200, "coord": { "lat": 51.51, "lon": -0.13 }, ...ミニAPIが機能しています。 Dockerを使用してコンテナ化しましょう。
Dockerを使用してアプリのコンテナーを作成
APIのコンテナを作成しましょう。 最初のステップは、Dockerfileを作成することです。 Dockerfileは、Dockerデーモンがイメージを構築するために従う必要のあるさまざまな手順と指示を含む有益なテキストファイルです。 イメージをビルドした後、コンテナを実行できるようになります。
Dockerfileは常にFROM命令で始まります。
FROM python:3 ENV PYTHONUNBUFFERED 1 RUN mkdir /app WORKDIR /app COPY requirements.txt /app RUN pip install --upgrade pip RUN pip install -r requirements.txt COPY . /app EXPOSE 5000 CMD [ "python", "app.py" ]上記のファイルでは、次のことを行いました。
- 「python:3」というベースイメージを使用
- また、PYTHONUNBUFFEREDを1に設定。PYTHONUNBUFFEREDを1に設定すると、ログメッセージをバッファリングする代わりにストリームにダンプできます。
- また、フォルダー/ appを作成し、それをworkdirとして設定
- 要件をコピーし、それを使用してすべての依存関係をインストール
- アプリケーションを構成するすべてのファイル、つまりapp.pyファイルをworkdirにコピー
- アプリがこのポートを使用するため、最終的にポート5000を公開し、app.pyを引数としてpythonコマンドを起動。 これにより、コンテナの起動時にAPIが起動します。
Dockerfileを作成したら、イメージ名と選択したタグを使用してDockerfileをビルドする必要があります。 この場合、名前として「weather」を使用し、タグとして「v1」を使用します。
docker build -t weather:v1 .Dockerfileとapp.pyファイルを含むフォルダー内からビルドしていることを確認してください。
コンテナをビルドした後、次を使用して実行できます。
docker run -dit --rm -p 5000:5000 --name weather weather:v1-dオプションを使用するため、コンテナーはバックグラウンドで実行されます。 コンテナは「weather」(-name weather)と呼ばれます。 ホストポート5000を公開されたコンテナポート5000にマッピングしたため、ポート5000でも到達可能です。
コンテナの作成を確認したい場合は、以下を使用できます。
docker ps次の出力と非常によく似た出力が表示されるはずです。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0e659e41d475 weather:v1 "python app.py" About a minute ago Up About a minute 0.0.0.0:5000->5000/tcp weatherこれでAPIをクエリできるようになります。 CURLを使用してテストしてみましょう。
curl http://0.0.0.0:5000/london/uk/最後のコマンドがJSONを返す必要がある場合:
{ "base": "stations", "clouds": { "all": 90 }, "cod": 200, "coord": { "lat": 51.51, "lon": -0.13 ... }開発のためのDockerComposeの使用
Docker Composeは、マルチコンテナーDockerアプリケーションを定義および実行するためにDockerInc。によって開発されたオープンソースツールです。 Docker Composeは、開発環境で使用することを目的としたツールでもあります。これにより、コンテナーを手動で再起動したり、変更のたびにイメージを再構築したりすることなく、コードの更新時にコンテナーを自動再ロードできます。 Dockerコンテナのみを使用して開発するComposeがないと、イライラするでしょう。
実装部分では、「docker-compose.yaml」ファイルを使用します。
これは、APIで使用している「docker-compose.yaml」ファイルです。
version: '3.6' services: weather: image: weather:v1 ports: - "5000:5000" volumes: - .:/app上記のファイルで、イメージ「weather:v1」を使用するようにサービス「weather」を構成したことがわかります。 ホストポート5000をコンテナポート5000にマップし、現在のフォルダをコンテナ内の「/ app」フォルダにマウントします。
イメージの代わりにDockerfileを使用することもできます。 すでにDockerfileがあるので、この場合はこれをお勧めします。
version: '3.6' services: weather: build: . ports: - "5000:5000" volumes: - .:/appここで、「docker-compose up」を実行してサービスの実行を開始するか、「docker-composeup--build」を実行してビルドしてから実行します。
まとめ
この投稿では、ミニPython API用のDockerコンテナーを作成する方法を確認し、DockerComposeを使用して開発環境を作成しました。 GoやRailsなどの別のプログラミング言語を使用している場合は、いくつかの小さな違いを除いて、通常は同じ手順に従います。 MetricFireの無料デモを予約して、MetricFireが監視環境に適合するかどうかを確認してください。
- 投稿日:2020-10-28T12:00:00+09:00
Node.js + socket.io の簡易チャットアプリをコンテナ化したメモ
背景
Node.js + socket.io の簡易チャットアプリをコンテナ化した時のメモ
リンク集
Node.js Web アプリケーションを Docker 化する
Hello Worldを返す簡易Node.jsサーバーを作ってコンテナ化するドキュメント。ほぼ忘れかけているNode.jsの記憶を取り戻すことができた。
Socket.io#Get Started
socket.ioを使って簡易的なアプリを作ることができる
サンプルコード
package.json{ "name": "docker_web_app", "version": "1.0.0", "description": "Node.js on Docker", "author": "shogo suzuki", "main": "socket_server.ts", "scripts": { "start": "node socket_server.js" }, "dependencies": { "express": "*", "socket.io": "^2.3.0" } }DockerfileFROM node:14.13 WORKDIR /usr/src/app COPY package*.json ./ RUN npm install COPY . . EXPOSE 3000 CMD [ "node", "socket_server.ts" ]index.html<!doctype html> <html> <head> <title>Socket.IO chat</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; } body { font: 13px Helvetica, Arial; } form { background: #000; padding: 3px; position: fixed; bottom: 0; width: 100%; } form input { border: 0; padding: 10px; width: 90%; margin-right: 0.5%; } form button { width: 9%; background: rgb(130, 224, 255); border: none; padding: 10px; } #messages { list-style-type: none; margin: 0; padding: 0; } #messages li { padding: 5px 10px; } #messages li:nth-child(odd) { background: #eee; } </style> </head> <script src="/socket.io/socket.io.js"></script> <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script> <script> $(function () { var socket = io(); $('form').submit(function(e){ e.preventDefault(); // prevents page reloading socket.emit('chat message', $('#m').val()); $('#m').val(''); return false; }); socket.on('chat message', function(msg){ $('#messages').append($('<li>').text(msg)); }); }); </script> <body> <ul id="messages"></ul> <form action=""> <input id="m" autocomplete="off" /><button>Send</button> </form> </body> </html>socket_server.tsvar app = require('express')(); var http = require('http').createServer(app); var io = require('socket.io')(http); app.get('/', (req, res) => { res.sendFile(__dirname + '/index.html'); }); io.on('connection', (socket) => { console.log('a user connected'); socket.on('chat message', (msg) => { io.emit('chat message', msg); }); }); http.listen(3000, () => { console.log('listening on *:3000'); });実行
docker build -t socket-example:1.0 . docker run -p 3000:3000 -d socket-example:1.0
- 投稿日:2020-10-28T11:58:25+09:00
Dockerfileを書くために | ベストプラクティスを抽出!
はじめに
今回は前回に引き続き、Dockerの基本的な書き方を紹介します。
本家のBest practices for writing Dockerfilesから抽出しました。
動画で確認したい方はこちらをどうぞ。
【YouTube動画】 Dockerfileのベストプラクティスを紹介! あなたはいくつできてますか?
.dockerignoreを使う
.gitignoreみたいなファイルで、コンテナに加えないファイルを設定できます。
# .dockerignore */tmpコンテナ1つに1プロセス
1つのコンテナ (Dockerfile) でRailsやMySQL, Nginxなどを起動するのは止めましょう。
バージョンアップが難しくなりますし、原因の切り分けも大変です。レイヤ数を最小にする
DockerはRUN, ADD, COPYを実行するたびに、一時的にイメージが作られます。
Dockerfileの読みやすさにも関わってくるので、なるべく分けないようにしましょう。マルチステージビルドを使う
以下のようにFROM内のAS句で名前付けします。
名前付けしたものを新しくレイヤーを作り直す時に宣言することで、中間のイメージを除くことができます。例ではGoを使ってますが、Nodeでも役立ちそうです。
FROM golang:1.11-alpine AS build #### パッケージ導入 & ビルド #### RUN apk add --no-cache git RUN go get github.com/golang/dep/cmd/dep COPY Gopkg.lock Gopkg.toml /go/src/project/ WORKDIR /go/src/project/ RUN dep ensure -vendor-only COPY . /go/src/project/ RUN go build -o /bin/project #### ビルド終了 #### # 新しくレイヤーを作り直す FROM scratch COPY --from=build /bin/project /bin/project ENTRYPOINT ["/bin/project"] CMD ["--help"]引数は適切に!
引数はアルファベット順に並べると、可読性が上がります。
RUN apt-get update && apt-get install -y bzr cvs gitalpineイメージで軽くする
alpineイメージを使うと、容量を小さくできます (5 M以下)。
ちなみに、alpineはBusyBoxにパッケージマネージャー apkを加えたイメージです。
ホストOSの負荷を小さくできるので、開発環境とかで良いかもしれません。upgradeはしない
upgradeするなら、ベースイメージのバージョンを上げましょう。
ADDよりもCOPYを使う
ADDは多機能なコマンドで、予期しない動きをすることがあります。
ホストOSからゲストOSにファイルを移動させるなら、COPYを使いましょう。rootユーザーを使わない
セキュリティ上あまりよろしくないので、USERを追加する方が良いです。
まとめ
今回はDockerfileの書き方を紹介しました。
具体的な書き方や使い方は、別記事で紹介します!twitterやyoutubeでのコメントもお待ちしています!
追記
より詳しい話は@zembutsu さんによる訳を読んでみると良さそうです!
Dockerfileを書くためのベストプラクティス【参考訳】
- 投稿日:2020-10-28T11:28:51+09:00
Dockerfile、docker-compose.ymlを作ってwindows10、Linux、ラズパイでnodejsを動かす
以前書いた下記、記事の続きでDockerfileとdocker-compose.ymlを作って、動かす手順まで今回記載します。
https://qiita.com/MCYamamoto/items/4d424af9573fa90edf61最終的なフォルダ構成
まず、最終的なフォルダ構成です。
下記のようになります。baseフォルダ +docker-compose.yml +cont +env +Dockerfile +deploy //デプロイ対象のソースコード(今回はnodejs) +package.json +package-lock.json +build +jsファイルたち +share //ホストとコンテナの共有フォルダDockerfileをつくる
[参考URL]
https://qiita.com/pottava/items/452bf80e334bc1fee69a全体的な流れとしては、上記を参考にした。
インストール必要なものをインストールしながらコマンドをメモして、最終的なDockerfileを作るというもの。1. Dockerイメージを決める。
ラズパイはARMのため、ARMに対応したイメージとしてDebianにした。
[参考URL]
https://qiita.com/koduki/items/0ed303dac5d32646194f2. bashのコンテナを起動する。
$ sudo docker run -it -v $(pwd):/tmp/share debian:buster /bin/bash -it:ターミナルで操作可能に -v:コンテナとのフォルダ共有3. 必要なものをインストールする。
動かしたいプログラムによって必要なパッケージをインストールする。
apt-get install パッケージ名といった感じです。
なお、注意点としては、Dockerfileに書く場合はインストールを止めないため"-y"オプションが必要です。
最終的にはnodeとsqliteしか必要なかったので、コンテナイメージをnodeにしてしまう方が良いのですが、
過程を残すということで、最終的にできたのは下記になります。やっていることとしては、下記になります。
- deploy対象のコードをコピー
- 必要なものをOSにインストール
- deployフォルダ配下のnodeに必要なパッケージを「npm install」でインストール#Dockerfile FROM debian:buster COPY deploy/ /home/deploy WORKDIR /home/deploy RUN apt-get update RUN apt-get install -y cmake RUN apt-get install -y libssl-dev RUN apt install curl RUN apt-get install -y sqlite3 libsqlite3-dev RUN apt-get install -y nodejs npm && npm install n -g && n 12.18.4 RUN npm installdocker-compose.ymlをつくる
先ほど作ったDockerfileをコンテナイメージとして、最終的にdeployフォルダ配下のnodeが自動起動するものにしました。
<補足>version: "3.8" services: cont: build: context: ./cont/env dockerfile: Dockerfile container_name: CONT-1 tty: true volumes: - "./cont/env/share:/tmp/share" - ".:/workspace" - "./cont/env/deploy/build:/home/deploy/build" working_dir: /home/deploy/build command: npm run start<補足>
package.jsonに下記記載して、buildフォルダ配下のプログラムが動くようにしています。"scripts": { "start": "node ./build/main.js", },docker-compose起動
作成したフォルダ環境一式を各OS(Windows10、Linux、Raspi)の任意のフォルダに配置して下記実行すると、すべて同じ動きします。
sudo docker-compose up --build(おまけ)Vscodeでのデバッグ環境作る
[参考URL]
https://tech-lab.sios.jp/archives/21675
https://qiita.com/Yuki_Oshima/items/d3b52c553387685460b0Visual Studio Code 上でf1メニューまたは左下に現れる緑色のアイコンをクリックして「Remote-Containers: Open Folder in Container...」を選択し、docker-compose.ymlがあるフォルダを選択すると
しばらくするとコンテナが実行され、コンソールでデバッグ操作できます。vscode、docker便利、、