20190829のdockerに関する記事は12件です。

docker for macでinsecure registryを設定する

macOSのメニューバーにあるDockerアイコンからPreferences...を選択し、プリファレンスを表示します。

Screen Shot 2019-08-29 at 20.43.56.png

DaemonタブのInsecure registries:に対象のサーバを追加します。

Screen Shot 2019-08-29 at 20.42.08.png

最後に Apply & Restart ボタンをクリックして適用します。

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

Docker For Macが遅い:対策の実験

docker-facebook-1024x536-1-1024x536.png
前回のまとめた資料から実際テストしてみた内容をまとめてみました。(人^─^)

会社のLaravelプロジェクトのdockerの開発環境で試してました。

問題になりそうなところ

先ずdocker-compose.ymlを分析して同期する対象を決めてみました。

docker-composer.yml
version: '2'
services:
  mysqldata: <- *1
    image: busybox
    volumes:
      - ./docker/mysql/storage:/var/lib/mysql
  mysql:
    build: ./docker/mysql
    volumes_from:
      - mysqldata <- *1
    ports:
      - ${DOCKER_NUM}4306:3306
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=app_db
  php:
    container_name: web_php
    build: ./docker/php
    ports:
      - ${DOCKER_NUM}8888:80
      - ${DOCKER_NUM}443:443
    volumes:
      - .:/var/www/html <- *2
    links:
      - mysql
  smtp:
    image: phpdockerio/mailhog:latest
    ports:
      - ${DOCKER_NUM}1025:1025
      - ${DOCKER_NUM}8025:8025

「*1」 : DBA

  • DBのファイルをDocker化する場合はvolumesが適切かと思います。SyncするとDatabaseファイルの構成上、大変なことになると思います。

  • Docker for Macの場合はvolumesが遅いのでMacに直接にインストールしてDockerから接続するか、Docker化するがvolumnsはしない(DB内容はDBAに接続してみるかDockerの中に入ってみる)と思います。

「*2 」: 今回はこれだけdocker-syncの対象にしてみいます。

現在の速度

Top画面を表示してみました。全体的に遅い(google developer toolsでみると20秒以上)です。特にHtml(DB関連かな)が遅いですね。Σ(´Д`)ハッ!!

100Mのファイルを作成します。Docker内部で実行します。

# time dd if=/dev/zero of=speedtest bs=1024 count=102400
102400+0 records in
102400+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 86.2196 s, 1.2 MB/s

real    1m26.162s
user    0m1.110s
sys     0m8.190s

ウヒャ━━ヽ(゚Д゚)ノ━━!!

では、docker-syncを利用して同期してみましょう。

同期するように変更

先ず、docker-syncをインストール

# gem install docker-sync
Fetching: thor-0.20.3.gem (100%)
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /Library/Ruby/Gems/2.3.0 directory.

つ〜〜 ( ´з`)・∵.ブッ

# sudo gem install docker-sync

次は監視するための物ですが、今回は使ってません。

# brew install fswatch

自分のPCはrsyncがインストールされているので、省略します。(´∀`*)ウフフ

実際、テストしてみると大きく同期なのでファイルの権限的な部分の問題が多かったので他のファイルも一部修正しました。

docker-sync.yml
version: '2'

syncs:
  document-root:
    sync_strategy: rsync
    notify_terminal: true
    sync_host_ip: 'auto'
    sync_host_port: 10872
    sync_excludes: [ '.git', '.idea', 'vendor', 'docker', '*.yml' ]
    sync_args: '-v'
    src: ./
    sync_userid: '33'

「sync_userid」についてはContainerのユーザー番号です。

docker-composer.yml
version: '2'
services:
  mysqldata:
    image: busybox
  mysql:
    build: ./docker/mysql
    ports:
      - ${DOCKER_NUM}4306:3306
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=app_db
  php:
    container_name: web_php
    build: ./docker/php
    ports:
      - ${DOCKER_NUM}8888:80
      - ${DOCKER_NUM}443:443
    environment:
      - APACHE_RUN_USER=www-data
      - APACHE_RUN_GROUP=www-data
    volumes:
      - document-root:/var/www/html
    links:
      - mysql
  smtp:
    image: phpdockerio/mailhog:latest
    ports:
      - ${DOCKER_NUM}1025:1025
      - ${DOCKER_NUM}8025:8025
volumes:
  document-root:
    external: true

修正後の速度

DBを同期&マウントしてないので、「初期のデータベースを更新」が比較的に早い(25分くらい)ですね。キタ━━(p゚∀゚q)━━!!

では、100Mのファイルを作成します。

# time dd if=/dev/zero of=speedtest bs=1024 count=102400
# time dd if=/dev/zero of=speedtest bs=1024 count=102400
102400+0 records in
102400+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 1.41639 s, 74.0 MB/s

real    0m1.432s
user    0m0.140s
sys     0m1.240s

同じくTop画面を表示してみました。全体的に2秒くらいで画面が表示されました。♪(´ε` )

