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

Function Compute で コンテナの Web アプリを作る

はじめに

Function Compute の Web アプリ機能でコンテナを起動できるようになったので、試してみます。

Migrate Web applications to Function Compute

https://www.alibabacloud.com/help/doc-detail/161884.htm

Function Compute では HTTP、OSS トリガーで起動する関数や、時間駆動で起動する関数を作成することができ、Web アプリ機能では、Python、Java 等の Web アプリを作成することができます。

アーキテクチャ

t_27.png

GitHub に Dockerfile 及びソースコードをプッシュすると、Container Registry が Webhook 経由でプッシュを検知し、Dockerfile からコンテナイメージをビルドします。

Build an image for a Java application by using a Dockerfile with multi-stage builds

https://www.alibabacloud.com/help/doc-detail/173175.htm

Function Compute は指定した Container Registry のイメージリポジトリからイメージを取り出し、コンテナをデプロイ及び起動します。デプロイ進捗を割合で指定することもでき、カナリアデプロイを実現できます。

Manage web applications

https://www.alibabacloud.com/help/doc-detail/162396.htm

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 を作成します。

t_06.png

2. Container Registry に名前空間を作成する

イメージリポジトリを設置する名前空間をまず作ります。

Alibaba Cloud コンソールにログインし、Container Registry の Namespaces を選択します。

上の写真は名前空間 tech4all を作成した状況です。

t_01.png

t_02.png

3. Container Registry にイメージリポジトリを作成する

イメージリポジトリを作成します。

Container Registry の Repositories を選択します。

写真はイメージリポジトリ tech4all を作成した状況です。

t_03.png

Function Compute からイメージリポジトリを使用するため、Public にします。

※公式ドキュメントには記載がないですが、Function Compute の画面に Public にする旨が記載されています。

t_04.png

GitHub のソースコードリポジトリとソースコードを読み取る GitHub ユーザーを指定します。

t_05.png

イメージリポジトリが作成されると、自動で GitHub の Webhooks に Container Registry のエンドポイントが追加されます。

t_07.png

4. Container Registry のイメージリポジトリにビルドルールを作成する

ソースコードリポジトリを起点とするビルドルールを作成します。

Container Registry の Repositories の tech4all を選択し、Build を選択します。

今回はソースコードリポジトリの master ブランチのルートディレクトリに Dockerfile があり、latest タグでコンテナイメージをビルドするルールを作成します。

上の写真はビルドルールを作成済みの状態です。

t_08.png

t_09.png

5. Web アプリを開発する

今回は Flask を使用した Web アプリを開発します。

ディレクトリ構成

/
├── app.py
├── Dockerfile
├── requirements.txt
└─app
    ├── __init__.py
    └── templates
        └── index.html
app.py
import 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.txt
FROM python:3.6
EXPOSE 9000
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
requirements.txt
flask
app/__init__.py
from flask import Flask, render_template


def create_app(env):
    app = Flask(__name__)

    @app.route('/', methods=['GET'])
    def index():
        return render_template('index.html')

    return app
app/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 を選択します。

t_10.png

注意点は以下の通りです。

  1. Container Image
    • イメージリポジトリ tech4alllatest タグを選択します
  2. Start Command
    • Docker の CMD コマンドにあたりますので、 Dockerfile には CMD を記載しないようにします
  3. Listener Port
    • Python は 9000 ポートでしか Function Compute が受け付けていませんので 9000 を指定します
  4. Environment Variables
    • Web アプリに渡したい環境変数を記載します
  5. Application Domain Name
    • Alibaba Cloud DNS を使用したカスタムドメインを使用する場合は Customize Domain Name を選択します

t_11.png

デプロイが始まるとログが流れ始めます。

t_12.png

7. 関数のポートを 9000 に指定する

関数が出来上がっているので、関数で受け付けるポートに 9000 を指定します。

Function Compute の Services and Functions の tech4all を選択します。

t_22.png

写真は既に 9000 に指定した状態です。

t_23.png

ポートは関係ないですが、Memory は 1024MB 以上でないと起動しないようになっています。

t_24.png

8. HTTP メソッドを編集

Web アプリで受け付ける HTTP メソッドを編集します。

