- 投稿日:2021-01-25T23:56:42+09:00
LaravelにDockerファイルでcronを導入して定期的にメール送信する方法
https://zenn.dev/kiyo_tech/articles/8e79e9873ff687
の転載です。dockerでcronを導入する方法が日本語では見つからなかったので書きました。
dockerファイルの書き方が全くわからない人は難しいです。
以下の例ではdocker内部ではprojectフォルダにソースを入れています。
あとdocker-composeでマウントする場合はCOPY . /project/が不要、 最後のRUN 以降で、chmod 0644 /etc/cron.d/cronとtouch /var/log/cron.log以外は不要です。
通常のLaravelで立ち上げるdockerファイルとは分けましょう。app/docker/cron/dockerfileFROM php:7-fpm ENV DEBIAN_FRONTEND noninteractive COPY --from=composer:latest /usr/bin/composer /usr/bin/composer RUN apt-get update && apt-get -y install git cron libicu-dev libonig-dev libzip-dev unzip &&\ apt-get clean && \ rm -rf /var/lib/apt/lists/* &&\ docker-php-ext-install pdo_mysql &&\ composer config -g process-timeout 3600 && \ mkdir -p /project COPY . /project/ COPY ./docker/cron/php.ini /usr/local/etc/php/php.ini COPY ./docker/cron/root /etc/cron.d/cron WORKDIR /project RUN composer install &&\ chmod -R a+w storage/ bootstrap/cache &&\ chmod 0644 /etc/cron.d/cron &&\ touch /var/log/cron.log &&\ php artisan cache:clear &&\ php artisan config:clear &&\ php artisan route:clear CMD cron -fproject/docker/cron/root* * * * * root /usr/local/bin/php -q -f /project/artisan schedule:run --no-ansi >> /dev/null 2>&1project/app/Console/Kernel.phpprotected function schedule(Schedule $schedule) { $schedule->command('email:send')->hourly()->onOneServer(); }コマンドは公式を参照しましょう。
https://readouble.com/laravel/7.x/ja/scheduling.htmlphp artisan make:command SendMailTest作成したファイルでコマンドの内容をつくります。
project/app/Console/Commands/SendMailTest.php<?php namespace App\Console\Commands; use Illuminate\Console\Command; use App\Models\User; use App\Mail\SendMail; use Illuminate\Support\Facades\Mail; use Carbon\Carbon; class SendMailTest extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'email:send'; /** * The console command description. * * @var string */ protected $description = 'メールを定期的に配信する'; /** * Create a new command instance. * * @return void */ public function __construct() { parent::__construct(); } /** * Execute the console command. * * @return mixed */ public function handle() { // 対象者を絞ったり $user = User::find(対象者); // 内容をDBから取り出しておいたり、 $contents = ~~~ Mail::to($user)->send(new SendMail($contents)); } }またコマンド
php artisan make:mail SendMail以下内容です。
project/app/Mail/SendMail.php<?php namespace App\Mail; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; class SendMail extends Mailable { use Queueable, SerializesModels; // 引数で受け取る変数 protected $user; protected $contents; // コンストラクタ設定 public function __construct($user,$contents) { // 引数で受け取ったデータを変数にセット $this->user = $user; $this->contents = $contents; } /** * Build the message. * * @return $this */ public function build() { return $this ->subject('メールのタイトル') ->view('emails.content') ->with([ 'user' => $this->user, 'contents' => $this->contents, ]); } }resources/views/emailsディレクトリを作成し、content.blade.phpを作成します。
project/resources/views/emails/content.blade.php<!DOCTYPE html> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> </head> <body> <!-- 何かしらの内容 --> </body> </html>内容面は適宜カスタマイズしてください。
- 投稿日:2021-01-25T18:29:18+09:00
Dockerで構築したLaravelにgRPCを導入してfirestoreにデータを書き込む方法
LaravelをAPIサーバーとして使い、Laravelからwebsocketなどではなく、firestoreでチャットやプッシュ通知などリアルタイム通信させたいときがあります。
公式( https://firebase.google.com/docs/firestore/quickstart?hl=ja )によれば、
PHPの場合、gRPCのインストールが必要です。
dockerでのインストールの情報が皆無なので書いておきます。gRPCのインストール
dockerfileの修正(docker-compose で制御する場合の参考)
docker/php/DockerfileFROM php:7-fpm ENV DEBIAN_FRONTEND noninteractive COPY --from=composer:latest /usr/bin/composer /usr/bin/composer RUN apt-get update && apt-get -y install git autoconf zlib1g-dev libicu-dev libonig-dev libzip-dev unzip &&\ apt-get clean && \ pecl install grpc && \ pecl install protobuf && \ rm -rf /var/lib/apt/lists/* &&\ docker-php-ext-install pdo_mysql &&\ composer config -g process-timeout 3600 && \ mkdir -p /app COPY ./docker/php/php.ini /usr/local/etc/php/php.ini WORKDIR /appこの中で、gRPCのインストールに関係する部分は、
docker/php/Dockerfileautoconf zlib1g-devでpeclをインストールし、
docker/php/Dockerfilepecl install grpc && \ pecl install protobuf && \でgrpc本体をインストールという流れです。
protobufはgrpcのパフォーマンスを向上させるライブラリのようです。php.iniの修正
dockerfile書くときにphp.iniも書いていると思いますので、
そこに以下を追記docker/php/php.iniextension=grpc.so extension=protobuf.soそして、composer.jsonファイルの
"require"にcomposer.json"grpc/grpc": "^1.27.0",を追記してください。
バージョンは公式(https://cloud.google.com/php/grpc?hl=ja)で最新版を確認してください。そのうえで、再ビルドすればgRPCの導入完了です。
(ただし、gRPCのインストールはめちゃくちゃ時間がかかります。。。)laravelからfirestoreへのsetができるようにする
ライブラリの導入
コマンドでライブラリのインストール
commandcomposer require google/cloud-firestore composer require kreait/laravel-firebaseconfig/app.phpに追記
config/app.phpreturn [ // ... 'providers' => [ // ... これを追記 Kreait\Laravel\Firebase\ServiceProvider::class ] // ... ];次に、firebaseのコンソールで、歯車 > サービスアカウント > FIrebase Admin SDK > 新しい秘密鍵の生成
をクリックしてください。ダウンロードされたファイル名を
firebase_credentials.json
に変えて、プロジェクト直下に設置し、
秘匿情報なので、
gitignoreに
firebase_credentials.json
を追記しておきましょう。もし本番環境がECS fargateの場合、本番環境ではsshログインできませんので、codebuildのときにs3からコピーするように処理を追記しておきましょう
.envFIREBASE_CREDENTIALS=firebase_credentials.jsonそして、コマンドでconfigファイルを作っておきましょう。
commandphp artisan vendor:publish --provider="Kreait\Laravel\Firebase\ServiceProvider" --tag=configfirestoreへのデータのセット等はいろんな箇所で使うことが多いと思うので、サービス化しておきましょう。
以下、サービス化(知っている方、必要ない方は読み飛ばしてください。)
app/Providers/FirebaseApiServiceProvider.php<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Illuminate\Foundation\Application; use App\Services\FirestoreApiService; class FirestoreApiServiceProvider extends ServiceProvider { /** * Register services. * * @return void */ public function register() { $this->app->bind('FirestoreApi', function(Application $app){ return new FirestoreApiService(); }); } /** * Bootstrap services. * * @return void */ public function boot() { // } }app/Facades/FirestoreApiFacade.php<?php namespace App\Facades; use Illuminate\Support\Facades\Facade; class FirestoreApiFacade extends Facade { protected static function getFacadeAccessor() { return 'FirestoreApi'; } }config/app.php// providersに追記 App\Providers\FirestoreApiServiceProvider::class, // aliasesに追記 'FirestoreApi' => App\Facades\FirestoreApiFacade::class,これでサービス化は完了です。
そしていよいよfirestoreへのデータset,update,deleteです。
app/Services/FirestoreApiService.php<?php namespace App\Services; use Google\Cloud\Firestore\FieldValue; class FirestoreApiService { protected $db; public function __construct() { $this->db = app('firebase.firestore')->database(); } /** * firestoreへのデータset * @param sender_id int * @param room_id int * @param comment string * @return void */ public function storeComment($sender_id, $room_id, $comment_id ,$comment) { $docRef = $this->db->collection('rooms')->document($room_id)->collection('comment'); $docRef->document($comment_id)->set([ 'comment' => $comment, 'sender_id' => $sender_id, 'created_at' => FieldValue::serverTimestamp(), 'updated_at' => FieldValue::serverTimestamp(), ]); } /** * firestoreのデータをupdate * @param sender_id int * @param room_id int * @param comment_id int * @param comment string * @return void */ public function updateComment($sender_id, $room_id, $comment_id, $comment) { $docRef = $this->db->collection('rooms')->document($room_id)->collection('comment'); $docRef->document($comment_id)->update([ [ 'path' => 'comment', 'value' => $comment], ['path' => 'updated_at', 'value' => FieldValue::serverTimestamp()] ]); } /** * firestoreのデータをdelete * @param room_id int * @param comment_id int * @return void */ public function deleteComment($room_id, $comment_id) { $docRef = $this->db->collection('rooms')->document($room_id)->collection('comment'); $docRef->document($comment_id)->delete(); } }これでuseなどを使わなくても、どこでも
\FirestoreApi::storeComment($sender_id, $room_id, $comment);で呼び出して、Laravelからfirestoreにsetしたりできます。
- 投稿日:2021-01-25T17:15:17+09:00
Docker開発環境
はじめに
現在開発中のアプリにDockerを導入したのでアウトプットします。
環境
Ruby on Rails '6.0.0'
Ruby '2.6.5'
MySQL '5.6.47'Dockerfile
開発中アプリのルートディレクトリにDockerfileを作成します。
DockerfileFROM ruby:2.6.5 RUN apt-get update -qq && \ apt-get install -y build-essential \ libpq-dev \ nodejs RUN mkdir /アプリ名 WORKDIR /アプリ名 ADD ./Gemfile /アプリ名/Gemfile ADD ./Gemfile.lock /live_search/Gemfile.lock RUN gem install bundler RUN bundle install ADD . /アプリ名docker-compose.yml
docker-compose.ymlversion: '3' services: db: image: mysql:5.6.47 environment: MYSQL_ROOT_PASSWORD: 'password' ports: - "4306:3306" volumes: - ./db/mysql-data:/var/lib/mysql web: build: . command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" volumes: - .:/アプリ名 ports: - "3000:3000" depends_on: - dbentrypoint.sh
entrypoint.shset -e rm -f /myapp/tmp/pids/server.pid exec "$@"database.yml
database.ymldefault: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: password host: db socket: /tmp/mysql.sockpassword: password
host: db
を追加コンテナを作成
ターミナル% docker-compose buildDB作成、migrationの実行
ターミナル% docker-compose run web bundle exec rake db:create % docker-compose run web bundle exec rake db:migrateコンテナを起動
ターミナル% docker-compose up
- 投稿日:2021-01-25T14:53:32+09:00
【Laravel】Dockerコンテナ内でのユーザー認証導入
初めまして!
スクールではRuby on Railsを学習。
就活の関係でPHPの学習始めたばかりです。
初めて1からLaravelで作成するので記録を残します。DockerでLaravelの開発環境を作成
これに関してはこちらの記事を参考にというかもうそのまま使わせて頂きました!
大変わかりやすかったです。
ありがとうございました!ユーザー認証導入
ユーザー登録やログイン機能の実装です。
Railsだとdeviseで簡単にできるイメージでしたが結構つまりました。
Dockerというのが理解が追いついていないので難しかったです。まずコンテナ内に入ります
ターミナル% docker-compose exec app bashコンテナ内でユーザー認証導入のコマンドを入力します
コンテナcomposer require laravel/uiここで下記のエラーが発生しました。
Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 bytes)調べると「メモリ不足なのでインストールできないよ」とのこと。
なのでコンテナCOMPOSER_MEMORY_LIMIT=-1 composer require laravel/ui上記のコマンドは一時的に容量を無制限にするコマンドのようです。
こちらの記事を参考にさせていただきました!ありがとうございます。vue.jsを元にしたテンプレートの認証機能を追加します
コンテナphp artisan ui vue --auth下記のように出れば成功です。
Vue scaffolding installed successfully. Please run "npm install && npm run dev" to compile your fresh scaffolding. Authentication scaffolding generated successfully.これでvue.jsを書く初期状態が完成。
app/Http/Controllers/Auth
にはバックエンドでの認証機能関係のファイルが追加されます。
resources/views/auth
にはフロントエンド関係のviewファイルが追加されます。ここまでで一旦は認証機能の導入が終わりましたが、まだ表示が崩れたままです。
画面を整えるためNode.jsのパッケージ管理ツールをインストールします。
コンテナnpm install && npm run devそうすると
npm: command not foundとエラー。
Node.jsのインストールしてなかったからみたいです(それはそうですね)
公式からインストールし再実行するも変わらず。
インストールの確認のためコンテナから出て
which node
と入力すると/usr/local/bin/node
と出力され
npm -v
と入力すると6.14.10
と出力されるがコンテナ内で行うと出てこないのでコンテナ内にNodeが存在しないことが原因と分かりました。コンテナ内に反映させるため,
php/Dockerfile
のWORKDIRの前に以下を追加します。COPY --from=node:12.20 /usr/local/bin /usr/local/bin COPY --from=node:12.20 /usr/local/lib /usr/local/libコンテナから抜けてビルドし直します。
docker-compose up -d --buildこのあと再度コンテナ内に入り
npm install && npm run dev
で無事完了。
public/js
とpublic/css
に新しいファイルが生成されます。リアルタイムでコンパイルさせる
phpのコンテナ内で
npm run watch-pollを実行することでコードを書きながらでもリアルタイムでjsがコンパイルされ画面が反映されます。
完成
以上です!
ご指摘などございましたらよろしくお願い致します!
- 投稿日:2021-01-25T14:08:25+09:00
DockerでAlpine LinuxのZabbix 5.0グラフが豆腐になる日本語表示を修正するメモ
背景
Zabbixのグラフ表示で日本語が豆腐に文字化けする件は古からよくある話で、
ネットで検索すると色々解決方法があります。
まずはそれらを参考にした方が良いかと思います。そんな中でここでは昨今ではよく使われるDockerコンテナ環境での事例になります。
Zabbixの公式Dockerコンテナには、Alpine,CentOS,Ubuntuの3つがあります。
今回はあまり情報が少ない感じのAlpine LinuxのDockerコンテナ環境をメモします。動作環境
ホスト側
- OS:Ubuntu 18.04LTS Docker環境
- Docker version 20.10.2
- docker-compose version 1.27.4
コンテナ側
- Zabbix 5.0 公式 Docker コンテナ Alpine版
Zabbix Docker動作方法
ここではZabbixのDocker環境の構築方法は省略します。
docker-composeで比較的簡単に出来るので挑戦して見て下さい。Zabbix Dockerコンテナのフロントエンドでの修正方法
Zabbix webフロントエンド側のコンテナに入ります。
$ docker exec -it -u root zabbix-docker_zabbix-web-apache-mysql_1 /bin/bashAlpineのパッケージを一通り更新しておきます。
$ apk update && apk upgrade日本語のフォントをインストールします。
$ apk add font-noto font-noto-cjkフォント情報を更新します。
$ fc-cache -fv既存のZabbixグラフの文字フォントをバックアップします。
$ mv /usr/share/zabbix/assets/fonts/DejaVuSans.ttf /usr/share/zabbix/assets/fonts/DejaVuSans.ttf.bak日本語のフォントをシンボリックリンクで割り当てます。
$ ln -s /usr/share/fonts/noto/NotoSansCJK-Regular.ttc /usr/share/zabbix/assets/fonts/DejaVuSans.ttfこれでZabbixのグラフで豆腐の文字化けから日本語に修正出来ていると思います。
お疲れさまでした。
- 投稿日:2021-01-25T13:55:21+09:00
【備忘】Ubuntu proxy設定
環境変数
export http_proxy=<proxyのURL> export no_proxy=<no_proxyのホスト> cat <<EOF | sudo tee /etc/profile.d/proxy.sh export http_proxy=${http_proxy} export https_proxy=\${http_proxy} export HTTP_PROXY=\${http_proxy} export HTTPS_PROXY=\${http_proxy} export no_proxy=${no_proxy} export NO_PROXY=\${no_proxy} EOF source /etc/profile.d/proxy.shApt
export http_proxy=<proxyのURL> cat <<EOF | sudo tee /etc/apt/apt.conf.d/99proxy Acquire::http::Proxy "${http_proxy}"; Acquire::https::Proxy "${https_proxy}"; EOFDocker
export http_proxy=<proxyのURL> export no_proxy=<プライベートリポジトリがあれば、そのホストを指定> sudo mkdir /etc/systemd/system/docker.service.d cat <<EOF | sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf [Service] Environment="HTTP_PROXY=${http_proxy}" "HTTPS_PROXY=${https_proxy}" "NO_PROXY=${no_proxy}" EOF sudo systemctl daemon-reload sudo systemctl restart docker
- 投稿日:2021-01-25T09:14:07+09:00
Dockerfile作成(メモ)
はじめに
個人的なメモです。
Dockerfileの中身
- FROM --- ベースとなるイメージ
- RUN --- docker build 時に実行。複数書いてOK
- WORKDIR --- 実行ディレクトリの変更。mkdir & cd の両方をやる。
- COPY --- ホストからコンテナへコピー
- ADD --- COPYとほぼ一緒。転送元に圧縮ファイルを指定すると自動的に展開してコピー
- CMD --- 実行中のコンテナにコマンドと引数を提供。1ファイルに1つだけ。
- VOLUME --- ディレクトリマウントポイント
- EXPOSE --- ポート公開
Dockerイメージ : コンテナを実行するときに必要なファイルシステム。読み込み専用。
コンテナ起動 : Dockerイメージ上に読み書き可能なレイヤを追加し、指定されたプロセスを隔離された状態やシステムリソース上で実行すること1. まずは、ひとつずつ確認
- [$ docker pull イメージ名:タグ名]でイメージをローカルにダウンロード
$ docker pull ubuntu:18.04
- ローカルマシンに取得しているイメージの一覧表示
$ docker images
- [$ docker run -it --name {任意のコンテナ名} {利用したいイメージ名} /bin/bash]
- イメージからコンテナ作成
- ホストにあるディレクトリをマウントする際はこの時に
-v
オプションで指定する$ docker run -it -d --name ubuntu18.04 ubuntu:18.04
- docker run オプション(run: pull, create, start同時に実行)
-it
:ターミナルで操作可。コンテナ内でbashプロセスを新規で立ち上げ、手元の環境でDocker内入力できる。
-d
: バックグラウンドで実行。付けなければ、すぐにコンテナ内に入る。
--name
: コンテナに名前をつける。これは指定した方が良い。
-v
: ホストマシンのファイルをコンテナ内でも使う。マウント。$ docker run -it -v {ホストマシンの任意のディレクトリ}:{Dockerコンテナ内の任意のディレクトリ} {利用したいイメージ} /bin/bash起動中のコンテナ確認
$ docker ps
- [docker exec コンテナ名 コマンド名]
$ docker exec -it ubuntu18.04 /bin/bash
exec
: コンテナが実行中のみ使用可能。対象コンテナでコマンドを実行。
-it
: コンテナ中でbashプロセスを新規で立ち上げ、手元の環境でdocker内を操作できるようにする
/bin/bash
: シェルの起動
- コンテナの停止
$ docker stop コンテナ名(or コンテナID)
- dockerは、rootが付属しており、コンテナ内では
sudo
は必要ない$ apt-get update $ apt-get install -y python3 python3-pip2. Dockerfileの作成
(例) python3の環境構築 + pip3でnumpyをインストール
Dockerfile.FROM ubuntu:18.04 RUN apt-get update \ && apt-get install -y python3 \ python3-pip RUN pip3 install numpy
- Dockerfileからイメージ作成
$ docker image build -t イメージ名:tag Dockerfileが置かれているディレクトリパスex) $ docker image build -t python3_env .
- イメージの詳細確認
$ docker inspect python3_envex) docker inspect イメージ名
3. Docker hubへ登録
- Dockerへログイン
$ docker login
- Dockerhubにアップロードする際は、イメージ名を
アカウント名/イメージ名:tag
にする- 最初から、Dockerhubにuploadする予定ならこの形式にしておくのがベター
$ docker tag python3_env アカウント名/python3_env
- ローカルからイメージをプッシュ
$ docker push アカウント名/python3_env
- 投稿日:2021-01-25T02:00:40+09:00
【Docker + CircleCI + Rails】Missing secret_key_base エラー
環境
Ruby 2.7.1
Rails 6.0.3.4CircleCIを使ってECSへデプロイ時に以下のようなエラーが発生
rake aborted! ArgumentError: Missing `secret_key_base` for 'production' environment, set this string with `rails credentials:edit`結論
Railsのmaster.keyをCircleCIの環境変数に設定しconfig.ymlとDockerfileに設定した環境変数を渡す事で解決しました。
Step1
CircleCI環境変数設定
nameをRAILS_MASTER_KEY
とし、
valueにmaster.key
の値を入力Step2
Dockerfileに追記
Dockerfile# 追記 ARG RAILS_MASTER_KEY ENV RAILS_MASTER_KEY ${RAILS_MASTER_KEY}Step3
CircleCIの設定
.circleci/config.yml- aws-ecr/build-and-push-image: # 追記 extra-build-args: '--build-arg RAILS_MASTER_KEY=${RAILS_MASTER_KEY}'extra-build-argsで設定する事でCircleCI内で設定した環境変数をRails側でENVとして受け取る事が出来るとのことです。
参考にさせていただいた記事
- 投稿日:2021-01-25T00:26:12+09:00
Windows10 Home環境にDocker DesktopをインストールしてOracle Databaseのイメージを動かす
本投稿の背景
自宅PC(Windows Home環境)でDockerを触ってみようというのと、
さらにOracle Databaseも簡単に環境セットアップしたいなと思ったのが背景です。本投稿で実施する内容
1.Windows10 Home(64bit)環境にDocker Desktopをインストール
2.Docker HubからOracle Database Enterprise EditionのイメージをPull
3.Pullしたイメージを使用してコンテナを起動
1.Windows10 Home環境にDocker Desktopをインストール
Docker Desktopをインストール
https://www.docker.com/products/docker-desktop
ダウンロードした、Docker Desktop Installer.exe を実行
2つのチェックはそのままで、[OK]をクリック
インストールが終わったら、OSを再起動
OS再起動すると Dockerが起動します。
※OS起動時にDocker起動しないようにするには、DockerDesktopの[Setting]-[General]で
[Start Docker Desktop when you log in]のチェックを外します起動時に「An error occurred」とエラーがでる
上記リンク
https://docs.docker.com/docker-for-windows/troubleshoot/#virtualization
を確認。私の環境は、
・[Windowsの機能の有効化または無効化]で
「Linux用Windowsサブシステム」、「仮想マシンプラットフォーム」にチェックが入っている。
・仮想化機能を有効にするためのBIOS設定は[有効]。
・[Hyper-V]がOFFになっていました ★
→こちらの記事 Hyper-VのON・OFFを簡単に自動化すっぞ!! を参考に
Hyper-VをONにしたところ、「An error occurred」のエラーはでませんでした。
再度、Docker Desktopを起動(デスクトップにある、Docker Desktopで起動)
メッセージにある、https://aka.ms/wsl2kernel の[x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージ]をクリックすると、wsl_update_x64.msi がダウンロードされますので、
ダウンロードが完了したら、こちらを実行します。Docker Desktopの画面が起動するので、[Skip tutorial]をクリック
Docker Desktopでサンプルコンテナを起動
Dockerのバージョン確認
※Dockerがインストールされているかの確認
docker versionイメージの確認
docker imagesコンテナ稼働状態の確認
http://docs.docker.jp/v17.06/engine/reference/commandline/ps.html
docker ps -aサンプルのコンテナを起動
getting-startedのイメージを使用して、コンテナ名はtutorial、コンテナのポート80は、ホストマシンのポート80に割り当てコンテナを起動。
docker run -d --name tutorial -p 80:80 docker/getting-startedコンテナ稼働状態の確認
docker ps -arunコマンドでしていしたtutorial という名前のコンテナが起動している。(STATUS が UP になっている)
ブラウザで localhost と入力
イメージの確認
docker imagesrunコマンドで指定した、getting-startedのImageがある
コンテナを停止、状態確認
docker stop <コンテナ名> docker ps -aコンテナを削除
docker rm <コンテナ名> docker ps -aイメージを削除、確認
docker rmi <イメージ名> docker imagesイメージ削除後、docker images で確認してイメージが削除されたことを確認。
2.Docker HubからOracle DatabaseイメージをPull
Dockerイメージの入手方法
イメージの入手方法は2つあり、「ビルド済のイメージを使用する方法」と「ビルド用のイメージを入手して自分でビルドする方法」があります。
1.ビルド済のイメージを使用する方法
・Oracle Container Registry(https://container-registry.oracle.com)
・Docker Hub(https://store.docker.com)
2.ビルド用のイメージを入手して自分でビルドする方法
・Github(https://github.com/oracle/docker-images)本投稿では、少ない手順でOracle Databaseのコンテナを使用したいので「ビルド済のイメージを使用する方法」を選択します。
Oracle Container Registryのイメージは、
「商用ライセンスまたはオラクル・トライアル・ライセンス契約」となっており、今回は個人で使用するのですが、トライアルライセンスの場合、「トライアル期間」は、 このトライアル・ライセンスの諸条件を受諾した日から30日となります。
※ライセンスについての詳細はOracle Container Registryにログインして内容を確認くださいDocker Hubのイメージは、
OTNライセンスとなっており、今回は学習用として使用しますのでDocker Hubのイメージを使用します。
※ライセンスについての詳細はDocker Hubにログインして内容を確認ください本投稿では、Docker Hubのビルド済のイメージを使用します
Docker Hubを利用するためアカウント作成
Docker HubにあるOracle Databaseのイメージを使用するため、Docker Hubが利用できるようにアカウントを作成します。
Docker Hubにアクセスして、アカウント作成
登録したemailにメールが届く
[Verify email address]をクリック
Docker ID、パスワードでSign In
Oracle Database Enterprise Editon のイメージを検索
利用規約を確認して[Proceed Checkout]をクリック
Oracle Database Enterprise Editon のイメージをPull
Power Shellを起動して、Docker Hubにログイン
docker loginOracle Database Enterprise Edition のイメージをPull
docker pull store/oracle/database-enterprise:12.2.0.1 docker imagesdocker images で イメージがPullされていることを確認
3.PullしたOracle Database Enterprise Editionのイメージを使用してコンテナを起動
docker runコマンドでコンテナを起動
docker run -d -it --name orcl -p 1521:1521 -v C:\app\oradata:/ORCL store/oracle/database-enterprise:12.2.0.1コンテナ名をorcl、1521ポートをホストマシンのポート1521に割り当て、oracleで使用するファイル群をホストマシンの c:\app\oradata に作成して、コンテナを起動しています。
-v オプションを指定しない場合、oracle で使用するファイル群は コンテナ内に作成されます。
コンテナを削除するとファイルも削除されてしまうため、それを回避する場合、-v オプションを指定してファイルを外部に作成します。※上記のdocker run のパラメータは、Docker HubのOracle Database Enterprise Edition のものとなります。Oracle Container Registry や Github のイメージをビルドする場合、
ドキュメントを確認ください(それぞれ、若干パラメータが違います)DB作成に少し時間がかかります。作成状況を確認する場合、docker logs で状況を確認します。
docker logs <コンテナ名>「Done ! The database is ready for use .」と出ればDBは使える状態になっています。
作成されたコンテナを確認
docker ps -a設定されている設定項目
設定項目 設定値 DB_SID ORCLCDB DB_PDB ORCLPDB1 DB_MEMORY 2GB(sga_target:1280M、pga_aggregate_target:768M DB_DOMAIN localdomain sysのパスワード Oradoc_db1 ホストマシンからsqlplusでDBに接続
コンテナの1521ポートがホストの1521ポートに割り当てられているので、1521ポートを指定してDB接続。
C:\> sqlplus sys/Oradoc_db1@localhost:1521/ORCLCDB.localdomain as sysdba SQL*Plus: Release 12.2.0.1.0 Production on Sun Jan 24 21:57:22 2021 Copyright (c) 1982, 2016, Oracle. All rights reserved. Last Successful login time: Sun Jan 24 2021 21:51:11 +09:00 Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production SQL> SQL> SQL> show con_name CON_NAME ------------------------------ CDB$ROOT SQL> SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 ORCLPDB1 READ WRITE NO SQL>コンテナに接続
docker exec でコンテナに接続して、DBにローカル接続。
docker exec -it orcl bash [oracle@6dddfb8fbe94 /]$ sqlplus / as sysdba SQL*Plus: Release 12.2.0.1.0 Production on Sun Jan 24 13:02:29 2021 Copyright (c) 1982, 2016, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production SQL> show con_name CON_NAME ------------------------------ CDB$ROOT SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 ORCLPDB1 READ WRITE NO SQL>コンテナを停止
docker stop <コンテナ名> docker ps -aコンテナ停止の際、DBのアラートログを見ると、DBをshutdown immediate でDBをシャットダウンしていました。
[検証その1] テーブルを作成して、コンテナ停止→起動でテーブルが残っているか確認
pdbに接続して、scottユーザを作成し、テーブル[test]を作成。
C:\> sqlplus sys/Oradoc_db1@localhost:1521/ORCLCDB.localdomain as sysdba SQL*Plus: Release 12.2.0.1.0 Production on Sun Jan 24 13:02:29 2021 Copyright (c) 1982, 2016, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production SQL> show con_name CON_NAME ------------------------------ CDB$ROOT SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 ORCLPDB1 READ WRITE NO SQL> SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 ORCLPDB1 READ WRITE NO SQL> alter session set container="ORCLPDB1"; Session altered. SQL> create user scott identified by Welcome1!; create user scott identified by Welcome1! SQL>exit C:\>sqlplus scott/Welcome1!@localhost:1521/ORCLPDB1.localdomain SQL*Plus: Release 12.2.0.1.0 Production on Sun Jan 24 22:23:58 2021 Copyright (c) 1982, 2016, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production SQL> SQL> create table test(col1 number); Table created. SQL> desc test Name Null? Type ----------------------------------------- -------- ---------------------------- COL1 NUMBER SQL>この状態でコンテナ停止→起動
docker stop <コンテナ名> docker start <コンテナ名>コンテナ起動後、sqlplus で接続してテーブル確認
C:\>sqlplus scott/Welcome1!@localhost:1521/ORCLPDB1.localdomain SQL*Plus: Release 12.2.0.1.0 Production on Sun Jan 24 22:32:00 2021 Copyright (c) 1982, 2016, Oracle. All rights reserved. Last Successful login time: Sun Jan 24 2021 22:23:59 +09:00 Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production SQL> desc test Name Null? Type ----------------------------------------- -------- ---------------------------- COL1 NUMBER→結果は、テーブルは残っていることを確認
[検証その2] コンテナを削除→docker run(Oracleのファイル群は -v オプションで使用したディレクトリを指定して再利用)でテーブルが残っているか確認
コマンドは以下を実行。
コンテナ停止、コンテナ削除、コンテナ起動。DB作成が完了したかは docker logs で確認。docker stop <コンテナ名> docker ps -a docker rm <コンテナ名> docker run -d -it --name orcl -p 1521:1521 -v C:\app\oradata:/ORCL store/oracle/database-enterprise:12.2.0.1 docker ps -a docker logs <コンテナ名>docker logs で「Done ! The database is ready for use .」が出力されたのを確認後、
sqlplus で接続して確認。C:\>sqlplus scott/Welcome1!@localhost:1521/ORCLPDB1.localdomain SQL*Plus: Release 12.2.0.1.0 Production on Sun Jan 24 23:11:54 2021 Copyright (c) 1982, 2016, Oracle. All rights reserved. Last Successful login time: Sun Jan 24 2021 22:32:00 +09:00 Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production SQL> desc test Name Null? Type ----------------------------------------- -------- ---------------------------- COL1 NUMBER SQL>結果は、
コンテナ削除する前に作成したテーブルがあることを確認。-v オプションで指定したディレクトリのデータファイル群があれば、コンテナ削除しても、別ホストでコンテナ起動しても、DBのデータは引き継ぐことができることが確認できました。
- 投稿日:2021-01-25T00:09:15+09:00
Docker×Git×VSCodeの環境構築は多分これが一番やさしい説明だと思います。
環境
- Windows 10 Pro
詳細なシステム要件は以下のページで確認。(Hyper-Vを有効にするための要件)
https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/reference/hyper-v-requirements
準備するもの
- Docker Desktop for Windows
- Git for Windows
- Visual Studio Code
この記事では1,2,3の順番で説明。
Docker Desktop for Windowsをインストール
- ダウンロードページへ移動(https://www.docker.com/products/docker-desktop)
- 「Download for Windows」をクリックしてダウンロード
3. ダウンロードしたインストーラをクリックしてインストール開始
4. インストーラを起動したらOKを押下(「Enable Hyper-V Windows Features」をチェックすることでHyper-Vを有効にしてくれる)
5. 「Close and restart」を押下して再起動再起動後に「WSL 2 installtion is incomplete」のエラーが発生する場合
現象
再起動後、自動的にDockerが起動する。その際に以下のエラーが発生。
解消方法
- 以下のリンクに移動して、「x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージ」をクリック
2. ダウンロードしたファイルをクリックして更新プログラムパッケージを実行Git for Windowsのインストール
- ダウンロードページへ移動(https://gitforwindows.org/)
- 「Download」をクリックしてインストーラをダウンロード
3. ダウンロードしたインストーラをクリックしてインストール開始
5. インストール場所を指定。特に理由が無ければデフォルトにしてNextを押下
6. コンポーネントの選択。これも特に理由が無ければデフォルトにしてNextを押下
8. Gitのデフォルトのエディタを選択。ここは特に気にする必要はないのでNextを押下(後で変更可能)
9. Gitで新しくリポジトリを作成するときのデフォルトの初期ブランチ名を決定。特にこだわりが無ければ「Let Git decide」を選択してNextを押下
11. HTTPS接続するときのSSL/TLSライブラリを選択。「Use the OpenSSL library」を選択してNextを押下
12. ここは要注意。チェックアウト・コミット時の改行コードの選択。以下の表を参照して選択し、Nextを押下
選択肢 チェックアウト時 コミット時 Checkout Winsows-style,
commit Unix-style line endingsLF -> CRLF CRLF -> LF Checkout as-is,
commit Unix-style line endings変換しない CRLF -> LF Checkout as-is,
commit as-is変換しない 変換しない
13. GitBashのターミナルを選択。特に理由が無ければデフォルトを選択してNextを押下
- git pullの振る舞いを選択。特に理由が無ければデフォルトを選択してNextを押下
15. 「Enable Git Credential Manager」を選択してNextを押下(https接続時に入力したパスワードを保持してくれる)
- 「Enable file system caching」を選択してNextを押下(ファイルシステムのキャッシュを利用する)
- 「Enable experimental support for pseudo consoles」のチェックをしない(バグがある模様)。Installを押下
18. Finishを押下して完了(リリースノートが表示されるが、どうでもよい)Visual Studio Codeのインストール
- ダウンロードページへ移動(https://code.visualstudio.com/download)
- WindowsのInstallerをクリックしてインストーラをダウンロード
4. 使用許諾契約書の同意。「同意する」を選択して次へを押下
6. スタートメニューフォルダーの指定。デフォルトのままで次へを押下
7. 追加タスクの選択。特に理由が無ければデフォルトで次へを押下
9. 完了を押下してインストール完了(Visual Studio Codeが自動的に実行される)Visual Studio Codeの拡張機能
- Visual Studio Codeを起動して「Ctrl」+「Shift」+「X」を押下して拡張機能を選択
- 検索ボックスで検索して、以下の拡張機能をインストールする
- Japanese Language Pack for Visual Studio Code:日本語化の拡張機能
- Remote-Containers:Dockerコンテナ内開発ができる拡張機能
- 投稿日:2021-01-25T00:09:15+09:00
Docker×Git×VSCodeの環境構築は多分これが一番やさしい説明だと思います
環境
- Windows 10 Pro
詳細なシステム要件は以下のページで確認。(Hyper-Vを有効にするための要件)
https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/reference/hyper-v-requirements
準備するもの
- Docker Desktop for Windows
- Git for Windows
- Visual Studio Code
この記事では1,2,3の順番で説明。
Docker Desktop for Windowsをインストール
- ダウンロードページへ移動(https://www.docker.com/products/docker-desktop)
- 「Download for Windows」をクリックしてダウンロード
3. ダウンロードしたインストーラをクリックしてインストール開始
4. インストーラを起動したらOKを押下(「Enable Hyper-V Windows Features」をチェックすることでHyper-Vを有効にしてくれる)
5. 「Close and restart」を押下して再起動再起動後に「WSL 2 installtion is incomplete」のエラーが発生する場合
現象
再起動後、自動的にDockerが起動する。その際に以下のエラーが発生。
解消方法
- 以下のリンクに移動して、「x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージ」をクリック
2. ダウンロードしたファイルをクリックして更新プログラムパッケージを実行Git for Windowsのインストール
- ダウンロードページへ移動(https://gitforwindows.org/)
- 「Download」をクリックしてインストーラをダウンロード
3. ダウンロードしたインストーラをクリックしてインストール開始
5. インストール場所を指定。特に理由が無ければデフォルトにしてNextを押下
6. コンポーネントの選択。これも特に理由が無ければデフォルトにしてNextを押下
8. Gitのデフォルトのエディタを選択。ここは特に気にする必要はないのでNextを押下(後で変更可能)
9. Gitで新しくリポジトリを作成するときのデフォルトの初期ブランチ名を決定。特にこだわりが無ければ「Let Git decide」を選択してNextを押下
11. HTTPS接続するときのSSL/TLSライブラリを選択。「Use the OpenSSL library」を選択してNextを押下
12. ここは要注意。チェックアウト・コミット時の改行コードの選択。以下の表を参照して選択し、Nextを押下
選択肢 チェックアウト時 コミット時 Checkout Winsows-style,
commit Unix-style line endingsLF -> CRLF CRLF -> LF Checkout as-is,
commit Unix-style line endings変換しない CRLF -> LF Checkout as-is,
commit as-is変換しない 変換しない
13. GitBashのターミナルを選択。特に理由が無ければデフォルトを選択してNextを押下
- git pullの振る舞いを選択。特に理由が無ければデフォルトを選択してNextを押下
15. 「Enable Git Credential Manager」を選択してNextを押下(https接続時に入力したパスワードを保持してくれる)
- 「Enable file system caching」を選択してNextを押下(ファイルシステムのキャッシュを利用する)
- 「Enable experimental support for pseudo consoles」のチェックをしない(バグがある模様)。Installを押下
18. Finishを押下して完了(リリースノートが表示されるが、どうでもよい)Visual Studio Codeのインストール
- ダウンロードページへ移動(https://code.visualstudio.com/download)
- WindowsのInstallerをクリックしてインストーラをダウンロード
4. 使用許諾契約書の同意。「同意する」を選択して次へを押下
6. スタートメニューフォルダーの指定。デフォルトのままで次へを押下
7. 追加タスクの選択。特に理由が無ければデフォルトで次へを押下
9. 完了を押下してインストール完了(Visual Studio Codeが自動的に実行される)Visual Studio Codeの拡張機能
- Visual Studio Codeを起動して「Ctrl」+「Shift」+「X」を押下して拡張機能を選択
- 検索ボックスで検索して、以下の拡張機能をインストールする
- Japanese Language Pack for Visual Studio Code:日本語化の拡張機能
- Remote-Containers:Dockerコンテナ内開発ができる拡張機能