20200920のdockerに関する記事は16件です。

Docker x Laravel ブラウザ自動リロード(Hot Module Replacement)

css や js ファイルが変更されたら自動的にブラウザリロードしてくれるととても開発が楽になります。
ということで、Laravel-mixでブラウザ自動リロード設定を行います。

対象者

Laravel Blade を書く人向け

前提

当記事は上記の記事の補足になる記事です。

環境

  • PHP: 7.4.6
  • Laravel: 8.5.0
  • Node: 14.2.0
  • yarn: 1.22.4
  • browser-sync: 2.26.12
  • browser-sync-webpack-plugin: 2.2.2
  • vue-template-compiler: 2.6.12

前準備: yarn を使用する場合

{
    // ...
    "scripts": {
        "dev": "npm run development",
        "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
        "watch": "npm run development -- --watch",
        "watch-poll": "npm run watch -- --watch-poll",
        "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --disable-host-check --config=node_modules/laravel-mix/setup/webpack.config.js",
        "prod": "npm run production",
        "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
    },
    // ...
}

npm runyarn に書き換えてください。

{
    // ...
    "scripts": {
        "dev": "yarn development",
        "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
        "watch": "yarn development -- --watch",
        "watch-poll": "yarn watch -- --watch-poll",
        "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --disable-host-check --config=node_modules/laravel-mix/setup/webpack.config.js",
        "prod": "yarn production",
        "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
    },
    // ...
}

webpack.min.js を修正する

webpack.min.js
const mix = require('laravel-mix');

mix.js('resources/js/app.js', 'public/js')
    .browserSync({
        proxy: {
            target: 'http://app:9000',
        },
        files: [
            './resources/**/*',
            './public/**/*',
        ],
        open: false,
        reloadOnRestart: true,
    });
    .postCss('resources/css/app.css', 'public/css', [
        //
    ]);

ビルド

$ make web
$ yarn install

# npm コマンドでインストールしようとするので、手動で追加しておきます。
$ yarn add -D vue-template-compiler browser-sync browser-sync-webpack-plugin

$ yarn hot

http://127.0.0.1

resourcespublic 配下のファイルが変更されたら自動的にブラウザリロードが行われます。
これでもokなんですが、コンテナ内でビルドさせるとめちゃくちゃ遅いです...

ローカルでNodeを使う場合の設定を書きます。

ローカルのNodeを使う場合

webpack.min.js
        proxy: {
            target: 'http://127.0.0.1', // 書き換え(webコンテナを指定している)
        },

Webpackのサーバーを起動します。

$ cd backend
$ yarn hot

http://127.0.0.1:3000

参考

https://browsersync.io/docs/options

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

VSCodeでリモート接続してDockerコンテナ上で作業するときのワークスペース設定箇所

VSCodeからDockerコンテナにリモート接続して作業する際、毎回 /にマウントされてしまっていて困っていた。
.devcontainerディレクトリのdevcontainer.jsonを見たらworkspaceFolderという箇所があった

devcontainer/devcontainer.json
// For format details, see https://aka.ms/vscode-remote/devcontainer.json or this file's README at:
// https://github.com/microsoft/vscode-dev-containers/tree/v0.134.1/containers/docker-existing-docker-compose
// If you want to run as a non-root user in the container, see .devcontainer/docker-compose.yml.
{
    "name": "Existing Docker Compose (Extend)",

    // Update the 'dockerComposeFile' list if you have more compose files or use different names.
    // The .devcontainer/docker-compose.yml file contains any overrides you need/want to make.
    "dockerComposeFile": [
        "../docker-compose.yml",
    ],

    // The 'service' property is the name of the service for the container that VS Code should
    // use. Update this value and .devcontainer/docker-compose.yml to the real service name.
    "service": "go_app",

    // The optional 'workspaceFolder' property is the path VS Code should open by default when
    // connected. This is typically a file mount in .devcontainer/docker-compose.yml
    // ここ
    "workspaceFolder": "/go/src/work",

    // Set *default* container specific settings.json values on container create.
    "settings": {
        "terminal.integrated.shell.linux": null
    },

    // Add the IDs of extensions you want installed when the container is created.
    "extensions": []

    // Use 'forwardPorts' to make a list of ports inside the container available locally.
    // "forwardPorts": [],

    // Uncomment the next line if you want start specific services in your Docker Compose config.
    // "runServices": [],

    // Uncomment the next line if you want to keep your containers running after VS Code shuts down.
    // "shutdownAction": "none",

    // Uncomment the next line to run commands after the container is created - for example installing curl.
    // "postCreateCommand": "apt-get update && apt-get install -y curl",

    // Uncomment to connect as a non-root user if you've added one. See https://aka.ms/vscode-remote/containers/non-root.
    // "remoteUser": "vscode"
}

設定ファイル見るのと英語読むの大事

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