Function Compute の Services and Functions の tech4all を選択します。

t_25.png

受け付ける HTTP メソッドを選択します。

t_26.png

9. Web アプリにアクセス

Web アプリの準備が整ったので、早速アクセスしてみます。

Function Compute の Application Center の tech4all を選択します。

t_13.png

Domain Name が出来上がっているのでアクセスします。

t_14.png

寂しい画面ですが、HTML が表示されました!

t_20.png

アクセスログ及びアプリログは Application Center で確認できます。

t_17.png

【appendix】カナリアデプロイを実現する

アプリのデフォルトバージョンに対するカナリアリリースバージョンの割合を設定し、カナリアデプロイを実現します。

Function Compute の Application Center の tech4all を選択します。

カナリアデプロイを実現したいバージョンの Set to Canary Release Version を選択します。

t_21.png

Canary Release Weight の割合をスライドします。

t_19.png

おわりに

Elastic Container InstanceKubernetes のコンテナ専用の実行環境を使用しなくても、Web アプリを作成することができました。

これらのサービスと Function Compute との使い分けは、アプリの規模であると考えられます。

互いに連携しあうコンテナが複数ある場合や、同一コンテナを複数起動する場合は、コンテナの管理が煩雑になるため、先に上げたコンテナ専用サービスを使用することが望ましいです。

Function Compute にはアプリの呼び出しを監視する機能やデプロイ機能もあるため、単一コンテナを起動させたい場合にお勧めです。

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

Function Compute でコンテナの Web アプリを作る

はじめに

Function Compute の Web アプリ機能でコンテナを起動できるようになったので、試してみます。

Migrate Web applications to Function Compute

https://www.alibabacloud.com/help/doc-detail/161884.htm

Function Compute では HTTP、OSS トリガーで起動する関数や、時間駆動で起動する関数を作成することができ、Web アプリ機能では、Python、Java 等の Web アプリを作成することができます。

アーキテクチャ

t_27.png

GitHub に Dockerfile 及びソースコードをプッシュすると、Container Registry が Webhook 経由でプッシュを検知し、Dockerfile からコンテナイメージをビルドします。

Build an image for a Java application by using a Dockerfile with multi-stage builds

https://www.alibabacloud.com/help/doc-detail/173175.htm

Function Compute は指定した Container Registry のイメージリポジトリからイメージを取り出し、コンテナをデプロイ及び起動します。デプロイ進捗を割合で指定することもでき、カナリアデプロイを実現できます。

Manage web applications

https://www.alibabacloud.com/help/doc-detail/162396.htm

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 を作成します。

t_06.png

2. Container Registry に名前空間を作成する

イメージリポジトリを設置する名前空間をまず作ります。

Alibaba Cloud コンソールにログインし、Container Registry の Namespaces を選択します。

上の写真は名前空間 tech4all を作成した状況です。

t_01.png

t_02.png

3. Container Registry にイメージリポジトリを作成する

イメージリポジトリを作成します。

Container Registry の Repositories を選択します。

写真はイメージリポジトリ tech4all を作成した状況です。

t_03.png

Function Compute からイメージリポジトリを使用するため、Public にします。

※公式ドキュメントには記載がないですが、Function Compute の画面に Public にする旨が記載されています。

t_04.png

GitHub のソースコードリポジトリとソースコードを読み取る GitHub ユーザーを指定します。

t_05.png

イメージリポジトリが作成されると、自動で GitHub の Webhooks に Container Registry のエンドポイントが追加されます。

t_07.png

4. Container Registry のイメージリポジトリにビルドルールを作成する

ソースコードリポジトリを起点とするビルドルールを作成します。

Container Registry の Repositories の tech4all を選択し、Build を選択します。

今回はソースコードリポジトリの master ブランチのルートディレクトリに Dockerfile があり、latest タグでコンテナイメージをビルドするルールを作成します。

上の写真はビルドルールを作成済みの状態です。

t_08.png

t_09.png

5. Web アプリを開発する

今回は Flask を使用した Web アプリを開発します。

ディレクトリ構成

/
├── app.py
├── Dockerfile
├── requirements.txt
└─app
    ├── __init__.py
    └── templates
        └── index.html
