20210226のdockerに関する記事は14件です。

apple m1 でDockerが動かない

ファイアウォールの Block all incoming connections をオフにすれば動く

Block all incoming connections 自体は、開発中のサーバ立ち上げるたびに外部から通信許可しますか的なプロントが出るので、それを全てブロックする設定なんですが、全然ネットでも引っ掛からなかったのでみんなもしかしてファイアウォール設定していないとか。。Macって初期状態で、いまだにファイアウォールオフになってるんですよね。そのままカフェとか行くと危ないんですよね。。みんな設定ちゃんとしてるんですかね。

参考にしたサイト
* https://github.com/docker/for-mac/issues/5130#issuecomment-757337509
* https://github.com/docker/for-mac/issues/5140

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

Linuxにdockerをワンパンでインストールする方法

まとめ

Rancherがワンパンでインストールできるスクリプトを提供してくれてる模様

curl https://releases.rancher.com/install-docker/<dockerのバージョン>.sh | sh

dockerのバージョンはここで確認

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

【docker】ローカルサーバーが遅い!快適に開発する方法

解決方法と原因

原因は、ローカルホストだと名前解決に時間がかかる事から起こります。

ローカルホスト名を確認

$ hostname
XXX.local

/etc/hosts の編集する

権限が必要なため、sudoでvimを開いて編集していきます。

$ sudo vi /etc/hosts

hosts(ホスツ)ファイルは、ドメインとIPを関連付ける行うファイルです。もう少し詳しく書けば、IPアドレスとホスト名の組み合わせが一覧で記載されているファイルです。

127.0.0.1   localhost XXX.local
::1         localhost XXX.local

このように編集して終了です。

参考

ローカルサーバーのレスポンスが遅いときはホスト名をマップする

【Mac】hostsファイルの場所と変更方法!ターミナルとテキストエディットどちらでも!

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

Raspberry Pi上のDocker環境でMetabase構築

はじめに

Raspberry Piの上にDocker環境を作って、Metabaseをコンテナとして起動する時のメモ。

環境

  • Raspberry Pi 3 Model B
$ cat /etc/os-release 
PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"
NAME="Raspbian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

なお、ラズパイの初期設定などは他の記事などを参考にしてください。

やったこと

Docker / docker-composeインストール

こちらを参考にインストール。

$curl -sSL https://get.docker.com | sh

バージョン確認。

$docker --version
Docker version 20.10.3, build 48d30b5

次にdocker-composeをインストール。

$sudo pip3 install docker-compose

Metabaseコンテナ作成

結論として最終的に動いたDockerfileは次の通り。

FROM arm32v7/adoptopenjdk:11.0.10_9-jdk-hotspot

RUN mkdir /apps
WORKDIR /apps/

RUN apt update
RUN apt install -y wget
RUN wget https://downloads.metabase.com/v0.38.0.1/metabase.jar

EXPOSE 3000

CMD java -jar metabase.jar

コンテナを動かすまでに2つ引っかかった点がありました。

ARM用のコンテナイメージでないと動かない

こちらにも記載されているように、CPUアーキテクチャーがARMのため、Metabaseの公式ドキュメントに書かれている、次のコマンドだと動かないです。

docker run -d -p 3000:3000 --name metabase metabase/metabase

DockerhubのARM用のコンテナイメージの一覧から選ぶのですが、2021年2月23日時点でMetabaseのイメージはありませんでした。
Metabaseをローカルにインストールする方法に記載されているように、Java(今回はAdoptOpenJDKを使用)環境があるarm32v7/adoptopenjdk:11.0.10_9-jdk-hotspotというイメージを使いました。

apt updateでエラー発生(signature error)

最初にDockerイメージに入ってapt updateをしたらsignature errorが発生して実行できず。
調べてみると、まさにarm32v7のubuntuイメージで発生するようなエラーのようです。
こちらの記事によるとlibseccompというファイルに起因するエラーのようで、最新版をダウンロードしてインストールすることで回避できるとのこと。

なお、これはコンテナ内の問題ではなくて、ホスト側のラズパイ側の問題のようなので、ラズパイのコンソール上で以下のページで最新版のlibseccompを持ってきて、インストールします。
http://ftp.debian.org/debian/pool/main/libs/libseccomp/

$wget http://ftp.debian.org/debian/pool/main/libs/libseccomp/libseccomp2_2.5.1-1_armhf.deb
$sudo dpkg -i libseccomp2_2.5.1-1_armhf.deb 

DBも併せてdocker-composeで起動

以下のようにディレクトリ構造を用意しました。

$ tree
.
├── docker-compose.yaml
├── metabase
│   ├── Dockerfile
│   └── data
├── postgres
│   ├── data
│   └── init
│       └── create_db.sql
└── reverse-proxy
    └── nginx.conf

docker-compose.yamlは次の通りで、Metabaseの他にDB(PostgreSQL)とリバースプロキシ用のnginxを用意しています。
(リバプロは不要ですが、作ってみたかっただけです)

docker-compose.yaml
$ cat docker-compose.yaml 
version: '3'

services:
  metabase:
    build: ./metabase
    container_name: metabase
    ports:
      - 3000:3000
    volumes:
      - ./metabase/data:/metabase-data
    environment:
      - MB_DB_FILE=/metabase-data/metabase.db

  postgres:
    image: arm32v7/postgres:latest
    ports:
      - 5432:5432
    volumes:
      - ./postgres/data:/var/lib/postgresql/data
      - ./postgres/init:/docker-entrypoint-initdb.d
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password

  reverse-proxy:
    image: arm32v7/nginx:latest
    volumes:
      - ./reverse-proxy/nginx.conf:/etc/nginx/nginx.conf
    ports:
      - 80:80
    depends_on:
      - metabase