Blazor(C#)をDockerで動かす方法

Blazorとは、

Blazor は、.NET を使って対話型のクライアント側 Web UI を構築するためのフレームワークです。
・JavaScript の代わりに C# を使って、優れた対話型 UI を作成します。
・.NET で記述された、サーバー側とクライアント側のアプリのロジックを共有します。
・モバイル ブラウザーを含めた広範なブラウザーのサポートのために、HTML および CSS として UI をレンダリングします。
・Docker などの最新のホスティング プラットフォームと統合します。
https://docs.microsoft.com/ja-jp/aspnet/core/blazor/?view=aspnetcore-3.1

なるほど、すごいですね。

BlazorをDocker上で動かしてみたのでその手順をまとめたいと思います。

今回はASP.NET Core Blazor のホスティング モデルで構築したいと思います。
ブラウザ側ではWebAssembly ベースの .NET ランタイム(Blazor WebAssembly) が動作してます。

dotnet-3.1.402 docker-19.03.12

まずはプロジェクトを作成します

下記コマンドを実行してください。プロジェクト名はBrazorwasmDotNetCoreHostedWithDockerとしています。

dotnet new blazorwasm --hosted -o BrazorwasmDotNetCoreHostedWithDocker

すると、

キャプチャ.JPG

こんな感じで、サーバ側、クライアント側、共通部分のプロジェクトができるかと思います。

ローカルで動作確認します

cd BrazorwasmDotNetCoreHostedWithDocker
dotnet publish

うまくいっていれば、プロジェクトは以下のServer\bin\Debug\netcoreapp3.1\publishに実行ファイルが出力されているはずです。
その配下にwwwrootがいることを確認してください。そこが公開フォルダとなります。

起動いたします。

cd Server\bin\Debug\netcoreapp3.1\publish
dotnet BrazorwasmDotNetCoreHostedWithDocker.Server.dll

こんな感じでログが出力されます。
キャプチャ.JPG
その中にContent root pathというものがあるかと思いますが、そこがコンテントルートとなり、その下のwwwrootが公開フォルダとなります。

ブラウザ上からhttp://localhost:5000/にアクセスして、下記のようなページが表示されれば成功です。
キャプチャ.JPG

上記と同じことをDocker上でします。

Dockerfile作ります

プロジェクトのトップに下記のようなDockerファイルを作成します。

Dockerfile
# コンパイルします
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env
WORKDIR /app
# 配下のもの全部コピーしてrestoreします
COPY . ./
RUN dotnet restore
# outディレクトリに発行します
RUN dotnet publish -c Release -o out

# 実行用Imageを用意します
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY --from=build-env /app/out .
EXPOSE 80
ENTRYPOINT ["dotnet", "BrazorwasmDotNetCoreHostedWithDocker.Server.dll"]

実行用のイメージに関してですが、
コンテントルートパスはdotnetコマンド実行ディレクトリとなり、/appの直下にwwwrootを持ってくるように設定しております。

Docker buildします

プロジェクト直下まで戻っていただいて、

docker build -t brazorwasmdotnetcorehosted .

こちら実行します。brazorwasmdotnetcorehostedというイメージで作成しています。
docker imagesして、イメージができていれば成功です。
キャプチャ.JPG

Docker runします

docker run -d -p 80:80 brazorwasmdotnetcorehosted:latest --rm

http://localhost/にアクセスすれば、先ほどのページが表示されるはずです。

ちなみにスタンドアローン(静的コンテンツのみ)の場合は

最初のプロジェクトを作るときに、

dotnet new blazorwasm -o BrazorwasmDotNetCoreStandAloneWithDocker

とし、Dockerfileで構築すればいけます。nginxで動かしています。

Dockerfile
# コンパイルします
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env
WORKDIR /app
# 配下のもの全部コピーしてrestoreします
COPY . ./
RUN dotnet restore
# outディレクトリに発行します
RUN dotnet publish -c Release -o out

FROM nginx:alpine
EXPOSE 80
COPY --from=build-env /app/out/wwwroot /usr/share/nginx/html
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DockerでReact Native(TypeScript)+Expoのプロジェクト構築

まえおき

React Native+Expoで構成されたプロジェクトのDockerコンテナをMac OS X上に構築する手順を記載しています。

各端末の情報

  • PC

    • Mac OS Catalina Ver.10.15.6
    • docker version 19.03.12, build 48a66213fe
    • docker-compose version 1.26.2, build eefe0d31
  • iPhone

    • iPhone XR
    • iOS:13.7

ExpoClientで動作検証済みの端末

  • iPhone(iOS:13.7)

前提

  • docker, docker-compose導入済み

手順

1. Expoアカウントを作成します

Expoアカウントの作成方法

2. Expoクライアントアプリのインストールとセットアップをおこないます。

iPhoneでExpoクライアントアプリのインストールとセットアップ方法

3. Docker環境を構築します

ファイル構成

root
└── docker
    └── react_native
        └── dockerfile
└── docker-compose.yml
└── .env

docker/react_native/dockerfile

FROM node:14-alpine

WORKDIR /usr/src/app/

RUN apk update && apk add bash

RUN yarn global add expo-cli

docker-compose.yml

version: "3"
services:
  react_native:
    build: ./docker/react_native
    volumes:
      - ./react_native/:/usr/src/app
    env_file: .env
    command: yarn start
    ports:
      - "19000:19000"
      - "19001:19001"
      - "19002:19002"

.env

Expoを利用する各端末のIPなどを設定する必要があります。

  • ADB_IP
    • 検証端末のIPアドレスを指定してください。カンマ区切りで複数指定可能なようです。
  • REACT_NATIVE_PACKAGER_HOSTNAME
    • Dockerコンテナ可動端末のIPアドレス
ADB_IP=192.168.0.10,192.168.0.11,...
REACT_NATIVE_PACKAGER_HOSTNAME=192.168.0.2

4. Dockerコンテナをビルドします

docker-compose build

5. Dockerコンテナへ接続します

docker-compose run --rm react_native bash --login

6. expoプロジェクトを作成します

expo init .

7. プロジェクトテンプレートを選択するとプロジェクトのセットアップが開始されます

わたしは[blank (TypeScript)]を選択しました。

? Choose a template: (Use arrow keys)
  ----- Managed workflow -----
  blank                 a minimal app as clean as an empty canvas
❯ blank (TypeScript)    same as blank but with TypeScript configuration
  tabs                  several example screens and tabs using react-navigation
  ----- Bare workflow -----
  minimal               bare and minimal, just the essentials to get you started
  minimal (TypeScript)  same as minimal but with TypeScript configuration

8. セットアップが完了したらコンテナから抜けます

9. Dockerコンテナを起動します

docker-compose up

10. 表示されたQRコードを検証端末上で読み取ります

スクリーンショット 2020-09-20 20.16.22.png

11. 検証端末でExpo Clientアプリが起動しREACTの画面が表示されます

スクリーンショット 2020-09-20 21.31.10.png

12. react_native/App.tsxを更新すると・・・

react_native/App.tsxのファイル内に記述された表示テキストの末尾に☺️を追加してファイルを更新します。

スクリーンショット 2020-09-20 20.22.23.png

13. 更新した内容が検証端末へ自動的に反映されます

ホットリロードによって末尾の☺️がiPhone上の検証画面へ自動的に反映されます。

スクリーンショット 2020-09-20 20.24.19.png

参考

DockerでReact Native環境作成から、Expo Clientで実機確認するまで
WSLでReact Native + Expo環境を作ろう
DockerでExpo / React Nativeを実行する

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

プロキシが必要な社内環境にSentry Onpremiseを入れる

外部接続が禁止されてる状態でのSentry onpremiseのインストール手順です。

プロキシを設定してSentry onpremiseのコードを取得します

$ export http_proxy=proxy.example.com:8080
$ export https_proxy=proxy.example.com:8081
$ git clone https://github.com/getsentry/onpremise.git
$ cd onpremise/

とりあえずインストールをお試し、通信失敗

$ ./install.sh
Checking minimum requirements...
中略
W: Failed to fetch http://deb.debian.org/debian/dists/stretch/InRelease  Could not connect to deb.debian.org:80 (151.101.230.133). - connect (111: Connection refused)

cron/Dockerfileでもproxyを使うように修正します

$ sed -i '3iENV http_proxy="http://proxy.example.com:8080"' cron/Dockerfile
$ ./install.sh
中略
You're all done! Run the following command to get Sentry running:
 docker-compose up -d

/etc/hostsの編集権限がない場合、内部urlをlocalhostに修正しておきます。

$ vi sentry/config.yml
system.internal-url-prefix: 'http://web:9000'
→system.internal-url-prefix: 'http://localhost:9000'

立ち上げます

$ docker-compose up -d
Starting sentry_onpremise_memcached_1            ... done
以下略

proxyを外して接続確認します

$ unset http_proxy
$ unset https_proxy
$ wget http://localhost:9000
--2020-09-16 20:37:49--  http://localhost:9000/
中略
Saving to: ‘index.html’

100%[====================================================================================>] 9,692       --.-K/s   in 0s     

2020-09-16 20:37:51 (285 MB/s) - ‘index.html’ saved [9692/9692]

おつかれさまでした。

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

Dockerで【TypeScript+Vue+Express+MySQL】の環境を構築する方法~MySQL編~

内容

前回の記事でアプリ用のコンテナを作成しました。
今回はDocker上でMySQLのコンテナを構築し実際のデータ投入とアクセスをするまでを行っていきます。

前回までの内容

Dockerで【TypeScript+Vue+Express+MySQL】の環境を構築する方法~Vue編~

作業手順

  1. DBコンテナの作成
  2. テストデータの投入
  3. MySQLへのアクセス

1. DBコンテナの作成

前回作成したappコンテナとは別にdbコンテナを作成していきます。
最終的なディレクトリ構成は下記の通りです。

├─ app
├─ db
│   └─ conf
│        └─ my.cnf     // 追加
│   └─ init_db
│        └─ test.sql   // 追加
├─ docker
│   └─ app
│   └─ db
│      └─ Dockerfile   // 追加
├─ .env                // 追加
└─ docker-compose.yml  // 編集

docker-compose.yml

version: "3"
services:
  app:
    container_name: app_container
    build: ./docker/app
    ports:
      - 8080:8080
    volumes:
      - ./app:/app
    stdin_open: true
    tty: true
    environment:
      TZ: Asia/Tokyo
    command: yarn serve
# 前回のアプリケーションコンテナは編集しない
# 下記を追加
  db:
    container_name: db_container
    build: ./docker/db
    image: mysql:5.7
    ports:
      - 3306:3306
    volumes:
      - ./db/conf/my.cnf:/etc/mysql/conf.d/mysql.cnf  # MySQLの設定をバインド
      - ./db/init_db:/docker-entrypoint-initdb.d      # 初期データ投入用のsqlファイルをバインド
      - test_data:/var/lib/mysql                      # 永続化したデータをバインド
    environment:
      - MYSQL_DATABASE=${MYSQL_DATABASE}              # コンテナの環境変数から各種設定を読み込み
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - TZ="Asia/Tokyo"

volumes:
  test_data:                                           # データの永続化

上記でappコンテナとdbコンテナを同時に立ち上げる設定が完了です。
アクセスするデータベース名、ユーザー名、パスワードは[environment]からコンテナの環境変数を参照することで実行します。

/docker/db/Dockerfile

FROM mysql

EXPOSE 3306

CMD ["mysqld"]

ポートは3306に設定しておきます。

db/conf/my.cnf

[mysqld]
character-set-server=utf8

[mysql]
default-character-set=utf8

[client]
default-character-set=utf8

MySQLの文字コードを設定。

.env

MYSQL_DATABASE=test_db  //後述するデータベース名を設定
MYSQL_USER={適当なユーザー名を設定}
MYSQL_PASSWORD={MySQLアクセス時のパスワードを設定}
MYSQL_ROOT_PASSWORD={MySQLアクセス時のパスワードを設定}

こちらで設定したものがコンテナ起動時に参照され、コンテナの環境変数に設定されます。
ログインパスワードは上記で設定したパスワードとなります。

※.envファイルはGitに含まれないように.gitignoreで除外しておきましょう。
間違ってもpushしないように!

2.テストデータの投入

db/init_db/test.sql

DROP DATABASE IF EXISTS test_db;
CREATE DATABASE test_db;

USE test_db;

DROP TABLE IF EXISTS test;

CREATE TABLE test (
  id int NOT NULL AUTO_INCREMENT primary key,
  name varchar(30),
  description varchar(255)
);

INSERT INTO test (id, name, description) VALUES (1, 'test1', 'テストデータ1です。');
INSERT INTO test (id, name, description) VALUES (2, 'test2', 'テストデータ2です。');
INSERT INTO test (id, name, description) VALUES (3, 'test3', 'テストデータ3です。');
INSERT INTO test (id, name, description) VALUES (4, 'test4', 'テストデータ4です。');
INSERT INTO test (id, name, description) VALUES (5, 'test5', 'テストデータ5です。');
INSERT INTO test (id, name, description) VALUES (6, 'test6', 'テストデータ6です。');
INSERT INTO test (id, name, description) VALUES (7, 'test7', 'テストデータ7です。');
INSERT INTO test (id, name, description) VALUES (8, 'test8', 'テストデータ8です。');
INSERT INTO test (id, name, description) VALUES (9, 'test9', 'テストデータ9です。');
INSERT INTO test (id, name, description) VALUES (10, 'test10', 'テストデータ10です。');

確認用のデータとしてtest_db データベース > test テーブル を作成します。
カラムは適当にID, Name, Descriptionなどのデータを挿入。

3. MySQLへアクセス

ここまでで事前準備が完了です。
ここからは実際にアクセスしてデータが取得できるか確認します。

DBコンテナビルド

$ docker-compose build

DBコンテナ起動

$ docker-compose up -d

コンテナ起動確認

$ docker ps

db_container が起動中であればOK!

コンテナへアクセス

$ docker exec -it db_container sh

MySQLへログイン

$ mysql -u root -p -h 127.0.0.1

Enter password: // .envに記載したパスワードを入力

mysql>          // これが出てくればMysqlへのアクセスが完了!

データベース確認

SHOW DATABASES;

用意したデータベース[test_db]が存在すれば成功!

スクリーンショット 2020-09-20 17.21.39.png

使用するデータベースを指定

USE test_db;

テーブルを確認

SHOW TABLES;

作成した[test]テーブルが存在すればOK!
スクリーンショット 2020-09-20 17.22.55.png

testテーブルのデータを確認

SELECT * FROM test;

test テーブルに保存したデータ一覧が表示されれば問題なく完了!

スクリーンショット 2020-09-20 17.24.06.png

ここまで確認がとれれば問題なくMySQLにアクセスできている状態です!
お疲れ様でした!

mysqlから抜ける

mysql> exit
Bye 
# // こうなっていればMySQLからログアウトしてコンテナにアクセスしている状態

コンテナから抜ける

exit

コンテナを停止

docker-compose stop

お疲れ様でした!
ここまででDockerコンテナ上でMySQLを立ち上げて、データを挿入&アクセスができる環境構築が完了です!
アプリコンテナと実際に操作するデータベースができたので、次回はデータの操作を行うAPIサーバーコンテナの作成を行っていきます!

次回

Dockerで【TypeScript+Vue+Express+MySQL】の環境を構築する方法~Express編~

参考

Dockerで【TypeScript+Vue+Express+MySQL】の環境を構築する方法~Vue編~
Dockerで【TypeScript+Vue+Express+MySQL】の環境を構築する方法~Sequelize編~

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

【自分用メモ】Docker Desktop for Windowsのボタン(GUI)操作について

目的

今回はDocker Desktop for Windowsで作ったコンテナのshellにボタン操作で接続し操作する方法になります。
dockerfileに記述したりする以前にDocker Desktop for Windowsの操作感に慣れるのが狙いです。

Dockerのバージョンは以下になります。
WS000767.JPG

Docker Desktop for Windowsの画面を見てみましょう。
WS000730.JPG

黒い帯にgetting-startedのコマンドが表示されただけの状態です。
DドライブにHyper-Vの設定の変更をしているため、若干動きが違うかもしれません。またCドライブでは右側にpowershellの画面が出たはずですが、getting-startedの操作は実施済なので、出てきていないのかもしれません。

「Containers/Apps」画面、「Images」画面の違い

左端を見ると、「Container/Apps」という項目と「Images」という項目があります。「Container/Apps」が選択されている状態なので、「Images」を選択してみます。
WS000731.JPG

今はローカルに何もコンテナがない状態です。

上部にLOCAL という項目と「REMOTE REPOSITORIES」という項目があります。

REMOTE REPOSITORIES側はDocker HubにPushしたものなりますが、何もpushしてないので、こちらにも何も表示されません。
WS000748.JPG

では、左端の「Container/Apps」を選択し、黒い帯にあるgetting-startedのコマンドをコマンドプロンプトで打ってみたいと思います。
WS000736.JPG

cmd.exe
> docker run -d -p 80:80 docker/getting-started
Unable to find image 'docker/getting-started:latest' locally
latest: Pulling from docker/getting-started
cbdbe7a5bc2a: Pull complete
85434292d1cb: Pull complete
75fcb1e58684: Pull complete
2a8fe5451faf: Pull complete
42ceeab04dd4: Pull complete
bdd639f50516: Pull complete
c446f16e1123: Pull complete
Digest: sha256:79d5eae6e7b1dec2e911923e463240984dad111a620d5628a5b95e036438b2df
Status: Downloaded newer image for docker/getting-started:latest
42f186b5894caa251bce39742538520666187ae9e27bb5a01855538c2f992d5c

最初は下記の画面が出るかもしれません。「アクセスを許可する」を押します。
WS000738.JPG

docker pullして、80番ポートでdocker runした状態ですね。

Docker Desktop画面を見てみましょう。
「Containers/Apps」に追加されたコンテナが表示されました。
WS000740.JPG

Constainers/Appsで表示されたコンテナの右側のボタン操作

右側にカーソルを持ってくると、アイコンが並んでいます。
一つ一つアイコンにカーソルを持っていきたいと思います。
WS000741.JPG
「OPEN IN BROWSER」を押すと、今docker runしているこのコンテナのWebページが表示されます。

WS000742.JPG
「CLI」を押すと、今docker runしているこのコンテナのshellに接続ができます。Linuxのコマンドが効く状態です。
開いた画面の上の方を確認すると、どんなコマンドでコンテナに接続しているか確認できます。
WS000750.JPG
WS000750_1.jpg
「STOP」を押すと、このコンテナを停止できます。
WS000743.JPG
「RESTART」を押すと、このコンテナを再起動させます。
WS000744.JPG
「DELETE」を押すと、このコンテナをローカルから削除できます。
WS000745.JPG
「Containers/Apps」側を一通り確認してきました。

Images画面

「Images」側の画面を確認していきたいと思います。
今起動していたコンテナのイメージが表示されます。
WS000753.JPG
「IN USE」という表示は一度でも起動したことがあるコンテナの場合は表示されるようです。

右側に「RUN」というアイコンがあります。これは今表示されているイメージからコンテナを起動させるボタンになります。

(「RUN」の横に別のボタンがありますが、また機会があれば記事にさせて頂ければと思います。)

ボタンを押すと、getting-startedのコンテナがもう一つ作成、起動されます。
「RUN」ボタンを押すと、「New Container」と画面が表示されます。
「Opthonal Settings」をクリックして、各々設定することもできるようです。
WS000754.JPG
WS000755.JPG
WS000756.JPG

docker pull

ではCentOSのコンテナをdocker pullしたいと思います。

cmd.exe
> docker pull centos:latest
latest: Pulling from library/centos
3c72a8ed6814: Pull complete
Digest: sha256:76d24f3ba3317fa945743bb3746fbaf3a0b752f10b10376960de01da70685fbd
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest

docker pull しただけではイメージをローカルに持ってきただけなので、「Containers/Apps」には表示されないようです。
WS000763.JPG
「Images」画面を確認します。
WS000776.JPG
docker pull してきたCentOSのdockerコンテナのイメージが表示されます。
右側にカーソルを持ってきて、「RUN」ボタンを押します。
WS000765.JPG
「New Container」と表示されるので、「RUN」ボタンを押せばコンテナを起動できます。
WS000770.JPG
WS000777.JPG

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

Sapper × Go(echo) × Dockerの開発環境構築

はじめに

フロント:Svelte.js(Sapper),API:Go(echo)でアプリを作ってみたかったので
Dockerを使って構築した。

どこまでやるか

Sapper,echoをローカルホストで接続できるところまで

初期のディレクトリ構造

今回の環境構築にあたり、「Vue.js + Go言語 + Docker」で作る!画像アップロード機能実装ハンズオン
を参考にさせていただきました。

シンプルでわかりやすい。

.
├── docker-compose.yml
└── server

Sapperの開発環境構築

npx degit "sveltejs/sapper-template#rollup" client

cd client
npm install
touch Dockerfile_develop

Dockerfileですが、自分の場合production用のDockerfileも用意したいため、名前をDockerfile_developにしてます。
特に分ける必要がなかったり、マルチステージビルドでおさまりそうであれば一個にしてしていただいて構いません。

Dockerfile

FROM mhart/alpine-node:12

WORKDIR /app
COPY package.json package-lock.json ./

RUN npm ci

ENV HOST=0.0.0.0
EXPOSE 3000

docker-compose.yml

version: '3.8'

services:
  client:
    env_file: .env
    build: 
      context: ./client
      dockerfile: Dockerfile_${DOCKER_ENV} # この行はいらなければ削除
    ports:
      - 3000:3000
    tty: true
    volumes:
      - ./client:/app
    command: npm run dev

※環境変数がある場合

touch .env
vim .env
DOCKER_ENV=develop

この段階でSapperが起動するかみてみましょう

docker-compose up --build

Go(echo)の開発環境構築

cd server
touch Dockerfile
touch main.go

Dockerfile

FROM golang:1.15.2-alpine


WORKDIR /go/src/api
ADD .  /go/src/api
ENV GO111MODULE=off

RUN apk update && apk add curl git

main.go

package main

import (
  "net/http"
  "github.com/labstack/echo"
)

func main() {
  e := echo.New()
  e.GET("/", func(c echo.Context) error {
    return c.String(http.StatusOK, "Hello, World")
  })
  e.Logger.Fatal(e.Start(":8080"))
}

docker-compose.yml

version: '3.8'
...
  server:
    build: ./server
    ports:
      - 8080:8080
    tty: true
    volumes:
      - ./server:/api

echoのローカルサーバーを立ち上げます。

docker-compose up --build
docker-compose exec server /bin/ash
go get github.com/labstack/echo
go run main.go

これでlocalhost:8080にアクセスできれば完了です。

おわりに

次はGorm, MySQLを入れるところまでやりたい

参考資料

「Vue.js + Go言語 + Docker」で作る!画像アップロード機能実装ハンズオン
svelteの開発環境の作り方
Hello World Recipe

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

Docker Composeを用いたHPC学習環境の構築(C, Python, Fortran)

以前からGPUを入手したらHPC(High Performance Computing)の勉強をしたいと思っていました。ただ、環境構築は(色々な意味で)非常に面倒くさい作業です。何とか手軽に学習環境を構築出来ないかと考えていた時に、Docker、Docker Composeを活用した環境構築を思いつきました。本記事ではCUDAやOpenCLを初めとするC言語をベースとしたHPC用ライブラリやPythonでHPCを実現するPyCUDAやPyOpenCLが実行出来るコンテナ環境を構築します。

最終目標

Dockerを用いてコンテナ上にHPC関連ライブラリの開発環境を構築します。また、ポートの開放も設定し、SSHで乗り込める用にします。これはVSCodeのRemote Development Extensionの機能を活用して、SSHでコンテナに乗り込んで開発が出来る環境を実現する為に行います。

導入するライブラリ

導入するライブラリを一覧にまとめます。このうち、OpenCLとPyCUDA、PyOpenCL以外のライブラリはNVIDIA HPC SDKに含まれている物をインストールします。

名称 言語 備考
CUDA C CUDAのデフォルトバージョンCベースの独自拡張
CUDA Fortran1 NVIDIA公式のコンパイラnvfortranがリリース
OpenCL C CUDAと二大巨頭と言われる並列計算ライブラリ
PyCUDA Python PythonからCUDAを実行するためのラッパー
PyOpenCL Python PythonからOpenCLを実行するためのラッパー
OpenMP C マルチコアCPUを手軽に活用出来るライブラリ
OpenACC C GPUを用いた並列計算用ライブラリ

Docker Composeeを用いた環境構築

環境構築に使用するDockerfileとdocker-compose.ymlを以下の様に作成します。Docker Composeは本来複数のコンテナを起動し、コンテナ間でネットワークを構築する環境構築に便利なアプリケーションですが、筆者の場合Makeの様な使い方をしていることが多い様に思います。Dockerfileは一部過去の公式コンテナイメージの中身を参考に作成しました。cuDNN、PyCUDA、OpenCL、PyOpenCLはNVIDIA HPC SDKには含まれていない為、CUDA10.1版の公式コンテナイメージをベースにインストールする方法を採用しています。また、コンテナにSSHでログイン出来る様に、ログインパスワードをビルド時に引数として渡して設定出来る様にしています。

2020/9/21追記: 今回の構築では、最終的クライアント端末からリモートSSHログインを実施して開発環境として使うことを目的に環境構築を行っています。故にクライアント端末からアクセスする運用を実施しない場合はDockerfile末尾のSSHの設定部分(# Setup SSHの部分)の記載は不要です。

Dockerfile
FROM nvidia/cuda:10.1-cudnn7-devel

ARG PASSWD
ENV CUDA_VERSION=10.1

# Upgrade OS
RUN apt update && apt upgrade -y

# Install some ruquirements
RUN apt install -y bash-completion build-essential gfortran vim wget git openssh-server python3-pip

# Install NVIDA HPC SDK
RUN wget https://developer.download.nvidia.com/hpc-sdk/nvhpc-20-7_20.7_amd64.deb \
    https://developer.download.nvidia.com/hpc-sdk/nvhpc-2020_20.7_amd64.deb \
    https://developer.download.nvidia.com/hpc-sdk/nvhpc-20-7-cuda-multi_20.7_amd64.deb
RUN apt install -y ./nvhpc-20-7_20.7_amd64.deb ./nvhpc-2020_20.7_amd64.deb ./nvhpc-20-7-cuda-multi_20.7_amd64.deb

# Install cuDNN
ENV CUDNN_VERSION=7.6.5.32
RUN apt install -y --no-install-recommends libcudnn7=$CUDNN_VERSION-1+cuda$CUDA_VERSION && \
    apt-mark hold libcudnn7 && rm -rf /var/lib/apt/lists/*

# Install OpenCL
RUN apt update && apt install -y --no-install-recommends ocl-icd-opencl-dev && rm -rf /var/lib/apt/lists/*

RUN ln -fs /usr/bin/python3 /usr/bin/python
RUN ln -fs /usr/bin/pip3 /usr/bin/pip
ENV PATH=/usr/local/cuda-$CUDA_VERSION/bin:$PATH
ENV CPATH=/usr/local/cuda-$CUDA_VERSION/include:$CPATH
ENV LIBRARY_PATH=/usr/local/cuda-$CUDA_VERSION/lib64:$LIBRARY_PATH

# Install PyCUDA
RUN pip install pycuda

# Install PyOpenCL
RUN pip install pyopencl 

# Setup SSH
RUN mkdir /var/run/sshd
# Set "root" as root's password
RUN echo 'root:'${PASSWD} | chpasswd
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed -i 's/#PasswordAuthetication/PasswordAuthetication/' /etc/ssh/sshd_config
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
docker-compose.yml
version: "2.4"                                                                                                                                               
services:
    hpc_env:
        build:
            context: .
            dockerfile: Dockerfile
            args:
                - PASSWD=${PASSWD}
        runtime: nvidia
        ports:
            - '12345:22'
        environment:
            - NVIDIA_VISIBLE_DEVICES=all
            - NVIDIA_DRIVER_CAPABILITIES=all
        volumes:
            - ../work:/root/work
        restart: always

イメージのビルド

Dockerfileからコンテナイメージを作成します。パスワードが.bash_historyに残るのは好ましくないので、外部ファイル(auth.txt:ファイル内に設定したいパスワードを記載)から読み込んだ内容を引数渡しする様にします。コマンド操作を記載したシェルファイルを以下に示します。

build_env.sh
#!/bin/bash                                                                                                                                                  

cat auth.txt | xargs -n 1 sh -c 'docker-compose build --build-arg PASSWD=$0'

ビルドの実行

シェルファイルを実行するだけです。途中の過程は省略していますが、Successfully...と最後に出力されれば成功です。途中cuDNNのセットアップでaptがエラー終了してしまうことが有りますが、何度かやり直すとビルド出来ます。(詳細な理由は不明)

$ ./build_env.sh
...
...
Successfully tagged building-hpc-env_hpc_env:latest

コンテナの起動

後はコンテナを起動するだけです。PASSWDの値が設定されていないという警告が出ていますが、ビルド時に用いる一時的な値で有る為、無視しても問題有りません。

$ docker-compose up -d
WARNING: The PASSWD variable is not set. Defaulting to a blank string.
Creating network "building-hpc-env_default" with the default driver
Creating building-hpc-env_hpc_env_1 ... done

コンテナへの接続確認

SSHで接続出来るか確認します。無事パスワードログイン出来ました。

2020/9/21追記: ここではlocalhostで接続確認していますが、
ssh -p 12345 root@<REMOTE_IP_ADDRESS>
でも接続可能です。クライアント上のVSCodeからRemote Development Extensionを用いて接続可能です。

$ ssh -p 12345 root@localhost
root@localhost's password: 
Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 5.4.0-45-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
This system has been minimized by removing packages and content that are
not required on a system that users do not log into.

To restore this content, you can run the 'unminimize' command.

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

root@bd12d0a840e6:~# 

おまけ1: VSCodeとの連携

詳細な構築方法は記載しませんが、VSCodeのRemote Development Extensionという拡張機能を用いると以下の様にVSCodeからHPCのお勉強が出来ます。(図はcufファイルを表示している所)

hpcenv

おまけ2: NVIDIA HPC SDK

NVIDIAが2020年8月にリリースしたHigh Performance Computing向けのライブラリやコンパイラまとめて開発環境として提供している物です。技術サポートは有償ですが、ライブラリやコンパイラを使用するだけなら無料で利用出来ます。従来はCUDA FortranのコンパイラはPGIコンパイラという他社製コンパイラが必要でしたが、NVIDIA製のコンパイラでCでもFortranでもCUDAが利用出来る様になります。含まれているコンパイラの一覧表を以下に示します。選り取り見取りといった所です。

hpcsdk

/opt/nvidia/hpc_sdk/Linux_x86_64/20.7/compilers/binの中は選り取り見取りな様子
# ls
addlocalrc                 jide-common.jar  ncu               nvaccelinfo  nvcudainit  nvprof        pgaccelinfo  pgf77      pgsize               tools
balloontip.jar             jide-dock.jar    nsight-sys        nvc          nvdecode    nvsize        pgc++        pgf90      pgunzip
cuda-gdb                   llvmversionrc    nsys              nvc++        nvextract   nvunzip       pgcc         pgf95      pgzip
cudarc                     localrc          nv-nsight-cu-cli  nvcc         nvfortran   nvzip         pgcpuid      pgfortran  rcfiles
ganymed-ssh2-build251.jar  makelocalrc      nvaccelerror      nvcpuid      nvprepro    pgaccelerror  pgcudainit   pgprepro   rsyntaxtextarea.jar

まとめ

環境構築が煩雑で面倒くさいHPC向けライブラリの開発環境構築をDockerを用いることで簡単かつ手間無く出来る様にしました。HPCの専門書が数冊手元に溜まっているので勉強に活用していこうと思います。

Reference


  1. Fortranを業務で扱っている友人にも使って貰うのでCUDA Fortranに対応させておくことにしました。 

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

ローカルPCのDocker環境からAWS RDSに接続する

概要

  • ローカルPCのDocker環境からRDSに接続する方法のメモ
  • Dockerの開発では、DBのコンテナイメージを作成する場合が多いと思われるが、何かしらの理由でAWSのRDSを直接使用したい場合の方法

前提

  • VPC環境を構築し、PrivateサブネットにEC2インスタンスおよび、Railsアプリケーションが接続する用のRDSを作成済
    • Nat gateway もしくは Endpointにより サービス 「com.amazonaws.us-east-1.ssm 」に接続が可能なこと
  • EC2インスタンスにssm-agentがインストールされている
  • EC2インスタンスへは踏み台サーバ等使用せずにSSMにて接続を行う

ローカルPC環境

  • Docker for mac

参考

SSMの設定

  • ssh config ファイルにSSM接続用の設定を追記する
config
Host EC2サーバのインスタンスID]
    User [ECインスタンス接続ユーザ]
    Port 22
    ServerAliveInterval 300
    IdentityFile ~/.ssh/id_rsa
    ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
  • ssm ssmによるssh接続確認
$ ssh [EC2サーバのインスタンスID]

ポートフォワーディングによるRDSへの接続

  • aws profileの設定
    • ポートフォワーディングによるトンネル作成時に必要
$ aws configure --profile=ssm-test
  • ssh-configに以下を設定
# SSH over Session Manager
host i-* mi-*
   ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p' --profile=ssm-test"
  • トンネルの作成
ssh -i ~/.ssh/id_rsa [ECインスタンス接続ユーザ]@[EC2サーバのインスタンスID] -L 13306:[RDSのエンドポイント]:3306
  • rdsへの接続確認を実行
mysql -u [DB接続ユーザ] -h 127.0.0.1 -P 13306 -p

Rails設定

database.ymlの設定

  • ポート番号にRDSへのポートフォワーディング時に指定しポート番号(13306)を指定する
  • hostに「docker.for.mac.localhost」を指定する
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: [RDS接続ユーザ]
  password: [RDS接続パスワード]
  host: docker.for.mac.localhost
  port: 13306

以上の設定を行うことで、Dockerコンテナで起動するRailsアプリケーションから、RDSへの接続が可能になる。
SSM接続および、ポートフォワーディングに使用に際し、SGおよび、NACLのポート番号(22、13306)の解放等は特に不要。

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

GitLabをdockerで立てる

CICDツールGitLabをdockerで立てるメモ

GitLabについて

https://www.gitlab.jp/

  • GitLab Inc.が開発したgitリポジトリサービス/ツール(GitHub的なもの)
  • SaaS版と、自身でセットアップする「self-managed GitLab」がある
  • ソフトウェアはMITライセンスのOSS
  • 無償のCE(Community Edition)と有償のEE(Enterprise Edition)がある
  • EEはCEより機能が豊富。self-managed GitLabでCEを使う想定でも、EEをインストールしておくのが推奨されている(あとでアップグレードが楽なので)

参考)
・ CEとEE
https://www.gitlab.jp/install/ce-or-ee/

・ SaaS版の機能比較
https://about.gitlab.com/pricing/saas/feature-comparison/

self-managed GitLab セットアップ

  • 公式のインストール方法たたくさんある
    • 各種OSに直接インストール(yum/rpmなど)
    • HELMでKubernetesにインストール
    • dockerでインストール
    • 各クラウドサービス(AWS/GCP/Azule)を利用

 https://about.gitlab.com/install/

クラウドサービス利用は、マネージドGitLabがあるわけではなく、例えばAWSならEC2/RDS/ELB/S3/Elasticache/IAMなどを組み合わせてGitLabをしっかり作りこむ

https://docs.gitlab.com/ee/install/aws/

dockerセットアップ

  • 公式のdockerイメージがdocker Hubで公開されている

  https://hub.docker.com/r/gitlab/gitlab-ee

  • docker / docker-compose / docker swarm それぞれの手順がある

  https://docs.gitlab.com/omnibus/docker/

  • 例えばdockerの場合はこんな感じ
sudo docker run --detach \
  --hostname gitlab.example.com \
  --publish 443:443 --publish 80:80 --publish 22:22 \
  --name gitlab \
  --restart always \
  --volume $GITLAB_HOME/config:/etc/gitlab \
  --volume $GITLAB_HOME/logs:/var/log/gitlab \
  --volume $GITLAB_HOME/data:/var/opt/gitlab \
  gitlab/gitlab-ee:latest

dockerでGitLab起動

  • 公式のイメージでdocker runするだけだが、起動には多少時間がかかり、すぐにアクセスしても下記エラーとなる。

  • 数分待てばログインできるようになる。初回アクセス時は、管理者(root)のパスワード設定から

  • rootパスワードを設定すると、下記ログイン画面に切り替わるので、usernameをroot、パスワードは先ほどのやつでログイン。

  • 下記トップ画面に

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

【自分用メモ】Docker Desktop for WindowsのCPUs設定についての小ネタ

こちらを参考にさせて頂きました。
Docker Desktop WSL 2 バックエンド — Docker-docs-ja 19.03 ...
WindowsでDocker環境を試してみる - Qiita
Docker Desktop for Windows (参考訳) - Qiita

※こちらの記事はDocker Desktop Community 2.3.7.0(Windows)以前の情報になります。

私の環境は以下になります。
Microsoft Windows [Version 10.0.19041.508]
Windows 10 Pro バージョン 2004 64bit
Intel Core i5-3340M 2.70GHz
RAM 16GB
Fujitsu LIFEBOOK P772/G

VScode Version: 1.49.1 (user setup)以前の情報です

※本日確認したところ、VSCodeで「VSCode Remote Development」の拡張機能を有効にした状態で、Docker Desktop for Windowsを起動してもCPU使用率は一桁台で安定していました。

Windows Subsystem for Linux のリリース ノート
上記サイトに「WSL2 VM の既定のメモリ割り当てを、ホスト メモリの 50% または 8 GB のどちらか少ない方になるように調整します」との記載がありますので、それで改善されたのかもしれません。
以前、WSL2を有効した状態でVSCodeの拡張機能のRemote Developmentを有効にしたところ、CPU使用率が100%近くを維持する現象がありました。その際に、WSL2のCPUの割当率を下げようとしたところ、ResoucesタブにCPUsの項目が見当たらないことに気づきました。
そのため、備忘録として残したいと思います。

結論

Generalタブの「Use the WSL 2 based engine」のチェックをつけるかつけないかということみたいです。
WSL2は動的にリソースを割り当てるそうですので、設定を行う必要がないということだと思います。

スクリーンショット

「Use the WSL 2 based engine」チェックをつけた場合

※ResourcesタブのProxiesとNetworkの項目はかわりないようです。
WS000710.JPG
WS000712.JPG
WS000713.JPG
WS000714.JPG

「Use the WSL 2 based engine」チェックをつけなかった場合

※ResourcesタブのAdvancedの中にCPUsの設定項目がありました。
WS000707.JPG
WS000708.JPG
WS000709.JPG
WS000726.JPG
WS000727.JPG

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

dockerによるkerasとtensorflow, jupyter labの環境構築およびport forwardingでのjupyterへの接続

概要

dockerによってkerasのgpuおよびjupyterlab環境構築をする。
dockerがどういうものか、dockerのインストール等は省略する。
またついでにport forwardingについて軽く解説する。

イメージのpull

tensorflowのdockerhubにてタグがlatest gpuのimageをpullする。
タグがlatestのみだとcudaが使えない。
やることは以下の通り

$ sudo docker pull tensorflow/tensorflow:latest-gpu

イメージの確認

$ sudo docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
tensorflow/tensorflow             latest-gpu          20fd065e3887        7 weeks ago         3.15GB

必要そうなモジュールとjupyterをインストール

インストールするモジュール

今回importするのは

  • matplotlib
  • cv2 (opencv-python)
  • keras
  • jupyter lab

インポートする前にdockerのコンテナをイメージから作成しておく。環境構築の際はrootで入る。

$ sudo docker run -it tensorflow/tensorflow:latest-gpu

pipとaptのアップデート

# pip install --upgrade pip
# apt-get update -y

opencvのインストールのための準備

以下を参照した
DockerでpythonのTensorFlowとOpenCVの実行環境を構築する

# apt-get install -y libopencv-dev

結構時間がかかる。

必要モジュールのインストール

# pip install matplotlib opencv-python keras
# pip install jupyterlab

モジュールがimportできるかテスト

# python
Python 3.6.9 (default, Jul 17 2020, 12:50:27)
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import matplotlib
>>> import numpy
>>> import cv2
>>> import keras
2020-09-20 01:02:34.313977: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcudart.so.10.1
>>> import tensorflow

大丈夫そうだ。
Ctrl + dで対話モードを抜けられる。
jupyterlabもこれにてインストールできているのだが、実行するためにはport forwardingをしないといけない。詳しい実行手順を確かめたかったら最後までこの記事を読んでほしい。

イメージのコミット

jupyter lab のテストの前に一旦コンテナをイメージにcommitする。つまり色々インストールした現在の状況をセーブする。
Ctrl+p,Ctrl+qでコンテナを稼働させたままコンテナから抜ける。

現在稼働中のコンテナの確認

$ sudo docker ps -n=-1
CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS              PORTS                  NAMES
a24503258ede        tensorflow/tensorflow:latest-gpu   "/bin/bash"              24 minutes ago      Up 24 minutes                              romantic_gauss

コンテナのコミット

$ sudo docker commit a24503258ede keras-jupyter

sudo docker commit (コンテナID) (つけたいイメージの名前) のようにする。以降今まで作ったものはkeras-jupyterという名前のイメージをビルドすれば先程のコンテナが出来上がる。

コンテナの停止

先程のコンテナを一旦止める。

$ sudo docker stop a245
$ sudo docker ps -n=-1
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES

コンテナIDは最初4文字くらいで反応してくれる。

port forwardingについて

これからjupyterlabの動作確認を行うのだが、ついでにport forwardingについて軽く説明する。

port forwarding(ポートフォワーディング)とは

現在私は以下の図のように私自身のパソコンからサーバにssh接続し、その上でdockerを走らせて、更にその上でjupyterlabを起動させようとしている。
しかしjupyterlabはブラウザ上で扱うもののためssh接続とは別にもう一つjupyterlabまでの接続経路を作成しないといけない。

スクリーンショット 2020-09-20 2.12.33.png

そのためブラウザ上でもjupyterに接続できるようssh以外の接続経路(トンネル)を作成することをport forwardingという。
以下の図のように各コマンドにオプションを加えることでsshのポート22番の他にトンネルを開けることができる。
スクリーンショット 2020-09-20 2.35.37.png
スクリーンショット 2020-09-20 2.35.49.png

ただ今回は解説のためにすべてポート番号を変えているが、間違えないようすべてのポートフォワードするポートは8888などに統一すると良いだろう。
それでは具体的にjupyterlabのテストを通してポートフォアディングができているか確認していこう。

jupyterlabへのport forwarding

sshでのport forward

まずローカルからsshでサーバに接続する。

$ ssh user@x.x.x.x -L 8800:x.x.x.x:8880

-L {ローカルのポート番号}:{サーバのip}:{サーバでつなぎたいポート番号} のようにオプションを付ける。

dockerでのport forward

-p 8880:8888をオプションに追加する。
これによりサーバからdockerにアクセスした際にサーバのポート8880番がdockerの8888番につながる。

$ sudo docker run -it -p 8880:8888 keras-jupyter

これによりローカルの8800番はdockerの8888番につながった。

jupyterlabの起動

次にコンテナ上でjupyterlabを以下のコマンドで起動する。

# jupyter lab --port 8888 --ip=* --allow-root

以下コマンドの解説

  • まずdockerのport8888番がローカルとつながっているためjupyterのportを8888とする。(--port 8888)
  • jupyterをそのまま起動するとipがわからず接続できないためdocker環境とアドホックにつなぐ。(--ip=*)
  • 最後に現在dockerはrootで起動してるためルートでの接続を許可する。(--allow-root)

以下のような出力のhttp://127.0.0.1:8888/?token=614f6e5d410a1c459baa691ee28fdd0e2593c4644189a09e`をコピー。

[W 02:52:43.023 LabApp] WARNING: The notebook server is listening on all IP addresses and not using encryption. This is not recommended.
[I 02:52:43.028 LabApp] JupyterLab extension loaded from /usr/local/lib/python3.6/dist-packages/jupyterlab
[I 02:52:43.028 LabApp] JupyterLab application directory is /usr/local/share/jupyter/lab
[I 02:52:43.030 LabApp] Serving notebooks from local directory: /
[I 02:52:43.030 LabApp] Jupyter Notebook 6.1.4 is running at:
[I 02:52:43.030 LabApp] http://0829a84d25eb:8888/?token=614f6e5d410a1c459baa691ee28fdd0e2593c4644189a09e
[I 02:52:43.030 LabApp]  or http://127.0.0.1:8888/?token=614f6e5d410a1c459baa691ee28fdd0e2593c4644189a09e
[I 02:52:43.030 LabApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).

jupyterへの接続

先程のurlの一部を以下のように変更し、ローカルのブラウザに貼り付ける。

http://localhost:8800/?token=614f6e5d410a1c459baa691ee28fdd0e2593c4644189a09e

これでサーバで実行中のjupyterにポートフォアディングによって接続できる。

余談

実際dockerを実行する際にはユーザーをdockerとserverでバインドするなどここでは詳しく解説しないが以下のようにdocker run コマンドをaliasに登録して使うとよいだろう。

alias docker-run-keras = 'sudo docker run -v /etc/group:/etc/group:ro -v /etc/passwd:/etc/passwd:ro -v $HOME:$HOME -u $(id -u $USER):$(id -g $USER) -it --gpus 2 -p 8888:8888 --shm-size 30g keras-jupyter
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

超初心者がDockerでRails6 + Postgresql 環境構築を最後まで

構築開始にいたるまで

Dockerに触れておきたかったので、上記環境を構築することに。
前知識がまったくないのでトライアンドエラーを繰り返しました...
しかしなんとか構築できたので、メモを残します。
いまいちよくわかってない箇所は注釈や説明に?を付けました

必要なフォルダ、ファイル

任意の名前のフォルダーを用意、ここではmy_appとします。

$ mkdir my_app

my_app内に以下のファイルを用意

$ touch xxx(必要なファイル名)

- my_app
    - .dockerignore
    - Dockerfile
    - docker-compose.yml
    - Gemfile
    - Gemfile.lock
    - entrypoint.sh

それぞれのファイルは以下のような中身に編集していきます。

.dockerignore

ローカルモジュールとデバッグログがDockerイメージにコピーされるのを防ぎます。
Mac環境とDocker上のLinux環境とでは必要なモジュールが違うから...なのかな?
とにかく、これがないと Node.js 12.xの関係でエラーがでます。

.dockerignore
node_modules
npm-debug.log

.Dockerfile

Postgresqlと、rails6のWebpackerに必要なyarnとNode.jsをインストールをします。
羅列されている各コマンドについてはざっくりでしか理解できてません(焦)
勉強の必要がありそうです...

Dockerfile
FROM ruby:2.7.1

# 必要なライブラリインストール
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client

# yarnパッケージ管理ツールをインストール
RUN apt-get update && apt-get install -y curl apt-transport-https wget && \
  curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
  echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
  apt-get update && apt-get install -y yarn

# Node.jsをインストール
RUN curl -SL https://deb.nodesource.com/setup_12.x | bash
RUN apt-get install -y nodejs

# コンテナ内の作業フォルダ構築
RUN mkdir /my_app
WORKDIR /my_app
COPY Gemfile /my_app/Gemfile
COPY Gemfile.lock /my_app/Gemfile.lock
RUN bundle install
COPY . /my_app

#entrypoint.shと接続の設定
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

CMD ["rails", "server", "-b", "0.0.0.0"]

docker-compose.yml

ここではPostgresqlで使うユーザー名とパスワードをpostgresとします。
サービスにwebdbがありますね。

docker-compose.yml
version: '3'
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/my_app
    ports:
      - "3000:3000"
    depends_on:
      - db

Gemfile

Gemfile
source 'https://rubygems.org'
gem 'rails', '~> 6'

Gemfile.lock

ファイル生成のみで、中身を編集する必要はありません。

entrypoint.sh

entrypoint.sh
#!/bin/bash
set -e

# 前回のrailsサーバー起動時から残ったserver.pidを消す処理?
rm -f /my_app/tmp/pids/server.pid

# コンテナのメインプロセスを実行(Dockerfile内のCMDで指定したコマンド)
exec "$@"

Railsアプリの作成

runでweb単体?がbuildされ、webコンテナ内でrails newを実行

$ docker-compose run web rails new . --force --no-deps --database=postgresql --skip-bundle

--no-deps:リンクしたサービスを起動しない(webにリンクしたdbを今は起動しない?)
--skip-bundle:bundleを実行しない

bundle install

さきほどのrails newで、Gemfileが書き換えられています。
イメージをbuildすることによって、bundle installも行われるため、以下のコマンドを実行します。

$ docker-compose build

データベース設定

作業用フォルダには見慣れたrailsのファイル一式がすでにあると思うので、
config/database.ymlを以下のように編集します。

config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  #docker-compose.yml内で書いたPostgresqlのユーザー名、パスワードと一致させること
  username: postgres
  password: postgres
  pool: 5

development:
  <<: *default
  database: my_app_development

test:
  <<: *default
  database: my_app_test

webpackerのインストールと設定

webpackerのインストール

webコンテナ内でbundle exec rails webpacker:installを実行。

$ docker-compose run web bundle exec rails webpacker:install

webpackerの設定

自分の場合、この設定を行わないとサーバー起動時にエラーが起ってしまいます。
rails webpacker:installによって生成されたconfig/webpacker.ymlを以下のように編集します。

config/webpacker.yml
development:
  dev_server:
    host: webpacker
    hmr: true

またconfig/environments/development.rbに以下のコードを加えます。
でもひょっとしたらこの工程だけは必要ないかもしれません。

config/environments/development.rb
config.webpacker.check_yarn_integrity = false

コンテナ起動

$ docker-compose up

この時点でhttp://localhost:3000/にアクセスできますが、
DBがまだ作成されてないので、エラー画面が表示されます。
実に初歩的ですが長い道のりだっただけに、自分はかなり焦りました(笑)

DB作成

$ docker-compose run web rails db:create

構築完了

http://localhost:3000/に「Yay! You're on Rails!」があれば成功です!
もし不要なdockerイメージやコンテナが生成されていれば各自で削除してくださいね。

初めての投稿記事につき、至らない点がたくさんあると思います。
そんな記事に最後までお付き合いいただき、ありがとうございました。
記事に間違いがありましたら、ご指摘ください。

参考

Docker + Rails6 + PostgreSQL 環境構築
docker-compose upの直後Yarnのエラーでコンテナが落ちる問題と解決
Node.js Web アプリケーションを Docker 化する
既存のrails6アプリをDocker,webpackerの組み合わせで使いたい
docker-compose 'up' とか 'build' とか 'start' とかの違いを理解できていなかったのでまとめてみた

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

さよならFirefox Send(泣)でも大丈夫、自前で構築できます!!

とても便利なFirefox Sendですが、残念ながらサービスの停止が発表されました。

Mozilla、「Firefox Send」の再開を断念 ~無償のファイル送信サービス - 窓の杜
Update on Firefox Send and Firefox Notes - The Mozilla Blog

停止の発表とともにすでにサービス停止済みで https://send.firefox.com/ にアクセスしてもmozillaのトップページに転送されます。

Firefox SendのソースコードはGitHubでオープンソースで公開されていますので、そちらを起動してみましょう。

Docker Composeを使いますが、

We don't recommend using docker-compose for production.

だそうですのでお気をつけください。

環境

丁度いいタイミングでAWSからt4g.microインスタンスの年内無料トライアルが発表されたため、こちらを使用してみます。

新しい EC2 T4g インスタンス – AWS Graviton2 によるバースト可能なパフォーマンス – 無料で利用可能 | Amazon Web Services ブログ

構築

Docker

sudo amazon-linux-extras install -y docker

sudoなしでdockerコマンドが使えるようになるおまじない

sudo groupadd docker
sudo usermod -aG docker $USER

Dockerサービス起動

sudo systemctl enable docker
sudo systemctl start docker

Docker Compose

ちょっと面倒ですが

sudo yum install -y python3 python3-devel libffi-devel openssl-devel gcc make
sudo pip3 install docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/

Git

sudo yum install -y git

環境構築は以上です。

アプリケーションデプロイ

ソースの取得

git clone https://github.com/mozilla/send.git

ちなみに2020/09/20時点で、リポジトリはすでにArchived状態になっています。

docker-compose.ymlの修正

2点、変更します。

  • selenium-firefoxの削除
docker-compose.yml
-  selenium-firefox:
-    image: b4handjr/selenium-firefox
-    ports:
-      - "${VNC_PORT:-5900}:5900"
-    shm_size: 2g
-    volumes:
-      - .:/code
  • Firefox Account不要化

このままdocker-composeすると起動はするのですが、ファイルのアップロードが失敗します。結構ハマったのですが、Issueを参考に、Firefox Accountを不要化することで解消します。

docker-compose.yml
     environment:
       - REDIS_HOST=redis
+      - FXA_REQUIRED=false

修正後はこんな感じ

docker-compose.yml
version: "3"
services:
  web:
    build: .
    links:
      - redis
    ports:
      - "1443:1443"
    environment:
      - REDIS_HOST=redis
      - FXA_REQUIRED=false
  redis:
    image: redis:alpine

docker-compose up

Docker Imageのビルドが始まり、しばらくすると起動します。

docker-compose up -d

http://[EC2のパブリックIP]:1443でFirefox Sendが無事起動します。

image.png

ファイルを登録して

image.png

アップロード!!!

image.png

発行されたリンクをクリックしてダウンロードできます。

image.png

自分用にはこれでなんとかなりそうです。

いいサービスだったのに、残念ですねぇ。。

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

さようならFirefox Send。あなたは私のT4gインスタンスの中で永遠に生き続けます!!

とても便利なFirefox Sendですが、残念ながらサービスの停止が発表されました。

Mozilla、「Firefox Send」の再開を断念 ~無償のファイル送信サービス - 窓の杜
Update on Firefox Send and Firefox Notes - The Mozilla Blog

停止の発表とともにすでにサービス停止済みで https://send.firefox.com/ にアクセスしてもmozillaのトップページに転送されます。

Firefox SendのソースコードはGitHubでオープンソースで公開されていますので、そちらを起動してみましょう。

Docker Composeを使いますが、

We don't recommend using docker-compose for production.

だそうですのでお気をつけください。


よろしければ、ご自由にどうぞ。
https://send.moritalous.tk/


独自ドメイン化とSSLについて以下で続きを書きました。
意外と簡単!EC2上のWebアプリを独自ドメイン化&SSL化

環境

丁度いいタイミングでAWSからt4g.microインスタンスの年内無料トライアルが発表されたため、こちらを使用してみます。

新しい EC2 T4g インスタンス – AWS Graviton2 によるバースト可能なパフォーマンス – 無料で利用可能 | Amazon Web Services ブログ

構築

Docker

sudo amazon-linux-extras install -y docker

sudoなしでdockerコマンドが使えるようになるおまじない

sudo groupadd docker
sudo usermod -aG docker $USER

Dockerサービス起動

sudo systemctl enable docker
sudo systemctl start docker

Docker Compose

ちょっと面倒ですが

sudo yum install -y python3 python3-devel libffi-devel openssl-devel gcc make
sudo pip3 install docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/

Git

sudo yum install -y git

環境構築は以上です。

アプリケーションデプロイ

ソースの取得

git clone https://github.com/mozilla/send.git

ちなみに2020/09/20時点で、リポジトリはすでにArchived状態になっています。

docker-compose.ymlの修正

2点、変更します。

  • selenium-firefoxの削除
docker-compose.yml
-  selenium-firefox:
-    image: b4handjr/selenium-firefox
-    ports:
-      - "${VNC_PORT:-5900}:5900"
-    shm_size: 2g
-    volumes:
-      - .:/code
  • Firefox Account不要化

このままdocker-composeすると起動はするのですが、ファイルのアップロードが失敗します。結構ハマったのですが、Issueを参考に、Firefox Accountを不要化することで解消します。

docker-compose.yml
     environment:
       - REDIS_HOST=redis
+      - FXA_REQUIRED=false

修正後はこんな感じ

docker-compose.yml
version: "3"
services:
  web:
    build: .
    links:
      - redis
    ports:
      - "1443:1443"
    environment:
      - REDIS_HOST=redis
      - FXA_REQUIRED=false
  redis:
    image: redis:alpine

docker-compose up

Docker Imageのビルドが始まり、しばらくすると起動します。

docker-compose up -d

http://[EC2のパブリックIP]:1443でFirefox Sendが無事起動します。

image.png

ファイルを登録して

image.png

アップロード!!!

image.png

発行されたリンクをクリックしてダウンロードできます。

image.png

自分用にはこれでなんとかなりそうです。

いいサービスだったのに、残念ですねぇ。。

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