課題&疑問点

  • ログファイルやコンテイナーのファイルを見るのが面倒で、速度に問題がないまま共有する方法が必要かと思います。
  • 結局DBの問題ではないのか?DB以外はマウント(volumes)を利用しても使えるレベルではないか? 検証しないとわかりません。(;´v_v)ゞ
  • 次回は「CE 17.12 (edge) 」を試してみましょう!! -> 初期状態の「docker-composer.yml」で試してみました。結果としては4・5秒くらいでTop画面が表示されました(DBの使用頻度にもよると思います)。テストはできるレベルですね。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker For Macが遅い

prefs-reset.png

「クソみたいに遅いじゃん。」自分の経験ではないですが、今後の為に資料を調査して理由・対応方法を咲くってみました。

遅い理由

結論としては「Docker For Mac」がosxfsを採用している。あ!!それよりosxfsがOSXのFSEvents APIとLinux’s inotify APIをマッピングさせているのが原因です。

参考:https://forums.docker.com/t/file-access-in-mounted-volumes-extremely-slow-cpu-bound/8076/158

  • osxfsの throughput は250 MB/s -> これはほとんどのAPPで問題にならないはず
  • コンテナ内からosxfsに対するファイルIOのシステムコールはlatencyが遅い。書き込み時で200μs -> 通常のファイルシステムであれば under 10μs(クソやられた感じ)

対応方法

じゃ、簡単!!「Docker For Mac」を使えなければ良い。( ゚Д゚)ヴォケ!!

VirtualBoxを利用

docker-machineでVirtualBox上に立ち上げたdocker環境で開発環境を構築する。うん、面倒だ〜〜〜(;^ω^)

Docker For Macを使わない

CE 17.12 (edge) チャンネルを使うこと。(・д・)チッ

参考:https://blog.hanhans.net/2017/05/10/docker-user-guided-caching/

コンテイナ間を爆速で同期する

例としてはdocker-syncをおすすめします。rsyncで設定が簡単かな。

対策の実験

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

Dockerを使ってWebサイトをSSL化

目的

DockerとLet's EncryptをつかってWebサイトをSSL化させる。

前提条件

ドメインの取得して名前解決できること。

本構成イメージ

無題.png

順番はあまり関係ないが、⑤は最後に行う。

①exampleexpressイメージ作成

app.js
var express = require('express');
var app = express();

app.get('/', function (req, res) {
  res.send('Hello World!');
});

app.listen(3000, function () {
  console.log('Example app listening on port 3000!');
});
packages.json
{
  "name": "exampleexpress",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.14.0"
  }
}
Dockerfile
FROM node:onbuild
EXPOSE 3000
CMD node app.js

以下のコマンドでイメージを作成する。

docker build -t exampleexpress .

②証明書を発行

以下のコマンドを実行

export LETSENCRYPT_EMAIL=<youremailaddress>
export DNSNAME=www.example.com

docker run --rm \
    -p 443:443 -p 80:80 --name letsencrypt \
    -v "/etc/letsencrypt:/etc/letsencrypt" \
    -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
    quay.io/letsencrypt/letsencrypt:latest \
    certonly -n -m $LETSENCRYPT_EMAIL -d $DNSNAME --standalone --agree-tos

③expressnginxイメージを作成

nginx.conf
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /dev/stdout  main;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  _;
        return 301 https://$host$request_uri;
    }

    server {
        listen              443 ssl;
        #add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
        server_name         www.example.com;
        ssl_certificate     /etc/letsencrypt/live/www.example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;
        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers         HIGH:!aNULL:!MD5;

        location ^~ /.well-known/ {
            root   /usr/share/nginx/html;
            allow all;
        }

        location / {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_pass http://expresshelloworld:3000;
        }
    }
}
Dockerfile
FROM nginx:alpine
COPY nginx.conf /etc/nginx/nginx.conf

