- 投稿日:2021-03-04T22:33:51+09:00
Function Compute で コンテナの Web アプリを作る
はじめに
Function Compute の Web アプリ機能でコンテナを起動できるようになったので、試してみます。
Migrate Web applications to Function Compute
Function Compute では HTTP、OSS トリガーで起動する関数や、時間駆動で起動する関数を作成することができ、Web アプリ機能では、Python、Java 等の Web アプリを作成することができます。
アーキテクチャ
GitHub に Dockerfile 及びソースコードをプッシュすると、Container Registry が Webhook 経由でプッシュを検知し、Dockerfile からコンテナイメージをビルドします。
Build an image for a Java application by using a Dockerfile with multi-stage builds
Function Compute は指定した Container Registry のイメージリポジトリからイメージを取り出し、コンテナをデプロイ及び起動します。デプロイ進捗を割合で指定することもでき、カナリアデプロイを実現できます。
Manage web applications
Special Thanks
本記事を作成するにあたり、SB Cloud 様のブログを参考にさせて頂きました。
Alibaba Cloud Container Registry (ACR) でコンテナイメージのビルドパイプラインを実装する
https://www.sbcloud.co.jp/entry/2020/04/01/container_registry
では手順を説明していきます。
1. GitHub にユーザーを作成する
GitHub のソースコードリポジトリとソースコードリポジトリを読み取る
Admin
権限を持つユーザーを作成します。今回はソースコードリポジトリ
alieaters-handson-serverless
とユーザーxxx-develop
を作成します。2. Container Registry に名前空間を作成する
イメージリポジトリを設置する名前空間をまず作ります。
Alibaba Cloud コンソールにログインし、Container Registry の Namespaces を選択します。
上の写真は名前空間
tech4all
を作成した状況です。3. Container Registry にイメージリポジトリを作成する
イメージリポジトリを作成します。
Container Registry の Repositories を選択します。
写真はイメージリポジトリ
tech4all
を作成した状況です。Function Compute からイメージリポジトリを使用するため、
Public
にします。※公式ドキュメントには記載がないですが、Function Compute の画面に
Public
にする旨が記載されています。GitHub のソースコードリポジトリとソースコードを読み取る GitHub ユーザーを指定します。
イメージリポジトリが作成されると、自動で GitHub の Webhooks に Container Registry のエンドポイントが追加されます。
4. Container Registry のイメージリポジトリにビルドルールを作成する
ソースコードリポジトリを起点とするビルドルールを作成します。
Container Registry の Repositories の
tech4all
を選択し、Build を選択します。今回はソースコードリポジトリの
master
ブランチのルートディレクトリにDockerfile
があり、latest
タグでコンテナイメージをビルドするルールを作成します。上の写真はビルドルールを作成済みの状態です。
5. Web アプリを開発する
今回は Flask を使用した Web アプリを開発します。
ディレクトリ構成
/ ├── app.py ├── Dockerfile ├── requirements.txt └─app ├── __init__.py └── templates └── index.htmlapp.pyimport os from app import create_app # 環境変数 APP_ENV, APP_KEY, DEBUG を使用 app = create_app(os.environ['APP_ENV']) app.secret_key = os.environ['APP_KEY'] # 9000 ポートを開放する if __name__ == "__main__": app.run(host="0.0.0.0", port=9000, debug=bool(os.environ['DEBUG']))Dockerfile.txtFROM python:3.6 EXPOSE 9000 ADD . /code WORKDIR /code RUN pip install -r requirements.txtrequirements.txtflaskapp/__init__.pyfrom flask import Flask, render_template def create_app(env): app = Flask(__name__) @app.route('/', methods=['GET']) def index(): return render_template('index.html') return appapp/templates/index.html<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>close-clothes</title> </head> <body> {% block content %} <form action="/user" method="post"> <div> <input type="text" name="user_name" size="6"> <select name="role_name"> <option value="admin">admin</option> </select> <button>join us!</button> </div> </form> {% endblock %} </body> </html>6. Function Compute に Web アプリを作成する
Function Compute の Application Center を選択します。
Web アプリのフレームワークに Container を選択します。
注意点は以下の通りです。
- Container Image
- イメージリポジトリ
tech4all
のlatest
タグを選択します- Start Command
- Docker の CMD コマンドにあたりますので、 Dockerfile には CMD を記載しないようにします
- Listener Port
- Python は 9000 ポートでしか Function Compute が受け付けていませんので 9000 を指定します
- Environment Variables
- Web アプリに渡したい環境変数を記載します
- Application Domain Name
- Alibaba Cloud DNS を使用したカスタムドメインを使用する場合は Customize Domain Name を選択します
デプロイが始まるとログが流れ始めます。
7. 関数のポートを 9000 に指定する
関数が出来上がっているので、関数で受け付けるポートに 9000 を指定します。
Function Compute の Services and Functions の
tech4all
を選択します。写真は既に 9000 に指定した状態です。
ポートは関係ないですが、Memory は 1024MB 以上でないと起動しないようになっています。
8. HTTP メソッドを編集
Web アプリで受け付ける HTTP メソッドを編集します。
Function Compute の Services and Functions の
tech4all
を選択します。受け付ける HTTP メソッドを選択します。
9. Web アプリにアクセス
Web アプリの準備が整ったので、早速アクセスしてみます。
Function Compute の Application Center の
tech4all
を選択します。Domain Name が出来上がっているのでアクセスします。
寂しい画面ですが、HTML が表示されました!
アクセスログ及びアプリログは Application Center で確認できます。
【appendix】カナリアデプロイを実現する
アプリのデフォルトバージョンに対するカナリアリリースバージョンの割合を設定し、カナリアデプロイを実現します。
Function Compute の Application Center の
tech4all
を選択します。カナリアデプロイを実現したいバージョンの Set to Canary Release Version を選択します。
Canary Release Weight の割合をスライドします。
おわりに
Elastic Container Instance や Kubernetes のコンテナ専用の実行環境を使用しなくても、Web アプリを作成することができました。
これらのサービスと Function Compute との使い分けは、アプリの規模であると考えられます。
互いに連携しあうコンテナが複数ある場合や、同一コンテナを複数起動する場合は、コンテナの管理が煩雑になるため、先に上げたコンテナ専用サービスを使用することが望ましいです。
Function Compute にはアプリの呼び出しを監視する機能やデプロイ機能もあるため、単一コンテナを起動させたい場合にお勧めです。
- 投稿日:2021-03-04T22:33:51+09:00
Function Compute でコンテナの Web アプリを作る
はじめに
Function Compute の Web アプリ機能でコンテナを起動できるようになったので、試してみます。
Migrate Web applications to Function Compute
Function Compute では HTTP、OSS トリガーで起動する関数や、時間駆動で起動する関数を作成することができ、Web アプリ機能では、Python、Java 等の Web アプリを作成することができます。
アーキテクチャ
GitHub に Dockerfile 及びソースコードをプッシュすると、Container Registry が Webhook 経由でプッシュを検知し、Dockerfile からコンテナイメージをビルドします。
Build an image for a Java application by using a Dockerfile with multi-stage builds
Function Compute は指定した Container Registry のイメージリポジトリからイメージを取り出し、コンテナをデプロイ及び起動します。デプロイ進捗を割合で指定することもでき、カナリアデプロイを実現できます。
Manage web applications
Special Thanks
本記事を作成するにあたり、SB Cloud 様のブログを参考にさせて頂きました。
Alibaba Cloud Container Registry (ACR) でコンテナイメージのビルドパイプラインを実装する
https://www.sbcloud.co.jp/entry/2020/04/01/container_registry
では手順を説明していきます。
1. GitHub にユーザーを作成する
GitHub のソースコードリポジトリとソースコードリポジトリを読み取る
Admin
権限を持つユーザーを作成します。今回はソースコードリポジトリ
alieaters-handson-serverless
とユーザーxxx-develop
を作成します。2. Container Registry に名前空間を作成する
イメージリポジトリを設置する名前空間をまず作ります。
Alibaba Cloud コンソールにログインし、Container Registry の Namespaces を選択します。
上の写真は名前空間
tech4all
を作成した状況です。3. Container Registry にイメージリポジトリを作成する
イメージリポジトリを作成します。
Container Registry の Repositories を選択します。
写真はイメージリポジトリ
tech4all
を作成した状況です。Function Compute からイメージリポジトリを使用するため、
Public
にします。※公式ドキュメントには記載がないですが、Function Compute の画面に
Public
にする旨が記載されています。GitHub のソースコードリポジトリとソースコードを読み取る GitHub ユーザーを指定します。
イメージリポジトリが作成されると、自動で GitHub の Webhooks に Container Registry のエンドポイントが追加されます。
4. Container Registry のイメージリポジトリにビルドルールを作成する
ソースコードリポジトリを起点とするビルドルールを作成します。
Container Registry の Repositories の
tech4all
を選択し、Build を選択します。今回はソースコードリポジトリの
master
ブランチのルートディレクトリにDockerfile
があり、latest
タグでコンテナイメージをビルドするルールを作成します。上の写真はビルドルールを作成済みの状態です。
5. Web アプリを開発する
今回は Flask を使用した Web アプリを開発します。
ディレクトリ構成
/ ├── app.py ├── Dockerfile ├── requirements.txt └─app ├── __init__.py └── templates └── index.htmlapp.pyimport os from app import create_app # 環境変数 APP_ENV, APP_KEY, DEBUG を使用 app = create_app(os.environ['APP_ENV']) app.secret_key = os.environ['APP_KEY'] # 9000 ポートを開放する if __name__ == "__main__": app.run(host="0.0.0.0", port=9000, debug=bool(os.environ['DEBUG']))Dockerfile.txtFROM python:3.6 EXPOSE 9000 ADD . /code WORKDIR /code RUN pip install -r requirements.txtrequirements.txtflaskapp/__init__.pyfrom flask import Flask, render_template def create_app(env): app = Flask(__name__) @app.route('/', methods=['GET']) def index(): return render_template('index.html') return appapp/templates/index.html<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>close-clothes</title> </head> <body> {% block content %} <form action="/user" method="post"> <div> <input type="text" name="user_name" size="6"> <select name="role_name"> <option value="admin">admin</option> </select> <button>join us!</button> </div> </form> {% endblock %} </body> </html>6. Function Compute に Web アプリを作成する
Function Compute の Application Center を選択します。
Web アプリのフレームワークに Container を選択します。
注意点は以下の通りです。
- Container Image
- イメージリポジトリ
tech4all
のlatest
タグを選択します- Start Command
- Docker の CMD コマンドにあたりますので、 Dockerfile には CMD を記載しないようにします
- Listener Port
- Python は 9000 ポートでしか Function Compute が受け付けていませんので 9000 を指定します
- Environment Variables
- Web アプリに渡したい環境変数を記載します
- Application Domain Name
- Alibaba Cloud DNS を使用したカスタムドメインを使用する場合は Customize Domain Name を選択します
デプロイが始まるとログが流れ始めます。
7. 関数のポートを 9000 に指定する
関数が出来上がっているので、関数で受け付けるポートに 9000 を指定します。
Function Compute の Services and Functions の
tech4all
を選択します。写真は既に 9000 に指定した状態です。
ポートは関係ないですが、Memory は 1024MB 以上でないと起動しないようになっています。
8. HTTP メソッドを編集
Web アプリで受け付ける HTTP メソッドを編集します。
Function Compute の Services and Functions の
tech4all
を選択します。受け付ける HTTP メソッドを選択します。
9. Web アプリにアクセス
Web アプリの準備が整ったので、早速アクセスしてみます。
Function Compute の Application Center の
tech4all
を選択します。Domain Name が出来上がっているのでアクセスします。
寂しい画面ですが、HTML が表示されました!
アクセスログ及びアプリログは Application Center で確認できます。
【appendix】カナリアデプロイを実現する
アプリのデフォルトバージョンに対するカナリアリリースバージョンの割合を設定し、カナリアデプロイを実現します。
Function Compute の Application Center の
tech4all
を選択します。カナリアデプロイを実現したいバージョンの Set to Canary Release Version を選択します。
Canary Release Weight の割合をスライドします。
おわりに
Elastic Container Instance や Kubernetes のコンテナ専用の実行環境を使用しなくても、Web アプリを作成することができました。
これらのサービスと Function Compute との使い分けは、アプリの規模であると考えられます。
互いに連携しあうコンテナが複数ある場合や、同一コンテナを複数起動する場合は、コンテナの管理が煩雑になるため、先に上げたコンテナ専用サービスを使用することが望ましいです。
Function Compute にはアプリの呼び出しを監視する機能やデプロイ機能もあるため、単一コンテナを起動させたい場合にお勧めです。
- 投稿日:2021-03-04T17:49:20+09:00
コンテナ型仮想化技術の仕組み
こんにちは。
前回の記事「Docker コンテナ構築入門」でDockerでのコンテナ構築方法を説明しました。
今回はコンテナ型仮想化技術の仕組みにフォーカスを当てた記事を書いていきます。特徴とコンテナを構成するNamespace, cgroup, Capabilityについて説明します。
コンテナ型仮想環境
コンテナ型仮想環境は、仮想化技術の一種です。
筆者は以前にOracle社のVirtualBoxを利用した経験があったため、VirtualBoxが該当するホスト型仮想環境と比較して説明します。
ホスト型は、仮想環境ごとにゲストOSを立ち上げるのに対し、コンテナ型はホストOSのカーネルを共有して動作しています。
そのため、他の仮想化技術と比べ起動が速く、軽量に動作するといったメリットがあります。また、ホストOSと独立した環境を作成できるので、管理が楽といったメリットもあります。
コンテナを構成する代表的なLinuxカーネルの機能
結論から言うと、コンテナは複数のLinuxカーネルの機能を組み合わせて構成されており、「コンテナ」と呼ばれる単一の技術でできているわけではありません。
その中でも重要な以下の3つの要素を説明します。
- Namespace "ネームスペース"
- cgroup "コントロールグループ"
- Capability "ケイパビリティ"
Namespace
Namespaceは、プロセスが参照するプロセスIDやマウントポイントなど、カーネルリソースを他のプロセスと分離し、ファイルツリーなどが独立したOS環境のように見せる機能です。
日本語では名前空間とも呼ばれています。
Namespaceはすべてのプロセスに関連付けられており、デフォルトでは親プロセスと同じNamespaceを参照します。そのため、同じNamespaceに存在する関係のないプロセスやリソースまで参照できてしまい、ファイルツリーの干渉やマウントなどのファイルシステムに影響を与えてしまう可能性があります。
そこでコンテナは、新たなNamespaceを関連付けることで、コンテナ内のリソースだけ見えるように隔離しています。
なお、Namespaceには7つ種類が存在し、それぞれ隔離できるリソースは異なります。
名前空間 定数 分離対象 IPC CLONE_NEWIPC System V IPC, POSIX メッセージキュー Network CLONE_NEWNET ネットワークデバイス、スタック、ポートなど Mount CLONE_NEWNS マウントポイント PID CLONE_NEWPID プロセス ID User CLONE_NEWUSER ユーザー ID とグループ ID UTS CLONE_NEWUTS ホスト名と NIS ドメイン名 ちなみに、
Docker
を介さずLinuxコマンドでNamespaceを作成する方法は、こちらにまとめてあります。
unshareコマンドで、Namespaceを作成してみるcgroup
controll groupの略です。
cgroup
はプロセスをグループ化し、グループ化したプロセスに対してリソースの管理を行う機能です。例えばホストが持つCPUやメモリなどのリソースを制限することができます。
そうすることで、あるプロセスが多くのCPUやメモリを消費し、動作が遅く不安定になったり、他のプロセスが強制終了したりといったことを抑制することができます。cgroupは具体的に、
- CPU時間・メモリ使用量の制限
- デバイスのアクセス制御
- ネットワーク優先度の設定
- 各リソースの使用量の確認
などといった事ができます。
Capability
通常プロセスは、特権(root権限)あるいは一般ユーザ権限で動いています。
特権が必要になるのは、
- 特権ポート(<1024)を使用する場合
- ネットワークの疎通確認に良く使う
$ping
コマンドなどのようにRawソケットを使用する場合$ntpd
などでシステムの時刻を設定する場合などが該当します。
しかし、上記のようなプロセスを実行する際に特権すべてを与えてしまうと、プロセスに脆弱性があった場合に、不正な操作によりプロセスが持っている権限を悪用され、システムに悪影響を与える可能性があり、セキュリティの観点であまり良くありません。
それに対し、特権をさらに細分化し、プロセスに特権すべてを与えるのではなく最小限にすることで、脆弱性が発見されて悪用されたとしてもそのプロセスが必要とする最小限の権限しか奪われないため、被害の範囲を狭めることができます。
この細分化した特権がCapabilityです。
- 投稿日:2021-03-04T17:37:42+09:00
Dockerとは?
Dockerとは
仮想化技術
のひとつ
Docker社が開発したコンテナ型の仮想環境
を作成、配布、実行するためのプラットフォーム仮想化とは、
1台の物理サーバーを複数の
仮想的なサーバーに分割して利用する
仕組みのことDockerを使うと
- パソコンやサーバーに
仮想環境
を作り、その上でWebサーバーやデータベースなどを動かすことが可能- それぞれの
仮想サーバー
で個別にOSやアプリケーションを実行することが可能で、独立したサーバー環境として利用することが可能Dockerを使用するメリット
- Webサーバーやデータベース本体やその設定内容を
ファイル化
できる- そうしてファイルを他の人に配布することで、
誰でも同じ環境を構築
可能- 作成した
環境を配布
しやすい具体的には
開発環境(Windows上)では動いていたけど
Linux(Microsoft WindowsとMacOSの無料の代替物)で動かなかった上記のようなケースも、開発工程からDockerを活用していくことで防ぎやすくなる
開発工程の中で使っていた環境をそのまま本番環境に持っていくことも可能となるため、
環境差分が少なく、環境による問題を減らすことができる
- 投稿日:2021-03-04T13:42:54+09:00
Dockerでbitwarden_rsをセルフホスティングする
はじめに
とある有名なパスワードマネージャーが有料化し、マルチデバイスができなくなったため移行した。
本家のものではなく、有志によって開発された非公式のbitwarden_rsを利用する。
サーバ構成
- OS:Ubuntu 20.08
- CPU:1コア
- メモリ:1GB
dockerインストール
詳細は省略。
コマンドのみ記載する。リポジトリ設定
dockerをインストールするためにリポジトリを設定する。
commandsudo apt-get update sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo apt-key fingerprint 0EBFCD88 sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"dockerエンジンインストール
commandsudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.iodockerインストール
commandsudo apt-get install docker-ce= docker-ce-cli= containerd.io sudo apt-get install docker-ce=5:19.03.9~3-0~ubuntu-focal docker-ce-cli=5:19.03.9~3-0~ubuntu-focal containerd.ioユーザ設定
sudoなしでdockerを触れるようにする。
commandsudo groupadd docker sudo gpasswd -a $USER docker sudo systemctl restart docker exit自動起動設定
commandsudo service docker start sudo systemctl enable dockerSSL証明書
以下のページを参考にしSSL証明書を作成する。
独自のルート認証局キー作成
パスワードを聞かれるので適当に入力する。
commandopenssl genpkey -algorithm RSA -aes128 -out private-ca.key -outform PEM -pkeyopt rsa_keygen_bits:2048ルートCA証明書作成
パスワードはルート認証局キーで設定したもの
Common Nameは「bitwarden_rs」とした。
それ以外はピリオド「.」を設定した。commandopenssl req -x509 -new -nodes -sha256 -days 3650 -key private-ca.key -out self-signed-ca-cert.crtこのコマンドを実行することで以下2ファイルが作成される。
- private-ca.key
- self-signed-ca-cert.crt
bitwardenサーバキー作成
以下のコマンドを実行し「bitwarden.key」を作成する。
commandopenssl genpkey -algorithm RSA -out bitwarden.key -outform PEM -pkeyopt rsa_keygen_bits:2048証明書要求ファイル作成
Common Name以外はピリオド「.」
Common NameはサーバのIPアドレスを設定する。commandopenssl req -new -key bitwarden.key -out bitwarden.csrbitwarden.ext作成
commandnano bitwarden.extIP.1にサーバのIPアドレスを設定する。
bitwarden.extauthorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] IP.1 = <サーバのIPアドレス>bitwarden証明書に署名
パスワードはルート認証局キーで設定したもの
このコマンドを定期的に実行して証明書を更新する必要がある。commandopenssl x509 -req -in bitwarden.csr -CA self-signed-ca-cert.crt -CAkey private-ca.key -CAcreateserial -out bitwarden.crt -days 365 -sha256 -extfile bitwarden.ext証明書のシステムフォルダに移動
commandsudo mv bitwarden.crt bitwarden.key /etc/ssl/certs/bitwarden起動
docker起動
ポートは8080としている。
commanddocker run -d --name bitwarden --restart unless-stopped -v /bw-data:/data -v /etc/ssl/certs:/ssl -e ROCKET_TLS='{certs="/ssl/bitwarden.crt",key="/ssl/bitwarden.key"}' -e SIGNUPS_ALLOWED=true -p 8080:80 bitwardenrs/server:latest証明書インポート
WinSCPなどを使用して「self-signed-ca-cert.crt」を取得する。
その後、信頼されたルート証明機関にインポートする。起動確認
以下のURLで接続する。
証明書が正しくインストールされていれば警告は出ない。URLhttps://<サーバIP>:<ポート>/アカウント作成後
dockerを停止&削除後、アカウント作成不可にして再起動する。
commanddocker stop bitwarden docker rm bitwarden docker run -d --name bitwarden --restart unless-stopped -v /bw-data:/data -v /etc/ssl/certs:/ssl -e ROCKET_TLS='{certs="/ssl/bitwarden.crt",key="/ssl/bitwarden.key"}' -e SIGNUPS_ALLOWED=false -p 8080:80 bitwardenrs/server:latest参考サイト
- 投稿日:2021-03-04T13:42:54+09:00
dockerでbitwarden_rsを構築する
はじめに
とある有名なパスワードマネージャーが有料化し、マルチデバイスができなくなったため移行した。
本家のものではなく、有志によって開発された非公式のbitwarden_rsを利用する。
目的
bitwarden_rsを自サーバに構築する。
サーバ構成
何人で使用するかによるが、1~3人程度なら512MBで十分。
- OS:Ubuntu 20.08
- CPU:1コア
- メモリ:1GBdockerインストール
詳細は省略。
コマンドのみ記載する。リポジトリ設定
dockerをインストールするためにリポジトリを設定する。
commandsudo apt-get update sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo apt-key fingerprint 0EBFCD88 sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"dockerエンジンインストール
commandsudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.iodockerインストール
commandsudo apt-get install docker-ce= docker-ce-cli= containerd.io sudo apt-get install docker-ce=5:19.03.9~3-0~ubuntu-focal docker-ce-cli=5:19.03.9~3-0~ubuntu-focal containerd.ioユーザ設定
sudoなしでdockerを触れるようにする。
commandsudo groupadd docker sudo gpasswd -a $USER docker sudo systemctl restart docker exit自動起動設定
commandsudo service docker start sudo systemctl enable dockerSSL証明書
以下のページを参考にしSSL証明書を作成する。
独自のルート認証局キー作成
パスワードを聞かれるので適当に入力する。
commandopenssl genpkey -algorithm RSA -aes128 -out private-ca.key -outform PEM -pkeyopt rsa_keygen_bits:2048ルートCA証明書作成
パスワードはルート認証局キーで設定したもの
Common Nameは「bitwarden_rs」とした。
それ以外はピリオド「.」を設定した。commandopenssl req -x509 -new -nodes -sha256 -days 3650 -key private-ca.key -out self-signed-ca-cert.crtこのコマンドを実行することで以下2ファイルが作成される。
- private-ca.key
- self-signed-ca-cert.crt
bitwardenサーバキー作成
以下のコマンドを実行し「bitwarden.key」を作成する。
commandopenssl genpkey -algorithm RSA -out bitwarden.key -outform PEM -pkeyopt rsa_keygen_bits:2048証明書要求ファイル作成
Common Name以外はピリオド「.」
Common NameはサーバのIPアドレスを設定する。commandopenssl req -new -key bitwarden.key -out bitwarden.csrbitwarden.ext作成
commandnano bitwarden.extIP.1にサーバのIPアドレスを設定する。
bitwarden.extauthorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] IP.1 = <サーバのIPアドレス>bitwarden証明書に署名
パスワードはルート認証局キーで設定したもの
このコマンドを定期的に実行して証明書を更新する必要がある。commandopenssl x509 -req -in bitwarden.csr -CA self-signed-ca-cert.crt -CAkey private-ca.key -CAcreateserial -out bitwarden.crt -days 365 -sha256 -extfile bitwarden.ext証明書のシステムフォルダに移動
commandsudo mv bitwarden.crt bitwarden.key /etc/ssl/certs/bitwarden起動
docker起動
ポートは8080としている。
commanddocker run -d --name bitwarden --restart unless-stopped -v /bw-data:/data -v /etc/ssl/certs:/ssl -e ROCKET_TLS='{certs="/ssl/bitwarden.crt",key="/ssl/bitwarden.key"}' -e SIGNUPS_ALLOWED=true -p 8080:80 bitwardenrs/server:latest証明書インポート
WinSCPなどを使用して上記「SSL証明書」で作成した「self-signed-ca-cert.crt」をサーバから取得する。
その後、クライアントPC側で信頼されたルート証明機関にインポートする。起動確認
以下のURLで接続する。
証明書が正しくインストールされていれば証明書関連の警告は出ない。URLhttps://<サーバIP>:<ポート>/アカウント作成後
dockerを停止&削除後、アカウント作成不可にして再起動する。
commanddocker stop bitwarden docker rm bitwarden docker run -d --name bitwarden --restart unless-stopped -v /bw-data:/data -v /etc/ssl/certs:/ssl -e ROCKET_TLS='{certs="/ssl/bitwarden.crt",key="/ssl/bitwarden.key"}' -e SIGNUPS_ALLOWED=false -p 8080:80 bitwardenrs/server:latestおわりに
上記の手順でbitwarden_rsを自サーバに構築できた。
次回はクライアント側の初期設定とbitwarden_rsの更新&バックアップを記載する。参考サイト
- 投稿日:2021-03-04T12:24:01+09:00
【vue.js】フロントエンド開発にDockerを使う。つらみもあるよ
今までローカルでフロントエンド開発やってたけど、Docker使ってみるか〜。
でもDocker難しくてわからないよ〜〜〜〜〜〜〜!!!!!!
対象読者はvue-cli開発経験のある方です。
最終的なコードはこちら(github)なぜDockerを使うのか
バックエンドの人たちがDocker信者すぎてフロントエンド開発者の肩身が狭いから「環境を揃えたいよね」というフワッとした動機から。
実際使ってみて今のところメリットは感じていないですが、vue-cliのバージョンを固定したりするのは追々嬉しいことになるのかも、と思います。未来への投資だと思ってやっていきます。「Dockerでフロントエンド開発する」とは
どこまでDockerに担わせるか、というところですが、調べた感じだと「実行環境」をDockerで構築するのがベターみたいですね。
クジラの写真なかった。vueをDockerで動かすまでの手順
vue-cliプロジェクトの作成
ローカル環境でプロジェクトを作成します。
ローカルの環境はこんな感じです。新規プロジェクトを始めるときに慌てて最新バージョンにしたりしてます。$ node --version v14.15.5 $ npm --version 6.14.11 $ vue --version @vue/cli 4.5.11あとはいつも通り
$ vue create docker-vue$ ls -a . .gitignore node_modules public .. README.md package-lock.json src .git babel.config.js package.jsonDokcerfileを作成
プロジェクトディレクトリに作ります
DockerfileFROM node:14.15.5-alpine WORKDIR /usr/src/app COPY package*.json ./ RUN apk update \ && npm install -g npm@6.14.11 @vue/cli@4.5.11 \ && npm install
FROM
でnodeイメージのバージョンを指定します。今回はローカルと同じにします。
WORKDIR
はDockerコンテナ内でのプロジェクトディレクトリです。なんでもよいです。
COPY
でpackage.jsonとpackage-lock.jsonをWORKDIRにコピーします。
RUN
でパッケージ等インストールし、環境構築します。ここでnpmとvue-cliのバージョンを固定します。docker-compose.ymlの作成
docker-compose.ymlversion: '3' services: app: container_name: docker-vue-test build: . ports: - 8080:8080 volumes: - .:/usr/src/app - /usr/src/app/node_modules stdin_open: true tty: true command: "npm run serve"コンテナ名を
docker-vue-test
と敢えてつけてます。あとで使います。
最後npm run serve
を命令することで、コンテナ起動と同時にvueサーバーを起動させます。動作確認する
まずDockerイメージをビルドします。
$ docker-compose buildそしてコンテナを起動。
$ docker-compose up -dhttp://localhost:8080/ にアクセスすると、いつものVueの画面が表示されます。
(任意)ポートを変える
ここまででDockerで実行環境を作るという目標は達成しましたが、
8080ポートは何かと他のプロジェクトでも使ったりするので、明示的にポートを指定してみます。vue.config.jsの作成
まず、vue-cliをどのポートを使って起動させるか指定します。
プロジェクトディレクトリにvue.config.jsを作成します。vue.config.jsmodule.exports = { devServer: { port: 9000, # 好きな数字にする host: '0.0.0.0', disableHostCheck: true, }, };docker-compose.ymlの編集
docker-compose.ymlの
ports
を、先ほど指定した数字に合わせて修正します。ports: - 9000:9000Docker再起動
$ docker-compose stop $ docker-compose up -d今度は http://localhost:9000/ で画面が確認できます。
所感
良いところ
いつも通りローカル開発でき、ホットリロードで画面に反映されます。普通です。
うーん…ってなったところ
ホットリロードしなくなった時、ローカル実行ならブラウザのキャッシュをクリアすれば大体治っていたのですが、
Dockerで実行してるとキャッシュを消しても治らないことがあります。
そういう時はコンテナをstop/startするか、全然関係ない箇所をいじったりすると治りました。ここはちょっとよくわからない…また、追加でライブラリなどを入れる時はコンテナ側にインストールする必要があります。
$ docker exec -it docker-vue-test sh /usr/src/app # npm install hogehoge...さいごに
開発初期段階ではまだ「Dockerにして幸せだなあ」と思うことはないです。
ただ手順もそんなに多くはないですし、git cloneしたあとに
以前はnodebrewでnodeバージョンを変えてnpm installしてrun serveして…という手数を踏んでいたところが
Dockerのイメージビルド、コンテナ起動だけになるのは少しシンプルになって小気味好いかもしれませんね。知らんけど。Dockerに頼りきりにならず、中で何をしているか理解することもとても重要だと思っているので、
それを心に留めつつ今後もDockerと仲良くしていきたいと思います。参考記事
- 投稿日:2021-03-04T12:24:01+09:00
【Vue.js】フロントエンド開発にDockerを使う。つらみもあるよ
今までローカルでフロントエンド開発やってたけど、Docker使ってみるか〜。
でもDocker難しくてわからないよ〜〜〜〜〜〜〜!!!!!!
対象読者はvue-cli開発経験のある方です。
最終的なコードはこちら(github)なぜDockerを使うのか
バックエンドの人たちがDocker信者すぎてフロントエンド開発者の肩身が狭いから「環境を揃えたいよね」というフワッとした動機から。
実際使ってみて今のところメリットは感じていないですが、vue-cliのバージョンを固定したりするのは追々嬉しいことになるのかも、と思います。未来への投資だと思ってやっていきます。「Dockerでフロントエンド開発する」とは
どこまでDockerに担わせるか、というところですが、調べた感じだと「実行環境」をDockerで構築するのがベターみたいですね。
クジラの写真なかった。vueをDockerで動かすまでの手順
vue-cliプロジェクトの作成
ローカル環境でプロジェクトを作成します。
ローカルの環境はこんな感じです。新規プロジェクトを始めるときに慌てて最新バージョンにしたりしてます。$ node --version v14.15.5 $ npm --version 6.14.11 $ vue --version @vue/cli 4.5.11あとはいつも通り
$ vue create docker-vue$ ls -a . .gitignore node_modules public .. README.md package-lock.json src .git babel.config.js package.jsonDokcerfileを作成
プロジェクトディレクトリに作ります
DockerfileFROM node:14.15.5-alpine WORKDIR /usr/src/app COPY package*.json ./ RUN apk update \ && npm install -g npm@6.14.11 @vue/cli@4.5.11 \ && npm install
FROM
でnodeイメージのバージョンを指定します。今回はローカルと同じにします。
WORKDIR
はDockerコンテナ内でのプロジェクトディレクトリです。なんでもよいです。
COPY
でpackage.jsonとpackage-lock.jsonをWORKDIRにコピーします。
RUN
でパッケージ等インストールし、環境構築します。ここでnpmとvue-cliのバージョンを固定します。docker-compose.ymlの作成
docker-compose.ymlversion: '3' services: app: container_name: docker-vue-test build: . ports: - 8080:8080 volumes: - .:/usr/src/app - /usr/src/app/node_modules stdin_open: true tty: true command: "npm run serve"コンテナ名を
docker-vue-test
と敢えてつけてます。あとで使います。
最後npm run serve
を命令することで、コンテナ起動と同時にvueサーバーを起動させます。動作確認する
まずDockerイメージをビルドします。
$ docker-compose buildそしてコンテナを起動。
$ docker-compose up -dhttp://localhost:8080/ にアクセスすると、いつものVueの画面が表示されます。
(任意)ポートを変える
ここまででDockerで実行環境を作るという目標は達成しましたが、
8080ポートは何かと他のプロジェクトでも使ったりするので、明示的にポートを指定してみます。vue.config.jsの作成
まず、vue-cliをどのポートを使って起動させるか指定します。
プロジェクトディレクトリにvue.config.jsを作成します。vue.config.jsmodule.exports = { devServer: { port: 9000, # 好きな数字にする host: '0.0.0.0', disableHostCheck: true, }, };docker-compose.ymlの編集
docker-compose.ymlの
ports
を、先ほど指定した数字に合わせて修正します。ports: - 9000:9000Docker再起動
$ docker-compose stop $ docker-compose up -d今度は http://localhost:9000/ で画面が確認できます。
所感
良いところ
いつも通りローカル開発でき、ホットリロードで画面に反映されます。普通です。
うーん…ってなったところ
ホットリロードしなくなった時、ローカル実行ならブラウザのキャッシュをクリアすれば大体治っていたのですが、
Dockerで実行してるとキャッシュを消しても治らないことがあります。
そういう時はコンテナをstop/startするか、全然関係ない箇所をいじったりすると治りました。ここはちょっとよくわからない…また、追加でライブラリなどを入れる時はコンテナ側にインストールする必要があります。
$ docker exec -it docker-vue-test sh /usr/src/app # npm install hogehoge...さいごに
開発初期段階ではまだ「Dockerにして幸せだなあ」と思うことはないです。
ただ手順もそんなに多くはないですし、git cloneしたあとに
以前はnodebrewでnodeバージョンを変えてnpm installしてrun serveして…という手数を踏んでいたところが
Dockerのイメージビルド、コンテナ起動だけになるのは少しシンプルになって小気味好いかもしれませんね。知らんけど。Dockerに頼りきりにならず、中で何をしているか理解することもとても重要だと思っているので、
それを心に留めつつ今後もDockerと仲良くしていきたいと思います。参考記事
- 投稿日:2021-03-04T11:52:12+09:00
DockerでDjangoのための環境構築をしてみた
理由
Techpitさんの講座の「【Django】Amazon風簡易ECサイトを作ってみよう!」の受講の際に、Djangoを使用することとなったが、その時の環境構築をDockerで行いたいと思ったためです。
実装
DockerfileFROM ubuntu:latest ADD requirements.txt . RUN apt-get update && apt-get install -y \ && apt-get install -y python3 python3-pip\ && apt-get install -y curl \ && curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py \ && python3 get-pip.py \ && pip install -r requirements.txt \ && rm requirements.txt \ && rm get-pip.py WORKDIR /django-ec CMD ["bash"]
- FROM
- ubuntu環境を持ってきています
- ADD
- `Dockerfile`と同じ階層にある`requirements.txt`をコンテナに持っていきます
- RUN
- ADDでRUNで主な環境構築を行なっています。
- ubuntuの場合、apt-getを用いて様々なものをインストールできます。
- WORKDIR
- django-ecというフォルダを作り、そこに移動します
- CMD
- デフォルトではbashを起動します
docker-compose.ymlversion: '3' services: django: build: . ports: - '8002:8002' volumes: - '.:/django-ec' tty: true stdin_open: true毎回、
docker run
の時にオプションをつけるのがめんどくさいので、docker-compose.yml
を作成しました。requirements.txtdjango Pillow今回の講座で
django
意外にも画像を扱うPillow
も使っていました。まとめ
Dockerを用いて環境構築をするのは、思っているより簡単なので、今後もたくさんDockerを使って環境構築をしていきたいと思います。
- 投稿日:2021-03-04T08:16:32+09:00
docker-composeでcomposer require した時にFatal error: Allowed memory size of 1610612736 bytes exhausted ....が出た対処法
解決策
php -d memory_limit=-1 /usr/bin/composer require ****/****
- 投稿日:2021-03-04T00:31:22+09:00
初心者がDocker + Ubuntu20.04でKaggleのGPU環境構築した備忘録
はじめに
DockerでKaggle imageを利用してGPU環境を構築した手順を備忘録として共有します。
あくまで、こうやれば成功したよという記事ですので他の環境で上手く動作するかは保証できません。
- 以下のサイトを参考にしてまとめた形となっております。
目標
- Kaggle kernelと同じ環境のコンテナの作成
- GPUの認識
動作環境
- Ubuntu 20.04.2 LTS
- Intel 10700k
- RTX3070
- nvidia-smi 460.39
- nvidia-driver 460.39
- cuda 11.2
Dockerインストール
Docker公式の方法でインストールします。
$ sudo apt-get update #必要なソフトウェアのインストール $ sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg #公開鍵のインストール $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg #リポジトリの指定(x86_64) $ echo \ "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null #dockerインストール $ sudo apt-get update $ sudo apt-get install docker-ce #versionが表示されればインストール完了 $ docker version毎度sudoを打つのが大変なのでsudo無しで動くようにします。
$ sudo groupadd docker $ sudo gpasswd -a $USER dockernvidia-dockerインストール
nvidia-dockerを入れないと、後述するrun --gpusが認識されませんでした。(これで結構ハマった。)
こちらもNVIDIA公式サイトの方法
でインストールします。#公開鍵等の設定 $ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \ sudo apt-key add - $ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) $ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list $ sudo apt-get update #インストール $ sudo apt-get install nvidia-docker2 $ sudo pkill -SIGHUP dockerdKggle公式Dockerimage(GPU版)の作成
こちらもKaggle公式サイトの方法で実行します。
環境にもよると思いますが非常に時間がかかります。(私の場合は5時間程度)$ git clone https://github.com/Kaggle/docker-python.git $ cd docker-python #ここで非常に時間がかかる。 $ ./build --gpu #image名がずらずらと表示されればOK $ docker images#Dockerの再起動 $ sudo systemctl restart dockerコンテナ作成
下のコマンドを実行して、GPUが認識されていれば成功です。
お疲れ様でした!$ docker run --gpus all --rm -it kaggle/python-gpu-build /bin/bash #GPUを認識しているか確認 $ nvidia-smi
- 投稿日:2021-03-04T00:31:22+09:00
初心者がDocker + Ubuntu20.04でKaggleのGPU環境を構築した。
目次
1.はじめに
2.動作環境
3.Dockerインストール
4.nvidia-dockerインストール
5.Kggle公式Dockerimage(GPU版)の作成
6.コンテナ作成1. はじめに
DockerでKaggle imageを利用してGPU環境を構築した手順を備忘録として公開します。
- あくまで、こうやれば成功したよという記事ですので他の環境で上手く動作するかは保証できません。
- 以下のサイトを参考にしてまとめた形となっております。
2. 動作環境
- Ubuntu 20.04.2 LTS
- Intel 10700k
- RTX3070
- nvidia-smi 460.39
- nvidia-driver 460.39
- cuda 11.2
3. Dockerインストール
Docker公式の方法でインストールします。
$ sudo apt-get update #必要なソフトウェアのインストール $ sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg #公開鍵のインストール $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg #リポジトリの指定(x86_64) $ echo \ "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null #dockerインストール $ sudo apt-get update $ sudo apt-get install docker-ce #versionが表示されればインストール完了 $ docker version毎度sudoを打つのが大変なのでsudo無しで動くようにします。
$ sudo groupadd docker $ sudo gpasswd -a $USER docker4. nvidia-dockerインストール
nvidia-dockerを入れないと、後述するrun --gpusが認識されませんでした。(これで結構ハマった。)
こちらもNVIDIA公式サイトの方法
でインストールします。#公開鍵等の設定 $ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \ sudo apt-key add - $ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) $ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list $ sudo apt-get update #インストール $ sudo apt-get install nvidia-docker2 $ sudo pkill -SIGHUP dockerd5. Kggle公式Dockerimage(GPU版)の作成
こちらもKaggle公式サイトの方法で実行します。
環境にもよると思いますが非常に時間がかかります。(私の場合は5時間程度)$ git clone https://github.com/Kaggle/docker-python.git $ cd docker-python #ここで非常に時間がかかる。 $ ./build --gpu #image名がずらずらと表示されればOK $ docker images#Dockerの再起動 $ sudo systemctl restart docker6. コンテナ作成
下のコマンドを実行して、GPUが認識されていれば成功です。
お疲れ様でした!$ docker run --gpus all --rm -it kaggle/python-gpu-build /bin/bash #GPUを認識しているか確認 $ nvidia-smi