create_db.sqlnginx.confについては以下の通りですが、大したことはしていないです。
リバプロはMetabaseへプロキシしているだけです。

create_db.sql
CREATE DATABASE qiita_db;
nginx.conf
events {
    worker_connections  16;
}
http {
    proxy_read_timeout 300;
    proxy_connect_timeout 300;
    proxy_send_timeout 300;

    server {
        listen 80;
        server_name localhost;
        location / {
            proxy_pass http://metabase:3000/;
            proxy_redirect off;
        }
    }
}

あとは起動します。

$docker-compose up -d
$ docker ps
CONTAINER ID   IMAGE                     COMMAND                  CREATED        STATUS        PORTS                    NAMES
0bb0fee61322   arm32v7/postgres:latest   "docker-entrypoint.s…"   25 hours ago   Up 25 hours   0.0.0.0:5432->5432/tcp   apps_postgres_1
db1acb60d29a   apps_metabase             "/bin/sh -c 'java -j…"   2 days ago     Up 2 days     0.0.0.0:3000->3000/tcp   metabase
7d6394803990   arm32v7/nginx:latest      "/docker-entrypoint.…"   2 days ago     Up 2 days     0.0.0.0:80->80/tcp       apps_reverse-proxy_1

動作確認

同じLAN内の別PCからブラウザで
http://<ラズパイのIPアドレス>
にアクセスすると無事にMetabaseの画面が表示されました。
※ 自分の環境だとラズパイのIPアドレスは192.168.0.20です。
※ 本当は初期設定画面が表示されますが、キャプチャは設定後のログイン画面になります(すみません、キャプチャし忘れました)。

Untitled.png

参考

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

Rails・Laravel・Docker・React環境構築一覧

本記事は、TechpitがQiitaで投稿している環境構築記事のまとめです。

今後も適時更新していきます(最終更新日:2021/2/26)

「〇〇の環境構築も掲載してほしい!」
「〇〇のエラーが解決できない」
等ありましたら、ぜひコメントしてください。

記事一覧表

Ruby on Rails

0から Ruby on Rails の環境構築【macOS】 (Homebrew のインストールから Rails のインストールまで)

0からRuby on Railsの環境構築【Cloud9】(Rubyのバージョン変更からRailsのインストールまで)

Laravel

【最新版】はじめてのLaravel!Laradockを用いたLaravel開発環境構築

React

React環境構築【Node.jsのインストールからCreate React Appまで】~macOS編~

React環境構築【Node.jsのインストールからCreate React Appまで】~Windows編~

Docker

?【すぐ開発を始めたい人向け】DockerをMacにインストールする手順?

?WindowsでDockerを始める手順?

?Docker Toolboxのインストール?

今後もプログラミング学習に役立つような情報を発信していきます!アカウントをフォローしてお待ちください!

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

.NETでDockerを利用したローカル開発時にもAWS Profileを使ってシークレットを安全に引き渡す

はじめに

 ローカル開発時に.NETのプログラムからAWSの各サービスを利用するには、認証情報としてAWSのプロファイル情報を利用するか、アクセスキーとシークレットキーを設定する必要があります。プログラムの設定ファイルなどにアクセスキーやシークレットキーを記載すると、誤ってソース管理リポジトリに公開してしまう危険があるため、可能であればAWSプロファイルを利用してAWSに接続することが推奨されます。
 この記事では、Dockerを利用したローカル開発時に、AWS Profileを利用してシークレットを安全に取り扱う方法について解説します。

プロファイルを利用した.NET CoreでのAWSサービスの利用

 .NET CoreでAWSの各サービスを利用する場合は下記のドキュメントに記載されている通り、設定ファイル(appsettings.json)に利用するAWSのプロファイル情報を定義し、Startup時にAddDefaultAWSOptions拡張メソッドで前述の設定内容を有効にすることが推奨されています。
https://docs.aws.amazon.com/ja_jp/sdk-for-net/v3/developer-guide/net-dg-config-netcore.html

具体的には、下記のようになります。

appsettings.json
{
  "AWS": {
    "Profile": "DevProfile",
    "Region": "ap-northeast-1"
  }
}
Startup.cs(AWSサービスのDI設定)
public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDefaultAWSOptions(Configuration.GetAWSOptions());
        services.AddAWSService<IAmazonSecretsManager>();

        /// ... 略 ...
    }
    /// ... 略 ...
}
サービスの利用
public class HomeController : ControllerBase
{
    private readonly IAmazonSecretsManager _amazonSecretsManager;
    public HomeController (IAmazonSecretsManager amazonSecretsManager)
    {
        _amazonSecretsManager = amazonSecretsManager;
    }
    public async Task<string> Get()
    {
        var secret = await _amazonSecretsManager.GetSecretValueAsync(new GetSecretValueRequest
            {
                SecretId = "MySecret"
            });
        return secret.SecretString;
    }
}

 Visual StudioでIISにホストしたり、dotnet runでWebサイトをセルフホストした場合はこれで問題ありませんが、Dockerにホストした場合はDocker内に設定ファイル(appsettings.jsonで指定した)AWSプロファイルが存在しないため、下記のような例外が発生します。