以下のコマンドを実行

docker build -t expressnginx .

④ネットワーク作成

以下のコマンドを実行

docker network create -d bridge expressnet

⑤Webサーバを動かす

以下のコマンドを実行

docker run -d \
    --name expresshelloworld --net expressnet exampleexpress
docker run -d -p 80:80 -p 443:443 \
    --name expressnginx --net expressnet \
    -v /etc/letsencrypt:/etc/letsencrypt \
    -v /usr/share/nginx/html:/usr/share/nginx/html \
    expressnginx

その他

証明書の更新
以下のコマンドを実行

export LETSENCRYPT_EMAIL=me@example.com
export DNSNAME=www.example.com

docker run --rm --name letsencrypt \
    -v "/etc/letsencrypt:/etc/letsencrypt" \
    -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
    -v "/usr/share/nginx/html:/usr/share/nginx/html" \
    quay.io/letsencrypt/letsencrypt:latest \
    certonly -n --webroot -w /usr/share/nginx/html -d $DNSNAME --agree-tos
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker for Windows の問題

Docker for Windows はいくつかの問題を抱えている。
どうしてもDockerしたいなら、LinuxのVMを立てるか、一部Docker+Docker以外運用にするか。

volumeしたディレクトリはオーナーがrootになりchownが効かない

MongoDBやSubversionなど、永続化(volume/マウント)するべきデータディレクトリのオーナーがrootだと起動できないアプリケーションは多い。
しかしDocker for windowsでは、volumeしたディレクトリはなぜかroot所有になり、chownも効かない。

Dockerを終了したときにデータも消える、という運用しかできない。

参考: https://github.com/moby/moby/issues/35665

共有しているディレクトリをvolumeすると、データは永続するがなぜか見えない

見出しの通り、Dockerとしては問題なく永続使用できるが、エクスプローラから見えなくなる。

原因不明..

Windowsを再起動するとvolumeが効かないことがある

こちらも原因不明。データは残っているしアプリケーションは動くが、マウント出来ていないことがたまにある。
しかしdocker restartコマンドを実行すると解決する。

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

Docker監視用のZabbix Agent

screenshot.1498627106-678x381.png
以前、会社のシステムをDocker化する際にZabbix Agentのために「monitoringartist/dockbix-agent-xxl-limited」を利用していました。

参考元:https://team-6.hatenablog.jp/entry/2017/08/11/220510

一ヶ月くらいテスト期間が終わり運営を初めて間も無く急に以下のエラーがで動かなくなってしましました。

Freeware licence - Usage of this binary is restricted to official monitoringartist Docker images only.

提供しているサイトにその理由が書いておりました。

参考元:https://github.com/monitoringartist/dockbix-agent-xxl

一ヶ月くらいはなんで動いたのかと思いましたが、先ずは対応が優先なので色々検索して見ましたがほとんどが同じ製品を使う例かDockerにZabbixサーバーを入れて利用する内容でした。

検索をしても「monitoringartist/dockbix-agent-xxl-limited」を利用して監視する内容ばかりでした。もうちょっと頑張って検索したらOSが違いますが、基本的にはLinux(CentOs)なので試して以下のURLの内容を参考で実行しました。

参考元:https://qiita.com/_BSmile_/items/5fe13bb6305de8f98ccd

お〜上手くいっている!!
.....

エラー

だが、こちらの内容では以下のDockerログように起動されないです。

cannot load module "zabbix_module_docker.so": /usr/lib/modules-load.d/zabbix_module_docker.so: invalid ELF header

参考元で利用している
モジュールは既になくなったので、モジュールは以下のところでDebian8をダウンロードしました。(注意:ダウンロードのリンク次第が一度リダイレクトされるのでHtmlを開いて元のURLを利用してダウンロード)

https://github.com/monitoringartist/zabbix-docker-monitoring

参考元通りに実装したログを分析したら参考元でCoreOs用のZabbixAgent(こちら) が古すぎるのが原因そうでした。

対策

先ず、docker-zabbix-coreos/etc/zabbix/(*1)をクロンしておく。

その後、以下のURL(Agentが3.0を想定)から該当するもの「zabbix-agent_3.0.18-1%2Bjessie_amd64.deb」をダウンロードして「files/zabbix-agent_2.2.7+dfsg-1.1_amd64.deb」の代わりに利用する。

Zabbix Official Repository

