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

Windows Docker:WSLファイルでDisk圧迫された件

はじめに

Widnows10でDockerビルドを何回もやるとDiskは100%になってしまう現象がありました。

WSLのext4.vhdxファイルは100GB以上占めていることはわかりました。

状況

WSLでDisk圧迫
image.png

問題はWSL 2 based engineだとDisk解放されないようです。

解消方法

WSL 2 based engineを外す(Hyper-v backendを使う)

いまのところ、いったん下記のWSLを外して「Apply&Restart」をクリックして再起動

image.png

ext4.vhdxを消す

wsl --shutdown

wsl --list --verbose

image.png

削除:

wsl --unregister docker-desktop-data

wsl --unregister docker-desktop

以上

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

dockerを使って、少しずつ環境構築をしてみた

はじめに

 新しいアプリケーションを作成するために、まだ使ったことのない技術を使おうと思い、環境構築において、dockerを用いることにした。

dockerとは

 仮想環境を構築するためのツール。

dockerを使うメリット

  • チーム開発では同じ開発環境を簡単に再現できる。
  • コマンドだけで、毎回同じ環境を再現できる。  などなど

イメージ

 DockerHubがらコマンドを用いてダウンロードすることで

コンテナ

 仮想環境そのもの。

流れ

  1. アプリケーションのディレクトリを作成
  2. Dockerfileを作成
  3. Gemfileを作成
  4. Gemfile.lockを作成
  5. docker-compose.ymlを作成
  6. ターミナルでdockerコマンドを実行
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.com

AWSのインスタンスに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.tar

sftpで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.tar

Dockerfileを転送する方法でコンテナを作る

・sftpでアクセスし、dockerfileを転送する。
 sftp -i xxx.pem ubuntu@[hostname]
 put local/path [remote/path]

・sshでアクセスし、buildしコンテナを作る
 ssh -i xxx.pem ubuntu@[hostname]
 (新しくフォルダを作り、ビルドコンテクストを作りそこにDockerfileを置く)
 docker build .
 

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

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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 password

logout/loginをやり直して解決した

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

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」とします。
network-ae2100-internet.png

VcXsrv のインストール

VcXsrv はフリーの X Server クライアントであり、GUIアプリケーションの画面表示に用いられます。
ここではVcXsrvをウインドウズPCへインストールします。
WebブラウザよりSourceForge.netにアクセスし “VcXsrv” のインストーラーをダウンロードします。
https://sourceforge.net/projects/vcxsrv/
vcxsrv-download.png

ダウンロードしたインストーラを実行すると次のような画面が出ます。
設定はそのままにし[Next]を押します。
vcxsrv-installation-options.png

インストール先のフォルダを確認・選択して「Install」をクリックします。
vcxsrv-installation-folder.png

インストールが完了したら「Close」をクリックします。
vcxsrv-complete.png

VcXsrvの起動

ウインドウズPCのスタートメニューからVcXsrv→Xlaunchを起動します。
start-menu-xlaunch.png

設定はそのままにし「次へ」をクリックします。(”Multiple Window”を選択)
display-settings.png

設定はそのままにし「次へ」をクリックします。(Start no clientを選択)
client-startup.png

「Disable access control」のチェックを入れて「次へ」をクリックします。
extra-settings.png

Save configrationで設定を保存し、[完了]を押します。
complete.png

以下の画像のような画面が出る場合、[アクセスを許可する]を押します。
firewall-pub.png

そして、タスクバー右下にXlaunchのアイコンが表示されれば成功です。
xlaunch-taskbar.png

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.0

GUIアプリケーションの実行

AE2100のコンテナ内で以下のコマンドを入力します。

# xcalc &

 
ウインドウズPCのデスクトップに電卓アプリが表示されます。
calc-0.png

試しにボタンを押して計算をさせてみましょう。
例えば「8」「*」「8」と入力すると「64」と表示されます。
アプリケーションウインドウはPC上に表示されていますが、計算自体はAE2100でおこなわれています。
calc-64.png

もし電卓が表示されない場合は、ウインドウズの「ファイアウォールとネットワーク保護」
を確認してください。
ウインドウズの「ファイアウォールとネットワーク保護」画面を開き、
「ファイアウォールによるアプリケーションの許可」を選択します。
firewall.png

設定変更ボタンを押し、下画面のようにVcXsrv windows xserverにチェックを入れOKボタンを押します。
app-permission.png

まとめ

今回は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)

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

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-client

