20210125のdockerに関する記事は11件です。

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/dockerfile
FROM 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 -f

project/docker/cron/root
* * * * * root /usr/local/bin/php -q -f /project/artisan schedule:run --no-ansi >> /dev/null 2>&1

project/app/Console/Kernel.php
    protected function schedule(Schedule $schedule)
    {
        $schedule->command('email:send')->hourly()->onOneServer();
    }

コマンドは公式を参照しましょう。
https://readouble.com/laravel/7.x/ja/scheduling.html

php 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>

内容面は適宜カスタマイズしてください。

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

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/Dockerfile
FROM 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/Dockerfile
autoconf zlib1g-dev

でpeclをインストールし、

docker/php/Dockerfile
pecl install grpc && \
pecl install protobuf && \

でgrpc本体をインストールという流れです。
protobufはgrpcのパフォーマンスを向上させるライブラリのようです。

php.iniの修正

dockerfile書くときにphp.iniも書いていると思いますので、
そこに以下を追記

docker/php/php.ini
extension=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ができるようにする

ライブラリの導入

コマンドでライブラリのインストール

command
composer require google/cloud-firestore
composer require kreait/laravel-firebase

config/app.phpに追記

config/app.php
return [
    // ...
    'providers' => [
        // ... これを追記
        Kreait\Laravel\Firebase\ServiceProvider::class
    ]
    // ...
];

次に、firebaseのコンソールで、歯車 > サービスアカウント > FIrebase Admin SDK > 新しい秘密鍵の生成
をクリックしてください。

2021-01-25_14h31_21.png

ダウンロードされたファイル名を
firebase_credentials.json
に変えて、プロジェクト直下に設置し、
秘匿情報なので、
gitignoreに
firebase_credentials.json
を追記しておきましょう。

もし本番環境がECS fargateの場合、本番環境ではsshログインできませんので、codebuildのときにs3からコピーするように処理を追記しておきましょう

.env
FIREBASE_CREDENTIALS=firebase_credentials.json

そして、コマンドでconfigファイルを作っておきましょう。

command
php artisan vendor:publish --provider="Kreait\Laravel\Firebase\ServiceProvider" --tag=config

firestoreへのデータのセット等はいろんな箇所で使うことが多いと思うので、サービス化しておきましょう。

以下、サービス化(知っている方、必要ない方は読み飛ばしてください。)

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したりできます。

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

Docker開発環境

はじめに

現在開発中のアプリにDockerを導入したのでアウトプットします。

環境

Ruby on Rails '6.0.0'
Ruby '2.6.5'
MySQL '5.6.47'

Dockerfile

開発中アプリのルートディレクトリにDockerfileを作成します。

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

entrypoint.sh

entrypoint.sh
set -e

rm -f /myapp/tmp/pids/server.pid

exec "$@"

database.yml

database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  host: db
  socket: /tmp/mysql.sock

password: password
host: db
を追加

コンテナを作成

ターミナル
% docker-compose build

DB作成、migrationの実行

ターミナル
% docker-compose run web bundle exec rake db:create
% docker-compose run web bundle exec rake db:migrate

コンテナを起動

ターミナル
% docker-compose up 
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】Dockerコンテナ内でのユーザー認証導入

初めまして!
スクールではRuby on Railsを学習。
就活の関係でPHPの学習始めたばかりです。
初めて1からLaravelで作成するので記録を残します。

DockerでLaravelの開発環境を作成

これに関してはこちらの記事を参考にというかもうそのまま使わせて頂きました!
大変わかりやすかったです。
ありがとうございました!

ユーザー認証導入

ユーザー登録やログイン機能の実装です。
Railsだとdeviseで簡単にできるイメージでしたが結構つまりました。
Dockerというのが理解が追いついていないので難しかったです。

目標物
Laravelの標準のユーザー認証機能の導入
スクリーンショット 2021-01-25 13.56.50.png

まずコンテナ内に入ります

ターミナル
% 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/jspublic/cssに新しいファイルが生成されます。

リアルタイムでコンパイルさせる

phpのコンテナ内で

npm run watch-poll

を実行することでコードを書きながらでもリアルタイムでjsがコンパイルされ画面が反映されます。

完成

以上です!
ご指摘などございましたらよろしくお願い致します!

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

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/bash

Alpineのパッケージを一通り更新しておきます。

$ 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のグラフで豆腐の文字化けから日本語に修正出来ていると思います。

お疲れさまでした。

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

【備忘】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.sh

Apt

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}";
EOF