app.py
import 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.txt
FROM python:3.6
EXPOSE 9000
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
requirements.txt
flask
app/__init__.py
from flask import Flask, render_template


def create_app(env):
    app = Flask(__name__)

    @app.route('/', methods=['GET'])
    def index():
        return render_template('index.html')

    return app
app/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 を選択します。

t_10.png

注意点は以下の通りです。

  1. Container Image
    • イメージリポジトリ tech4alllatest タグを選択します
  2. Start Command
    • Docker の CMD コマンドにあたりますので、 Dockerfile には CMD を記載しないようにします
  3. Listener Port
    • Python は 9000 ポートでしか Function Compute が受け付けていませんので 9000 を指定します
  4. Environment Variables
    • Web アプリに渡したい環境変数を記載します
  5. Application Domain Name
    • Alibaba Cloud DNS を使用したカスタムドメインを使用する場合は Customize Domain Name を選択します

t_11.png

デプロイが始まるとログが流れ始めます。

t_12.png

7. 関数のポートを 9000 に指定する

関数が出来上がっているので、関数で受け付けるポートに 9000 を指定します。

Function Compute の Services and Functions の tech4all を選択します。

t_22.png

写真は既に 9000 に指定した状態です。

t_23.png

ポートは関係ないですが、Memory は 1024MB 以上でないと起動しないようになっています。

t_24.png

8. HTTP メソッドを編集

Web アプリで受け付ける HTTP メソッドを編集します。

Function Compute の Services and Functions の tech4all を選択します。

t_25.png

受け付ける HTTP メソッドを選択します。

t_26.png

9. Web アプリにアクセス

Web アプリの準備が整ったので、早速アクセスしてみます。

Function Compute の Application Center の tech4all を選択します。

t_13.png

Domain Name が出来上がっているのでアクセスします。

t_14.png

寂しい画面ですが、HTML が表示されました!

t_20.png

アクセスログ及びアプリログは Application Center で確認できます。

t_17.png

【appendix】カナリアデプロイを実現する

アプリのデフォルトバージョンに対するカナリアリリースバージョンの割合を設定し、カナリアデプロイを実現します。

Function Compute の Application Center の tech4all を選択します。

カナリアデプロイを実現したいバージョンの Set to Canary Release Version を選択します。

t_21.png

Canary Release Weight の割合をスライドします。

t_19.png

おわりに

Elastic Container InstanceKubernetes のコンテナ専用の実行環境を使用しなくても、Web アプリを作成することができました。

これらのサービスと Function Compute との使い分けは、アプリの規模であると考えられます。

互いに連携しあうコンテナが複数ある場合や、同一コンテナを複数起動する場合は、コンテナの管理が煩雑になるため、先に上げたコンテナ専用サービスを使用することが望ましいです。

Function Compute にはアプリの呼び出しを監視する機能やデプロイ機能もあるため、単一コンテナを起動させたい場合にお勧めです。

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

コンテナ型仮想化技術の仕組み

こんにちは。

前回の記事「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やメモリを消費し、動作が遅く不安定になったり、他のプロセスが強制終了したりといったことを抑制することができます。

image.png

cgroupは具体的に、

  • CPU時間・メモリ使用量の制限
  • デバイスのアクセス制御
  • ネットワーク優先度の設定
  • 各リソースの使用量の確認

などといった事ができます。

Capability

通常プロセスは、特権(root権限)あるいは一般ユーザ権限で動いています。
特権が必要になるのは、

  • 特権ポート(<1024)を使用する場合
  • ネットワークの疎通確認に良く使う$pingコマンドなどのようにRawソケットを使用する場合
  • $ntpdなどでシステムの時刻を設定する場合

などが該当します。

しかし、上記のようなプロセスを実行する際に特権すべてを与えてしまうと、プロセスに脆弱性があった場合に、不正な操作によりプロセスが持っている権限を悪用され、システムに悪影響を与える可能性があり、セキュリティの観点であまり良くありません。

それに対し、特権をさらに細分化し、プロセスに特権すべてを与えるのではなく最小限にすることで、脆弱性が発見されて悪用されたとしてもそのプロセスが必要とする最小限の権限しか奪われないため、被害の範囲を狭めることができます。

