m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

AmazonLinuxをVMWare Fusionで起動する

概要

なんかVagrantでboxどっかで見つけたことがあるので じゃあ、あるはずということで探した

たぶんここ

docs.aws.amazon.com

やり方

1. seed.iosを作成しないといけない

meta-data

mkdir seed
cd seed
cat << EOF > meta-data
local-hostname: amazonlinuxvm
EOF

user-data

cat << EOF > user-data
#cloud-config
# vim:syntax=yaml
users:
# A user by the name ec2-user is created in the image by default.
  - default

chpasswd:
  list: |
    ec2-user:ec2-pass
EOF

seed.iosを作成

cd ../
hdiutil makehybrid -o seed.iso -hfs -joliet -iso -default-volume-name cidata seed/

Creating hybrid image...
...............................................................................

% ls -la
total 1800
drwxr-xr-x   4 shigeharu  staff     128 11  6 07:17 .
drwxr-xr-x  21 shigeharu  staff     672 11  6 07:05 ..
drwxr-xr-x   4 shigeharu  staff     128 11  6 07:15 seed
-rw-r--r--   1 shigeharu  staff  921600 11  6 07:17 seed.iso
%

2. VMイメージをダウンロード

Index of /os-images/2.0.20211005.0/vmware

f:id:m_shige1979:20211106072000p:plain

3. VMWare Fusionを起動し、VMイメージをインポート

f:id:m_shige1979:20211106072322p:plain
f:id:m_shige1979:20211106072516p:plain
f:id:m_shige1979:20211106072943p:plain
f:id:m_shige1979:20211106073326p:plain

起動した感じ
sshは行ける?

% ssh ec2-user@192.168.11.20
ec2-user@192.168.xx.yy: Permission denied (publickey,なんかの文字列).

だめなので、めんどいのでPWログインを許可する ・/etc/ssh/sshd_config

PasswordAuthentication yes

再チャレンジ

% ssh ec2-user@192.168.11.20
ec2-user@192.168.11.20's password:
Last login: Fri Nov  5 22:43:04 2021 from 192.168.11.2

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
No packages needed for security; 10 packages available
Run "sudo yum update" to apply all updates.
$

できた(^ ^)

参考

VMwarePlayerでAmazon Linux 2を起動 - Qiita

VirtualBoxにAmazon Linux 2をインストールする方法(環境構築方法) | PostgresWeb - ポスグレウェブ

共通のSCSSファイルを外部ファイルで読み込みたい

概要

vueの場合はvueファイルでtemplate、script、css(scssとかも含む)を記載することができる。 さらにcssはスコープでファイル内のみとそれ以外の制御ができる

やりたいこと

f:id:m_shige1979:20211106034610p:plain

参考

Vue CLI 3でグローバルなSCSSを読み込ませる - Qiita

Vue-cli3 でグローバルなCSSを読み込む - FULL STUCK DIARY

ソースコード準備

src/assets/scss/_prepends.scss

/**
 * 全体に適用するscss
 */
@import "./common";
@import "./font";

src/assets/scss/common.scss

* {
  margin: 0px;
  padding: 0px;
}

src/assets/scss/font.scss

* {
  font-size: 14px;
}

方法は2つあるとのこと

vue.config.jsにcssローダーを付与

module.exports = {
  devServer: {
    port: 5000,
    disableHostCheck: true,
  },
  css: {
    loaderOptions: {
      sass: {
        prependData: `@import "./src/assets/scss/_prepends.scss";`,
      },
    },
  },
};

※色々なサイトでは「prependData」ではなく、「data」になっていて「data」ではエラーになる・・・

main.js(main.ts)で読み込み

import { createApp } from "vue";
import App from "./App.vue";
import router from "./router";
import store from "./store";
require("./assets/scss/_prepends.scss");  // ⇦ 追加

createApp(App).use(store).use(router).mount("#app");

※まあ、こっちの方が楽といえば楽

Vueのインストール

Vue

jp.vuejs.org

お試し

インストール

% yarn global add @vue/cl
% vue -V
@vue/cli 4.5.15
%

プロジェクト作成

vue create .

※カレントディレクトリ直下に作成する ※Manualで色々設定してみた(v2)

ディレクトリ構成