Docker

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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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-pip

2. 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_env

ex) docker inspect イメージ名

3. Docker hubへ登録

  • Dockerへログイン
$ docker login
  • Dockerhubにアップロードする際は、イメージ名をアカウント名/イメージ名:tagにする
  • 最初から、Dockerhubにuploadする予定ならこの形式にしておくのがベター
$ docker tag python3_env アカウント名/python3_env
  • ローカルからイメージをプッシュ
$ docker push アカウント名/python3_env
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Docker + CircleCI + Rails】Missing secret_key_base エラー

環境

Ruby 2.7.1
Rails 6.0.3.4

CircleCIを使って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として受け取る事が出来るとのことです。

参考にさせていただいた記事

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

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したイメージを使用してコンテナを起動
image.png

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で起動)
image.png

再びメッセージが出力されます

メッセージにある、https://aka.ms/wsl2kernel の[x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージ]をクリックすると、wsl_update_x64.msi がダウンロードされますので、
ダウンロードが完了したら、こちらを実行します。

[Next]をクリック

[Finish]をクリック

[Restart]をクリック

Docker Desktopの画面が起動するので、[Skip tutorial]をクリック

コンテナがなにも起動していない状態と表示されている

Docker Desktopでサンプルコンテナを起動

Power Shellを起動

Dockerのバージョン確認

※Dockerがインストールされているかの確認

docker version

image.png

イメージの確認

docker images

イメージはない状態
image.png

コンテナ稼働状態の確認

http://docs.docker.jp/v17.06/engine/reference/commandline/ps.html

docker ps -a

コンテナはまだ作成されていない状態
image.png

サンプルのコンテナを起動

getting-startedのイメージを使用して、コンテナ名はtutorial、コンテナのポート80は、ホストマシンのポート80に割り当てコンテナを起動。

docker run -d --name tutorial -p 80:80 docker/getting-started 

コンテナ稼働状態の確認

docker ps -a

runコマンドでしていしたtutorial という名前のコンテナが起動している。(STATUS が UP になっている)

image.png

ブラウザで localhost と入力

image.png

Getting Started のページが表示される
image.png

イメージの確認

docker images

runコマンドで指定した、getting-startedのImageがある
image.png

コンテナを停止、状態確認

docker stop <コンテナ名>
docker ps -a

STATUSがExitになり、コンテナが停止。
image.png

コンテナを削除

docker rm <コンテナ名>
docker ps -a

image.png

イメージを削除、確認

docker rmi <イメージ名>
docker images

イメージ削除後、docker images で確認してイメージが削除されたことを確認。
image.png

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にアクセスして、アカウント作成

https://hub.docker.com/
 

登録したemailにメールが届く

[Verify email address]をクリック

Docker ID、パスワードでSign In

Oracle Database Enterprise Editon のイメージを検索


利用規約を確認して[Proceed Checkout]をクリック

各種情報を入力して、[Get Content]をクリック

Oracle Database Enterprise Editon のイメージをPull

Power Shellを起動して、Docker Hubにログイン

docker login

Docker IDとパスワードを入力

Oracle Database Enterprise Edition のイメージをPull

docker pull store/oracle/database-enterprise:12.2.0.1
docker images

docker 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は使える状態になっています。
image.png

作成されたコンテナを確認

docker ps -a 

image.png

設定されている設定項目

設定項目 設定値
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

image.png

コンテナ停止の際、DBのアラートログを見ると、DBをshutdown immediate でDBをシャットダウンしていました。
image.png