AWSプロファイルからAWSの接続情報が取得できないために発生する例外
Amazon.Runtime.AmazonServiceException: Unable to get IAM security credentials from EC2 Instance Metadata Service.
   at Amazon.Runtime.DefaultInstanceProfileAWSCredentials.FetchCredentials()
   at Amazon.Runtime.DefaultInstanceProfileAWSCredentials.GetCredentials()
   at Amazon.Runtime.DefaultInstanceProfileAWSCredentials.GetCredentialsAsync()
   at Amazon.Runtime.Internal.CredentialsRetriever.InvokeAsync[T](IExecutionContext executionContext)
   at Amazon.Runtime.Internal.RetryHandler.InvokeAsync[T](IExecutionContext executionContext)
   at Amazon.Runtime.Internal.RetryHandler.InvokeAsync[T](IExecutionContext executionContext)
   at Amazon.Runtime.Internal.CallbackHandler.InvokeAsync[T](IExecutionContext executionContext)
   at Amazon.Runtime.Internal.CallbackHandler.InvokeAsync[T](IExecutionContext executionContext)
   at Amazon.Runtime.Internal.ErrorCallbackHandler.InvokeAsync[T](IExecutionContext executionContext)
   at Amazon.Runtime.Internal.MetricsHandler.InvokeAsync[T](IExecutionContext executionContext)

Docker利用のAWSプロファイルの利用

 アクセスキーとシークレットキーを設定してもよいのですが、せっかく機密情報を記載しなくてもよい仕組みがあるのでプロファイルを利用したいですよね。AWSプロファイルは、各ユーザーのホームディレクトリ直下の.awsディレクトリに保存されています。このディレクトリ配下の設定情報はどのOSでも共通になっているので、このフォルダーをボリュームマウントしてあげればよさそうです。

Visual Studioを利用している場合は、コンテナーオーケストレーターのサポートから
image.png
Docker Composeを追加して、
image.png
docker-compose.override.ymlにホームディレクトリ/.awsディレクトリを各コンテナのホームディレクトリにマウントする設定を追加してあげましょう。AWSプロファイル名は各開発者で異なる可能性があるので、AWSプロファイル名もこちらに書いておくと良いかもしれませんね。

docker-compose.override.yml
version: '3.4'

services:
  app:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=https://+:443;http://+:80
      - AWS__Profile=DevProfile # 追加
    ports:
      - "80"
      - "443"
    volumes:
      - ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro
      - ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro
      - ${USERPROFILE}/.aws:/root/.aws/:ro # 追加

プロファイルからアクセスキーとシークレットキーが取得できていますね。
image.png

まとめ

  • AWSに接続する場合はできるだけAWSプロファイルを利用する。
  • ローカルでDockerコンテナの中からAWSに接続する場合はホストの.awsディレクトリをマウントしてAWSプロファイルを利用する。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

.NET(Core)で利用可能なDockerイメージとタグ

はじめに

Dockerfileのメンテナンスをしていて、あれ?このバージョンの.NETで利用可能なタグは何だっけか?を調べるためのメモです。

利用可能な.NET(Core)のコンテナリポジトリ

.NETのDockerイメージはDockerHubから確認できます。
コンテナイメージはMicrosoftのDockerリポジトリにホストされているので下記のリポジトリからPullできます。

.NET Coreはもともと下記のリポジトリで公開されていましたが、.NET5で.NET Frameworkと.NET Coreが統合されたためコンテナリポジトリも変更されています。引き続きPullできますが新しいコンテナイメージを作成する場合は使わない方が良いでしょう。

利用可能なタグ、OSの種類

.NET(Core)のバージョンごとに利用できるOSのベースイメージは結構違いがあって、それぞれ下記のようなタグで公開されています。

公式ではAlpineは最新(.NET 5)以外はだいぶ絞られていますね。
mcr.microsoft.com/dotnet/sdkで公開されているイメージの一覧を表にしたものです。

OS Version .NET Core 2.1 .NET Core 3.1 .NET 5 .NET 6(Preview)
Debian 9(stretch) 2.1-stretch-slim
Debian 10(buster) 3.1-buster-slim 5.0-buster-slim
Debian 11(bullseye) 6.0-bullseye-slim
Alpine 3.11 5.0-alpine3.11
Alpine 3.12 2.1-alpine3.12 3.1-alpine3.12 5.0-alpine3.12
Alpine 3.13 5.0-alpine3.13 5.0-alpine3.13
Ubuntu 18(bionic) 2.1-bionic 3.1-bionic
Ubuntu 20(focal) 2.1-focal 3.1-focal 5.0-focal 6.0-focal

また5以前であれば以前のリポジトリ(mcr.microsoft.com/dotnet/core/sdk)からもPullできます。こちらはAlpine9などの古いイメージも引き続き公開されているようです。

OS Version .NET Core 2.1 .NET Core 3.1
Debian 9(stretch) 2.1-stretch
Debian 10(buster) 3.1-buster
Alpine 3.9 2.1-alpine3.9
Alpine 3.10 2.1-alpine3.10 3.1-alpine3.10
Alpine 3.11 2.1-alpine3.11 3.1-alpine3.11
Alpine 3.12 2.1-alpine3.12 3.1-alpine3.12
Ubuntu 18(bionic) 2.1-bionic 3.1-bionic
Ubuntu 20(focal) 2.1-focal 3.1-focal
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Docker】エラー Could not find gem 'mysql2 (~> 0.5)' in any of the gem sources listed in your Gemfile

はじめに

Dockerの環境構築中に発生したエラーの解決した方法を記録します。
ただ、エラーは発生までの経緯で解決方法が違ってくるので、参考程度にしてください。