Dockerfileの「zabbix-agent_2.2.7+dfsg-1.1_amd64.deb」ファイル名をダウンロードしたファイル名「zabbix-agent_3.0.18-1+jessie_amd64.deb」に変更する。

これでOKでした。「monitoringartist/dockbix-agent-xxl-limited」と同じことが出来ました。

FROM debian:jessie
MAINTAINER kugyon.i <fatty.rabbit.75@gmail.com>

ENV DEBIAN_FRONTEND noninteractive

RUN apt-get update && \
    apt-get -y install locales && \
    dpkg-reconfigure locales && \
    locale-gen C.UTF-8 && \
    /usr/sbin/update-locale LANG=C.UTF-8 && \
    echo 'en_US.UTF-8 UTF-8' >> /etc/locale.gen && \
    locale-gen
ENV LC_ALL C.UTF-8
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US.UTF-8
ENV TERM xterm

RUN apt-get -y install \
        ucf \
        procps \
        iproute \
        supervisor
COPY etc/supervisor/ /etc/supervisor/

RUN apt-get -y install --no-install-recommends \
        curl \
        jq \
        libcurl3-gnutls \
        libldap-2.4-2 \
        netcat-openbsd \
        pciutils \
        sudo

COPY files/zabbix-agent_3.0.18-1+jessie_amd64.deb /root/
RUN dpkg -i /root/zabbix-agent_3.0.18-1+jessie_amd64.deb
COPY etc/zabbix/ /etc/zabbix/

RUN mkdir -p /var/lib/zabbix && \
    chmod 700 /var/lib/zabbix && \
    chown zabbix:zabbix /var/lib/zabbix && \
    usermod -d /var/lib/zabbix zabbix && \
    usermod -a -G adm zabbix

COPY etc/sudoers.d/zabbix etc/sudoers.d/zabbix
RUN chmod 400 /etc/sudoers.d/zabbix

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

RUN curl -k -o /usr/lib/modules-load.d/zabbix_module_docker.so -O https://raw.githubusercontent.com/monitoringartist/zabbix-docker-monitoring/gh-pages/debian8/3.0/zabbix_module_docker.so
RUN echo 'LoadModulePath=/usr/lib/modules-load.d/' > /etc/zabbix/zabbix_agentd.conf.d/docker-module.conf
RUN echo 'LoadModulePath=/usr/lib/modules-load.d/' >> /etc/zabbix/zabbix_agentd.conf.d/docker-module.conf
RUN echo 'LoadModule=zabbix_module_docker.so' >> /etc/zabbix/zabbix_agentd.conf.d/docker-module.conf
RUN echo 'AllowRoot=1' >> /etc/zabbix/zabbix_agentd.conf.d/docker-module.conf

COPY entrypoint.sh /
RUN chmod +x /entrypoint.sh

EXPOSE 10050
ENTRYPOINT ["/entrypoint.sh"]
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ECS FargateでRails動かそうとして2ヶ月かかって手元に残ったもの【3.Fargate編】

弊社の基幹システムをVPSからAWSに移行するにあたって、まずはrailsを動かしてみる、という段階で無事に死にました☆
今後のための備忘録です。

前記事:ECS FargateでRails動かそうとして2ヶ月かかって手元に残ったもの【2.Build編】

前回まででやったこと

バックエンド構成.png

今回やったこと

今回はいよいよコンテナをfargteで動かして、ALBも用いて公開してみようと思います。

VPC

今回はデフォルトのものを使います。
スクリーンショット 2019-08-27 15.59.18.png

RDS

FireShot Capture 016 - RDS · AWS Console - ap-northeast-1.console.aws.amazon.com.png

  • エンジンのタイプはmysqlで設定して、バージョンも合わせます。
  • データベースの承認情報はdocker-composeファイルなどで設定した環境変数と合わせます。
  • VPCはデフォルトのもの、セキュリティグループはデフォルトを消して新規作成します。

ALB

スクリーンショット 2019-08-26 14.23.52.png

スクリーンショット 2019-08-26 14.24.08.png

「サービス」 → 「ES2」 → 「ロードバランサー」を選ぶ。

スクリーンショット 2019-08-26 14.24.23.png

スクリーンショット 2019-08-26 14.24.44.png

スクリーンショット 2019-08-26 14.25.58.png
アベイラビリティーゾーンは全てにチェックを入れます。

スクリーンショット 2019-08-26 14.33.46.png

