20201019のdockerに関する記事は16件です。

Djangoチュートリアル(ブログアプリ作成)⑤ - 記事作成機能編

前回、Djangoチュートリアル(ブログアプリ作成)④ - ユニットテスト編 ではユニットテストの実装方法を学んでいきました。

本来であれば、せっかくなので期待するテストを先に書くテスト駆動開発スタイルで実装していきたいところですが
このチュートリアルでは Django ではどんなことが出来るかを学びながらなので、先に実装してからユニットテストを書いていきます。

これから、何回かに分けて今回は以下の機能を追加していきます。

1.記事の作成 (Create)
2.記事の詳細 (Read)
3.記事の編集 (Update)
4.記事の削除 (Delete)

これら機能の頭文字をとって「CRUD」とここでは呼ぶことにします。
(厳密にいえば既に blog_list で Read は出来るので違うかもしれませんが)

さて、今回はベースともいえる記事の作成機能を追加していきましょう。
これまでは管理サイトを使って superuser 権限で記事を追加していましたが、アプリ内で記事を作成出来たほうが便利ですよね。

form の準備

アプリからデータを追加するときは form という仕組みを使います。
form がユーザから入力データを受け付け、view を通して model へデータを渡してデータベースへ登録することができるようになります。

まずは blog アプリ配下に forms.py というファイルを作成します。

.
├── blog
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── forms.py # 追加
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   └── __init__.py
│   ├── models.py
│   ├── tests
│   │   ├── __init__.py
│   │   ├── test_forms.py
│   │   ├── test_models.py
│   │   ├── test_urls.py
│   │   └── test_views.py
│   ├── urls.py
│   └── views.py
├── db.sqlite3
├── manage.py
├── mysite
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── templates
    └── blog
        ├── index.html
        └── post_list.html

作成した forms.py の中身はこのようになります。

forms.py
from django import forms
from .models import Post

class PostCreateForm(forms.ModelForm): # DjangoのModelFormでは強力なValidationを使える

    class Meta:
        model = Post # Post モデルと接続し、Post モデルの内容に応じてformを作ってくれる
        fields = ('title', 'text') # 入力するカラムを指定

説明文も入れているのである程度わかるかと思います。
データを投入したい model を指定すると form が対応する入力フォームを用意してくれるようになります。

なお、最終行でデータを入力するカラムをフィールドとして指定していますが、
fields = 'all' と定義することで全てのカラムを手入力するように指定することもできます。

urls.py の修正

新たに view に追加するクラスは **PostCreateView と名前を予め決めておき、
urls.py では次のようにルーティングを追加しておきましょう。

urls.py
from django.urls import path
from . import views

app_name = 'blog'

urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),
    path('post_list', views.PostListView.as_view(), name='post_list'),
    path('post_create', views.PostCreateView.as_view(), name='post_create'), # 追加
]

success_url では、データベースの変更に成功した場合にリダイレクトさせるページを指定しています。
「アプリ名:逆引きURL名」の形で指定し、結果的に urls.py で指定した 'post_list' にリダイレクトされることになります。
※reverse_lazy は、view に対応した「URLの文字列」を返す。今回であれば /blog/post_list を返してくれます

views.py の修正

先ほど追加するクラス名は PostCreateView と決めましたね。
また、form で入力フォーム用のクラスも作成しました。

次は views.py の中で、またまた汎用クラスビューを使ってクラスを作成します。

views.py
from django.views import generic
from django.urls import reverse_lazy
from .forms import PostCreateForm # forms.py で作ったクラスをimport
from .models import Post

class IndexView(generic.TemplateView):
    template_name = 'blog/index.html'

class PostListView(generic.ListView):
    model = Post

class PostCreateView(generic.CreateView): # 追加
    model = Post # 作成したい model を指定
    form_class = PostCreateForm # 作成した form クラスを指定
    success_url = reverse_lazy('blog:post_list') # 記事作成に成功した時のリダイレクト先を指定

Django の強力なクラスベース汎用ビューのおかげで、これだけのコードで済みます。
作成したい model、作成した form クラス、そして記事作成が成功した時のリダイレクト先を指定してあげるだけです。

template の準備

まだ記事作成(投稿)用の html は作成していなかったので、templates/blog 配下に作成してあげましょう。
名前は post_form.html とします。
※クラスベース汎用ビューの命名規則に沿うことで template 名を指定しなくても OK になります

└── templates
    └── blog
        ├── index.html
        ├── post_form.html # 追加
        └── post_list.html
post_create.html
<form action="" method="POST">
  <table class="table">
      <tr>
        <th>タイトル</th>
        <td>{{ form.title }}</td>
      </tr>
      <tr>
        <th>本文</th>
        <td>{{ form.text }}</td>
      </tr>
  </table>
  <button type="submit" class="btn btn-primary">送信</button>
  {% csrf_token %}
</form>

forms.py の fields で指定した入力フィールドを form という変数で受け取ることができるので、
template 側では form.title と form.text という形で取り出すことができます。

また CSRF (クロスサイトリクエストフォージェリ) という、入力フォームを利用した攻撃を防ぐためのものです。
入力フォームを html に表示させる時は、必ず入れておきましょう。

この状態で runserver コマンドでサーバを起動すると、見た目はひどいものですが入力フォームが表示されます。
(度々ですが、まずは Django の基本をおさえてから見た目を整えます)
image.png

では試しに値を入力し、送信してみましょう。
image.png

送信を押すと、post_list にリダイレクトされます。
そして、先ほど投稿した記事が追加されていることが分かるかと思います。
image.png

これで無事に記事投稿機能を追加することができました。

test_views.py の修正

最後に今回の機能のテストを実装しましょう。

test_views.py に下記のテストクラスを作成します。

test_views.py
...
class PostCreateTests(TestCase):
    """PostCreateビューのテストクラス."""

    def test_get(self):
        """GET メソッドでアクセスしてステータスコード200を返されることを確認"""
        response = self.client.get(reverse('blog:post_create'))
        self.assertEqual(response.status_code, 200)

    def test_post_with_data(self):
        """適当なデータで POST すると、成功してリダイレクトされることを確認"""
        data = {
            'title': 'test_title',
            'text': 'test_text',
        }
        response = self.client.post(reverse('blog:post_create'), data=data)
        self.assertEqual(response.status_code, 302)

    def test_post_null(self):
        """空のデータで POST を行うとリダイレクトも無く 200 だけ返されることを確認"""
        data = {}
        response = self.client.post(reverse('blog:post_create'), data=data)
        self.assertEqual(response.status_code, 200)

基本となる GET の確認、適当なデータの投入とリダイレクトの確認、そして空データ投入時のレスポンスを見ています。

最後にテストを実行しましょう。
image.png

無事に通りましたね。

次回は一気に記事の詳細画面を作成していきます。

→次回
Djangoチュートリアル(ブログアプリ作成)⑥ - 記事詳細・編集・削除機能編

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

Docker 開発環境のパフォーマンスを上げる

やりたいこと

Docker コンテナ環境 (特に VSCode Remote Containers) を快適に動かす

方法

DockerでVolumeをマウントするとき一部を除外する方法 を使って、ビルドファイル等(.gitignore に書くような場所)のボリュームマウントを外す。

経緯

VSCode の Remote Container を使ってコードのビルドを行うと動作が重くなったり、突如 Docker ホストが落ち たり、というということが発生して、最初は何が原因なのか検討もつかなかった。
マウントファイルの高負荷が原因と疑って実施してみたところ、解決、パフォーマンスも改善した。

Remote Containers を 使う場合は開発時にマウントさせる必要もあまりないと思うので、 cached のオプションを使うよりも効果が高そう。

サンプル

この方法を使っているサンプルリポジトリ
- https://github.com/tktcorporation/youtube_to_m3u8

参考

さいごに

Remote Conyainers すてき!

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

【docker】シリアルポートからデータを読む (u-blox 受信機)

docker container でシリアルポートからのデータを扱いたい