【エラー文】
Could not find gem 'mysql2 (~> 0.5)' in any of the gem sources listed in your Gemfile

環境

Docker version 20.10.0
docker-compose version 1.27.4

Docker内の環境

ruby:2.6.5
Rails:6.0.0
データベース:mysql

Dockerfile

docker-compose.yml
FROM ruby:2.6.5
RUN apt-get update && apt-get install -y \
    build-essential \
    libpq-dev \
    nodejs\
    vim 

WORKDIR /[作成したディレクトリ名]
COPY Gemfile Gemfile.lock /[作成したディレクトリ名]/
RUN bundle install

docker-compose.yml

docker-compose.yml
version: '3'

services:
  web:
    build: .
    ports:
      - 3000:3000
    volumes:
      - '.:/[作成したディレクトリ名]'
    tty: true
    stdin_open: true

結論

結論は以下の2点を事項することで解決に至りました。
・bundle installしてmysqlをインストール
・webpackerをインストール

経緯と対応

dockerc-composeでコンテナを作成後Railsのセットアップを行いサーバーを起動した時に発生しました。
エラー内容はmysql2が見つからないという内容でした。

対応1

Dockerfileにmysqlの記述がないから当然??と思いましたが、Gemfileにはmysqlが記述されてるのでとりあえずコンテナ内でbundle installをしてインストールしてみることにしてみました。

かなり時間が経ってgemfileにインストールされました。

対応2

再びrails s -b 0.0.0.0をして起動しようと試みましたが今度はPlease run rails webpacker:install Error dockerというエラーが出ました。
これも、Dockerfileに書いてないので当然??と思いながら調べてるとwebpackerを使う為にはyarnが必要で、yarnをインストールする為には下記の記述も必要との事でDockerfileを編集してイメージ作成からやり直しました。
最後コンテナ内でwebpackerをインストールするとうまくいきました。

対応2の手順

Dockerfileにyarnを追記します。

Dockerfile
FROM ruby:2.6.5
RUN apt-get update && apt-get install -y \
    build-essential \
    libpq-dev \
    nodejs\
    yarn \ ←ここ
    vim 

WORKDIR /exam
COPY Gemfile Gemfile.lock /exam/
RUN bundle install

rails webpacker:installのコマンドを入力してwebpackerをインストールします。

ターミナル
root@c21d03f52523:/exam# rails webpacker:install
.
.
.
省略
Webpacker successfully installed ? ?
root@c21d03f52523:/exam# 

サーバーを起動します。

ターミナル
root@c21d03f52523:/exam# rails s -b 0.0.0.0
=> Booting Puma
=> Rails 6.1.2.1 application starting in development 
=> Run `bin/rails server --help` for more startup options
Puma starting in single mode...
* Puma version: 5.2.1 (ruby 2.6.5-p114) ("Fettisdagsbulle")
*  Min threads: 5
*  Max threads: 5
*  Environment: development
*          PID: 156
* Listening on http://0.0.0.0:3000
Use Ctrl-C to stop

かなり時間がかかりましたが、インストール後rails s -b 0.0.0.0で見事サーバーが立ち上がりました!

この記事では上記のエラー解決のみの内容ですがこの後データベースを作ってDocker内での開発環境を整えて行きます。
もしこの先にもご興味あれば下記の記事を参考にしてみてください。

【Docker】Ruby2.6.5とRails6.0.0とmysql DockerComposeで環境構築
後日更新予定

最後に

Dockerについて完全に理解できておらず、今回の対応も対処療法ですのでこれからも継続学習が必要です。
万が一情報が間違っている場合ご指摘していただけると幸いです。

参考

https://qiita.com/matata0623/items/2ff3125d2cdbd5c13528

https://qiita.com/anx/items/88cb4bbf67ff6c046e32

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

CircleCIでDockerを使えないときの対処法(ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?)

最近、個人開発でCircleCIを導入中です。
が、情弱すぎるが故に大苦戦を強いられています:tired_face:

CircleCIってbitriseなんかとは違ってガッツリymlを手書きするスタイルなんですね。
こっちの方が好きかもです。

で、今回そこそこ苦戦を強いられたエラーですが

ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?

↑これです。
dockerを使っている人なら結構見覚えありますよね。以前にも何度も苦しめられたのですが、今回もです。

「これって、dockerグループ作って、自分をそこに追加すれば良いやつだよな。それかservice docker startでいけるやろ:tired_face:
↑安易にそう思って敵とすら認識しなかったのですが・・・

・・・全然直らない

結論

結論から言うと、CircleCIのコンテナ(コンテナへの入り方は後述)の/run/docker-temp.sockの権限が問題だったようです

sudo docker-compose up -d
でも動くと思いますが、sudoつけてdockerを動かすと何かと不具合が多発した記憶があるのでできればなしで動くようにしたい・・・

というわけで早速、CircleCIのコンテナ内の/runの配下の権限をみてみます

$ls -al /run
total 16
drwxr-xr-x 1 root        root        4096 Sep  6 08:33 .
drwxr-xr-x 1 root        root        4096 Sep  6 08:33 ..
srw-rw---- 1 root        root           0 Sep  5 02:54 docker-temp.sock
lrwxrwxrwx 1 root        root          25 Sep  6 08:33 docker.sock -> /var/run/docker-temp.sock
drwxr-x--- 2 Debian-exim Debian-exim 4096 Sep  6 00:06 exim4
drwxrwxrwt 2 root        root        4096 Aug 31 00:00 lock
-rw-rw-r-- 1 root        utmp           0 Aug 31 00:00 utmp