% tree -L 3 -I node_modules
.
├── README.md
├── babel.config.js
├── package.json
├── public
│   ├── favicon.ico
│   └── index.html
├── src
│   ├── App.vue
│   ├── assets
│   │   └── logo.png
│   ├── components
│   │   └── HelloWorld.vue
│   ├── main.ts
│   ├── router
│   │   └── index.ts
│   ├── shims-vue.d.ts
│   ├── store
│   │   └── index.ts
│   └── views
│       ├── About.vue
│       └── Home.vue
├── tests
│   └── unit
│       └── example.spec.ts
├── tsconfig.json
└── yarn.lock

vue.config.js

module.exports = {
  devServer: {
    port: 5000,
    disableHostCheck: true,
  },
};

起動

yarn serve

※初回は多分ビルドが走る
f:id:m_shige1979:20211104193216p:plain

AWS Workspaceを試す

AWS Workspaces

aws.amazon.com

始める

今すぐ始める

f:id:m_shige1979:20210921234829p:plain

高速セットアップを選択

f:id:m_shige1979:20210921234949p:plain
VPCとかを指定したい場合は詳細で設定する必要あり

無料版があったんで選択

f:id:m_shige1979:20210921235004p:plain

起動したら暫く待つ

f:id:m_shige1979:20210921235018p:plain
※多分、最大20分待つ

起動するまで待機

f:id:m_shige1979:20210921235047p:plain

f:id:m_shige1979:20210921235058p:plain

f:id:m_shige1979:20210921235110p:plain

メール確認

メールを確認してリンクをクリックする

f:id:m_shige1979:20210921235121p:plain

初回のアクセスパスワードを更新

f:id:m_shige1979:20210921235132p:plain

クライアントをダウンロード

f:id:m_shige1979:20210921235144p:plain

クライアントアプリをインストール

f:id:m_shige1979:20210921235200p:plain

f:id:m_shige1979:20210921235212p:plain

クライアントで起動

メールの登録キーを設定

f:id:m_shige1979:20210921235224p:plain

ユーザーとパスワードを設定

f:id:m_shige1979:20210921235236p:plain

アクセス

f:id:m_shige1979:20210921235248p:plain

所感

今回はちょっとお試し、
データをどのように管理できるかとか
Workspaceからインターネットへの接続制限などをどのようにやるかでセキュリティを保てるかを試してみたい

docker-composeでnginx+php(cakeph4)+MySQLの環境を構築する

構成(雑)

f:id:m_shige1979:20210908070301p:plain

手順

docker-compose.yml

version: "3"

services:
  # web
  web:
    # コンテナ名
    container_name: web
    # image
    image: nginx:alpine
    # 他のコンテナ起動後に起動するように制御
    depends_on:
      - php
      - db
    # ポート開放
    ports:
      - "80:80"
    # ボリューム
    volumes:
      - "./nginx/conf.d:/etc/nginx/conf.d"
      - "./app:/var/www/html"

  # app
  php:
    # コンテナ名
    container_name: php
    # ビルド
    build: ./dockers/php
    # コンテナに入るようにできる
    tty: true
    # 他のコンテナが起動後に動くように制御
    depends_on:
      - db
    # ボリューム
    volumes:
      - "./app:/var/www/html"
    # ポート
    ports:
      - 9000:9000
      - 4321:4321
    # 環境変数
    environment:
      TZ: "Asia/Tokyo"
  # DB
  db:
    # コンテナ名
    container_name: mysql
    # イメージ
    image: mysql
    #
    tty: true
    # 再起動
    restart: always
    # 環境変数
    environment:
      MYSQL_ROOT_USER: "root"
      MYSQL_ROOT_PASSWORD: "password"
      MYSQL_DATABASE: sample
      MYSQL_USER: hoge
      MYSQL_PASSWORD: foofoo
      TZ: "Asia/Tokyo"
    # ボリューム
    volumes:
      - mysql_data:/var/lib/mysql
    # ポート
    ports:
      - 3306:3306

# 名前付きボリュームをdockerホストの管理下で作成
volumes:
  mysql_data: {}

nginx/conf.d/vhost1.conf