スクリーンショット 2019-08-26 14.34.10.png

スクリーンショット 2019-08-26 14.35.11.png

スクリーンショット 2019-08-26 14.35.41.png

IAM

ECSのアクセス権限を設定します。
「サービス」 → 「IAM」 → 「ロール」 → 検索ボックスに「ecs」と入力して、「ecsTaskExecutionRole」を選択

スクリーンショット 2019-08-27 17.25.13.png

スクリーンショット 2019-08-27 17.28.06.png

スクリーンショット 2019-08-27 17.43.11.png

スクリーンショット 2019-08-27 17.43.50.png

ECS

「サービス」 → 「ECS」

タスク定義

スクリーンショット 2019-08-27 17.11.20.png

スクリーンショット 2019-08-27 17.11.31.png

FireShot Capture 018 - Amazon ECS - ap-northeast-1.console.aws.amazon.com.png

「コンテナの追加」がポイントになります。
ECRで設定した「web」と「server」のリポジトリをそれぞれ指定します。

  • web
    スクリーンショット 2019-08-29 12.43.00.png
    スクリーンショット 2019-08-29 12.45.20.png

  • server
    スクリーンショット 2019-08-29 12.46.19.png

クラスター

スクリーンショット 2019-08-29 13.36.56.png

スクリーンショット 2019-08-29 13.37.06.png

スクリーンショット 2019-08-29 13.37.21.png

サービス

スクリーンショット 2019-08-29 13.41.51.png

FireShot Capture 020 - Amazon ECS - ap-northeast-1.console.aws.amazon.com.png

1FireShot Capture 026 - Amazon ECS - ap-northeast-1.console.aws.amazon.com.png

VPCを設定します。(点線部上)
スクリーンショット 2019-08-29 14.57.35.png
次にロードバランサーも設定します。
2FireShot Capture 024 - Amazon ECS - ap-northeast-1.console.aws.amazon.com.png

3FireShot Capture 025 - Amazon ECS - ap-northeast-1.console.aws.amazon.com.png

4FireShot Capture 022 - Amazon ECS - ap-northeast-1.console.aws.amazon.com.png

これでサービスを動かせば、ひとまず設定は完了です。

起動確認

「サービス」 → 「EC2」 → 「ロードバランサー」 を選択して下部のメニューにアドレスがあるのでそこからコピペしましょう。
スクリーンショット 2019-08-29 15.19.33.png

最後に

私自身、手探りで2ヶ月かかって、やっと起動にこぎつけました。
まだまだ設定が十分でない部分はあると思います。
今後も自分自身の備忘録として、更新を続けていきたいと思います。

ここまでできたこと

バックエンド構成 (1).png

次記事:S3編。。。?

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

Docker+Vue.js+Vuetify環境構築

この記事について

VSCodeのRemoteを使って、Dockerコンテナー内に、Vue.js+Vuetify環境を構築するためのメモです。

対象

  • VSCodeはある程度使い慣れている
  • VSCodeのRemote container拡張機能は使った事がある

dockerfile作成

EXPOSE 9000でポート指定をする事を忘れないように。
最悪コピペでもOK

dockerfile
FROM node:lts

WORKDIR /app

RUN npm install -g npm && \
    npm install -g @vue/cli

EXPOSE 9000

CMD ["/bin/sh"]

dockerビルド

VSCode Remote Containerを使用して、ビルドを行う。

Vue-Cliインストール

shell
$ npm install -g @vue/cli

Vueプロジェクト作成

コマンドを叩いた後に、途中で選択肢が出るので、defaultUse NPMを選択

shell
$ vue create sandbox

> default (babel, eslint)
> Use NPM

VSCode RemoteでPORT設定

Forewd Port from Containerを選択し、8080を入力

Vueの動作確認

shell
$ cd sandbox
$ npm run serve

コマンドを叩いた後に、localhostにアクセス
http://localhost:8080/studio

動作確認できたら、ctrl+cで一旦終了。

Vuetify インストール

コマンドを叩いた後に、選択肢があるのでDefault (recommended)を選択

shell
$ vue add vuetify

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

GitHub PagesにDocker+Vue.js+Vuetifyでページを公開

この記事について

VSCodeのRemoteを使って、Dockerコンテナー内に、Vue.js+Vuetify環境を構築するためのメモです。

対象

  • VSCodeはある程度使い慣れている
  • VSCodeのRemote container拡張機能は使った事がある