docker-temp.sockのグループがroot rootになっています。
これに対して

sudo chown $(whoami):$(whoami) /run/docker-temp.sock

これをやれば使えるようになりました。実際のconfig.ymlを下の方に貼っときました
(※セキュリティ的な懸念があればどなたか教えてください。)

その他の考えられる原因

config.ymlのstepsに

- setup_remote_docker

これが含まれているか確認してください(エラー文の通り、dockerが起動していない可能性)

CircleCIのコンテナへの入り方(最下部にある参考文献より引用多し)

まずは、コンテナを10分間立ち上げるためにほぼ空っぽのconfig.ymlを用意します。

config.yml
version: 2
jobs:
  build:
    working_directory: ~/app
    docker:
      - image: circleci/python:3.6
    steps:
      - setup_remote_docker
      - run:
          name: test
          command: sleep 600

(引用)

次にdocker psで

$ docker ps
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS               NAMES
e1ebbeccc823        circleci/python:3.6   "/bin/sh"           7 seconds ago       Up 5 seconds                            vigorous_brattain
16ba46868114        circleci/picard       "circleci build"    9 seconds ago       Up 7 seconds                            hardcore_murdock

一番目のコンテナに入ります

$ docker exec -it vigorous_brattain bash

そしてsocketの権限を確認します

circleci@e1ebbeccc823:/$ ls -al /run
total 16
drwxr-xr-x 1 root        root        4096 Sep  6 08:33 .
drwxr-xr-x 1 root        root        4096 Sep  6 08:33 ..
srw-rw---- 1 root        root           0 Sep  5 02:54 docker-temp.sock
lrwxrwxrwx 1 root        root          25 Sep  6 08:33 docker.sock -> /var/run/docker-temp.sock
drwxr-x--- 2 Debian-exim Debian-exim 4096 Sep  6 00:06 exim4
drwxrwxrwt 2 root        root        4096 Aug 31 00:00 lock
-rw-rw-r-- 1 root        utmp           0 Aug 31 00:00 utmp

こんな感じで、コンテナに入ってsocketの権限を確認できます。

作成したconfig.yml

実際に動作したものを切り抜いて載せます

config.yml
version: 2.1

executors:
  python_executor:
    docker:
      - image: circleci/python:3.8.2
    working_directory: ~/repo

jobs:
  build:
    executor: python_executor
    steps:
      - checkout
      - setup_remote_docker
      - run: 
          name: up
          command: |
            sudo chown root:$(whoami) /run/docker-temp.sock
            docker-compose up -d --build

こんな感じでどうにか動いて、ローカルでCIが動作しました。
明日はpushしてリモートで回してみますが、うまくいくと良いのですが・・・(フラグ)

参考

圧倒的感謝:bow::bow::bow:

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

【メモ】Laravel6/7 (laravel/ui)でのLogin機能の実装方法

Laravel6/7 (laravel/ui)でのLogin機能の実装方法

#Laravel 6.x
composer require laravel/ui:^1.0 --dev

#laravel 7の場合
composer require laravel/ui:^2.4
root@***********::/work# 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.
C:\Users\name\*****\*****\backend>npm install

npm WARN deprecated axios@0.19.2: Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410
                                                        ~~省略~~
C:\Users\name\*****\*****\backend>npm run dev

> @ dev C:\Users\name\*****\*****\backend
> npm run development

> @ development C:\Users\name\*****\*****\backend
> cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --config=node_modules/laravel-mix/setup/webpack.config.js
                                                        ~~省略~~

これで完璧!!!

今後は自作できるように頑張ります。

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

Ruby 3.x, Rails 6.x, MySQL 8.x の Docker 環境構築。

概要

Docker と docker-compose を使い、アプリケーションサーバを Ruby 3.x, Ruby on Rails 6.x、DB サーバを MySQL 8.x でコンテナの構築するまでの手順となります。

なお、この記事ではセキュリティについての考慮は一切していません。

Windows 10 の WSL2 - Ubuntu 18.04 と Mac で確認していますが、後述する理由により Mac の方がお勧めです。

PostgreSQL の方が好みの方は、以下のページをご確認ください。
cf. クィックスタート: Compose と Rails

前提

下記の環境が設定されていること。

Windows 10

  • WSL2 Ubuntu 18.04+
  • Docker
  • docker-compose
  • MySQL Client(必要に応じて)

Mac

  • Docker
  • docker-compose
  • Docker Desktop for Mac
  • MySQL Client(必要に応じて)

また、Docker のサービスが起動済みであること。

初期ファイル構成

以下のファイルから Rails プロジェクトを新規に作成します。

.
├── docker
│   ├── app
│   │   ├── Dockerfile
│   │   └── entrypoint.sh
│   └── db
│       ├── Dockerfile
│       ├── conf.d
│       │   └── my.cnf
│       └── initdb.d
│           └── init.ddl.sql
├── scripts
│   └── wait-for-it.sh
├── docker-compose.yml
├── Gemfile
└── Gemfile.lock

初期ファイル設定

docker-compose.yml

注意点は app 側の build: context: で基準になるフォルダを root として、Dockerfile のパスを指定しているところです。
これは Dockerfile 内で Gemfile をコピーする必要があるのですが、build: ./docker/app としてしまうとフォルダを遡って Gemfile の操作ができないため、起点を root にしています。
Dockerfile が root にあれば関係ないのですが、今回は docker フォルダ下にしているため、このような対応となります。

また app の command: で先述の wait-for-it.sh を利用し、DB が起動するまで rails server を立ち上げないようにしています。

docker-compose.yml
version: "3.3"