Jetson NanoでUSBでu-blox 受信機を接続して、docker container でデータを読むことができました。
そのときのメモです。多分、Jetson Nanoや u-blox は関係なく、一般的な初歩的なお話だと思います。(^^;)
復習も兼ねて「くどく」書いています。。。

ポイントは、Docker のマニュアルにもありますが、ホスト側のシリアリポートをそのまま仮想環境にマッピングするには、一言、docker run の引数に書くだけでOKです。

docker run --device=<ホストOSのdevice>:仮想環境のdevice> 

とするだけです。実際は、Docker-docs-ja で

等を読むと、権限や通信帯域の設定など、細かい話もあるにはあります。が、今回はホストOSと同じ設定(どちらもubuntu18.04だし)なのでdon't care でOKでした。

動作確認

以下、Jetson Nanoでu-blox M8TをUSBで接続し、最後にdocker runで入力を読めることを確認したときのメモです。

シリアル通信するデバイスの動作確認

デバイスはu-blox M8Tを使いました。(だから何だ。。。)

$lsusb
Bus 001 Device 004: ID 1546:01a8 U-Blox AG
Bus 001 Device 002: ID 0bda:5411 Realtek Semiconductor Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$dmesg
...
[1442054.399797] tegra-xusb-padctl 7009f000.xusb_padctl: power on UTMI pads 1
[1442054.403431] tegra-xusb 70090000.xusb: Firmware timestamp: 2019-10-17 15:58:59 UTC, Version: 50.25 release
[1442054.404047] tegra-pmc: PMC tegra_pmc_utmi_phy_disable_sleepwalk : port 0
[1442054.404242] tegra-pmc: PMC tegra_pmc_utmi_phy_disable_sleepwalk : port 1
[1442054.404427] tegra-pmc: PMC tegra_pmc_utmi_phy_disable_sleepwalk : port 2
[1442054.405876] tegra-xusb 70090000.xusb: exiting ELPG done
[1442054.409069] usb usb2: usb_suspend_both: status 0
[1442054.750106] usb 1-2.4: new full-speed USB device number 4 using tegra-xusb
[1442054.773772] usb 1-2.4: New USB device found, idVendor=1546, idProduct=01a8
[1442054.773846] usb 1-2.4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[1442054.773896] usb 1-2.4: Product: u-blox GNSS receiver
[1442054.773944] usb 1-2.4: Manufacturer: u-blox AG - www.u-blox.com
[1442054.864251] cdc_acm 1-2.4:1.0: ttyACM0: USB ACM device
[1442054.864676] usbcore: registered new interface driver cdc_acm
[1442054.864679] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
$ ls -lth /dev/ttyACM*
crw-rw---- 1 root dialout 166, 0 10月 19 17:08 /dev/ttyACM0

u-blox 受信機をUSBポートにさしました。

$ sudo usermod -a -G dialout $USER
$ screen /dev/ttyACM0 115200

screenはctrl+a d で終了します。

docker 素材の用意

次に、シリアルポートからデータを読む python スクリプトを用意します。pyserialを使います。

serial_read.py
#!/usr/bin/env python3
import sys
import serial

port = sys.argv[1]
with serial.Serial(port, 115200) as ser:
    while True:
        data =ser.read(1024)
        print(data)

python3 serial_read.py /dev/ttyACM0 で動作確認をした後、Dockerfile を作成します。

FROM ubuntu:18.04