この細分化した特権Capabilityです。

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

Dockerとは?

Dockerとは

仮想化技術のひとつ
Docker社が開発したコンテナ型の仮想環境を作成、配布、実行するためのプラットフォーム

仮想化とは、

1台の物理サーバーを複数の仮想的なサーバーに分割して利用する仕組みのこと

Dockerを使うと

  • パソコンやサーバーに仮想環境を作り、その上でWebサーバーやデータベースなどを動かすことが可能
  • それぞれの仮想サーバーで個別にOSやアプリケーションを実行することが可能で、独立したサーバー環境として利用することが可能

Dockerを使用するメリット

  1. Webサーバーやデータベース本体やその設定内容をファイル化できる
  2. そうしてファイルを他の人に配布することで、誰でも同じ環境を構築可能
  3. 作成した環境を配布しやすい

具体的には

開発環境(Windows上)では動いていたけど
Linux(Microsoft WindowsとMacOSの無料の代替物)で動かなかった

上記のようなケースも、開発工程からDockerを活用していくことで防ぎやすくなる


開発工程の中で使っていた環境をそのまま本番環境に持っていくことも可能となるため、
環境差分が少なく、環境による問題を減らすことができる

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

Dockerでbitwarden_rsをセルフホスティングする

はじめに

とある有名なパスワードマネージャーが有料化し、マルチデバイスができなくなったため移行した。
本家のものではなく、有志によって開発された非公式のbitwarden_rsを利用する。

サーバ構成

  • OS:Ubuntu 20.08
  • CPU:1コア
  • メモリ:1GB

dockerインストール

詳細は省略。
コマンドのみ記載する。

リポジトリ設定

dockerをインストールするためにリポジトリを設定する。

command
sudo 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エンジンインストール

command
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

dockerインストール

command
sudo 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を触れるようにする。

command
sudo groupadd docker
sudo gpasswd -a $USER docker
sudo systemctl restart docker
exit

自動起動設定

command
sudo service docker start
sudo systemctl enable docker

SSL証明書

以下のページを参考にしSSL証明書を作成する。

独自のルート認証局キー作成

パスワードを聞かれるので適当に入力する。

command
openssl genpkey -algorithm RSA -aes128 -out private-ca.key -outform PEM -pkeyopt rsa_keygen_bits:2048

ルートCA証明書作成

パスワードはルート認証局キーで設定したもの
Common Nameは「bitwarden_rs」とした。
それ以外はピリオド「.」を設定した。

command
openssl 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」を作成する。

command
openssl genpkey -algorithm RSA -out bitwarden.key -outform PEM -pkeyopt rsa_keygen_bits:2048

証明書要求ファイル作成

Common Name以外はピリオド「.」
Common NameはサーバのIPアドレスを設定する。

command
openssl req -new -key bitwarden.key -out bitwarden.csr

bitwarden.ext作成

command
nano bitwarden.ext

IP.1にサーバのIPアドレスを設定する。

bitwarden.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
IP.1 = <サーバのIPアドレス>

bitwarden証明書に署名

パスワードはルート認証局キーで設定したもの
このコマンドを定期的に実行して証明書を更新する必要がある。

command
openssl 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

証明書のシステムフォルダに移動

command
sudo mv bitwarden.crt bitwarden.key /etc/ssl/certs/

bitwarden起動

docker起動

ポートは8080としている。

command
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=true -p 8080:80 bitwardenrs/server:latest

証明書インポート

WinSCPなどを使用して「self-signed-ca-cert.crt」を取得する。
その後、信頼されたルート証明機関にインポートする。

起動確認

以下のURLで接続する。
証明書が正しくインストールされていれば警告は出ない。

URL
https://<サーバIP>:<ポート>/

アカウント作成後

dockerを停止&削除後、アカウント作成不可にして再起動する。

command
docker 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

参考サイト

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

dockerでbitwarden_rsを構築する

はじめに

とある有名なパスワードマネージャーが有料化し、マルチデバイスができなくなったため移行した。
本家のものではなく、有志によって開発された非公式のbitwarden_rsを利用する。

