- 投稿日:2020-09-20T22:36:27+09:00
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 run
をyarn
に書き換えてください。{ // ... "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.jsconst 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
resources
やpublic
配下のファイルが変更されたら自動的にブラウザリロードが行われます。
これでもokなんですが、コンテナ内でビルドさせるとめちゃくちゃ遅いです...ローカルでNodeを使う場合の設定を書きます。
ローカルのNodeを使う場合
webpack.min.jsproxy: { target: 'http://127.0.0.1', // 書き換え(webコンテナを指定している) },Webpackのサーバーを起動します。
$ cd backend $ yarn hot参考
- 投稿日:2020-09-20T22:32:20+09:00
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" }設定ファイル見るのと英語読むの大事
- 投稿日:2020-09-20T22:26:06+09:00
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
) が動作してます。まずはプロジェクトを作成します
下記コマンドを実行してください。プロジェクト名は
BrazorwasmDotNetCoreHostedWithDocker
としています。dotnet new blazorwasm --hosted -o BrazorwasmDotNetCoreHostedWithDockerすると、
こんな感じで、サーバ側、クライアント側、共通部分のプロジェクトができるかと思います。
ローカルで動作確認します
cd BrazorwasmDotNetCoreHostedWithDocker dotnet publishうまくいっていれば、プロジェクトは以下の
Server\bin\Debug\netcoreapp3.1\publish
に実行ファイルが出力されているはずです。
その配下にwwwroot
がいることを確認してください。そこが公開フォルダとなります。起動いたします。
cd Server\bin\Debug\netcoreapp3.1\publish dotnet BrazorwasmDotNetCoreHostedWithDocker.Server.dllこんな感じでログが出力されます。
その中にContent root pathというものがあるかと思いますが、そこがコンテントルートとなり、その下のwwwrootが公開フォルダとなります。ブラウザ上から
http://localhost:5000/
にアクセスして、下記のようなページが表示されれば成功です。
上記と同じことを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
して、イメージができていれば成功です。
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
- 投稿日:2020-09-20T21:30:13+09:00
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アカウントを作成します
2. Expoクライアントアプリのインストールとセットアップをおこないます。
iPhoneでExpoクライアントアプリのインストールとセットアップ方法
3. Docker環境を構築します
ファイル構成
root └── docker └── react_native └── dockerfile └── docker-compose.yml └── .envdocker/react_native/dockerfile
FROM node:14-alpine WORKDIR /usr/src/app/ RUN apk update && apk add bash RUN yarn global add expo-clidocker-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.24. Dockerコンテナをビルドします
docker-compose build5. Dockerコンテナへ接続します
docker-compose run --rm react_native bash --login6. 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 configuration8. セットアップが完了したらコンテナから抜けます
9. Dockerコンテナを起動します
docker-compose up10. 表示されたQRコードを検証端末上で読み取ります
11. 検証端末でExpo Clientアプリが起動しREACTの画面が表示されます
12. react_native/App.tsxを更新すると・・・
react_native/App.tsxのファイル内に記述された表示テキストの末尾に☺️を追加してファイルを更新します。
13. 更新した内容が検証端末へ自動的に反映されます
ホットリロードによって末尾の☺️がiPhone上の検証画面へ自動的に反映されます。
参考
DockerでReact Native環境作成から、Expo Clientで実機確認するまで
WSLでReact Native + Expo環境を作ろう
DockerでExpo / React Nativeを実行する
- 投稿日:2020-09-20T18:28:40+09:00
プロキシが必要な社内環境に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]おつかれさまでした。
- 投稿日:2020-09-20T18:01:15+09:00
Dockerで【TypeScript+Vue+Express+MySQL】の環境を構築する方法~MySQL編~
内容
前回の記事でアプリ用のコンテナを作成しました。
今回はDocker上でMySQLのコンテナを構築し実際のデータ投入とアクセスをするまでを行っていきます。前回までの内容
Dockerで【TypeScript+Vue+Express+MySQL】の環境を構築する方法~Vue編~
作業手順
- DBコンテナの作成
- テストデータの投入
- 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=utf8MySQLの文字コードを設定。
.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 buildDBコンテナ起動
$ docker-compose up -dコンテナ起動確認
$ docker psdb_container が起動中であればOK!
コンテナへアクセス
$ docker exec -it db_container shMySQLへログイン
$ mysql -u root -p -h 127.0.0.1 Enter password: // .envに記載したパスワードを入力 mysql> // これが出てくればMysqlへのアクセスが完了!データベース確認
SHOW DATABASES;用意したデータベース[test_db]が存在すれば成功!
使用するデータベースを指定
USE test_db;テーブルを確認
SHOW TABLES;testテーブルのデータを確認
SELECT * FROM test;test テーブルに保存したデータ一覧が表示されれば問題なく完了!
ここまで確認がとれれば問題なく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編~
- 投稿日:2020-09-20T17:38:32+09:00
【自分用メモ】Docker Desktop for Windowsのボタン(GUI)操作について
目的
今回はDocker Desktop for Windowsで作ったコンテナのshellにボタン操作で接続し操作する方法になります。
dockerfileに記述したりする以前にDocker Desktop for Windowsの操作感に慣れるのが狙いです。Docker Desktop for Windowsの画面を見てみましょう。
黒い帯にgetting-startedのコマンドが表示されただけの状態です。
DドライブにHyper-Vの設定の変更をしているため、若干動きが違うかもしれません。またCドライブでは右側にpowershellの画面が出たはずですが、getting-startedの操作は実施済なので、出てきていないのかもしれません。「Containers/Apps」画面、「Images」画面の違い
左端を見ると、「Container/Apps」という項目と「Images」という項目があります。「Container/Apps」が選択されている状態なので、「Images」を選択してみます。
今はローカルに何もコンテナがない状態です。
上部にLOCAL という項目と「REMOTE REPOSITORIES」という項目があります。
REMOTE REPOSITORIES側はDocker HubにPushしたものなりますが、何もpushしてないので、こちらにも何も表示されません。
では、左端の「Container/Apps」を選択し、黒い帯にあるgetting-startedのコマンドをコマンドプロンプトで打ってみたいと思います。
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最初は下記の画面が出るかもしれません。「アクセスを許可する」を押します。
docker pullして、80番ポートでdocker runした状態ですね。
Docker Desktop画面を見てみましょう。
「Containers/Apps」に追加されたコンテナが表示されました。
Constainers/Appsで表示されたコンテナの右側のボタン操作
右側にカーソルを持ってくると、アイコンが並んでいます。
一つ一つアイコンにカーソルを持っていきたいと思います。
「OPEN IN BROWSER」を押すと、今docker runしているこのコンテナのWebページが表示されます。
「CLI」を押すと、今docker runしているこのコンテナのshellに接続ができます。Linuxのコマンドが効く状態です。
開いた画面の上の方を確認すると、どんなコマンドでコンテナに接続しているか確認できます。
「STOP」を押すと、このコンテナを停止できます。
「RESTART」を押すと、このコンテナを再起動させます。
「DELETE」を押すと、このコンテナをローカルから削除できます。
「Containers/Apps」側を一通り確認してきました。Images画面
「Images」側の画面を確認していきたいと思います。
今起動していたコンテナのイメージが表示されます。
「IN USE」という表示は一度でも起動したことがあるコンテナの場合は表示されるようです。右側に「RUN」というアイコンがあります。これは今表示されているイメージからコンテナを起動させるボタンになります。
(「RUN」の横に別のボタンがありますが、また機会があれば記事にさせて頂ければと思います。)
ボタンを押すと、getting-startedのコンテナがもう一つ作成、起動されます。
「RUN」ボタンを押すと、「New Container」と画面が表示されます。
「Opthonal Settings」をクリックして、各々設定することもできるようです。
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:latestdocker pull しただけではイメージをローカルに持ってきただけなので、「Containers/Apps」には表示されないようです。
「Images」画面を確認します。
docker pull してきたCentOSのdockerコンテナのイメージが表示されます。
右側にカーソルを持ってきて、「RUN」ボタンを押します。
「New Container」と表示されるので、「RUN」ボタンを押せばコンテナを起動できます。
- 投稿日:2020-09-20T15:18:25+09:00
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_developDockerfileですが、自分の場合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 3000docker-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 .envDOCKER_ENV=developこの段階でSapperが起動するかみてみましょう
docker-compose up --build
Go(echo)の開発環境構築
cd server touch Dockerfile touch main.goDockerfile
FROM golang:1.15.2-alpine WORKDIR /go/src/api ADD . /go/src/api ENV GO111MODULE=off RUN apk update && apk add curl gitmain.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:/apiechoのローカルサーバーを立ち上げます。
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
- 投稿日:2020-09-20T13:46:15+09:00
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の部分)の記載は不要です。
DockerfileFROM 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.ymlversion: "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ファイルを表示している所)
おまけ2: NVIDIA HPC SDK
NVIDIAが2020年8月にリリースしたHigh Performance Computing向けのライブラリやコンパイラまとめて開発環境として提供している物です。技術サポートは有償ですが、ライブラリやコンパイラを使用するだけなら無料で利用出来ます。従来はCUDA FortranのコンパイラはPGIコンパイラという他社製コンパイラが必要でしたが、NVIDIA製のコンパイラでCでもFortranでもCUDAが利用出来る様になります。含まれているコンパイラの一覧表を以下に示します。選り取り見取りといった所です。
/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
- CUDA10.2 Dockerfile
- cuDNN Dockerfile
- OpenCL Dockerfile
- Installing PyCUDA on Ubuntu Linux
- Dockerのコンテナを起動したままにする
- NVIDIA HPC SDK
- NVIDIA HPC SDK Version 20.7 Downloads
- NVIDIA HPC SDK の HPC Compilers について
- SSHでログイン出来るコンテナの作り方(Ubuntu18対応版)
Fortranを業務で扱っている友人にも使って貰うのでCUDA Fortranに対応させておくことにしました。 ↩
- 投稿日:2020-09-20T12:54:58+09:00
ローカル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
参考
- https://dev.classmethod.jp/articles/session-manager-launches-tunneling-support-for-ssh-and-scp/#toc-10
- https://blog.serverworks.co.jp/tech/2019/09/11/ssm-portfowarding/
- https://qiita.com/lighttiger2505/items/ea33291639a8656d50b4
- https://dev.classmethod.jp/articles/ssm-session-manager-private/
SSMの設定
- ssh config ファイルにSSM接続用の設定を追記する
configHost 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 -pRails設定
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)の解放等は特に不要。
- 投稿日:2020-09-20T10:29:19+09:00
GitLabをdockerで立てる
CICDツールGitLabをdockerで立てるメモ
GitLabについて
- 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:latestdockerでGitLab起動
- 公式のイメージでdocker runするだけだが、起動には多少時間がかかり、すぐにアクセスしても下記エラーとなる。
- 数分待てばログインできるようになる。初回アクセス時は、管理者(root)のパスワード設定から
- rootパスワードを設定すると、下記ログイン画面に切り替わるので、usernameをroot、パスワードは先ほどのやつでログイン。
- 下記トップ画面に
- 投稿日:2020-09-20T10:02:12+09:00
【自分用メモ】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/GVScode 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の項目はかわりないようです。
「Use the WSL 2 based engine」チェックをつけなかった場合
- 投稿日:2020-09-20T03:04:07+09:00
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-gpupipとaptのアップデート
# pip install --upgrade pip # apt-get update -yopencvのインストールのための準備
以下を参照した
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までの接続経路を作成しないといけない。そのためブラウザ上でもjupyterに接続できるようssh以外の接続経路(トンネル)を作成することをport forwardingという。
以下の図のように各コマンドにオプションを加えることでsshのポート22番の他にトンネルを開けることができる。
ただ今回は解説のためにすべてポート番号を変えているが、間違えないようすべてのポートフォワードするポートは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
- 投稿日:2020-09-20T01:34:31+09:00
超初心者が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の関係でエラーがでます。.dockerignorenode_modules npm-debug.log.Dockerfile
Postgresqlと、rails6のWebpackerに必要なyarnとNode.jsをインストールをします。
羅列されている各コマンドについてはざっくりでしか理解できてません(焦)
勉強の必要がありそうです...DockerfileFROM 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
とします。
サービスにweb
とdb
がありますね。docker-compose.ymlversion: '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: - dbGemfile
Gemfilesource '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.ymldefault: &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_testwebpackerのインストールと設定
webpackerのインストール
webコンテナ内で
bundle exec rails webpacker:install
を実行。$ docker-compose run web bundle exec rails webpacker:installwebpackerの設定
自分の場合、この設定を行わないとサーバー起動時にエラーが起ってしまいます。
rails webpacker:install
によって生成されたconfig/webpacker.yml
を以下のように編集します。config/webpacker.ymldevelopment: dev_server: host: webpacker hmr: trueまた
config/environments/development.rb
に以下のコードを加えます。
でもひょっとしたらこの工程だけは必要ないかもしれません。config/environments/development.rbconfig.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' とかの違いを理解できていなかったのでまとめてみた
- 投稿日:2020-09-20T01:09:40+09:00
さよなら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 dockersudoなしでdockerコマンドが使えるようになるおまじない
sudo groupadd docker sudo usermod -aG docker $USERDockerサービス起動
sudo systemctl enable docker sudo systemctl start dockerDocker 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.ymlenvironment: - REDIS_HOST=redis + - FXA_REQUIRED=false
修正後はこんな感じ
docker-compose.ymlversion: "3" services: web: build: . links: - redis ports: - "1443:1443" environment: - REDIS_HOST=redis - FXA_REQUIRED=false redis: image: redis:alpinedocker-compose up
Docker Imageのビルドが始まり、しばらくすると起動します。
docker-compose up -d
http://[EC2のパブリックIP]:1443
でFirefox Sendが無事起動します。ファイルを登録して
アップロード!!!
発行されたリンクをクリックしてダウンロードできます。
自分用にはこれでなんとかなりそうです。
いいサービスだったのに、残念ですねぇ。。
- 投稿日:2020-09-20T01:09:40+09:00
さようなら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 dockersudoなしでdockerコマンドが使えるようになるおまじない
sudo groupadd docker sudo usermod -aG docker $USERDockerサービス起動
sudo systemctl enable docker sudo systemctl start dockerDocker 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.ymlenvironment: - REDIS_HOST=redis + - FXA_REQUIRED=false
修正後はこんな感じ
docker-compose.ymlversion: "3" services: web: build: . links: - redis ports: - "1443:1443" environment: - REDIS_HOST=redis - FXA_REQUIRED=false redis: image: redis:alpinedocker-compose up
Docker Imageのビルドが始まり、しばらくすると起動します。
docker-compose up -d
http://[EC2のパブリックIP]:1443
でFirefox Sendが無事起動します。ファイルを登録して
アップロード!!!
発行されたリンクをクリックしてダウンロードできます。
自分用にはこれでなんとかなりそうです。
いいサービスだったのに、残念ですねぇ。。