server {
    listen   80;
    listen   [::]:80;
    server_name example.com;

    root   /var/www/html/webroot;
    index  index.php;

    #access_log /var/www/example.com/log/access.log;
    #error_log /var/www/example.com/log/error.log;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        try_files $uri =404;
        include fastcgi_params;
        fastcgi_pass   php:9000;
        fastcgi_index index.php;
        fastcgi_intercept_errors on;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

dockers/php/Dockerfile

# PHPイメージ
FROM php:7.4.23-fpm-buster

# 関連パッケージをインストール
RUN apt-get update && \
    apt-get install -y vim && \
    apt-get install -y unzip && \
    apt-get install -y libicu-dev && \
    docker-php-ext-install intl && \
    docker-php-ext-install pdo_mysql

# composerをインストール
COPY --from=composer /usr/bin/composer /usr/bin/composer

phpイメージ用のDockerfileでphpのパッケージインストーラーであるcomposerをインストールしておく

f:id:m_shige1979:20210908065000p:plain

参考

インストール - 4.x

Docker の Nginx + MySQL 環境で CakePHP 4 を動かす / Twin Turbo Computing

CakePHP4 の開発環境をDockerを使って構築する - Qiita

github

github.com

docker-composeでnginxを使用してリバースプロキシを行う

dockerでnginxを利用してアプリサーバをリバースプロキシしたい

こんなやつ

f:id:m_shige1979:20210904220418p:plain

設定

docker-compose.yml

version: "3"

services:
  # nginx
  nginx:
    # コンテナ名
    container_name: nginx
    # image
    image: nginx:alpine
    # スタブサーバー起動後に動く
    depends_on:
      - mocky
      - staticsite
    # コンテナに入るようにできる
    tty: true
    # ポート
    ports:
      - "80:80"
    # ボリューム(マウント)
    volumes:
      - ./dockers/nginx/conf.d:/etc/nginx/conf.d

  # スタブサーバ用
  mocky:
    # コンテナ名
    container_name: mocky
    # Dockerfile場所
    build: ./dockers/mocky
    # コンテナに入るようにできる
    tty: true
    # ボリューム
    volumes:
      - "./dockers/mocky/app:/usr/src/app"
    # ポート
    ports:
      - "4321:4321"
    # 作業ディレクトリ
    working_dir: /usr/src/app
    # 実行コマンド
    entrypoint: npm start

  # 静的サーバ用
  staticsite:
    # コンテナ名
    container_name: staticsite
    # image
    image: panubo/staticsite
    # コンテナに入るようにできる
    tty: true
    # ポート
    ports:
      - "8000:80"
    # ボリューム
    volumes:
      - "./dockers/staticsite/html:/var/www/html"

docker-compose.yml自体はほとんど変化なし 2つのホストでそれぞれ異なるサーバへプロキシを行う検証として1つコンテナは追加しました。

dockers/nginx/conf.d/vhost1.conf

# スタブサーバ接続用設定
upstream backend1 {
    server host.docker.internal:4321;
}
server {
  listen       80;
  server_name  sample.mocky.com;
  root         /var/www/html;
  
  location / {
    proxy_set_header  Host                $host;
    proxy_set_header  X-Real-IP           $remote_addr;
    proxy_set_header  X-Forwarded-Host    $host;
    proxy_set_header  X-Forwarded-Server  $host;
    proxy_set_header  X-Forwarded-For     $proxy_add_x_forwarded_for;
    proxy_pass        http://backend1/;
  }  
}

dockers/nginx/conf.d/vhost2.conf

# スタブサーバ接続用設定
upstream backend2 {
    server host.docker.internal:8000;
}
server {
  listen       80;
  server_name  sample.staticsite.com;
  root         /var/www/html;
  
  location / {
    proxy_set_header  Host                $host;
    proxy_set_header  X-Real-IP           $remote_addr;
    proxy_set_header  X-Forwarded-Host    $host;
    proxy_set_header  X-Forwarded-Server  $host;
    proxy_set_header  X-Forwarded-For     $proxy_add_x_forwarded_for;
    proxy_pass        http://backend2/;
  }  
}

基本的なプロキシ設定自体は同じ それぞれ異なるポートを利用すること

結果

sample.mocky.com/

 % curl http://sample.mocky.com/api/v01/users | jq

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    42    0    42    0     0   8400      0 --:--:-- --:--:-- --:--:--  8400
{
  "users": [
    {
      "name": "hoge"
    },
    {
      "name": "foo"
    }
  ]
}
%

sample.staticsite.com

 % curl http://sample.staticsite.com

<html>
    <head>
        <title>test</title>
    </head>
    <body>
        <p>
            test
        </p>
    </body>
</html>
%

コンテナから他のコンテナへのアクセス

コンテナ名を指定したり、ネットワークを作成して割り当てる方法などもあるようですが、 今回はhost.docker.internalで対応

参考

Docker上のリバースプロキシで静的コンテンツを複数コンテナ間と共有 | Tech Memo

GitHub - panubo/docker-staticsite: Docker image with nginx, awscli and scripts for automated configuration and deployment of static sites

Dockerコンテナ内からホストへ`localhost` でアクセスしてみる | iret.media

github

https://github.com/mshige1979/mocky_docker_sample/tree/nginx

docker-composeで簡易的なスタブサーバを作成

普段、簡易サーバを用意する場合って

毎回、nodejsとかphpとかでデモを一から用意するんですよね… まあ、それでも良いのですが ちょっとだけ楽したいってことがあります。

よく使うの

github.com

使い方の参考リンク

Node.js の mocky を使用し スタブREST API を作成してみる、その1 - Qiita

mocky を使ってちょっと賢いスタブAPIサーバを作る - Qiita

dockerでやりたい

最終的にはnginxとか使いたいけどとりあえず、docker~composeでの試作版を用意する

docker版

ディレクトリ構成

.
├── LICENSE
├── README.md
├── docker-compose.yml
└── dockers
    └── mocky
        ├── Dockerfile
        ├── README.md
        └── app
            ├── api
            │   ├── api.js
            │   └── user.js
            ├── index.js
            ├── package-lock.json
            └── package.json

dockers/mocky/app/package.json

{
  "name": "mocky",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "type": "module",
  "scripts": {
    "start": "nodemon --exec node --experimental-modules index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "mocky": "^0.1.11",
    "nodemon": "^2.0.7"
  },
  "dependencies": {
    "canvas": "^2.6.1",
    "html-pdf": "^2.2.0"
  }
}

dockers/mocky/app/index.js

import mocky from "mocky";
import Api from "./api/api.js";

mocky.createServer([Api.getUser, Api.getUsers]).listen(4321);

※各APIのコードはgithubに記載

docker-compose.yml

version: "3"

services:
  # スタブサーバ用
  mocky:
    # コンテナ名
    container_name: mocky
    # Dockerfile場所
    build: ./dockers/mocky
    # コンテナに入るようにできる
    tty: true
    # ボリューム
    volumes:
      - "./dockers/mocky/app:/usr/src/app"
    # ポート
    ports:
      - "4321:4321"
    # 作業ディレクトリ
    working_dir: /usr/src/app
    # 実行コマンド
    entrypoint: npm start

dockers/mocky/Dockerfile

# ベースイメージ
FROM node:12

# 作業ディレクトリ
WORKDIR /usr/src

# package.jsonをコピー
# ホスト側はDockerfileの場所からの相対パス
COPY ./app/package*.json ./

# パッケージインストール
RUN npm install --no-optional && npm cache clean --force
ENV PATH /usr/src/node_modules/.bin:$PATH

# 作業ディレクトリ
WORKDIR /usr/src/app

# ホスト側はDockerfileの場所からの相対パス
COPY ./app/. ./

# 実行
CMD ["npm", "start"]

起動

 % docker-compose up -d
Creating network "mocky_default" with the default driver
Creating mocky ... done
%

 % curl http://localhost:4321/api/v01/users | jq

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    42    0    42    0     0  14000      0 --:--:-- --:--:-- --:--:-- 14000
{
  "users": [
    {
      "name": "hoge"
    },
    {
      "name": "foo"
    }
  ]
}
%

参考情報

Dockerでmockyを使ったスタブサーバを立ち上げる - Qiita

DockerでNode.jsアプリをイイ感じに保つ4つの方法 #docker - クリエーションライン株式会社

Github

https://github.com/mshige1979/mocky_docker_sample