目的

bitwarden_rsを自サーバに構築する。

サーバ構成

何人で使用するかによるが、1~3人程度なら512MBで十分。
- OS:Ubuntu 20.08
- CPU:1コア
- メモリ:1GB

dockerインストール

詳細は省略。
コマンドのみ記載する。

リポジトリ設定

dockerをインストールするためにリポジトリを設定する。

command
sudo 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エンジンインストール

command
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

dockerインストール

command
sudo 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を触れるようにする。

command
sudo groupadd docker
sudo gpasswd -a $USER docker
sudo systemctl restart docker
exit

自動起動設定

command
sudo service docker start
sudo systemctl enable docker

SSL証明書

以下のページを参考にしSSL証明書を作成する。

独自のルート認証局キー作成

パスワードを聞かれるので適当に入力する。

command
openssl genpkey -algorithm RSA -aes128 -out private-ca.key -outform PEM -pkeyopt rsa_keygen_bits:2048

ルートCA証明書作成

パスワードはルート認証局キーで設定したもの
Common Nameは「bitwarden_rs」とした。
それ以外はピリオド「.」を設定した。

command
openssl 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」を作成する。

command
openssl genpkey -algorithm RSA -out bitwarden.key -outform PEM -pkeyopt rsa_keygen_bits:2048

証明書要求ファイル作成

Common Name以外はピリオド「.」
Common NameはサーバのIPアドレスを設定する。

command
openssl req -new -key bitwarden.key -out bitwarden.csr

bitwarden.ext作成

command
nano bitwarden.ext

IP.1にサーバのIPアドレスを設定する。

bitwarden.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
IP.1 = <サーバのIPアドレス>

bitwarden証明書に署名

パスワードはルート認証局キーで設定したもの
このコマンドを定期的に実行して証明書を更新する必要がある。

command
openssl 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

証明書のシステムフォルダに移動

command
sudo mv bitwarden.crt bitwarden.key /etc/ssl/certs/

bitwarden起動

docker起動

ポートは8080としている。

command
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=true -p 8080:80 bitwardenrs/server:latest

証明書インポート

WinSCPなどを使用して上記「SSL証明書」で作成した「self-signed-ca-cert.crt」をサーバから取得する。
その後、クライアントPC側で信頼されたルート証明機関にインポートする。

起動確認

以下のURLで接続する。
証明書が正しくインストールされていれば証明書関連の警告は出ない。

URL
https://<サーバIP>:<ポート>/

アカウント作成後

dockerを停止&削除後、アカウント作成不可にして再起動する。

command
docker 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の更新&バックアップを記載する。

参考サイト

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

【vue.js】フロントエンド開発にDockerを使う。つらみもあるよ

今までローカルでフロントエンド開発やってたけど、Docker使ってみるか〜。

でもDocker難しくてわからないよ〜〜〜〜〜〜〜!!!!!!

対象読者はvue-cli開発経験のある方です。
最終的なコードはこちら(github)

なぜDockerを使うのか

バックエンドの人たちがDocker信者すぎてフロントエンド開発者の肩身が狭いから

「環境を揃えたいよね」というフワッとした動機から。
実際使ってみて今のところメリットは感じていないですが、vue-cliのバージョンを固定したりするのは追々嬉しいことになるのかも、と思います。未来への投資だと思ってやっていきます。

「Dockerでフロントエンド開発する」とは

どこまでDockerに担わせるか、というところですが、調べた感じだと「実行環境」をDockerで構築するのがベターみたいですね。
image.png
クジラの写真なかった。

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

Dokcerfileを作成

プロジェクトディレクトリに作ります

Dockerfile
FROM 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.yml
version: '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 -d

http://localhost:8080/ にアクセスすると、いつものVueの画面が表示されます。

(任意)ポートを変える

ここまででDockerで実行環境を作るという目標は達成しましたが、
8080ポートは何かと他のプロジェクトでも使ったりするので、明示的にポートを指定してみます。

vue.config.jsの作成

まず、vue-cliをどのポートを使って起動させるか指定します。
プロジェクトディレクトリにvue.config.jsを作成します。