[検証その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のデータは引き継ぐことができることが確認できました。

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

Docker×Git×VSCodeの環境構築は多分これが一番やさしい説明だと思います。

環境

  • Windows 10 Pro

詳細なシステム要件は以下のページで確認。(Hyper-Vを有効にするための要件)

https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/reference/hyper-v-requirements

準備するもの

  1. Docker Desktop for Windows
  2. Git for Windows
  3. Visual Studio Code

この記事では1,2,3の順番で説明。

Docker Desktop for Windowsをインストール

  1. ダウンロードページへ移動(https://www.docker.com/products/docker-desktop)
  2. 「Download for Windows」をクリックしてダウンロード

image.png
 
3. ダウンロードしたインストーラをクリックしてインストール開始

image.png
 
4. インストーラを起動したらOKを押下(「Enable Hyper-V Windows Features」をチェックすることでHyper-Vを有効にしてくれる)

image.png
 
5. 「Close and restart」を押下して再起動

image.png
 
6. 再起動後、自動的にDockerが起動したら完了

image.png

再起動後に「WSL 2 installtion is incomplete」のエラーが発生する場合

現象

再起動後、自動的にDockerが起動する。その際に以下のエラーが発生。

image.png

解消方法

  1. 以下のリンクに移動して、「x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージ」をクリック

https://docs.microsoft.com/ja-jp/windows/wsl/install-win10#step-4---download-the-linux-kernel-update-package

image.png
 
2. ダウンロードしたファイルをクリックして更新プログラムパッケージを実行

image.png
 
3. Nextを押下して実行

image.png
 
4. Finishを押下してダイアログを閉じる

image.png
 
5. エラーのダイアログでRestartを押下

image.png

Git for Windowsのインストール

  1. ダウンロードページへ移動(https://gitforwindows.org/)
  2. 「Download」をクリックしてインストーラをダウンロード

image.png
 
3. ダウンロードしたインストーラをクリックしてインストール開始

image.png
 
4. Nextを押下

image.png
 
5. インストール場所を指定。特に理由が無ければデフォルトにしてNextを押下

image.png
 
6. コンポーネントの選択。これも特に理由が無ければデフォルトにしてNextを押下

image.png
 
7. Nextを押下

image.png
 
8. Gitのデフォルトのエディタを選択。ここは特に気にする必要はないのでNextを押下(後で変更可能)

image.png
 
9. Gitで新しくリポジトリを作成するときのデフォルトの初期ブランチ名を決定。特にこだわりが無ければ「Let Git decide」を選択してNextを押下

image.png
 
10. Nextを押下

image.png
 
11. HTTPS接続するときのSSL/TLSライブラリを選択。「Use the OpenSSL library」を選択してNextを押下

image.png
 
12. ここは要注意。チェックアウト・コミット時の改行コードの選択。以下の表を参照して選択し、Nextを押下

選択肢 チェックアウト時 コミット時
Checkout Winsows-style,
commit Unix-style line endings
LF -> CRLF CRLF -> LF
Checkout as-is,
commit Unix-style line endings
変換しない CRLF -> LF
Checkout as-is,
commit as-is
変換しない 変換しない

image.png
 
13. GitBashのターミナルを選択。特に理由が無ければデフォルトを選択してNextを押下

image.png

  1. git pullの振る舞いを選択。特に理由が無ければデフォルトを選択してNextを押下

image.png
 
15. 「Enable Git Credential Manager」を選択してNextを押下(https接続時に入力したパスワードを保持してくれる)

image.png

  1. 「Enable file system caching」を選択してNextを押下(ファイルシステムのキャッシュを利用する)

image.png

  1. 「Enable experimental support for pseudo consoles」のチェックをしない(バグがある模様)。Installを押下

image.png
 
18. Finishを押下して完了(リリースノートが表示されるが、どうでもよい)

image.png

Visual Studio Codeのインストール

  1. ダウンロードページへ移動(https://code.visualstudio.com/download)
  2. WindowsのInstallerをクリックしてインストーラをダウンロード

キャプチャ.PNG
 
3. インストーラをクリックしてインストール開始

image.png
 
4. 使用許諾契約書の同意。「同意する」を選択して次へを押下

image.png
 
5. インストール先の選択。デフォルトのままで次へを押下

image.png
 
6. スタートメニューフォルダーの指定。デフォルトのままで次へを押下

image.png
 
7. 追加タスクの選択。特に理由が無ければデフォルトで次へを押下

image.png
 
8. インストール先などを確認して、インストールを押下

image.png
 
9. 完了を押下してインストール完了(Visual Studio Codeが自動的に実行される)

image.png

Visual Studio Codeの拡張機能

  1. Visual Studio Codeを起動して「Ctrl」+「Shift」+「X」を押下して拡張機能を選択
  2. 検索ボックスで検索して、以下の拡張機能をインストールする
  • Japanese Language Pack for Visual Studio Code:日本語化の拡張機能
  • Remote-Containers:Dockerコンテナ内開発ができる拡張機能

image.png

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

Docker×Git×VSCodeの環境構築は多分これが一番やさしい説明だと思います

環境

  • Windows 10 Pro

詳細なシステム要件は以下のページで確認。(Hyper-Vを有効にするための要件)

https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/reference/hyper-v-requirements

準備するもの

  1. Docker Desktop for Windows
  2. Git for Windows
  3. Visual Studio Code

この記事では1,2,3の順番で説明。

Docker Desktop for Windowsをインストール

  1. ダウンロードページへ移動(https://www.docker.com/products/docker-desktop)
  2. 「Download for Windows」をクリックしてダウンロード

image.png
 
3. ダウンロードしたインストーラをクリックしてインストール開始

image.png
 
4. インストーラを起動したらOKを押下(「Enable Hyper-V Windows Features」をチェックすることでHyper-Vを有効にしてくれる)

image.png
 
5. 「Close and restart」を押下して再起動

image.png
 
6. 再起動後、自動的にDockerが起動したら完了

image.png

再起動後に「WSL 2 installtion is incomplete」のエラーが発生する場合

現象

再起動後、自動的にDockerが起動する。その際に以下のエラーが発生。

image.png

解消方法

  1. 以下のリンクに移動して、「x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージ」をクリック

https://docs.microsoft.com/ja-jp/windows/wsl/install-win10#step-4---download-the-linux-kernel-update-package

image.png
 
2. ダウンロードしたファイルをクリックして更新プログラムパッケージを実行

image.png
 
3. Nextを押下して実行

image.png
 
4. Finishを押下してダイアログを閉じる

image.png
 
5. エラーのダイアログでRestartを押下

image.png

Git for Windowsのインストール

  1. ダウンロードページへ移動(https://gitforwindows.org/)
  2. 「Download」をクリックしてインストーラをダウンロード

image.png
 
3. ダウンロードしたインストーラをクリックしてインストール開始

image.png
 
4. Nextを押下

image.png
 
5. インストール場所を指定。特に理由が無ければデフォルトにしてNextを押下

image.png
 
6. コンポーネントの選択。これも特に理由が無ければデフォルトにしてNextを押下

image.png
 
7. Nextを押下

image.png
 
8. Gitのデフォルトのエディタを選択。ここは特に気にする必要はないのでNextを押下(後で変更可能)

image.png
 
9. Gitで新しくリポジトリを作成するときのデフォルトの初期ブランチ名を決定。特にこだわりが無ければ「Let Git decide」を選択してNextを押下

image.png
 
10. Nextを押下

image.png
 
11. HTTPS接続するときのSSL/TLSライブラリを選択。「Use the OpenSSL library」を選択してNextを押下

image.png
 
12. ここは要注意。チェックアウト・コミット時の改行コードの選択。以下の表を参照して選択し、Nextを押下

選択肢 チェックアウト時 コミット時
Checkout Winsows-style,
commit Unix-style line endings
LF -> CRLF CRLF -> LF
Checkout as-is,
commit Unix-style line endings
変換しない CRLF -> LF
Checkout as-is,
commit as-is
変換しない 変換しない

image.png
 
13. GitBashのターミナルを選択。特に理由が無ければデフォルトを選択してNextを押下

image.png

  1. git pullの振る舞いを選択。特に理由が無ければデフォルトを選択してNextを押下

image.png
 
15. 「Enable Git Credential Manager」を選択してNextを押下(https接続時に入力したパスワードを保持してくれる)

image.png

  1. 「Enable file system caching」を選択してNextを押下(ファイルシステムのキャッシュを利用する)

image.png

  1. 「Enable experimental support for pseudo consoles」のチェックをしない(バグがある模様)。Installを押下

image.png
 
18. Finishを押下して完了(リリースノートが表示されるが、どうでもよい)

image.png

Visual Studio Codeのインストール

  1. ダウンロードページへ移動(https://code.visualstudio.com/download)
  2. WindowsのInstallerをクリックしてインストーラをダウンロード

キャプチャ.PNG
 
3. インストーラをクリックしてインストール開始

image.png
 
4. 使用許諾契約書の同意。「同意する」を選択して次へを押下

image.png
 
5. インストール先の選択。デフォルトのままで次へを押下

image.png
 
6. スタートメニューフォルダーの指定。デフォルトのままで次へを押下

image.png
 
7. 追加タスクの選択。特に理由が無ければデフォルトで次へを押下

image.png
 
8. インストール先などを確認して、インストールを押下

image.png
 
9. 完了を押下してインストール完了(Visual Studio Codeが自動的に実行される)

image.png

Visual Studio Codeの拡張機能

  1. Visual Studio Codeを起動して「Ctrl」+「Shift」+「X」を押下して拡張機能を選択
  2. 検索ボックスで検索して、以下の拡張機能をインストールする
  • Japanese Language Pack for Visual Studio Code:日本語化の拡張機能
  • Remote-Containers:Dockerコンテナ内開発ができる拡張機能

image.png

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