dockerfile作成

EXPOSE 8080でポート指定をする事を忘れないように。
最悪コピペでもOK

dockerfile
FROM node:lts

WORKDIR /app

RUN npm install -g npm && \
    npm install -g @vue/cli

EXPOSE 8080

CMD ["/bin/sh"]

dockerビルド

VSCode Remote Containerを使用して、ビルドを行う。

Vue-Cliインストール

shell
$ npm install -g @vue/cli

Vueプロジェクト作成

カレントディレクトリにvueプロジェクトを作成する

コマンドを叩いた後に、途中で選択肢が出るので、yes> default>Use NPMを選択

shell
$ vue create .
> Y
> default (babel, eslint)
> Use NPM

VSCode RemoteでPORT設定

Forewd Port from Containerを選択し、8080を入力

Vueの動作確認

shell
$ npm run serve

コマンドを叩いた後に、localhostにアクセス
http://localhost:8080/studio

動作確認できたら、ctrl+cで一旦終了。

Vuetify インストール

コマンドを叩いた後に、選択肢があるのでDefault (recommended)を選択

shell
$ vue add vuetify

> Default (recommended)

ビルドディレクトリ変更

/node_modules/@vue/cli-service/lib/options.js

options.js
<省略>

exports.defaults = () => ({
  // project deployment base
  publicPath: '',
  // for compatibility concern. TODO: remove in v4.
  baseUrl: '',

  // where to output built files
  //  outputDir: 'dist',
  outputDir: 'docs',

  assetsPublicPath: '',

  // where to put static assets (js/css/img/font/...)
  assetsDir: '',

  // filename for index.html (relative to outputDir)
  indexPath: 'index.html',


ビルド

docsディレクトリにビルドされたファイルが格納されるので、そのままGitHub Pagesにデプロイできます。

shell
$ npm run build

Vue routerを入れる

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

phpの開発環境用のdocker-compose

horizontal.png
fattyrabbit/php-fpmを利用したローカル開発環境のdocker-compose

全体ソース:https://bitbucket.org/FattyRabbit/php-dev-docker-compose/src/master/

概要:phpの開発(laravelの開発用)のためにlocal環境を作成する目的で、以下を目指しました。

  • 出来る限り軽い
  • 他のバージョンのPhpを同時に動かす

それで選択したのが「nginx」+「php-fpm」の構成しました。

php-fpmのカスタマイズ

元になるphpのfpmは問題点としてListenポートが「9000」固定で複数のfpmを同時に利用できないところが問題でした。その為にphpのfpm(まずは7.3)のDockerfileを改善してContainerを実行する際にポートを設定出来るように修正を加えました。

改善したphp-fpmのソース:
https://bitbucket.org/dockerfile_test/php-fpm/src/master/

nginx

何回かテスト中に問題として出たのがサーバーの設定ファイルの修正があった場合、Dockerfile内でCOPYを利用すると再Buildしても上手く更新されない場合がありましたので、サーバーの管理をvolumesで管理するように設定しました。
これでDockerの再起動や中のデモンの再起動でも設定の変更が反映されるようになりました。

docker-compose.xml
    proxy:
        build: nginx
        container_name: proxy
        build:
          context: .
          dockerfile: docker-nginx/Dockerfile
        volumes:
          - ./etc/logs/nginx:/etc/nginx/logs
          - ./etc/nginx/conf.d:/etc/nginx/conf.d
          - ./etc/nginx/letsencrypt:/etc/letsencrypt
          - ./www:/var/www/
        ports:
          - 80:80
          - 443:443

php-fpm

このではListenのポートを「9001」にしてみました。

docker-compose.xml
  php-7.3:
    build:
      context: .
      dockerfile: docker-php-7.3/Dockerfile
      args:
        LISTEN_PORT: 9001
    container_name: php-7.3
    volumes:
      - ./www:/var/www/
      - ./etc/php/php.ini:/usr/local/etc/php/php.ini

nginxの設定

実際のウェブサーバーでphpを利用する設定です。

/etc/nginx/conf.d/default.conf
   location ~ \.php$ {
        fastcgi_pass    php-7.3:9001;
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include         fastcgi_params;
    }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker runしたら「no matching manifest for windows/amd64 10.0.18362 in the manifest list entries.」と出る

環境

  • Windows10
  • Docker for Windows

エラー

PS C:\> docker run nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
C:\Program Files\Docker\Docker\Resources\bin\docker.exe: no matching manifest for windows/amd64 10.0.18362 in the manifest list entries.

対処方法

Settingで "experimental": true を定義して、 Apply
image.png

experimentalは実験とか検証とかそういう意味みたいですね。

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

「gawkで基本統計量を計算する」をdockerで

gawkで基本統計量を計算する
https://qiita.com/EjiriAkira/items/e92e919bb9ee1c52b7ae

をdockerで利用してみた。

それだけでは芸がない。自分のデータで分析もしてみる。

スクリプトの1つが、ファイル名固定になっているのに手を入れ、ファイル入力する方式にした。

bas.sh
#!/bin/bash
# https://qiita.com/EjiriAkira/items/e92e919bb9ee1c52b7ae
# https://qiita.com/kaizen_nagoya/items/c362cb343a412fe12d46
. ./basic_statistics.sh
IFS=',' read n min max med ave sum svar uvar ssd usd skew kurt text <<< $(calc_basic_statistics $1)
echo "=============================="
printf "n = %d\n" ${n}
printf "min = %G\n" ${min}
printf "max = %G\n" ${max}
printf "med = %G\n" ${med}
printf "ave = %G\n" ${ave}
printf "sum = %G\n" ${sum}
printf "svar = %G\n" ${svar}
printf "uvar = %G\n" ${uvar}
printf "ssd = %G\n" ${ssd}
printf "usd = %G\n" ${usd}
printf "skew = %G\n" ${skew}
printf "kurt = %G\n" ${kurt}
echo "=============================="
printf "${text}"
echo "=============================="
echo -n -e "${text}"

上記ファイルで$1のところ。

データは自分のqiitaの書き込みの20件ごとのいいねの数の分布を用いた。

d50.txt
14
5
6
15
13
6
8
9
8
6
8
9
12
15
14
13
10
15
11
7
15
12
10
10
6
9
9
8
6
4
6
6
11
8
14
15
12
14
10
10
5
8
12
12
15
11
11
7
14
12

25までのデータ、12までのデータファイルも用意。

# ./bas.sh d12.txt
==============================
n = 12
min = 5
max = 15
med = 8
ave = 8.91667
sum = 107
svar = 10.2431
uvar = 11.1742
ssd = 3.20048
usd = 3.34279
skew = 0.840341
kurt = -0.537908
==============================
n=12
min=5
max=15
med=8
ave=8.91667
sum=107
svar=10.2431
uvar=11.1742
ssd=3.20048
usd=3.34279
skew=0.840341
kurt=-0.537908
==============================
n=12
min=5
max=15
med=8
ave=8.91667
sum=107
svar=10.2431
uvar=11.1742
ssd=3.20048
usd=3.34279
skew=0.840341
kurt=-0.537908
# ./bas.sh d25.txt
==============================
n = 25
min = 5
max = 15
med = 10
ave = 10.28
sum = 257
svar = 10.7616
uvar = 11.21
ssd = 3.28049
usd = 3.34813
skew = 0.0464061
kurt = -1.36321
==============================
n=25
min=5
max=15
med=10
ave=10.28
sum=257
svar=10.7616
uvar=11.21
ssd=3.28049
usd=3.34813
skew=0.0464061
kurt=-1.36321
==============================
n=25
min=5
max=15
med=10
ave=10.28
sum=257
svar=10.7616
uvar=11.21
ssd=3.28049
usd=3.34813
skew=0.0464061
kurt=-1.36321
# ./bas.sh d50.txt
==============================
n = 50
min = 4
max = 15
med = 10
ave = 10.12
sum = 506
svar = 10.3856
uvar = 10.5976
ssd = 3.22267
usd = 3.25539
skew = -0.0191191
kurt = -1.16719
==============================
n=50
min=4
max=15
med=10
ave=10.12
sum=506
svar=10.3856
uvar=10.5976
ssd=3.22267
usd=3.25539
skew=-0.0191191
kurt=-1.16719
==============================
n=50
min=4
max=15
med=10
ave=10.12
sum=506
svar=10.3856
uvar=10.5976
ssd=3.22267
usd=3.25539
skew=-0.0191191
kurt=-1.16719

docker

起動は

$ docker run -it kaizenjapan/gawk -bin/bash

で利用できる。dockerに入ったら、

docker/ubuntu
# cd /home/awk

Excelとの比較

エクセルでの結果は

50 25 12
14
5
6
15
13
6
8
9
8
6
8
9
12
15
14
13
10
15
11
7
15
12
10
10
6
9 14
9 5
8 6
6 15
4 13
6 6
6 8
11 9
8 8
14 6
15 8
12 9
14 12
10 15 14
10 14 5
5 13 6
8 10 15
12 15 13
12 11 6
15 7 8
11 15 9
11 12 8
7 10 6
14 10 8
12 6 9
合計 506 合計 257 合計 107
平均 10.12 平均 10.28 平均 8.916666667
範囲 11 範囲 10 範囲 10
最小 4 最小 5 最小 5
最大 15 最大 15 最大 15
標準誤差 0.45575432 標準誤差 0.656097554 標準誤差 0.923898243
中央値 10 中央値 10 中央値 8
最頻値 6 最頻値 6 最頻値 6
標準偏差 3.222669701 標準偏差 3.280487769 標準偏差 3.200477395
分散 10.3856 分散 10.7616 分散 10.24305556
尖度 -1.167191039 尖度 -1.36321223 尖度 -0.537907774
歪度 -0.01911908 歪度 0.046406059 歪度 0.840341472

元資料に記載がみあたらない計算式は

範囲 =MAX(B1:B50)-MIN(B1:B50)
標準誤差 =STDEVP(B1:B50)/SQRT(COUNT(B1:B50))

考察

記事のいいねがついている数の範囲にぶれがあまりない。20づつのまとまりごとに、12、25、50を比べているから見えた現象の可能性がある。まとまりを変えると違う現象が見えてくるかもしれない。

6から9がつづいたり、10以上がつづいたりのぶれがあり、この周期による影響もあるかもしれない。

いいねがついた記事を先に追記するため、いいねがつかなかった記事はなかなか良くならないという傾向がある。
100viewsでいいねがついていない記事は追記するようにしている。
いいねがついた記事への追記を優先させているかもしれない。

平均より中央値が低く、最頻値がもっと低いのは、ときどき突出した数値を叩き出すものがある分類によくある現象。

Qiita(6)行動分類
https://qiita.com/kaizen_nagoya/items/dc683fc6c054e3c187df
Qiita(7)投稿
https://qiita.com/kaizen_nagoya/items/456b8d0d27806543615b
Qiita(8)週5回の確認作業の流れ
https://qiita.com/kaizen_nagoya/items/592e5eed915fbbc3e0ff
Qiita(11)「Qiitaいいな〜自分のいいね分析」自分版
https://qiita.com/kaizen_nagoya/items/11955909b0302d9ba999
Qiita(13)なぜ少しづつQiitaの記事を追記しているか
https://qiita.com/kaizen_nagoya/items/fa8b102a92d094437416

Qiita(16)Qiita記事 いいね と views の関係
https://qiita.com/kaizen_nagoya/items/d30240b2a9adec288ca

Qiita(18)記事を書くときに注意していること
https://qiita.com/kaizen_nagoya/items/3a6e08309231aa05fb27
Qiita(23)書きかけの項目の一覧を書きかけ
https://qiita.com/kaizen_nagoya/items/45db8672c1081c1e78e1

Qiita(27)views一覧を作るまで(第一日目)
https://qiita.com/kaizen_nagoya/items/7de46ac898e776834605Qiita(35) Qiita: いいね, follow, follower, ストック, views
https://qiita.com/kaizen_nagoya/items/1f0c56ebd05c5495f72e

参考資料

エクセルでの標準誤差の計算方法
http://www.ipc.shimane-u.ac.jp/food/kobayasi/se_excel.html

=stdev(データ範囲)/sqrt(count(データ範囲))

標準誤差の計算
http://hp.brs.nihon-u.ac.jp/~kaki/dat_arr_xls_se.html

=stdevp(データ範囲)/sqrt(count(データ範囲))

【Excel】エクセルで標準誤差を計算する方法 標準誤差と標準偏差との違い
http://kenkou888.com/category13/excel_hyoujungosa.html

データそのものの標準偏差を求めるために、STDEVP関数を使用します。なお、STDEV関数やSTDEV.S関数は標本から母集団の標準偏差を予想するときにします。

#文書履歴(document history)
ver. 0.01 初稿 20180829 朝
ver. 0.02 追記 20180829 午前
ver. 0.03 考察追記 20180829 午後
このエントリーをはてなブックマークに追加
https://b.hatena.ne.jp/guide/bbutton

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