serverとの接続確認

<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 にアクセス
初回ログイン時,パスワードの変更を求められる.

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

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

Dockerfile
FROM node:12.16.1
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

Dockerfile編集後は保存を忘れずにお願いします。
また、ターミナルで編集しても良いです。

terminal
touch Dockerfile && \
echo 'FROM node:12.16.1' >> Dockerfile && \
echo 'RUN mkdir -p /usr/src/app' >> Dockerfile && \
echo 'WORKDIR /usr/src/app' >> Dockerfile

Dockerfile の準備ができたら、初期のDocker イメージを作成します。
今回は nuxt-test という名前のイメージを作成します。
これから開発するアプリケーションの名前を入れると良いでしょう。

terminal
docker build -t nuxt-test .

Docker イメージが作成できたらイメージからコンテナを作成し、コンテナ内に入ります。
コンテナ名は ctr-nuxt-test としています。

terminal
docker 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)が空になっているか確認します。
空でない場合でも、削除して問題なければディレクトリを削除します。

terminal
ls -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.bash
docker-compose.yml
version: '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.bash
yarn install && \
yarn dev

これでいよいよ準備完了です!実行の確認をしましょう。

(初回)
docker-compose up --build

(2回目以降)
docker-compose up

立ち上がったかどうか、localhost:3000 で確認してください!
スクリーンショット 2020-10-28 15.41.16.png

自分で指定したプロジェクト名が表示されていればdocker compose での起動が成功です!

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

Dockerを使用してアプリケーションをコンテナー化する方法と、DockerComposeを使用して開発環境でアプリケーションを実行する方法

image.png

はじめに

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 --version​

PIPをインストールした後、次のコマンドを使用して仮想環境をインストールします。

​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/uk

PIPを使用して「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('/&lt;string:city&gt;/&lt;string:country&gt;/')
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('/&lt;string:city&gt;/&lt;string:country&gt;/')
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" ]

上記のファイルでは、次のことを行いました。

  1. 「python:3」というベースイメージを使用
  2. また、PYTHONUNBUFFEREDを1に設定。PYTHONUNBUFFEREDを1に設定すると、ログメッセージをバッファリングする代わりにストリームにダンプできます。
  3. また、フォルダー/ appを作成し、それをworkdirとして設定
  4. 要件をコピーし、それを使用してすべての依存関係をインストール
  5. アプリケーションを構成するすべてのファイル、つまりapp.pyファイルをworkdirにコピー
  6. アプリがこのポートを使用するため、最終的にポート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-&gt;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が監視環境に適合するかどうかを確認してください。

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

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"
  }
}
Dockerfile
FROM 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.ts
var 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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerfileを書くために | ベストプラクティスを抽出!

はじめに

今回は前回に引き続き、Dockerの基本的な書き方を紹介します。

本家のBest practices for writing Dockerfilesから抽出しました。

動画で確認したい方はこちらをどうぞ。
【YouTube動画】 Dockerfileのベストプラクティスを紹介! あなたはいくつできてますか?
Collation

.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 git

alpineイメージで軽くする

alpineイメージを使うと、容量を小さくできます (5 M以下)。
ちなみに、alpineはBusyBoxにパッケージマネージャー apkを加えたイメージです。
ホストOSの負荷を小さくできるので、開発環境とかで良いかもしれません。

upgradeはしない

upgradeするなら、ベースイメージのバージョンを上げましょう。

ADDよりもCOPYを使う

ADDは多機能なコマンドで、予期しない動きをすることがあります。
ホストOSからゲストOSにファイルを移動させるなら、COPYを使いましょう。

rootユーザーを使わない

セキュリティ上あまりよろしくないので、USERを追加する方が良いです。

まとめ

今回はDockerfileの書き方を紹介しました。
具体的な書き方や使い方は、別記事で紹介します!

twitteryoutubeでのコメントもお待ちしています!

追記

より詳しい話は@zembutsu さんによる訳を読んでみると良さそうです!
Dockerfileを書くためのベストプラクティス【参考訳】

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

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/0ed303dac5d32646194f

2. 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 install

docker-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/d3b52c553387685460b0

Visual Studio Code 上でf1メニューまたは左下に現れる緑色のアイコンをクリックして「Remote-Containers: Open Folder in Container...」を選択し、docker-compose.ymlがあるフォルダを選択すると
しばらくするとコンテナが実行され、コンソールでデバッグ操作できます。

vscode、docker便利、、

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