vue.config.js
module.exports = {
  devServer: {
    port: 9000,     # 好きな数字にする
    host: '0.0.0.0',
    disableHostCheck: true,
  },
};

docker-compose.ymlの編集

docker-compose.ymlのportsを、先ほど指定した数字に合わせて修正します。

    ports:
      - 9000:9000

Docker再起動

$ 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と仲良くしていきたいと思います。

参考記事

ローカルを汚さずdockerを使ってvue.jsの開発環境を作る[vuecli4]

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

【Vue.js】フロントエンド開発にDockerを使う。つらみもあるよ

今までローカルでフロントエンド開発やってたけど、Docker使ってみるか〜。

でもDocker難しくてわからないよ〜〜〜〜〜〜〜!!!!!!

対象読者はvue-cli開発経験のある方です。
最終的なコードはこちら(github)

なぜDockerを使うのか

バックエンドの人たちがDocker信者すぎてフロントエンド開発者の肩身が狭いから

「環境を揃えたいよね」というフワッとした動機から。
実際使ってみて今のところメリットは感じていないですが、vue-cliのバージョンを固定したりするのは追々嬉しいことになるのかも、と思います。未来への投資だと思ってやっていきます。

「Dockerでフロントエンド開発する」とは

どこまでDockerに担わせるか、というところですが、調べた感じだと「実行環境」をDockerで構築するのがベターみたいですね。
image.png
クジラの写真なかった。

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

Dokcerfileを作成

プロジェクトディレクトリに作ります

Dockerfile
FROM 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.yml
version: '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 -d

http://localhost:8080/ にアクセスすると、いつものVueの画面が表示されます。

(任意)ポートを変える

ここまででDockerで実行環境を作るという目標は達成しましたが、
8080ポートは何かと他のプロジェクトでも使ったりするので、明示的にポートを指定してみます。

vue.config.jsの作成

まず、vue-cliをどのポートを使って起動させるか指定します。
プロジェクトディレクトリにvue.config.jsを作成します。

vue.config.js
module.exports = {
  devServer: {
    port: 9000,     # 好きな数字にする
    host: '0.0.0.0',
    disableHostCheck: true,
  },
};

docker-compose.ymlの編集

docker-compose.ymlのportsを、先ほど指定した数字に合わせて修正します。

    ports:
      - 9000:9000

Docker再起動

$ 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と仲良くしていきたいと思います。

参考記事

ローカルを汚さずdockerを使ってvue.jsの開発環境を作る[vuecli4]

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

DockerでDjangoのための環境構築をしてみた

理由

Techpitさんの講座の「【Django】Amazon風簡易ECサイトを作ってみよう!」の受講の際に、Djangoを使用することとなったが、その時の環境構築をDockerで行いたいと思ったためです。

実装

Dockerfile
FROM 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.yml
version: '3'

services:
  django:
    build: .
    ports: 
      - '8002:8002'
    volumes:
      - '.:/django-ec'
    tty: true
    stdin_open: true

毎回、docker runの時にオプションをつけるのがめんどくさいので、docker-compose.ymlを作成しました。

requirements.txt
django
Pillow

今回の講座でdjango意外にも画像を扱うPillowも使っていました。

まとめ

Dockerを用いて環境構築をするのは、思っているより簡単なので、今後もたくさんDockerを使って環境構築をしていきたいと思います。

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

docker-composeでcomposer require した時にFatal error: Allowed memory size of 1610612736 bytes exhausted ....が出た対処法

解決策

php -d memory_limit=-1 /usr/bin/composer require ****/****
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

初心者が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 docker

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 dockerd

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 docker

コンテナ作成

下のコマンドを実行して、GPUが認識されていれば成功です。
お疲れ様でした!

$ docker run --gpus all --rm -it kaggle/python-gpu-build /bin/bash

#GPUを認識しているか確認
$ nvidia-smi

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

初心者が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 docker

4. 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 dockerd

5. 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 docker

6. コンテナ作成

下のコマンドを実行して、GPUが認識されていれば成功です。
お疲れ様でした!

$ docker run --gpus all --rm -it kaggle/python-gpu-build /bin/bash

#GPUを認識しているか確認
$ nvidia-smi

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