# Install python and pip
RUN apt-get update -y && \
  apt-get install -y -qq --no-install-recommends \
  python3 \
  python3-serial \
 && apt-get clean \
 && rm -rf /var/lib/apt/lists/*

ENV PATH /usr/local/bin/:$PATH

# the port number the container should expose
COPY serial_read.py /usr/local/bin
RUN  chmod +x /usr/local/bin/serial_read.py

ENTRYPOINT [ "serial_read.py" ]

動作確認

できたら、build して動かしてみます。ここでは、仮想環境でのシリアルポートを /dev/myserialport としました。

$ docker build -t test/serial .
Successfully tagged test/serial:latest
$ docker run --device=/dev/ttyACM0:/dev/myserialport --rm -it test/serial /dev/myserialport
b'$GNRMC,093210.00,V,,,,,,,191020,,,N*61\r\n$GNVTG,,,,,,,,,N*2E\r\n$GNGGA,093210.00,,,,,0,00,99.99,,,,,,*71\r\n$GNGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*2E\r\n$GNGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*2E\r\n$GPGSV,2,1,06,04,,,13,05,,,12,20,,,21,24,,,11*7B\r\n$GPGSV,2,2,06,26,,,09,29,,,21*7A\r\n$GLGSV,1,1,00*65\r\n$GNGLL,,,,,093210.00,V,N*5D\r\n$GNZDA,093210.00,19,10,2020,00,00*78\r\n$GNTXT,01,01,02,u-blox AG - www.u-blox.com*4E\r\n$GNTXT,01,01,02,HW UBX-M8030 00080000*60\r\n$GNTXT,01,01,02,EXT CORE 3.01 (111141)*39\r\n$GNTXT,01,01,02,ROM BASE 2.01 (75331)*19\r\n$GNTXT,01,01,02,FWVER=TIM 1.10*50\r\n$GNTXT,01,01,02,PROTVER=22.00*18\r\n$GNTXT,01,01,02,MOD=NEO-M8T-0*7D\r\n$GNTXT,01,01,02,FIS=0xEF4015 (100111)*58\r\n$GNTXT,01,01,02,GPS;GLO;GAL;BDS*77\r\n$GNTXT,01,01,02,SBAS;IMES;QZSS*49\r\n$GNTXT,01,01,02,GNSS OTP=GPS;GLO*37\r\n$GNTXT,01,01,02,LLC=FFFFFFFF-FFFFFFED-FFFFFFFF-FFFFFFAE-FFFFFF69*27\r\n$GNTXT,01,01,02,ANTSUPERV=AC SD PDoS SR*3E\r\n$GNTXT,01,01,02,ANTSTATUS=OK*25\r\n$GNTXT,01,01,02,PF=3FA*4C\r\n$GNRMC,093211.00,V,,,,,,,191020,,,N*60\r\n$GNVTG,,,,,,,,,N*2E\r\n$'

無事に動いたのでよかった。(^^)/

まとめ

とりあえず、docker でシリアルポートを扱うことはできた。リソースの取り扱いにはオプションがあるので、将来的にはそれらを使うことになるかもしれないので、そのときはそのとき。

(2020/10/19)

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

Dockerのコンテナとホストとの関係の条件付け

はじめに

Dockerは多くのIT開発企業で導入されている環境構築を楽にする技術です。
Dockerで作成したコンテナはホスト(自身のPCやAWSなどのクラウド)に対して、ファイルを読み込んだり、また、ホストのサーバーからコンテナへ接続したり、というような関係を持ちます。
それらの関係の条件を指定するために、docker runにオプションを付けて、実行します。
今回はコンテナとホストとの関係の条件付けのためのオプションを紹介します。

今回紹介する内容(docker runコマンドとオプション)

  • コンテナからホストのファイルに接続できるようにする (docker run -v)
  • ユーザーIDやグループIDの指定する (docker run -u)
  • ホストのポートとコンテナのポートをつなげる (docker run -p)
  • コンテナがアクセスできるCPUやメモリの上限を設定する(docker run --cpus)(docker run --memory)

コンテナからホストのファイルに接続できるようにする (docker run -v)

ホストのファイルをコンテナの中にも存在するように振舞わせることをマウントと言います。
コンテナは誰かに使ってもらったり、手軽に実行させたりできるように、サイズが小さいことが望ましいので、可能な限りコンテナ自体にファイルを設置しないようにします。
例えば、コードのファイルはホストに置いておき、コンテナからホストのコードのファイルを読み込ませるという場合、コードのファイルをコンテナにマウントさせる、と言います。

docker run -it -v (ホストのパス):(コンテナのパス) (DockerImageの名前 or ID) bash

例) docker run -it -v /Desktop/sample_dir:/new_dir (DockerImageのID) bash
=> コンテナのnew_dirというディレクトリにホストのDesktopに存在するsample_dirというディレクトリがマウントされます。
(コンテナにnew_dirというディレクトリが存在しない場合は、コンテナにnew_dirというディレクトリが自動で作成されます。)

ユーザーIDやグループIDの指定する (docker run -u)

ホストのファイルをコンテナでマウントさせる場合、ユーザーIDやグループIDを指定しないと、コンテナがルート権限を持ってアクセスすることができてしまいます。
ルート権限がコンテナ側にあると、コンテナからホストのファイルを作成したり、編集したり、様々なことができてしまいます。
ルート権限を持たせたくない場合には、ユーザーIDやグループIDを指定して、マウントさせます。

docker run -it -u (ユーザーID):(グループID)

例) docker run -it -u $(id -u):$(id -g) -v /Desktop/sample_dir:/new_dir (DockerImageのID) bash
=> ユーザーIDとグループIDが指定して、ホストのファイルをマウントしたコンテナが作成される。

ホストのポートとコンテナのポートをつなげる (docker run -p)

ポートとはサーバーの中の特定の場所です。
例えば、サーバーに複数のサービスがあった場合、IPアドレスだけではどのサービスに接続するか分からないため、ポートを指定します。
作成したコンテナを一つのWebサービスとする場合、コンテナのポートとホストのポートをつなげる必要があります。

docker run -it -p (ホストのポート):(コンテナのポート)

例) docker run -it -p 3000:3000 rails bash
=> railsというDockerImageからコンテナが作成され、railsのデフォルトのポート3000に繋がるため、ホスト側でlocalhost:3000にアクセスするとrailsにアクセスすることができます。

コンテナがアクセスできるCPUやメモリの上限を設定する(docker run --cpus)(docker run --memory)

コンテナが動く時、ホストのCPUやメモリを使います。
例えば、一つのコンテナが限界までCPUやメモリを使ってしまった場合、メモリが枯渇してシステム全体が落ちてしまう可能性があります。
そのようなリスクを避けるために、それぞれのコンテナに対して、CPUやメモリの上限設定をします。

docker run -it --cpus (論理コア数) --memory (メモリ容量)

例) docker run -it --cpus 4 --memory 2g ubuntu bash
=> ubuntuというDockerImageからコンテナが作成され、このコンテナが使えるCPUの論理コアの上限は4つで、メモリの上限は2ギガとなります。
(コンテナのCPUやメモリを確認したい時は、"docker inspect (コンテナID)"を入力します。)

※自身のPCのCPUやメモリが知りたい場合はターミナルに以下の入力をすると確認できます。

  • sysctl -n hw.logicalcpu_max => CPU(論理コア数)
  • sysctl hw.memsize => メモリ(byte)

参考

Udemy

かめれおん講師 「米国AI開発者がゼロから教えるDocker講座」

https://www.udemy.com/share/103aTRAEAdd1pTTHoC/

有料ですが、初学者の私にも非常に理解しやすかったです。

最後に

本投稿が初学者の復習の一助となればと幸いです。

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

【Docker】Unsupported config option for services.app: 'node'

docker環境構築を作っていて、npmを初期化するコマンドを入力したら、Errorが発生した。

#docker-compose run --rm node npm init
ERROR: The Compose file './../docker-compose.yml' is invalid because:
Unsupported config option for services.app: 'node'

このError内容を見ると、docker-compose.ymlファイルの 'node' 辺りでErrorが発生しているみたい。。。

ymlファイルの該当箇所を確認したところ、本来は「services->node」が正しいが、「services->app->node」にインデントがずれていた。。。

間違い↓

version: '3'
services:
  app:
    image: nginx:latest
    container_name: "app"
    ports:
      - "8080:80"
    volumes:
      - ./src/html:/app
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    node:
      image: node:10
      container_name: node
      tty: true
      working_dir: /usr/src/app
      volumes:
       - ./src:/usr/src/app

正しい↓

version: '3'
services:
  app:
    image: nginx:latest
    container_name: "app"
    ports:
      - "8080:80"
    volumes:
      - ./src/html:/app
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
  node:
    image: node:10
    container_name: node
    tty: true
    working_dir: /usr/src/app
    volumes:
      - ./src:/usr/src/app

修正されたコードを実行したら

#docker-compose run --rm node npm init
Creating network "app_default" with the default driver
Pulling node (node:10)...
10: Pulling from library/node
0400ac8f7460: Pull complete
fa8559aa5ebb: Pull complete
da32bfbbc3ba: Pull complete
e1dc6725529d: Pull complete
572866ab72a6: Pull complete
63ee7d0b743d: Pull complete
90a199058c87: Pull complete
eec01b4217d9: Pull complete
a6a01f1bcd7b: Pull complete
Digest: sha256:9d06418fa4335f9cf96c59d5c09372f7a56329e7234456ee9fe2340c4ac35a95
Status: Downloaded newer image for node:10
Creating app_node_run ... done

無事成功!!!

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

Dockerとdocker-composeを ラズパイ4 と Linux(Debian) と Windows10 にそれぞれインストールする

最近勉強している、Docker と docker-compoesについて書きます。
本当は、同じDockerfile と ymlを用いて動作環境を作って便利さを実感するところまで書きたかったのですが、次回にしようと思います。

まず、ラズパイ4にDockerとdocker-composeをインストール

ラズパイはARMだからか?、Linux版とはインストール方法が異なる。

環境

  • ラズパイ4 + Rasbian10

1.前準備

1-1. パッケージの一覧を更新する

$ sudo apt-get update

1-2. gitインストール

$ sudo apt-get install git-all

1-3. curlインストール

$ sudo apt-get install curl

2. Docker/docker-composeインストール

2-1. Dockerを取得しインストールする。

$ curl -sSL https://get.docker.com | sh
$ docker -v
Docker version 19.03.13, build 4484c46d9d

versionが表示されれば、インストール成功。

2-2. Docker composeインストール

gitから取得した環境docker-compose instal shellを実行

$ git clone https://github.com/docker/compose.git
$ cd compose
$ git checkout 1.27.4
$ sudo ./script/build/linux
$ cd dist
$ sudo cp docker-compose-Linux-armv7l /usr/local/bin/docker-compose
$ cd /usr/local/bin
$ sudo chown root:root docker-compose
$ sudo chmod 755 docker-compose
$ docker-compose -v
docker-compose version 1.27.4, build 40524192

versionが表示されれば、インストール成功。

次、PC LinuxにDockerとdocker-composeをインストール

環境

  • Debian10

1.前準備

ここはラズパイと同じため、省略

2. Docker/docker-composeインストール

2-1. Dockerを取得しインストールする。

$sudo apt-get -y remove docker docker-engine docker.io
$sudo apt-get -y update
$sudo apt-get -y install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg2 \
    software-properties-common
$sudo curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg | sudo apt-key add -
$sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
   $(lsb_release -cs) \
   stable"
$sudo apt-get update
$sudo apt-get -y install docker-ce
$docker -v
Docker version 19.03.13, build 4484c46d9d

versionが表示されれば、インストール成功。

2-2. Docker composeインストール

gitから取得した環境docker-compose instal shellを実行

$sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
docker-compose version 1.27.4, build 40524192

versionが表示されれば、インストール成功。

最後、Windows10

ほぼ、手動でやることはなかったので、ほぼ参照です。。

環境

  • Windows10 + WSL2
    ※最終的に、VSCodeと連携するおデバッグ実行できてとても便利。

1.前準備

1-1. Windowのバージョンを2004以降にする。

下記参照。
https://support.microsoft.com/ja-jp/help/4028685/windows-10-get-the-update

1-2. WSL2をインストールする。

下記参照。
https://docs.microsoft.com/ja-jp/windows/wsl/install-win10

2.Docker DeskTopをインストール(Windows向けDocker、docker-compose環境)

2-.1 Docker DeskTopインストール

下記参照。
https://docs.docker.com/docker-for-windows/install/

次回は、Dockerfile、ymlファイルを用意して実行するところを書きます。

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

Python で parameter store を使う

はじめに

以前、仕事で使った Parameter Store(AWS Systems Manager) をまた使うことになったので思い出しました。

今回もPoetry + Dockerを開発環境にしています。
ソースは Github にあげてあります。

Parameter Store を設定する

/aaa で始まるように作成
スクリーンショット 2020-10-19 16.58.17.png

ファイル

mainとライブラリとしてファイルを分けています。

main.py
from src.ssm_manager import SsmManager

print("start")

ssm_manager = SsmManager(region_name="ap-northeast-1")
ssm_manager.load_parameter(base_ssm_path="/aaa")
print(ssm_manager.parameters)
ssm_manager.py
from typing import List, Dict

import boto3


class SsmManager:
    def __init__(self, region_name: str):
        self.__ssm = boto3.client('ssm', region_name=region_name)
        self.__parameters = []
        self.__base_ssm_path = None

    @property
    def parameters(self) -> List[Dict[str, any]]:
        return [{
            'name': item['Name'].replace(f'{self.__base_ssm_path}/', ''),
            'value': item['Value']
        } for item in self.__parameters]

    def load_parameter(self, base_ssm_path: str) -> None:
        self.__base_ssm_path = base_ssm_path
        result = []
        next_token = None
        while True:
            dict_parameter = {
                'Path': base_ssm_path,
                'Recursive': True,
                'WithDecryption': True,
            }
            if next_token is not None:
                dict_parameter['NextToken'] = next_token
            response = self.__ssm.get_parameters_by_path(**dict_parameter)
            parameters = response['Parameters']
            result.extend(parameters)
            if 'NextToken' not in response:
                break
            next_token = response['NextToken']
        self.__parameters = result

終わりに

これで、環境変数などに入れていたRDSのパスワードなどを保存できます。

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

TAO Core をDockerで動かす

備忘録として

環境

macOS Catalina 10.15.7
docker desktop 2.4.0.0
TAO Core 3.3.0-RC2

流れ

  • ここからDLして解凍したフォルダに移動
  • Terminalで docker-compose build を実行 するとエラーになった
  • エラーメッセージから docker/phpfpm/Dockerfile の6行目、apt-getで色々installしている中に libzstd-dev を追記
  • 改めて docker-compose build を実行
  • 完了したら docker-compose up -d
  • ブラウザで http://localhost にアクセスでTAO Installation Wizardのページが開く。

気になったこと

  • 公式からDLしたのに素直にビルドできないとは
  • Installation Wizardの最初にRequirements Checkが表示されるが、Nginx is not officially supported.と言われる

中身はまだ触っていないのでこれから

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

更新したDockerfileの再読み込みは何をすればいい?

はじめに

メンバーからもらったDockerや、GitからクローンしてきたDocker。
それぞれローカル環境に沿った内容に書き換えた時はなにをすればいいのか?
簡単な備忘録程度にまとめました。

結論docker-compose up --build でOK

自分で更新したDockerfileを再読み込みするには、
docker-compose down
docker-compose up だけでは、初回に作ったイメージを利用しちゃうので
docker-compose up --build で1から作り直す必要があります。

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

まだVMで消耗してるの? Dockerの良い所、関連用語の解説!

はじめに

Dockerはコマンド一発で環境構築でき、開発環境をそのまま本番環境に移せるツールです。
今回、簡単にDockerについて解説します!

【YouTube動画】 まだVMで消耗してるの? Dockerの良い所、関連用語を解説します!
Collation

VMとコンテナの違い

動画だとこの部分に相当します。

大きな違いはホストOS (いまメインで使ってるOS) 上で別のOSが動いているかどうかです。

VMではOSの上で別のOSが動いているので、動作が遅いです。
対して、コンテナ技術を使った仮想化では、今使ってるOS上で動かしているので、動作が早いです!

ちなみにコンテナはDockerだけじゃなく、他にもcontainerdやpodmanなどいろんなものがあります。

Dockerの使い所

動画だとこの部分になります。
Dockerの利便性として、以下のようなものがあります。

  • フロントエンドの実装だけする人や初心者が大変な環境構築を一発でできる
  • CircleCIなどCIサービス
  • イミュータブル・インフラストラクチャ (環境を毎回新しく作り直せる!) 
    -> パッチを当てて脆弱性を修正する必要がなくなります!

もう開発にはなくてはならないツールですね。

Dockerの用語まとめ

Docker関連でよく見る単語について紹介しておきます。
動画だとこの部分です。

  • Docker Hub
    Docker HubはDockerイメージを保存しておくリポジトリです。
    ちなみに2020年11月から、半年間未使用のイメージが削除されるようになったので、気をつけてください (フリープランの人)。

  • Dockerfile
    作成するDockerイメージの設定を書いておくファイルです。
    設定を書くと、RUNやADDなどの命令がある行ごとに中間イメージが作成されます。

  • docker-compose
    複数のDockerコンテナを連携するために使用します。

  • kubernetes
    発音は以下のサイトで確認ください。
    https://www.youtube.com/watch?v=3uFqJ0IhxVA

コンテナ運用の自動化をするために使います。
kとsの間に8文字あるので、k8sとか略されます。

  • Amazon ECR (Amazon Elastic Container Registry)
    コンテナイメージをAWS上で管理するために使います。

  • Amazon ECS (Amazon Elastic Container Service)
    クラスターでコンテナ実行、停止、管理ができるサービスです。

  • Amazon EKS (Amazon Elastic Kubernetes Service)
    AWS上でk8sを運用するためのサービスです。

  • Amazon Fargate
    コンテナ向けのサーバレスサービスです。

まとめ

Dockerについて興味をもっていただけたでしょうか?

もっと詳しく学びたいと思われた方は、以下のQiita記事が大変詳しいので、オススメします!
いまさらだけどDockerに入門したので分かりやすくまとめてみた

twitteryoutubeでのコメントもお待ちしています!

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

DockerでNuxt.js + TypeScript + Sassの環境構築

概要

nuxt.jsをdockerで動かすための環境を作ったので忘れない様に残しておきます。

環境

・macOS
・Docker for mac

ファイル構成

最終的なファイル構成は以下の様な感じになります。

- docker
  - nuxt
    - Dockerfile
- sample
  - nuxt.config.js
  - その他省略
- docker-compose.yml 

手順

Dockerfile作成

Dockerfile
FROM node:14.4.0-alpine

WORKDIR /app

RUN apk update && \
    npm install -g npm && \
    npm install -g @vue/cli && \
    npm install -g @vue/cli-init

ENV HOST 0.0.0.0
EXPOSE 3000

CMD ["/bin/ash"]

docker-compose.yml作成

docker-compose.yml
version: '3'
services:
  nuxt:
    build: ./docker/nuxt
    ports:
      - 3000:3000
    volumes:
      - .:/app
    stdin_open: true
    tty: true

イメージをビルド

$ docker-compose build

コンテナを立ち上げる

$ docker-compose up -d

作成したコンテナ内に入ります

$ docker exec -it nuxt-docker_nuxt_1 /bin/sh

create-nuxt-appでnuxtプロジェクトを作成する

npxはインストールしていないパッケージを一度だけ実行できる機能があります。

$ npx create-nuxt-app sample

色々な選択肢が出てきるので好きなのを選びましょう。
※そしてここでTypeScriptを選択すること。

create-nuxt-app v3.1.0
✨  Generating Nuxt.js project in sample
? Project name: sample
? Programming language: TypeScript
? Package manager: Npm
? UI framework: None
? Nuxt.js modules: (Press <space> to select, <a> to toggle all, <i> to invert selection)
? Linting tools: (Press <space> to select, <a> to toggle all, <i> to invert selection)
? Testing framework: Jest
? Rendering mode: Single Page App
? Deployment target: Server (Node.js hosting)
? Development tools: (Press <space> to select, <a> to toggle all, <i> to invert selection)

インストールが無事完了したら下記のメッセージが出ます。

?  Successfully created project sample

  To get started:

        cd sample
        npm run dev

  To build & start for production:

        cd sample
        npm run build
        npm run start

  To test:

        cd sample
        npm run test


  For TypeScript users. 

  See : https://typescript.nuxtjs.org/cookbook/components/

※TypeScriptの使い方についてはhttps://typescript.nuxtjs.org/cookbook/components/ を参照してくださいとのこと。

ガイドに沿ってnuxt.jsを立ち上げてみます。

$ cd sample
$ npm run dev
> nuxt


   ╭───────────────────────────────────────╮
   │                                       │
   │   Nuxt.js @ v2.13.3                   │
   │                                       │
   │   ▸ Environment: development          │
   │   ▸ Rendering:   client-side          │
   │   ▸ Target:      server               │
   │                                       │
   │   Listening: http://localhost:3000/   │
   │                                       │
   ╰───────────────────────────────────────╯

ℹ Preparing project for development                                                           16:39:27
ℹ Initial build may take a while                                                              16:39:27
✔ Builder initialized                                                                         16:39:27
✔ Nuxt files generated                                                                        16:39:27
ℹ Starting type checking service...                                           nuxt:typescript 16:39:31

✔ Client
  Compiled successfully in 11.52s

ℹ Type checking in progress...                                                nuxt:typescript 16:39:43
ℹ Waiting for file changes                                                                    16:39:43
ℹ Memory usage: 261 MB (RSS: 361 MB)                                                          16:39:43
ℹ Listening on: http://localhost:3000/                                                        16:39:43
ℹ No type errors found                                                        nuxt:typescript 16:39:45
ℹ Version: typescript 3.8.3                                                   nuxt:typescript 16:39:45
ℹ Time: 13999 ms   

無事立ち上がったようなのでhttp://localhost:3000/ にアクセスしてみます。
スクリーンショット 2020-07-04 16.40.20.png

あれっ?

調べてみるとどうやら以下のserverの記述がnuxt.config.jsに必要なようです。
[参考]
https://qiita.com/arthur_foreign/items/bc87c9b66e7ea9710c6b

nuxt.config.js
  mode: 'spa',
  server: {
    port: 3001, // 3000でもいい
    host: '0.0.0.0',
  },

再チャレンジ

$ npm run dev

> nuxt


   ╭──────────────────────────────────────────╮
   │                                          │
   │   Nuxt.js @ v2.13.3                      │
   │                                          │
   │   ▸ Environment: development             │
   │   ▸ Rendering:   client-side             │
   │   ▸ Target:      server                  │
   │                                          │
   │   Listening: http://192.168.0.11:3001/   │
   │                                          │
   ╰──────────────────────────────────────────╯

ℹ Preparing project for development                                                           17:02:18
ℹ Initial build may take a while                                                              17:02:18
✔ Builder initialized                                                                         17:02:18
✔ Nuxt files generated                                                                        17:02:18
ℹ Starting type checking service...                                           nuxt:typescript 17:02:22

✔ Client
  Compiled successfully in 3.93s

ℹ Type checking in progress...                                                nuxt:typescript 17:02:26
ℹ Waiting for file changes                                                                    17:02:26
ℹ Memory usage: 271 MB (RSS: 345 MB)                                                          17:02:26
ℹ Listening on: http://192.168.0.11:3001/                                                     17:02:26
ℹ No type errors found                                                        nuxt:typescript 17:02:31
ℹ Version: typescript 3.8.3                                                   nuxt:typescript 17:02:31
ℹ Time: 9546 ms                   

スクリーンショット 2020-07-04 17.04.25.png

無事立ち上げることができました?

Sassの追加

プロジェクトのディレクトリにて追加でsass-loaderをnpm installしてあげればokです。
[参考]
https://ja.nuxtjs.org/faq/pre-processors/

$ npm install --save-dev node-sass sass-loader
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker + Django + Reactの環境構築

Dockerfile(Django用)

FROM python:3.9.0
ENV PYTHONUNBUFFERED 1
RUN mkdir /backend
WORKDIR /backend
ADD requirements.txt /backend/
RUN pip install -r requirements.txt
ADD . /backend/

Dockerfile-nodejs(React用)

FROM node:12.19.0
RUN mkdir /frontend
WORKDIR /frontend
RUN npm install -g create-react-app

requirements.txt

Django==3.1
psycopg2

docker-compose.yml

version: '3'

services:
  db:
    image: postgres
    environment: 
      POSTGRES_PASSWORD: password
  django:
    build: .
    command: python3 manage.py runserver 0.0.0.0:8000
    volumes:
      - ./backend:/backend
    ports:
      - "8000:8000"
    depends_on:
      - db

  react:
    build:
      context: .
      dockerfile: "./Dockerfile-nodejs"
    volumes:
      - .:/frontend
    command: >
        cd frontend && yarn start
    ports:
      - "3000:3000"
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CentOS8にNginxを入れずにdockerでNginx起動

Qiiaに投稿してみるにあたり、自分のブログに掲載した内容をQiia向けに修正して投稿してみることに。画像挿入や見出しや引用など、修正する作業量は割と多かった。

CentOS8にNginxを入れずにNginx起動する

CentOS8にNginxを入れずにNginx起動することは可能だ。具体的にはdockerをインストールしてdockerを利用してNginxを起動する。
# nginx -V
2020-10-18_185817.png

CentOS8にはNginxをインストールしていないので、コマンドが見つかりませんでしたのメッセージ。その後にnginx のインストールを促してくるがNo。この状態でdockerをインストールしてdockerを利用してNginxを起動してみる。

CentOS8にdockerをインストール手順についての参照元

docs.docker.comCentOSにDockerエンジンをインストールするを参考にしようかと思ったが、CentOS7を対象としており、CentOS8向けではなかった。そのため、CentOs8にdockerをインストールを参考にさせてもらいインストールの実施をすることにした。

CentOS8にdockerをインストール(失敗)

手順としては
CentOSにDockerエンジンをインストールするを参考に、一応古いバージョンのアンインストールを実施
# dnf remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

②CentOS Linuxのバージョン確認
# cat /etc/centos-release
CentOS Linux release 8.2.2004 (Core)

③リポジトリの追加 確認
# dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

④リポジトリの確認
# dnf repolist

⑤DockerEngineのインストールを実施(失敗)
# dnf install --nobest docker-ce

2020-10-18_182424.png
CentOS8をインストール直後の状態では、古いバージョンのdockerアンインストールは対象が無かったので「①CentOSにDockerエンジンをインストールするを参考に、一応古いバージョンのアンインストールを実施」は飛ばしてもらって問題ない。

CentOS8にdockerをインストール(成功)

競合するパッケージがあり、DockerEngineのインストールに失敗したので、警告通り競合するパッケージを置きかえるコマンドラインを追加して再度CentOS8にdockerのインストールを実施した
⑤DockerEngineのインストールを実施(成功)
# dnf install --nobest docker-ce --allowerasing

2020-10-18_182500.png
dockerインストールが成功したので
⑥dockerのバージョンを確認
# docker --version
Docker version 19.03.13, build 4484c46d9d

⑦dockerの自動起動と起動設定
# systemctl enable docker
# systemctl start docker

を実施。
2020-10-18_182614.png

dockerを利用してNginxを起動する

⑧dockerを利用してNginxを起動
# docker run --name testnginx -d -p 8080:80 nginx

⑨dockerのコンテナの状態の情報表示
# docker ps -a

2020-10-18_232838.png
docker runでnginxを「testnginx」という名前で<ホスト側のポート>:<コンテナ側のポート>を8080:80で実行している。
docker ps -aでコンテナの状態を表示すると
NAMESが「testnginx」PORTSが「0.0.0.0:8080->80/tcp」と、指定した条件で実行されているのが確認できる。なお後で確認することになるので、CONTAINER IDが「c917cab45486」で実行されていることにも注目しておいてほしい。

Firefoxでlocalhost:8080にアクセス

Firefoxでlocalhost:8080にアクセスする。8080なのはdocker runで「-p 8080:80」と指定した為だ。
2020-10-18_182852.png
CentOS8にNginxを入れずにdockerを利用してNginx起動することに成功した。

Dockerコンテナ、イメージを削除する

⑩dockerのコンテナ、イメージの停止
# docker stop c917cab45486

⑪dockerのコンテナ、イメージを削除
# docker rm c917cab45486

⑫dockerのコンテナの状態の情報表示
# docker ps -a

2020-10-18_234125.png
実行中のコンテナ、イメージを削除しようとするとエラーとなるので、事前にdocker stopでCONTAINER ID「c917cab45486」を指定して停止している。その後、docker rmで削除してdockerのコンテナ、イメージが無くなったことをdocker ps -aで確認している。

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

Windows環境上にLinuxを構築。laradockを導入してMigrationするまでの手順

開発環境

Laravel 7.20.0
PHP 7.4
MYSQL 8.0.21
Windows version 2004

全体のおおまかな流れ

  • Ubuntu導入
  • WSL2に更新・導入
  • dockerインストール
  • laradock導入

本記事のゴール

本記事はWindows環境上にWSL2を用いてLinux環境を構築し、Laradockを導入して画面の表示+Migrationすることを目標としています。

まずはUbuntu導入準備から

Windowsを最新状態にアップデート(下記URLでダウンロード)

https://support.microsoft.com/ja-jp/help/4028685/windows-10-get-the-update

PCの設定から開発者モードに変更

• 「設定(スタートボタンの歯車アイコン)」-「更新とセキュリティ」-「開発者向け」を選択
• 「開発者向け機能を使う」欄の「開発者モード」を選択して有効化

追加機能でSubsystem for Linuxを有効化

• 「コントロールパネル」-「プログラム」-「Windowsの機能の有効化または無効化」を選択
• 一覧のなかから「Windows Subsystem for Linux(Beta)」にチェックを入れる

windows version2004の場合は表記が「Linux用Windowsサブシステム」に変更しているためそれを有効化してください。

PC再起動

Ubuntuのインストール

UbuntuとはLinuxディストリビューションの1つであり、フリーソフトウェアとして提供されている

Microsoft storeでubunntuをインストール。

コマンドプロンプトでbashと入力。(Ubuntuにログイン出来たら成功)

続いてUbuntuの状態を最新にします。

$ sudo apt-get update
$ sudo apt-get dist-upgrade
$ sudo apt-get autoremove

GitとPHPを取得

普通にインストールすると古いバージョンのGitがインストールされるので、リポジトリを追加して最新のものを取得。

下記コマンドを実行。

$ sudo apt-get install build-essential
$ sudo add-apt-repository ppa:git-core/ppa
$ sudo apt-get update
$ sudo apt-get install git
$ git --version //最新になっていたらOK
git version 2.28.0

PHP

※PHP--version 7.4を指定しています。

$sudo apt-get install php7.4 php7.4-fpm php7.4-mysql php7.4-mbstring php7.4-gd
$ php -v  //指定したバージョンがインストールされているかを確認
PHP 7.4.3 (cli) (built: May 26 2020 12:24:22) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies

WSL2の事前準備

WSL2とはLinuxカーネルが動作する「本物のLinux環境」

「Windows PowerShell」の中の「Windows PowerShell」を「管理者として実行」して下記コマンドを実行
PS C:\>dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

PS C:\>dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

PCを再起動
バージョンの確認
C:¥> ver
Microsoft Windows [Version 10.0.19041.84]

バージョンが10.0.18917以上であることを確認
デフォルトをWSL2に設定するため、下記コマンドを実行。
C:¥> wsl --set-version ubuntu 2

WSL2に切り替わっているか確認。

C:¥> wsl -l -v
  NAME    STATE    VERSION
* Ubuntu   Stopped    2

WSL2を導入したのでDockerを構築するうえでの事前準備は完了

Dockerのインストール

DockerとはLinux コンテナの作成と使用を実現するオープンソースのコンテナ化技術

下記URLからDocker Desktop Edgeをインストール

https://docs.docker.com/docker-for-windows/wsl-tech-preview/

PC再起動

再起動後、タスクバーのdockerアイコンから「setting」を選択
「Enable the experimental WSL2 based engine」にチェックを入れ「Appli&Restart」をクリック

再起動が終わってnotificationと表示されたらOK

続いて、ResourcesのWSLIntegration内の「Enable WSL Integration」をクリック

「Ubuntu」を選択して「Appli&Restart」をクリック

Dockerの動作確認

C:\Users\magic>wsl -d ubuntu
$ docker -v
Docker version 19.03.5, build 633a0ea838

####Hello Worldと表示されれば成功
$ docker run hello-world
To run a command as administrator (user "root"), use "sudo ".
See "man sudo_root" for details.

Hello from Docker!

Laradock導入

本番環境に必要なパッケージを提供してくれる。Homesteadをより細かく分割したようなもの

前提

Laradockも含めて1プロジェクト1リポジトリで管理したいので下記構成。

 ──project_dir
 ├ app  //laravel ディレクトリ
 │  ├  app
 │  │ bootstrap
 │ └ .env
 │   
 └ Laradock

Laradockをgit clone

$git clone https://github.com/Laradock/laradock.git

設定ファイル(env-exampl)をコピーして.envを生成

$ cd laradock
$ cp env-example .env

コピーしたenv(Laradock.env)ファイルの編集

指定したいプロジェクトを指定

APP_CODE_PATH_HOST=../
APP_CODE_PATH_HOST=../プロジェクト名/

データの保存ディレクトリを指定

DATA_PATH_HOST=~/.laradock/data
+ DATA_PATH_HOST=.laradock/data

プロジェクト名の設定

laradockを使ったプロジェクトを複数作る場合、プロジェクト名が同じ場合、過去に作った同じ名前のコンテナイメージが上書きされてしまいまうため、被らない名前を設定

COMPOSE_PROJECT_NAME=laradock
+ COMPOSE_PROJECT_NAME=

MYSQLの設定

MySQLは8系になってパスワードの生成方法が変わったらしくLaravelから操作できないため下記記述を追記。

/lardock/mysqmy.cnfに下記を追加

// [mysqld]のエリアに追記する(デフォルトの場合一番下)
default_authentication_plugin=mysql_native_password

Laravel.envの設定

DBの設定を合わせて変更します
※DB_HOSTはdocker-compose.ymlに書かれているコンテナ内名を指定します。

DB_CONNECTION=mysql
DB_HOST=mysql(既存だと127.001になっていると思うのでmysqlに修正)
DB_PORT=3306
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret

Laradockの起動

下記コマンドでlaradockを起動します。 引数には起動したいミドルウェアを指定

なお、projectが存在しない場合はroot権限で作成されてしまうため、必ず作成した状態で起動すること

$ docker-compose up -d nginx mysql workspace

起動確認

$ docker-compose ps

Dockerコンテナ内からLaravelをインストール

dockerコンテナ内からlaravelをインストールする方法と、設定。

下記コマンドでWorkspaceコンテナに入る。

※userオプションでユーザを指定してください。

$ docker-compose exec --user=laradock workspace /bin/bash

コンテナ内で下記を実行してLaravelをインストール。

/var/www$ composer create-project --prefer-dist laravel/laravel .

インストール完了したところで動作確認。
(※3306portを他に使用している場合はportが競合するためタスクマネージャーなどでportを終了させてください)

Windows側のブラウザで、http://localhostにアクセスします。

画面が表示されればインストール完了

マイグレーションの確認
MySQLの設定が完了したか、マイグレーションで確認してみましょう。

下記のようにDBにテーブルが作成されれば成功

/var/www$ php artisan migrate

Migration table created successfully.
Migrating: 2014_10_19000000_create_users_table
Migrated:  2014_1019000000_create_users_table (0.36 seconds)
Migrating: 2014_1019100000_create_password_resets_table
Migrated:  2014_1019100000_create_password_resets_table (0.35 seconds)
Migrating: 20191019_000000_create_failed_jobs_table
Migrated:  201910_19_000000_create_failed_jobs_table (0.1 seconds)

終わりに

今回はWindows環境にLaradockを導入するまでの流れを記事として投稿しました

それと来月でプログラミングを始めてから一年経つこともあり、当初よりも知見が深まったこともあるので、これから少しずつ技術記事を上げていこうと思います。
どうかよろしくお願いいたしますm(._.)m

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

Windows環境上にLinuxを構築。Laradockを導入してMigrationするまでの手順

開発環境

Laravel 7.20.0
PHP 7.4
MYSQL 8.0.21
Windows version 2004

全体のおおまかな流れ

  • Ubuntu導入
  • WSL2に更新・導入
  • dockerインストール
  • laradock導入

本記事のゴール

本記事はWindows環境上にWSL2を用いてLinux環境を構築し、Laradockを導入して画面の表示+Migrationすることを目標としています。

まずはUbuntu導入準備から

Windowsを最新状態にアップデート(下記URLでダウンロード)

https://support.microsoft.com/ja-jp/help/4028685/windows-10-get-the-update

PCの設定から開発者モードに変更

• 「設定(スタートボタンの歯車アイコン)」-「更新とセキュリティ」-「開発者向け」を選択
• 「開発者向け機能を使う」欄の「開発者モード」を選択して有効化

追加機能でSubsystem for Linuxを有効化

• 「コントロールパネル」-「プログラム」-「Windowsの機能の有効化または無効化」を選択
• 一覧のなかから「Windows Subsystem for Linux(Beta)」にチェックを入れる

windows version2004の場合は表記が「Linux用Windowsサブシステム」に変更しているためそれを有効化してください。

PC再起動

Ubuntuのインストール

UbuntuとはLinuxディストリビューションの1つであり、フリーソフトウェアとして提供されている

Microsoft storeでubunntuをインストール。

コマンドプロンプトでbashと入力。(Ubuntuにログイン出来たら成功)

続いてUbuntuの状態を最新にします。

$ sudo apt-get update
$ sudo apt-get dist-upgrade
$ sudo apt-get autoremove

GitとPHPを取得

普通にインストールすると古いバージョンのGitがインストールされるので、リポジトリを追加して最新のものを取得。

下記コマンドを実行。

$ sudo apt-get install build-essential
$ sudo add-apt-repository ppa:git-core/ppa
$ sudo apt-get update
$ sudo apt-get install git
$ git --version //最新になっていたらOK
git version 2.28.0

PHP

※PHP--version 7.4を指定しています。

$sudo apt-get install php7.4 php7.4-fpm php7.4-mysql php7.4-mbstring php7.4-gd
$ php -v  //指定したバージョンがインストールされているかを確認
PHP 7.4.3 (cli) (built: May 26 2020 12:24:22) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies

WSL2の事前準備

WSL2とはLinuxカーネルが動作する「本物のLinux環境」

「Windows PowerShell」の中の「Windows PowerShell」を「管理者として実行」して下記コマンドを実行
PS C:\>dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

PS C:\>dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

PCを再起動
バージョンの確認
C:¥> ver
Microsoft Windows [Version 10.0.19041.84]

バージョンが10.0.18917以上であることを確認
デフォルトをWSL2に設定するため、下記コマンドを実行。
C:¥> wsl --set-version ubuntu 2

WSL2に切り替わっているか確認。

C:¥> wsl -l -v
  NAME    STATE    VERSION
* Ubuntu   Stopped    2

WSL2を導入したのでDockerを構築するうえでの事前準備は完了

Dockerのインストール

DockerとはLinux コンテナの作成と使用を実現するオープンソースのコンテナ化技術

下記URLからDocker Desktop Edgeをインストール

https://docs.docker.com/docker-for-windows/wsl-tech-preview/

PC再起動

再起動後、タスクバーのdockerアイコンから「setting」を選択
「Enable the experimental WSL2 based engine」にチェックを入れ「Appli&Restart」をクリック

再起動が終わってnotificationと表示されたらOK

続いて、ResourcesのWSLIntegration内の「Enable WSL Integration」をクリック

「Ubuntu」を選択して「Appli&Restart」をクリック

Dockerの動作確認

C:\Users\magic>wsl -d ubuntu
$ docker -v
Docker version 19.03.5, build 633a0ea838

####Hello Worldと表示されれば成功
$ docker run hello-world
To run a command as administrator (user "root"), use "sudo ".
See "man sudo_root" for details.

Hello from Docker!

Laradock導入

本番環境に必要なパッケージを提供してくれる。Homesteadをより細かく分割したようなもの

前提

Laradockも含めて1プロジェクト1リポジトリで管理したいので下記構成。

 ──project_dir
 ├ app  //laravel ディレクトリ
 │  ├  app
 │  │ bootstrap
 │ └ .env
 │   
 └ Laradock

Laradockをgit clone

$git clone https://github.com/Laradock/laradock.git

設定ファイル(env-exampl)をコピーして.envを生成

$ cd laradock
$ cp env-example .env

コピーしたenv(Laradock.env)ファイルの編集

指定したいプロジェクトを指定

APP_CODE_PATH_HOST=../
APP_CODE_PATH_HOST=../プロジェクト名/

データの保存ディレクトリを指定

DATA_PATH_HOST=~/.laradock/data
+ DATA_PATH_HOST=.laradock/data

プロジェクト名の設定

laradockを使ったプロジェクトを複数作る場合、プロジェクト名が同じ場合、過去に作った同じ名前のコンテナイメージが上書きされてしまいまうため、被らない名前を設定

COMPOSE_PROJECT_NAME=laradock
+ COMPOSE_PROJECT_NAME=

MYSQLの設定

MySQLは8系になってパスワードの生成方法が変わったらしくLaravelから操作できないため下記記述を追記。

/lardock/mysqmy.cnfに下記を追加

// [mysqld]のエリアに追記する(デフォルトの場合一番下)
default_authentication_plugin=mysql_native_password

Laravel.envの設定

DBの設定を合わせて変更します
※DB_HOSTはdocker-compose.ymlに書かれているコンテナ内名を指定します。

DB_CONNECTION=mysql
DB_HOST=mysql(既存だと127.001になっていると思うのでmysqlに修正)
DB_PORT=3306
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret

Laradockの起動

下記コマンドでlaradockを起動します。 引数には起動したいミドルウェアを指定

なお、projectが存在しない場合はroot権限で作成されてしまうため、必ず作成した状態で起動すること

$ docker-compose up -d nginx mysql workspace

起動確認

$ docker-compose ps

Dockerコンテナ内からLaravelをインストール

dockerコンテナ内からlaravelをインストールする方法と、設定。

下記コマンドでWorkspaceコンテナに入る。

※userオプションでユーザを指定してください。

$ docker-compose exec --user=laradock workspace /bin/bash

コンテナ内で下記を実行してLaravelをインストール。

/var/www$ composer create-project --prefer-dist laravel/laravel .

インストール完了したところで動作確認。
(※3306portを他に使用している場合はportが競合するためタスクマネージャーなどでportを終了させてください)

Windows側のブラウザで、http://localhostにアクセスします。

画面が表示されればインストール完了

マイグレーションの確認
MySQLの設定が完了したか、マイグレーションで確認してみましょう。

下記のようにDBにテーブルが作成されれば成功

/var/www$ php artisan migrate

Migration table created successfully.
Migrating: 2014_10_19000000_create_users_table
Migrated:  2014_1019000000_create_users_table (0.36 seconds)
Migrating: 2014_1019100000_create_password_resets_table
Migrated:  2014_1019100000_create_password_resets_table (0.35 seconds)
Migrating: 20191019_000000_create_failed_jobs_table
Migrated:  201910_19_000000_create_failed_jobs_table (0.1 seconds)

終わりに

今回はWindows環境にLaradockを導入するまでの流れを記事として投稿しました

それと来月でプログラミングを始めてから一年経つこともあり、当初よりも知見が深まったこともあるので、これから少しずつ技術記事を上げていこうと思います。
どうかよろしくお願いいたしますm(._.)m

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

Waypointを使ったアプリケーションの超簡単デプロイ

概要

2020年10月15日、HashiCorpがWaypointという新しいプロダクトを発表しました。

簡単に説明すると、デプロイ設定ファイル1つ書くだけで、Amazon EC2やECS、Google Cloud Run、Azure Container Instancesといったクラウド環境にワンライナーでビルドからデプロイまで出来てしまう凄いツールです。

機能

  • Waypointは、AWSやGoogle、Azureといったプラットフォームにアプリケーションを構築・リリースするためのワークフローを提供する
    • waypointup up コマンドで、アプリケーションのビルドからデプロイ・リリースまでを一括で実行することができる
    • 現在サポートしているプラットフォーム
      • Kubernetes
      • HashiCorp Nomad
      • Amazon ECS
      • Google Cloud Run
      • Azure Container Instances
      • Docker
      • Buildpacks
  • Dockerfileが不要
    • Waypointはアプリケーションの構成から最適なビルドパックを自動的に利用してDockerfileを生成する (1)
  • アプリケーションデプロイ後、デプロイメントの検証やログ、コマンド実行などの機能を提供する
  • WaypointでデプロイされたアプリケーションはLet's Encryptで生成されるTLS証明書を含む公開URLを発行する。これによりアプリケーションの動作を他のユーザーと簡単に共有可能となる
    • デプロイごとにバージョンを含むURLが発行される (オプション機能のため無効化することも可能)
  • アプリケーションのビルド・リリース状況を確認するためのUIを提供 (2)

クラウドネイティブなアプリケーションはECSやKubernetesといったコンテナ基盤で動かすことが多いですが、サービスの構成によってはデプロイ構成やコマンドが複雑化することは多々あります。
Waypointを使うことで設定ファイルは一言管理でき、アプリケーションはよりシンプルなワークフローでリリースサイクルを回すことが可能となるのです。凄い。

検証

Mac環境で試してみました。マニュアル には手動やLinux環境でのセットアップ方法も書いてあります。

Waypointで公開されているサンプルアプリケーションをDockerで動かしてみます。初めにWaypointをbrewでインストールします。

$ brew tap hashicorp/tap
$ brew install hashicorp/tap/waypoint

ヘルプを見てみましょう。

% waypoint --help
Welcome to Waypoint
Docs: https://waypointproject.io
Version: v0.1.2

Usage: waypoint [-version] [-help] [-autocomplete-(un)install] <command> [args]

Common commands
  build        Build a new versioned artifact from source
  deploy       Deploy a pushed artifact
  release      Release a deployment
  up           Perform the build, deploy, and release steps for the app

Other commands
  artifact        Artifact and build management
  config          Application configuration management
  context         Server access configurations
  deployment      Deployment creation and management
  destroy         Delete all the resources created for an app
  docs            Show documentation for components
  exec            Execute a command in the context of a running application instance
  hostname        Application URLs
  init            Initialize and validate a project
  install         Install the Waypoint server to Kubernetes, Nomad, or Docker
  logs            Show log output from the current application deployment
  runner          Runner management
  server          Server management
  token           Authenticate and invite collaborators
  ui              Open the web UI
  version         Prints the version of this Waypoint CLI

先ほど紹介した waypoint up コマンドは、waypoint buildwaypoint deploywaypoint relase を一括実行するコマンドであることが分かります。

続いてサンプルアプリケーションをダウンロードします。サンプルの中にはDockerのほか、Amazon ECSやGoogle Cloud Runにデプロイするコードが含まれています。

$ git clone https://github.com/hashicorp/waypoint-examples.git
$ cd waypoint-examples
$ ls
README.md                azure-container-instance google-cloud-run         waypoint.hcl
aws-ecs                  data.db                  kubernetes
aws-eks                  docker                   nomad

# 今回はDocker上でNode.jsを動かしてみます
$ cd docker/nodejs

Waypointサーバーをインストールします。Waypointサーバーはアプリケーションのワークフローを管理するコンソールです。

$ docker pull hashicorp/waypoint:latest
$ waypoint install -platform=docker -accept-tos

アプリケーションをデプロイするにはデプロイ設定ファイルが必要となります。これは waypoint init というコマンドで作成できますが、サンプルアプリケーションではファイルが作成されています。

waypoint.hcl
project = "example-nodejs"

app "example-nodejs" {
  labels = {
    "service" = "example-nodejs",
    "env" = "dev"
  }

  build {
    use "pack" {}
  }

  deploy {
    use "docker" {}
  }
}

アプリケーションを初期化します。

$ waypoint init
✓ Configuration file appears valid
✓ Connection to Waypoint server was successful
✓ Project "example-nodejs" and all apps are registered with the server.
✓ Plugins loaded and configured successfully
✓ Authentication requirements appear satisfied.

Project initialized!

You may now call 'waypoint up' to deploy your project or
commands such as 'waypoint build' to perform steps individually.

そしてデプロイ。アプリケーションのディレクトリ構成を見ても分かりますが、Dockerfileがないことに気付くはずです。どうやってビルドしてるのかというと、Waypointがファイル構成からアプリケーションタイプを自動検出し、最適なビルドパックを利用してDockerfile自体を自動生成してるのです。賢い。

$ waypoint up

ビルドには時間がかかるので、この間にWaypointのUIを立ち上げてみましょう。

$ waypoint ui

ブラウザでWaypointのコンソールが立ち上がります。

Screen Shot 2020-10-18 at 23.15.30.png

初めに認証トークンを求められるので、CLIからトークンを発行しましょう。
生成された値をフォームに貼り付けることで認証済みとなります。

$ waypoint token new

example-nodejs の画面が開きます。この画面からビルド状況やデプロイログ、更にはコンテナへのコマンド実行などが可能となります。

Screen Shot 2020-10-18 at 23.17.38.png

CLIに戻り、先ほどのビルド状態を確認してみます。

$ waypoint up

» Building...
Creating new buildpack-based image using builder: heroku/buildpacks:18
✓ Creating pack client
✓ Building image
 │ [exporter] Adding 1/1 app layer(s)
 │ [exporter] Reusing layer 'launcher'
 │ [exporter] Adding layer 'config'
 │ [exporter] Adding label 'io.buildpacks.lifecycle.metadata'
 │ [exporter] Adding label 'io.buildpacks.build.metadata'
 │ [exporter] Adding label 'io.buildpacks.project.metadata'
 │ [exporter] *** Images (e2a2e3a85138):
 │ [exporter]       index.docker.io/library/example-nodejs:latest
 │ [exporter] Reusing cache layer 'heroku/nodejs-engine:nodejs'
 │ [exporter] Reusing cache layer 'heroku/nodejs-engine:toolbox'
✓ Injecting entrypoint binary to image

Generated new Docker image: example-nodejs:latest

» Deploying...
✓ Setting up waypoint network
✓ Starting container

» Releasing...

The deploy was successful! A Waypoint deployment URL is shown below. This
can be used internally to check your deployment and is not meant for external
traffic. You can manage this hostname using "waypoint hostname."

           URL: https://***.waypoint.run
Deployment URL: https://***--v1.waypoint.run

Deployment URL に書かれたURLを開くとアプリケーションが起動します。(3)

Screen Shot 2020-10-18 at 23.21.17.png

デプロイが成功したので、表示されているテンプレートの中身を書き換えてみます。

views/pages/index.js
<h1>This Node.js app was deployed with Waypoint.</h1>
<h2>Hello world!</h2>

<h1> の下に <h2> を追加してみました。
再度デプロイを実行します。

           URL: https://***.waypoint.run
Deployment URL: https://***--v2.waypoint.run

Deployment URL に含まれるサブドメインが v2 に変わってます。

Screen Shot 2020-10-18 at 23.38.29.png

正しく Hello World が表示されました! (4)

軽く触ってみた感じ、AWSのElastic Beanstalkのようなデプロイを抽象化するソフトウェアという印象を受けました。Waypointを導入することでアプリケーション構成からデプロイフローを分離でき、各種サービスのリリース状況を一元管理することができそうです。


  1. アプリケーションディレクトリで Dockerfileを検出した場合はビルド時に使用されるようです 

  2. チームで開発する場合はWaypointサーバーを構築する必要があります 

  3. waypoint.run はHashiCorpが提供するパブリックなホストです。検証用環境のため、本番運用にはホストを用意する必要があります。詳しくは Waypoint URL Service を参照してください 

  4. v1 のURLにアクセスすれば以前のアプリケーションを開くこともできます 

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