services:
  db:
    container_name: "db"
    build: ./docker/db
    restart: always
    tty: true
    environment:
      MYSQL_DATABASE: app_development
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: password
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    ports:
      - "3306:3306"
    volumes:
      - ./docker/db/conf.d:/etc/mysql/conf.d
      - ./docker/db/initdb.d:/docker-entrypoint-initdb.d
    networks:
      - backend

  app:
    container_name: "app"
    build:
      context: ./
      dockerfile: ./docker/app/Dockerfile
    ports:
      - "3000:3000"
    environment:
      PORT: 3000
      BINDING: 0.0.0.0
    tty: true
    depends_on:
      - "db"
    command: ["./scripts/wait-for-it.sh", "db:3306", "--", "bundle", "exec", "rails", "s", "-p", "3000", "-b", "0.0.0.0"]
    volumes:
      - .:/app
    networks:
      - frontend
      - backend

networks:
  frontend:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 192.168.10.0/24
  backend:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 192.168.20.0/24

app 用設定ファイル

docker/app/Dockerfile

ここで Gemfile および Gemfile.lock をホスト(ローカル)からゲスト(コンテナ)にコピーしています。

docker/app/Dockerfile
FROM ruby:3.0

ENV LANG C.UTF-8
ENV TZ Asia/Tokyo

RUN apt-get update -qq && \
    apt-get install -y --no-install-recommends sudo curl apt-transport-https wget build-essential libpq-dev nodejs default-mysql-client

RUN 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 --no-install-recommends -y yarn

RUN apt-get clean && \
    rm -rf /var/lib/apt/lists/*

RUN mkdir /app
WORKDIR /app
COPY Gemfile /Gemfile
COPY Gemfile.lock /Gemfile.lock
RUN bundle install
COPY . /app

COPY docker/app/entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

docker/app/entrypoint.sh

こちらは以下のサイトの entrypoint.sh からいただきました。
cf. Quickstart: Compose and Rails

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

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"

db 用設定ファイル

docker/db/Dockerfile

docker/db/Dockerfile
FROM mysql:8.0

RUN apt-get update -qq && \
    apt-get install -y --no-install-recommends locales && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/* && \
    locale-gen ja_JP.UTF-8

RUN sed -i -E 's/# (ja_JP.UTF-8)/\1/' /etc/locale.gen && locale-gen

ENV LANG ja_JP.UTF-8
ENV TZ Asia/Tokyo

docker/db/conf.d/my.cnf

my.cnf は文字コード指定が中心ですが、今回はシンプルに Rails の実行のみを考えているため、default_authentication_plugin=mysql_native_password で認証プラグインを変更しておきます。

docker/db/conf.d/my.cnf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_bin
default-storage-engine=INNODB
explicit-defaults-for-timestamp=1
general-log=1
general-log-file=/var/log/mysql/mysqld.log

default_authentication_plugin=mysql_native_password

[mysqldump]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[client]
default-character-set=utf8mb4

docker/db/initdb.d/init.ddl.sql

データベースを development 以外に test 用も作成する場合のファイルです。
実際は test 用データベースは rake db:create で作成されるはずですのでなくても問題ないと思われます。
コピー先の /docker-entrypoint-initdb.d フォルダではシェルの実行も可能なので、組み込み次第ではいろいろと対応できるようです。

docker/db/initdb.d/init.ddl.sql
CREATE DATABASE IF NOT EXISTS `app_test`;
GRANT ALL ON app_test.* TO 'user'@'%';

Gemfile

Gemfile

初期は Rails のバージョン指定のみとなります。

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

Gemfile.lock

初期状態は空ファイルとなります。

Gemfile.lock

初期起動までの手順

rails new

Docker のサービスが起動しているか確認の上、docker-compose.yml があるフォルダで database を MySQL に指定して rails new を実行します。

$ docker-compose run app rails new . --force --database=mysql

問題なく実行が完了すると、実行したフォルダに Rails アプリのファイル群が作成されます。
このとき、Mac の場合は実行したユーザーの権限でファイルが作成されますが、WSL の場合は root 権限となり、そのままではファイルの更新が行えません。

cf. 【Docker】 WSL 2 を利用したコンテナー内開発で権限をどう設定するべきか

根本的な解決ではないとは思いますが、とりあえず以下のコマンドで権限を実行ユーザーに振り替えて対応することは可能です。
ただし、ここだけではなく、scaffold など rails のコマンドでファイルを作成・編集するごとに権限を書き換える必要があります。
(これが WSL よりも Mac をお勧めする理由です)

$ sudo chown -R $USER:$USER .

この時点で、作成された config/database.yml を編集し、MySQL へのアクセス設定を変更します。

config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: user
  password: password
  host: db

docker-compose build, up

build でサービスを作成し、問題がなければ up でコンテナを起動します。
この際、--no-cache オプションを付けるのは、bundle install 実行時に gem ファイルを巧く取り込めない場合がある(らしい)ためです。

$ docker-compose build --no-cache
$ docker-compose up -d

この時、db および app がほぼ同時に立ち上がりますが、docker-compose.yml で記述した通り、app の rails server は MySQL サーバとの接続が確立するまで実行されないようになっています。
それぞれのコンテナのログは docker logs で確認できるため、以下のように確認して下さい。

$ docker logs app # アプリケーションサーバのログ
$ docker logs db # DB サーバのログ

実行に問題がなければ、ブラウザまたは curl などで http://localhost:3000/ にアクセスすることで、いつもの Rails の初期画面が表示されます。

image.png

scaffold 作成と実行の確認

scaffold で MVC を作成して動作が可能か確認します。

$ docker-compose run app rails g scaffold user name:string email:string

WSL で操作している場合はファイル権限の変更をしてください。

$ sudo chown -R $USER:$USER .

db:migrate でテーブルを作成します。

$ docker-compose run app rails db:migrate

ブラウザで http://localhost:3000/users にアクセスすることで scaffold で作成した Rails 標準の UI が表示され、CRUD の一連の操作が可能なことが確認できます。

http://localhost:3000/users/new
image.png

http://localhost:3000/users
image.png

実際の DB を確認したい場合は MySQL Client が入っていればコマンドで確認できます。
(設定を変えていない場合は、user アカウントのパスワードは password となります)

$ mysql -u user -h 127.0.0.1 -D app_development -p
mysql> show create table users;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                              |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| users | CREATE TABLE `users` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  `created_at` datetime(6) NOT NULL,
  `updated_at` datetime(6) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select * from users;
+----+------+-----------------+----------------------------+----------------------------+
| id | name | email           | created_at                 | updated_at                 |
+----+------+-----------------+----------------------------+----------------------------+
|  1 | test | aaa             | 2021-02-25 15:56:02.123864 | 2021-02-25 15:56:02.123864 |
|  2 | test | aaa@example.com | 2021-02-25 16:38:33.311981 | 2021-02-25 16:38:33.311981 |
+----+------+-----------------+----------------------------+----------------------------+
2 rows in set (0.00 sec)

今回は以上となります。

参考資料

以下の記事、情報を参考にさせていただきました。
ありがとうございます。

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

【環境構築】docker + Vue.js + Rails + MySQL をエラー地獄切り抜け、構築した方法

はじめに

色々なサイトを見ながら、まる三日かけてついに構築できましたので、スムーズに解決できた構築方法をご紹介したいと思います。

・Ruby 2.5.8 (x86_64-linux)
・Ruby on Rails 5.2.4.5

スクリーンショット 2021-02-26 1.09.36.png

初めに、ファイル作成

$ cd 作業するディレクトリ

作業ディレクトリに移動後。

$ touch Gemfile Gemfile.lock docker-compose.yml Dockerfile

ファイル構成はこちら

[project_name]
├── docker-compose.yml
│── Dockerfile
│── Gemfile
├── Gemfile.lock

ファイルの中身を編集していきます

・Gemfile↓

source 'https://rubygems.org'
gem 'rails', '~>5'
docker-compose.yml
version: '3'
services:
  db:
    image: mysql:5.7.19
    environment:
      - MYSQL_ROOT_PASSWORD=root
    ports:
      - "3307:3306"
    volumes:
      - ./tmp/db:/var/lib/mysql
  webpacker:
    build: .
    command: bundle exec bin/webpack-dev-server
    volumes:
      - .:/myapp
    ports:
      - "3035:3035"
  web:
    build: .
    environment:
      RAILS_ENV: development
    command: bash -c "bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
      - bundle-data:/usr/local/bundle
    ports:
      - "3000:3000"
    depends_on:
      - db
      - webpacker
volumes:
  bundle-data:

db(データベース用)、webpacker、アプリケーション用、それぞれのコンテナを作成します。

・Dockerfile↓

FROM ruby:2.5
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev

RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - \
  && apt-get install -y nodejs

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

RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

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

Railsの初期画面を表示させる

まず、rails newでプロジェクトの作成をします。

$ docker-compose run web rails new . --force --database=mysql --webpack=vue --skip-coffee

--skip-coffee:CoffeeScriptのセットアップをスキップ。

$ sed -i ".bak" -e "s/host: localhost/host: webpacker/g" config/webpacker.yml

sed -i:テキストファイルをフィルター処理で直接編集します。

buildでイメージの構築をします。

$ docker-compose build

datebase.ymlを編集します。

datebase.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root

# ここからした2行
  password: # ここには、datebase-compose.ymlの、- MYSQL_ROOT_PASSWORD=ここを入力
  host: db

development:
  <<: *default
  database: myapp_development

webコンテナ上で、データベースの作成をします。

$ docker-compose run web rails db:create

イメージ構築〜コンテナ起動までをバックグラウンド(-d)で行います

$ docker-compose up -d

localhost:3000にアクセスすると、yey!Railsの初期画面が表示されたのではないでしょうか?

webpackerをインストールしていく

$ docker-compose run web rails webpacker:install
$ docker-compose run web rails webpacker:install:vue
$ docker-compose build
$ docker-compose up -d

Hello Vue!表示しにいく

スクリーンショット 2021-02-26 1.09.36.png

config/routes.rbを下記のように編集

routes.rb
Rails.application.routes.draw do
  root to: 'home#index'
end

続いて、home controllerを作成していきます。

$ docker-compose run --rm web rails g controller home index

app/controllers/home_controller.rbと、app/views/home/index.html.erbの編集をする

home_controller.rb
class HomeController < ApplicationController
  def index
  end
end

webpacker は app/javascript/packs/ 配下に設置されたファイルをコンパイルします。
よって、index.html.erbでは、下記のようになります。

index.html.erb
<%= javascript_pack_tag 'hello_vue' %>

localhost:3000を開いてください。

スクリーンショット 2021-02-26 1.09.36.png

お疲れ様でした?

参考

Rails世渡り2【docker × Ruby on Rails × Vue.js】

Dockerでlocalhostへのアクセスが遅い時の対処法

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

SSHのたびにDockerコンテナを立ち上げる

TCPでDockerの標準入出力を提供したい - Qiita

↑は失敗。真面目にdocker killとかやらないとダメかなと考えていたけれど、そもそもやりたいことは接続ごとにコンテナをリセットすることで、ncでなくても良かった。シェルを提供するならSSHを使うほうが良いよね。ということで、SSH接続があったら、コンテナを立ち上げ、そのコンテナを渡す方法。

SSHサーバーを立ち上げるDockerfile。

FROM centos

RUN \
  dnf -y install openssh-server passwd && \
  dnf -y clean all

RUN \
  ssh-keygen -t rsa -N "" -f /etc/ssh/ssh_host_rsa_key && \
  ssh-keygen -t ecdsa -N "" -f /etc/ssh/ssh_host_ecdsa_key && \
  ssh-keygen -t ed25519 -N "" -f /etc/ssh/ssh_host_ed25519_key

RUN \
  adduser user && \
  echo p@ssw0rd | passwd --stdin user

# これを消さないと一般ユーザーはログインできない
RUN rm /run/nologin

CMD ["/usr/sbin/sshd", "-D"]

nologinを消さないとroot以外はログインできない。

このDockerfileだとssh-keygenのところで生成しているサーバー鍵がキャッシュされるので注意。例えば、後半を書き換えて別のイメージを作り、そのイメージを他人に渡すと、自分の手元のコンテナのサーバー鍵と同じサーバー鍵を他人が持っていることになるので、中間者攻撃とかをされてしまう。これで作ったイメージ自体を公開するのもダメ。

ビルド。

$ docker build -t ssh_server .

シェルスクリプトを用意。

ssh_server.sh
# コンテナを立ち上げ、
cid=$(docker run --rm -d ssh_server)
# IPアドレスを取得し、
ip=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ${cid})
# 標準入出力を${ip}:22に繋ぐ
timeout 3m socat - TCP:${ip}:22
# タイムアウトするか標準入出力が切断されたら、コンテナを終了
docker stop ${cid}

このシェルスクリプトは、標準入出力を新しく立ち上げたコンテナのポート22に繋ぐ。

あとはホストの適当なポートで接続を待ち受けて、このシェルスクリプトの標準入出力に渡せば良い。この部分はxinetdでも良い。

$ socat TCP-LISTEN:2222,reuseaddr,fork 'SYSTEM:sh ssh_server.sh'
$ ssh user@ssh-server.example.com -p 2222
user@ssh-server.example.com's password:
[user@a73d4676f399 ~]$ echo "hoge" > hoge
[user@a73d4676f399 ~]$ ls -al
total 28
drwx------ 1 user user 4096 Feb 25 15:13 .
drwxr-xr-x 1 root root 4096 Feb 25 15:05 ..
-rw-r--r-- 1 user user   18 Jul 21  2020 .bash_logout
-rw-r--r-- 1 user user  141 Jul 21  2020 .bash_profile
-rw-r--r-- 1 user user  376 Jul 21  2020 .bashrc
-rw-rw-r-- 1 user user    5 Feb 25 15:13 hoge
[user@a73d4676f399 ~]$ exit
logout
Connection to ssh-server.example.com closed.

$ ssh user@ssh-server.example.com -p 2222
user@ssh-server.example.com's password:
[user@0e2465485f42 ~]$ ls -al
total 20
drwx------ 2 user user 4096 Feb 25 15:05 .
drwxr-xr-x 1 root root 4096 Feb 25 15:05 ..
-rw-r--r-- 1 user user   18 Jul 21  2020 .bash_logout
-rw-r--r-- 1 user user  141 Jul 21  2020 .bash_profile
-rw-r--r-- 1 user user  376 Jul 21  2020 .bashrc
[user@0e2465485f42 ~]$ exit
logout
Connection to ssh-server.example.com closed.

$ ssh user@ssh-server.example.com -p 2222
user@ssh-server.example.com's password:
[user@62bc4f4c36ed ~]$ Bad packet length 1237871916.
ssh_dispatch_run_fatal: Connection to xxx.xxx.xxx.xxx port 2222: Connection corrupted

新しいファイルを追加しても繋ぎ直したらリセットされているし、接続して放置していると(上記のシェルスクリプト中のtimeoutで)3分で強制切断されるし、どうなってもサーバー側にDockerのコンテナが残ることはない :ok_hand:

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

dockerのコンテナ内conflictの解消

原因

 docker-compose.yml等で定義したコンテナの名前が、既に存在するコンテナの名前と同一である時に発生します。

 対処法としては、新たに作るコンテナの名前を変更する、既存のコンテナを削除するなどが考えられ、本記事においては既存のコンテナを不要と仮定し、削除を行いconflictを解消する手順について解説します。

コンテナの情報を確認

docker ps -a

上記コマンドで稼働中、停止中全てのコンテナの情報が確認が可能です。

5260AFE3-5682-41AB-B9D0-FF08DCE673AA_1_105_c.jpeg

 エラーメッセージにあるコンテナのIDをここで確認し控え、削除を行います。

コンテナの削除

docker rm コンテナID

 コンテナが起動中で削除できない場合、docker-compose stopを行うか、下記コマンドにて強制的に削除を行います。

docker rm -f コンテナID

 削除を行えているかコンテナ一覧から該当のコンテナがないことを確認。なければconflictは解消されているはずです。

docker ps -a

おわりに

 環境構築が簡単な分余計なコンテナが溜まってしまうので、conflict起きていない場合でもこまめに整理を行うことが大切だと思います。

 最後までお読みいただきありがとうございました。

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