- 投稿日:2022-03-03T23:45:27+09:00
Laravel:413 Request Entity Too Large
画像を複数枚サーバーにアップロードするときに生じた。 アップロードの容量が上限に達しているというメッセージ 解決法 nginxとphp.iniからアップロード上限を変更する nginx ***.confというファイルに設定が書いてある。 デフォルトだと1MBになっているので10Mに変更 nginx.conf server { # 10Mに変更 client_max_body_size 10M; # // } php.ini アプリケーションサーバーの設定も変える。 php.ini # メモリ上限 memory_limit = 10M # リクエスト上限 post_max_size = 10M # 1ファイルあたりのサイズ上限 upload_max_filesize = 10M 上限を上げすぎるとサーバーに負荷がかかるので本番での運用には注意する。 一般にはどれぐらいなのだろう。 gmailのファイル上限が25MBらしいので、20~30MBが良さそう。 ?参考 https://wp-firststep.com/mediasize/ 私が30MBになっていたのは エックスサーバーの初期設定が30MBだったからです ロリポップの方で、はじめ2MBと言う方もいらっしゃいました。
- 投稿日:2022-03-03T23:05:39+09:00
Dockerfile ベストプラクティス
この記事は 自分のために公式ドキュメントを自分がほしいものだけを簡単にまとめたものです。 Dockerfile ベストプラクティス Dockerのイメージはレイヤーというものが積み重なってできているものだと考えればよいです。Dockerfileの各行が前の行でつくったレイヤーに新しいレイヤーを重ねていきます。 基本的にするべきこと できるかぎりエフェメラルにする エフェメラルとは簡単に壊せて簡単に作成できること。(たとえば、ホスト側に○○のファイルがあることが条件とかがあるとエフェメラルではなくなっていきます) ビルドコンテキストのファイルがすべてデーモンに送られることを意識する ビルドコンテキストのファイルがDockerデーモンに送られる。-fでDockerfileを指定してもこれは変わらない。docker build PATH の PATH がビルドコンテキストになる。ビルドに必要ないファイルはビルドコンテキストを変えて送らないようにするのが良い。 どのくらいの容量がDockerデーモンに送られるのかはビルドするときのログを見ること。以下のようなログがでるはずである。 Sending build context to Docker daemon 187.8MB 標準入力からビルドするとビルドコンテキストとして送られるファイルが0になる ファイルを作らずに標準入力からDockerfileの内容を入力して docker build することもできる。 フォーマットは docker build [OPTIONS] - な感じで、 echo -e 'FROM busybox\nRUN echo "hello world"' | docker build - とか、 docker build -t myimage:latest -<<EOF FROM busybox RUN echo "hello world" EOF とかのように書ける。 これをすると、ビルドコンテキストとして送られるファイルがなくなる。ビルドするのにホスト上のファイルが不要であればこれでビルドが速くなる。 これをすると、ファイルが何も送られなくなるのでCOPYやADDは失敗する。 いくつかのファイルだけをビルドコンテキストのファイルとして贈りたくないときは (.dockerignore)[https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#exclude-with-dockerignore] を使うこと。 ビルドコンテキストはローカルディレクトリーにしてDockerfileは標準入力から読みたい場合 docker build [OPTIONS] -f- PATH ビルドコンテキストをリモートの場所にしてDockerfileを標準入力から読みたい場合 ほぼ同じだが PATH が URL になる。 docker build -t myimage:latest -f- https://github.com/docker-library/hello-world.git <<EOF FROM busybox COPY hello.c ./ EOF マルチステージビルドを使え # syntax=docker/dockerfile:1 FROM golang:1.16-alpine AS build # Install tools required for project # Run `docker build --no-cache .` to update dependencies RUN apk add --no-cache git RUN go get github.com/golang/dep/cmd/dep # List project dependencies with Gopkg.toml and Gopkg.lock # These layers are only re-built when Gopkg files are updated COPY Gopkg.lock Gopkg.toml /go/src/project/ WORKDIR /go/src/project/ # Install library dependencies RUN dep ensure -vendor-only # Copy the entire project and build it # This layer is rebuilt when a file changes in the project directory COPY . /go/src/project/ RUN go build -o /bin/project # This results in a single layer image FROM scratch COPY --from=build /bin/project /bin/project ENTRYPOINT ["/bin/project"] CMD ["--help"] 不要なモジュールはインストールするな そのまま アプリケーションを疎にする 役割でちゃんと分ける。アプリとDBとキャッシュのコンテナに分けるとか。 レイヤーの数を減らすことについて (よくわからないから省略) 引数が複数行になる場合にはソートする 半角スペースと\で分けて、各引数が英数字順になるようにすると読みやすくてよい RUN apt-get update && apt-get install -y \ bzr \ cvs \ git \ mercurial \ subversion \ && rm -rf /var/lib/apt/lists/* ビルドキャッシュを有効に使え --no-cache=trueをdocker buildで使えばキャッシュを使わないようにできる。でも遅くなる。どういうときにキャッシュを使って、どういうときにキャッシュを使わないほうが良いのかを知っておくのがよい。 ADDとCOPYはファイルの中身のキャッシュを見て更新されているかを判定してキャッシュを使うかどうかを決める その他のDockerfileのコマンドはファイルの中身を見ない。コマンドの文字列が変わっているかどうかだけを見る Dockerfile内の命令について FROM できるだけ公式のイメージを使え。Alpineがおすすめ。 LABEL ラベルつけたほうがいいよってこと # Set one or more individual labels LABEL com.example.version="0.0.1-beta" LABEL vendor1="ACME Incorporated" LABEL vendor2=ZENITH\ Incorporated LABEL com.example.release-date="2015-02-12" LABEL com.example.version.is-production="" RUN apt-get よく使う。よくハマるのは以下。 # syntax=docker/dockerfile:1 FROM ubuntu:18.04 RUN apt-get update RUN apt-get install -y curl nginx ってすると RUN apt-get update がキャッシュを使われてしまい実行されないので、 RUN apt-get update && apt-get install -y のようにするか、以下のようにバージョン固定(バージョンピニング)する。以下の例ではapt cacheを消しているのでイメージが小さくなって良い。 RUN apt-get update && apt-get install -y \ aufs-tools \ automake \ build-essential \ curl \ dpkg-sig \ libcap-dev \ libsqlite3-dev \ mercurial \ reprepro \ ruby1.9.1 \ ruby1.9.1-dev \ s3cmd=1.1.* \ && rm -rf /var/lib/apt/lists/* ※公式DebianとUbuntuは自動でapt-get cleanをするのでrmは不要 パイプ /bin/sh -cを使って実行するのパイプの最後のコマンドの終了コードしか見ない。それ以前のコマンドが失敗しても成功とみなすので注意すること。 この動作を変えたいのであればset -o pipefail &&を使うこと RUN set -o pipefail && wget -O - https://some.site | wc -l > /number dashなどは-o pipefailを使えないので RUN ["/bin/bash", "-c", "set -o pipefail && wget -O - https://some.site | wc -l > /number"] などとする CMD サービスを提供するコンテナであればCMDはCMD ["executable", "param1", "param2"…]の形式で使うのがほとんどだと思う CMD ["param", "param"] はENTRYPOINTの使い方を知っている人が少ないのでやめておくのが良さそう サービス提供のコンテナでなければCMD ["perl", "-de0"], CMD ["python"], or CMD ["php", "-a"] みたいなインタラクティブシェルにするのがよい EXPOSE アプリケーションが使うデフォルトのポートを使うのが良い。Apacheウェブサーバーであれば80など。 ENV (難しそうなので省略。ビルド時の変数であればARG使えば良さそう) ADD or COPY ADDよりCOPYを使うのがよい。ADDは単純なコピーではなくtar解凍だったりリモートURLが使えたりするので機能が複雑なので。例えば、ADD rootfs.tar.xz /とかでtar解凍ができる。 また、ADDするとレイヤーが増えるのでパッケージのダウンロードとインストールをするのならば、 ADD https://example.com/big.tar.xz /usr/src/things/ RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things RUN make -C /usr/src/things all ではなくて、 RUN mkdir -p /usr/src/things \ && curl -SL https://example.com/big.tar.xz \ | tar -xJC /usr/src/things \ && make -C /usr/src/things all のようにするのがよい ENTRYPOINT これがデフォルトで実行されるコマンドの意味。これにCMDで引数を指定することができる。 VOLUME 変更可能なファイル、ユーザーがサービスの一部として提供するファイル部分にはボリュームを使えって話 USER 権限が必要ないのであればUSERをつかってrootじゃないユーザーを使おうって話 WORKDIR WORKDIRをいつも使おう、絶対パスで使おうって話。 ONBUILD (自分の作ったイメージが他のイメージのベースを作るときのFROMに使われるときの話で、自分はやらなそうなので省略)
- 投稿日:2022-03-03T21:59:34+09:00
Laravel SailでLaravel 9 (PHP8.1 + node.js 16.x) 環境をサクッと立ち上げる
はじめに Laravelの作業を始めるときは、まずLaravel用のdocker-compose.yml他一式を準備していましたが、今ではデフォルトでLaravelのDocker構築環境Laravel Sailがインストールされているので、それを利用する機会が多くなってきました。備忘録も兼ねて、まとめておきます。 環境 ホスト MacBook Pro (16インチ, 2019) macOS Monterey 12.2.1 Docker Desktop 4.5.0 PHP 8.1.3 Composer 2.2.7 ゲスト Laravel Sail PHP 8.1.3 node.js 16.4.0 MySQL 8.0.x 準備 Laravelのインストール 自分はComposerでインストールするのが好きなので、以下のようにインストールします。laravel-cliが好きな方はそちらで。 composer create-project laravel/laravel laravel-sail-sample Laravel Sailの準備 すでにLaravel Sailはインストール済みなので、作成したLaravelのプロジェクトルートで以下のコマンドを実行します。一緒にどのサービスをインストールするか聞かれるので、ここでは0 (mysql)を選択します。例えばmysqlとmailhogをインストールする場合は0, 7と入力すればOKです。 php artisan sail:install Which services would you like to install? [mysql]: [0] mysql [1] pgsql [2] mariadb [3] redis [4] memcached [5] meilisearch [6] minio [7] mailhog [8] selenium > 0 Sail scaffolding installed successfully. プロジェクトルートにdocker-compose.ymlが以下のような作成されているはずです。 docker-compose.yml # For more information: https://laravel.com/docs/sail version: '3' services: laravel.test: build: context: ./vendor/laravel/sail/runtimes/8.1 dockerfile: Dockerfile args: WWWGROUP: '${WWWGROUP}' image: sail-8.1/app extra_hosts: - 'host.docker.internal:host-gateway' ports: - '${APP_PORT:-80}:80' environment: WWWUSER: '${WWWUSER}' LARAVEL_SAIL: 1 XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}' XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}' volumes: - '.:/var/www/html' networks: - sail depends_on: - mysql mysql: image: 'mysql/mysql-server:8.0' ports: - '${FORWARD_DB_PORT:-3306}:3306' environment: MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}' MYSQL_ROOT_HOST: "%" MYSQL_DATABASE: '${DB_DATABASE}' MYSQL_USER: '${DB_USERNAME}' MYSQL_PASSWORD: '${DB_PASSWORD}' MYSQL_ALLOW_EMPTY_PASSWORD: 1 volumes: - 'sail-mysql:/var/lib/mysql' networks: - sail healthcheck: test: ["CMD", "mysqladmin", "ping", "-p${DB_PASSWORD}"] retries: 3 timeout: 5s networks: sail: driver: bridge volumes: sail-mysql: driver: local これで準備は完了です。 Laravel Sailの利用のための一手間 Laravel Sailの実行ファイルはプロジェクトルート以下の./vendor/bin/sailになります。例えば、Laravel Sailで実行環境を立ち上げる際は、以下のように実行します。 ./vendor/bin/sail up これを毎回打つのは面倒なので、zshやbashのエイリアスを追加します。私はmacOS標準のzshを使っているので、~/.zshrcに以下の行を追加しました。 ~/.zshrc alias sail='[ -f sail ] && bash sail || bash vendor/bin/sail' ~/.zshrcに行を追加したら、以下を実行してzshを再起動しておきます。 exec $SHELL -l こうすることで、先ほどの実行環境立ち上げのコマンドは、以下のように短縮されます。 sail up Laravel Sailの利用 1. 起動その1 以下のコマンドで起動します。この場合、終了はCtrl+Cです。 sail up 標準では http://localhost/ でLaravelの標準のウェルカムページが立ち上がっているはずです。最初のup時はDockerイメージのPULLや準備のため3〜5分ほど完全に起動するまでに時間がかかります。 2. 起動その2 以下のコマンドでバックグラウンド起動します。この場合、終了は3. 終了の手順です。 sail up -d 3. 終了 sail stop 4. composerコマンド composerはsail composerで起動します。以下はバージョンを表示した例です。 sail composer --version Composer version 2.2.7 2022-02-25 11:12:27 5. artisanコマンド Laravelのartisanコマンドはphp artisan ...と入力していましたが以下のように実行します。以下はテストを実行した例です。 sail artisan test PASS Tests\Unit\ExampleTest ✓ that true is true PASS Tests\Feature\ExampleTest ✓ the application returns a successful response Tests: 2 passed Time: 0.49s 6. npmコマンド ホストにnode.jsがインストールされていなくても、Laravel SailのDockerイメージ内にインストール済みですぐ利用出来ます。以下はnpm installを実行した例です。 sail npm install このようにsail ${FOO} ...とすれば、今まで使っていたコマンドが利用出来る事が分かります。 まとめ 時前のdocker-compose.ymlをDockerfileを準備して、色々と時間がかかっていた事を考えると、サクッとできてしまうのはありがたいです。この環境を使って、Laravel Inertiaについて次は書いてみたいなと考えています。
- 投稿日:2022-03-03T17:03:47+09:00
Dockerで簡単VuePress環境構築!!
VuePressとは? vue.jsによる静的サイトジェネレータです。 特定のディレクトリにMarkdownファイルを放り込むと、自動的にページを作成してくれます。 ドキュメントの記述に最適化された静的サイト制作ツールです。 環境 いつも通りDockerを使っていきます! macOS Monterey 12.1 Docker version 20.10.12 Docker Compose version v2.2.3 構成 . ├── README.md ├── docker │ └── vue-press │ └── Dockerfile ├── docker-compose.yml └── documents ├── docs │ └── README.md ├── node_modules ├── package.json └── yarn.lock 手順 1. Docker環境構築 1-1. docker-compose.yml作成 docker-compose.yml version: '3.9' services: vue-press: build: docker/vue-press ports: - "8080:8080" volumes: - ./documents:/documents tty: true 1-2. Dockerfile作成 docker/vue-press/Dockerfile FROM node:16.0.0 WORKDIR /documents RUN npm install -g npm@8.5.2 RUN npm cache clean -f 1-3. Docker起動 docker-compose.ymlがあるディレクトリにて以下を実行しましょう。 docker-compose up -d 2. VuePressインストール 公式の手順を参考にします。 2-1. コンテナにインスペクション docker-compose exec vue-press bash 2-2. yarn初期化 yarn init 2-3. VuePressインストール yarn add -D vuepress 色々と質問されますがこだわりなければ全てEnterでOKです。 ※ Git使っている方は、.gitignoreを使ってnode_modulesを無視することをお勧めします。 documents/.gitignore /node_modules 2-4. ディレクトリ作成 docsディレクトリを作成します。 mkdir docs 2-5. サンプルドキュメント作成 なんでも良いのですが、以下はサンプルです。 documents/docs/REAME.md # README.mdサンプル ## テスト見出し この画面が表示されていたら成功です。 ### 記述例 ~~~md Hello VuePress! ~~~ 2-6. package.jsonの編集 以下のようにscriptsブロックを追記してください。 documents/package.json { "name": "documents", "version": "1.0.0", "main": "index.js", "license": "MIT", "devDependencies": { "vuepress": "^1.9.7" }, "scripts": { "docs:dev": "vuepress dev docs", "docs:build": "vuepress build docs" } } 2-7. ローカルサーバーの起動 yarn docs:dev 3. 確認 http://localhost:8080にアクセスして確認してみましょう。 おまけ command追加 Docker起動時にパッケージのインストールとローカルサーバーの起動を行うようにします。 docker-compose.yml version: '3.9' services: vue-press: build: docker/vue-press ports: - "8080:8080" volumes: - ./documents:/documents tty: true command: bash -c "yarn install && yarn docs:dev"
- 投稿日:2022-03-03T15:43:13+09:00
Docker minioのコンテナを起動させようとしたら起動直後にコンテナが落ちる
概要 Dockerのminioコンテナを起動させようとdocker-composeコマンドでbuildしたところ、コンテナ起動直後にコンテナが落ちる問題の解決法をメモ的にまとめる 解決までの道のり Docker Desktopをとりあえず見てみる。 Docker Desktopから確認しても動作してなかったので再生ボタンみたいなのをクリックして起動してみたらコンソールにエラーが出ていた。(「シークレットキーとアクセスキーが設定されていないぜ」的なエラーが出てる。) ああ、、、docker-compose.ymlのminioのenvironmentでアクセスキーとシークレットアクセスキーの設定をしていなかった。下記のように記載し直し。 docker-compose.yml environment: - MINIO_ROOT_USER=${MINIO_ROOT_USER} - MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD} - MINIO_ACCESS_KEY=access_key - MINIO_SECRET_KEY=secret_key 再度$ docker-compose up -d --buildを実行してみる まだ同じエラーが出る。どうやらminioの仕様変更でMINIO_ACCESS_KEYとMINIO_SECRET_KEYがそれぞれ非推奨になっているらしい。MINIO_ROOT_USERとMINIO_ROOT_PASSWORDが推奨されているらしい。そしてその2つは既にenvironmentで読まれており、値そのものは.envに記載されている。MINIO_ROOT_PASSWORDの方が8文字以上じゃないからだめなのかも。 MINIO_ROOT_PASSWORDの値を見直して再度$ docker-compose up -d --buildを実行してみる。 無事起動した。
- 投稿日:2022-03-03T12:47:31+09:00
Rancher Desktopアンインストール後のWSLの後始末
Docker Desktop有償化後のDocker環境 まず、私はWSL上で動かすようにした。 その後、Rancher Desktopの存在を知ったのでこちらを入れてみた。 結果 しかし、私の用途では、GUIとKubernetes環境は不要、単純に軽く使いたいのでRancher Desktopは消すことにした。 アンインストール 通常のWindowsアプリの様に コントロール パネル\プログラム\プログラムと機能 から削除する。しかし、コマンドプロンプトからwsl -lコマンドで見るとrancherのWSL環境が残ったまま(2022-03-03現在)。 >wsl -l Linux 用 Windows サブシステム ディストリビューション: Ubuntu-20.04 (既定) rancher-desktop-data rancher-desktop 対応 コマンドプロンプトからwsl --unregisterコマンドで消してあげる。 >wsl --unregister rancher-desktop-data >wsl --unregister rancher-desktop 補足 rancher-desktopのissueを探すとこの話ありました。今後どういう挙動になるかはこちらをチェック。
- 投稿日:2022-03-03T09:08:01+09:00
Dcokerの基本操作(コマンド)について理解してみた
はじめに 「イメージ操作系」「コンテナ操作系」に分類されるようなので、その観点で操作についてみていく(前段として、Docker Hubとは?とDockerイメージのTagとは?についても整理してみた)。 ※以下の操作はDocker Hubのアカウントを持っている事を前提にしている。Docker Hubへの登録は https://hub.docker.com/signup からできる。 Docker Hubについて Dockerコンテナを作成する際に必要になるDockerイメージが保管されているクラウド上のストレージ。Dcokerをインストールした際には、デフォルトでDocker Hubからそのイメージを取得するように設定されている。 Dockerイメージは、通常はユーザ名/イメージ名という名前でないと利用できないが、Docker公式イメージは以下の図のようにユーザ名が省略されたイメージ名のみで利用できる。 DockerイメージのTagsについて 各DockerイメージのDescriptionにTagと呼ばれるものが記載されているが、大抵の場合これはversion名-OS名という構成で表記されている事が多い。例えばnodeであれば、以下のようにTagの一覧があるが、17-alpine3.14というのはNode.js17.xというversionでOSがalpine3.14という意味である。 ※alpineという聞きなれないOS名が出てきたが、これはDocker向けの軽量Linux。なんでDocker向けの軽量Linuxというものがあるのか?だが、Dockerではコンテナを作成する際に都度必要なイメージをダウンロードしてくるが、そのサイズが大きいと時間がかかるしディスク容量も圧迫してしまう。つまり、Dockerイメージが軽量(小さい)事が重要であり、そのためDocker向けの軽量Linuxというものがある。 そしてそのTagだが、サイトを見ると分かる通りリンクになっており、そのリンクをクリックすると大抵はGitHubに飛ぶ。 このGitHub上で見える以下のようなファイルDockerfileは、Dockerイメージの構成を定義されたファイルであり、Dockerイメージ利用する際にどんな定義のイメージなのか?が見れないと困るという事で、TagのリンクをクリックするとこのDockerfileに飛ぶことが多い。 Dockerのイメージ操作系のコマンドを実行してみる コマンド自体は以下の3つ(削除は使用していないイメージを全て削除するdocker imagae pruneもある)。 Dockerイメージの取得 docker image pull NAME[:TAG] Dockerイメージをレジストリが取得してダウンロードする。NAMEはDockerイメージの名前を指定し、:TAGイメージのversionを指定するためのもので、Dcoker HubであればDockerイメージのTagsについての章で取り上げたようなものを指定できる(:TAG未指定だとversionはlatestになる)。 ※コマンドの省略形:docker pull NAME[:TAG]36. 参考:docker image pull Dockerイメージの一覧表示 docker image ls ローカルにダウンロード済みのDockerイメージ一覧を表示する。 ※コマンドの省略形:docker images 参考:docker image ls Dockerイメージの削除 docker image rm IMAGE_ID Dockerイメージをローカルから削除する。削除する際には、上記のlsコマンドで一覧を表示した際に出てくるIMAGE IDを指定する。 ※コマンドの省略形:docker rmi IMAGE_ID 参考:docker image rm Dockerのコンテナ操作系のコマンドを実行してみる コマンド自体は以下の4つ。 参考:コンテナで Hello world Dockerコンテナの実行 docker container run [OPTION] NAME[:TAG] [COMMAND] 指定のDockerイメージで、Dockerコンテナを実行する。 OPTIONの中でも覚えておくと便利なものとして以下の5つがある。 ※コマンドの省略形:docker run [OPTION] NAME[:TAG] [COMMAND] オプション 説明 --detach , -d コンテナをバックグラウンドで実行する(+コンテナIDを表示する)事ができるオプション -it Dockerコンテナを作成時にshellを実行したい場合、このオプションを設定する事でshellの実行ができる正確にはDockerコンテナ実行時に以下のようにDockerコンテナのターミナルとホストが相互に接続し、ホスト側から指示(shellの実行やbashを起動)を実行できる。これにより、例えば以下の画像のようにLinuxのbashを起動するように指定すると、Dockerコンテナ内のターミナルが見れる。※実際には-itというオプションはないが、公式のOption typesに書かれている通り、1文字のコマンドラインオプションは組み合わせることができるので、docker run -i -t --name test busybox shはdocker run -it --name test busybox shとできるちなみに、-tは「新しいコンテナ内に疑似ターミナル (pseudo-tty)」というオプションで、-iは「コンテナの標準入力 (STDIN)を取得し、双方向に接続できるようにする」という意味で、これを組み合わせると、Dockerコンテナ内のターミナルに対しshellが実行できる(Dockerコンテナを起動するホストのターミナルから、Dockerコンテナ内のターミナルが双方につながるので) --env , -e -e KEY=VALUEのように指定する事で、Dockerコンテナ内の環境変数を設定できるオプション --name --name NAMEのように指定する事で、Dockerコンテナ実行時のコンテナ名を指定できるオプション --publish , -p -p CONTAINER_PORT:HOST_PORTのように指定する事で、コンテナポートをホストのポートに公開(マッピング)できるオプション※Dockerコンテナ内に起動しているサーバ(アプリ、Redis、MySQLなど)にホスト側からアクセスする際には、このオプション設定をしないとダメ 参考:docker container run Dockerコンテナの停止 docker container stop CONTAINER 実行中のコンテナを停止する。 複数指定すれば複数停止もできる。 ※コマンドの省略形:docker stop CONTAINER 参考:docker container stop Dockerコンテナの一覧 docker container ls [OPTION] コンテナの一覧を表示する。 オプション-aを付ける事で停止中のコンテナも表示できる。 ※コマンドの省略形:docker ps 参考:docker container ls Dockerコンテナの削除 docker container rm CONTAINER 指定されたコンテナを削除する。 ※コマンドの省略形:docker rm CONTAINER 参考:docker container rm 使用していない全てのDockerコンテナの削除 docker container prune 使用されていないコンテナを削除する。 参考:docker container prune (おまけ)docker system prune 使用されていないイメージとコンテナを全て削除する。 参考:docker system prune
- 投稿日:2022-03-03T01:53:31+09:00
【スーパー初心者向け】Dockerを使ってReact環境を構築&起動する方法をかなり詳しく解説してみた。
はじめに こんにちは、家業を飛び出したヤメツギフリーランスの笠原大瑚(@KasaharaDaigo_)と言います。 プログラミングを学び始めて半年にも満たないですが、Qiitaでアウトプットすることを決意し、今回が初投稿になります。 エンジニアなら知ってて当たり前のようなステップを端折っている記事が多く散見され、これらが初学者のつまづきの原因になっているのでは?という仮説の基、私自身が躓いたところを網羅するよう、あくまで初学者目線でとにかく手順を丁寧に記載することを心掛けています。 世界一端的かつわかりやすい記事を心掛けていきますので、どうぞ応援よろしくお願いします! この記事では以下のことを約束します。 難しいカタカナ語は使わない! カタカナ語ばかりの記事ダメ、絶対。 細かい手順も端折らない! 細かい手順を端折っている記事ダメ、絶対。 要点をシンプルかつ明快に! 長ったらしい記事ダメ、絶対。 今回使うツールや技術 ターミナル Docker 開発に使える仮想環境のひとつ。色々な言語やプロジェクトを一括で管理でき、新規作成や削除も簡単。PC自体に色々な言語をインストールしないので汚れにくいと良いことづくめ。 Node React Create-React-App 目次 事前準備 Terminalのインストール Dockerのインストール Node.jsのインストール フォルダ名、プロジェクト名の決定 Reactのインストール 作業用フォルダの作成 Dockerfileの作成 docker-compose.ymlファイルの作成 Dockerイメージのビルド Reactのインストールとプロジェクトの作成 Reactの起動 Dockerを起動 コンテナを起動 Reactを実行 Reactプロジェクト画面が立ち上がるか確認 事前準備 Terminalのインストール(Windowsのみ) ここでやること ・windows Terminalのインストール ターミナルが開発においての基本となる。 Windows11では既定のターミナルアプリが「windows Terminal」となっているため問題ないはず。 もしインストールしていなければ、以下のリンクからインストール。 https://docs.microsoft.com/ja-jp/windows/terminal/ Dockerのインストール ここでやること ・Dockerのインストール まだインストールしていなければ、以下のリンクからインストール https://www.docker.com/products/docker-desktop DockerへNode.jsをインストール ここでやること ・Docker Hubでnode.jsのイメージを探す ・ターミナルでコマンドを叩いてnodeをdockerへインストール Dockerはあくまで仮想環境を構築するツールであり、 実際には利用するイメージをインストールして使うことになる。 今回はReactを利用するためにNode.jsのインストールが必要なので、 Node.jsをDockerへインストールする方法を解説する。 ・以下のリンクからDockerHubを開く(もしくはググる) https://hub.docker.com/ ・サインインをするような表示がされているがしなくても問題はない ・Nodeと書かれたイメージを検索してクリック この画像ではちょうど上段右から二番目にnodeがある。 ここにないイメージを探したい場合は、右下にある「See all Docker Official images」をクリックして検索しよう ・インストールするためのコマンドがサイトに書かれているのでコピー ここでいうdocker pull nodeが該当部分 ・ターミナルを管理者権限で開く ・コピーしたコマンドを貼り付けてEnterで実行 ・NodeがDockerにインストールされる ・Dockerを起動 ・左サイドバーのイメージをクリック ・nodeと書かれているイメージが入っていることを確認する フォルダ名、プロジェクト名の決定(重要!) ここでやること ・作業用フォルダ名の決定 ・プロジェクト用フォルダ名の決定 コマンドの実行やymlファイル内の記述にはフォルダ名やプロジェクト名を多用します。 整合性が取れないと正しくインストールができなかったり、エラーが発生するので、 先にきちんとしたフォルダ名、プロジェクト名を決定することがとても大事。 フォルダの名前は自由だが、必ずわかりやすい名前かつ英語表記に。 Reactをインストール 1.作業用フォルダを作成する ・使いたい場所に作業用フォルダを作成 ・フォルダの名前は事前準備で決めた名前にする ・今回はdocker-react-appとする 【現時点の作業用フォルダの構成】 docker-react-app 2.Dockerfileを作成する 次にDockerfileの作成を行う。 Dockerfileとは Docker上で動作させるコンテナの構成情報を記述したファイルのこと。 これを元にDockerがイメージを生成してくれる。 Dockerfileのファイル名をつけるときのポイント ・必ず英語で表記する ・わかりやすい名前にする ・拡張子はつけない 今回はファイル名をDockerfileとする。 ファイル内の記述は以下の通り。 Dockerfile #Node.jsの最新版を記載 FROM node:16.14.0 #コンテナ内の作業ディレクトリを記載 WORKDIR /usr/src/app # 【各項目の説明】 #FROM #コンテナのベースとなるDockerイメージを記載 #ここではReactを使うために利用するnode.jsを記載 #基本的には最新版を使うことが望ましい #nodeの公式サイトを確認し、最新版のバージョンをここに記載する #WORKDIR #コンテナ内の作業ディレクトリを記載 【現時点の作業用フォルダの構成】 docker-react-app └── Dockerfile 3.docker-compose.ymlを作成する 次にdocker-compose.ymlファイルを作成する。 ymlファイルとは ローカルPCに作成した作業ディレクトリとDockerにおけるコンテナ内の作業ディレクトリを接続するためのファイル docker-compose.yml version: '3.8' services: node: build: context: . dockerfile: Dockerfile volumes: - ./:/usr/src/app command: sh -c "cd free-parking && yarn start" ports: - "3000:3000" # 【各項目の説明】 # version:Composeファイルのバージョンを記載。Dockerの最新版を入れている場合は、ここを最新版にする。 # バージョンによっては非対応なのでリファレンスをチェック(https://matsuand.github.io/docs.docker.jp.onthefly/compose/compose-file/compose-versioning/) # dockerfile:先ほど作成したdockerfile名を記載 # volumes:ローカルのディレクトリが接続するDockerコンテナ内の作業ディレクトリを指定 # command:コンテナ内で実行されるコマンドを記載 # ports:外部に対して公開するポート番号 【現時点の作業用フォルダの構成】 docker-react-app ├── Dockerfile └── docker-compose.yml 4.Dockerイメージをビルドする Dockerへnode.jsをベースとしたイメージのビルドを行う。 作成したディレクトリ(Dockerfileが入っているところ)をTerminalで開き、以下のコマンドを打ち込むことでdockerfileに基づいたイメージがビルドされる。 docker-compose build 以下のような画面にFINISHEDという文言が表示されていたらビルド完了 【豆知識】Reactプロジェクト作成場所にしたいフォルダをターミナルで開く方法 方法1:ターミナルからcd(チェンジディレクトリ)コマンドで移動 ・ターミナルを起動 ・コマンドによって階層を移動 ・ターミナルでプロジェクト作成予定のフォルダが参照される 良く使うターミナルのコマンド(これだけは最低でも覚える) .. :階層を一つ上がる cd {同じ階層にあるフォルダ名} :同じ階層にある指定のフォルダへ移動 ls -l :現在の階層にあるフォルダをリスト形式で縦表示 方法2:フォルダを作成したあとに、右クリックから開く ・フォルダを新規作成 ・フォルダ内の空白を右クリック ・「Windowsターミナルで開く」をクリック ・ターミナルでプロジェクト作成予定のフォルダが参照される 5.Reactをインストール&プロジェクトを作成 ここではReactのインストールを行い、さらにプロジェクトフォルダも同時に作成する。 ・作成した作業用フォルダをターミナルで開く ※イメージをビルドした直後はターミナルを開いているはずなので飛ばしてOK ・以下のコマンドを実行 コマンド解説 npmコマンドでcreate-react-appを使って、任意のプロジェクト名のフォルダを作成し、さらにReactをインストールしている。 Create-React-Appは、ターミナルで使うコマンドの一つ。簡単にReactの開発環境を構築して開発をスタートできる。 Reactでアプリを作る際は、このコマンドを使うことが公式から推奨。 docker-compose run --rm node sh -c "npm install -g create-react-app && create-react-app {任意のプロジェクト名(英語)}" ・末尾に「Happy hacking!」という文言が表示されたらReactインストール完了 ※たまにエラーが起きるが、再度コマンドを実行すると通る場合も ・実行したコマンドに記述したプロジェクト名のフォルダが、作業用フォルダ内に新しく作成されていることを確認する 【現時点の作業用フォルダの中身】 docker-react-app ├──新しく作成されたプロジェクトフォルダ ├── Dockerfile └── docker-compose.yml React起動編 ここからは実際にReactを起動する手順を解説 1.Dockerを起動する ・まずはDockerを起動 ・クジラのマークのアレ? 2.コンテナを起動し、Reactを実行する ・Docker上でイメージを選択し、Runを押す ・「Optional Settings」を設定可能なので、コンテナ名をわかりやすい名前(プロジェクト名など)に設定する ・Runを押す ・コンテナが作成される ・コンテナを起動 ※起動している状態(緑色)になっていたらここはスキップ ・ターミナルを起動して、作業用フォルダを参照 ※docker上から開くのではなく、PC上からそのままターミナルで開く →ターミナル上で移動するか、フォルダを開いて右クリで起動するかのどちらか。 ・以下のコマンドを実行すると、docker-compose.ymlが実行される docker-compose up ・以下のような文言がターミナルに表示されていたら起動成功 3.Reactプロジェクト画面が立ち上がるか確認 ・Webブラウザを開く ・アドレスバーに http://localhost:3000 と入力して開く →ここの3000とはdocker-compose.ymlファイル内に記載したポート番号3000のこと →変えたい場合は、ymlファイルのポート番号記載を修正してやり直し ・次のような画面が出ればプロジェクト作成成功
- 投稿日:2022-03-03T01:53:31+09:00
【スーパー初心者向け】Dockerを使ってReact環境を構築&起動する方法をめちゃくちゃ丁寧に解説してみた。
はじめに こんにちは、家業を飛び出したヤメツギフリーランスの笠原大瑚と言います。 プログラミングを学び始めて半年にも満たないですが、Qiitaでアウトプットすることを決意し、今回が初投稿になります。 エンジニアなら知ってて当たり前のようなステップを端折っている記事が多く散見され、これらが初学者のつまづきの原因になっているのでは?という仮説の基、私自身が躓いたところを網羅するよう、あくまで初学者目線でとにかく手順を丁寧に記載することを心掛けています。 世界一端的かつわかりやすい記事を心掛けていきますので、どうぞ応援よろしくお願いします! この記事では以下のことを約束します。 難しいカタカナ語は使わない! カタカナ語ばかりの記事ダメ、絶対。 細かい手順も端折らない! 細かい手順を端折っている記事ダメ、絶対。 要点をシンプルかつ明快に! 長ったらしい記事ダメ、絶対。 今回使うツールや技術 ターミナル Docker 開発に使える仮想環境のひとつ。色々な言語やプロジェクトを一括で管理でき、新規作成や削除も簡単。PC自体に色々な言語をインストールしないので汚れにくいと良いことづくめ。 Node React Create-React-App 目次 事前準備 Terminalのインストール Dockerのインストール Node.jsのインストール フォルダ名、プロジェクト名の決定 Reactのインストール 作業用フォルダの作成 Dockerfileの作成 docker-compose.ymlファイルの作成 Dockerイメージのビルド Reactのインストールとプロジェクトの作成 Reactの起動 Dockerを起動 コンテナを起動 Reactを実行 Reactプロジェクト画面が立ち上がるか確認 事前準備 Terminalのインストール(Windowsのみ) ここでやること ・windows Terminalのインストール ターミナルが開発においての基本となる。 Windows11では既定のターミナルアプリが「windows Terminal」となっているため問題ないはず。 もしインストールしていなければ、以下のリンクからインストール。 https://docs.microsoft.com/ja-jp/windows/terminal/ Dockerのインストール ここでやること ・Dockerのインストール まだインストールしていなければ、以下のリンクからインストール https://www.docker.com/products/docker-desktop DockerへNode.jsをインストール ここでやること ・Docker Hubでnode.jsのイメージを探す ・ターミナルでコマンドを叩いてnodeをdockerへインストール Dockerはあくまで仮想環境を構築するツールであり、 実際には利用するイメージをインストールして使うことになる。 今回はReactを利用するためにNode.jsのインストールが必要なので、 Node.jsをDockerへインストールする方法を解説する。 ・以下のリンクからDockerHubを開く(もしくはググる) https://hub.docker.com/ ・サインインをするような表示がされているがしなくても問題はない ・Nodeと書かれたイメージを検索してクリック この画像ではちょうど上段右から二番目にnodeがある。 ここにないイメージを探したい場合は、右下にある「See all Docker Official images」をクリックして検索しよう ・インストールするためのコマンドがサイトに書かれているのでコピー ここでいうdocker pull nodeが該当部分 ・ターミナルを管理者権限で開く ・コピーしたコマンドを貼り付けてEnterで実行 ・NodeがDockerにインストールされる ・Dockerを起動 ・左サイドバーのイメージをクリック ・nodeと書かれているイメージが入っていることを確認する フォルダ名、プロジェクト名の決定(重要!) ここでやること ・作業用フォルダ名の決定 ・プロジェクト用フォルダ名の決定 コマンドの実行やymlファイル内の記述にはフォルダ名やプロジェクト名を多用します。 整合性が取れないと正しくインストールができなかったり、エラーが発生するので、 先にきちんとしたフォルダ名、プロジェクト名を決定することがとても大事。 フォルダの名前は自由だが、必ずわかりやすい名前かつ英語表記に。 Reactをインストール 1.作業用フォルダを作成する ・使いたい場所に作業用フォルダを作成 ・フォルダの名前は事前準備で決めた名前にする ・今回はdocker-react-appとする 【現時点の作業用フォルダの構成】 docker-react-app 2.Dockerfileを作成する 次にDockerfileの作成を行う。 Dockerfileとは Docker上で動作させるコンテナの構成情報を記述したファイルのこと。 これを元にDockerがイメージを生成してくれる。 Dockerfileのファイル名をつけるときのポイント ・必ず英語で表記する ・わかりやすい名前にする ・拡張子はつけない 今回はファイル名をDockerfileとする。 ファイル内の記述は以下の通り。 Dockerfile #Node.jsの最新版を記載 FROM node:16.14.0 #コンテナ内の作業ディレクトリを記載 WORKDIR /usr/src/app # 【各項目の説明】 #FROM #コンテナのベースとなるDockerイメージを記載 #ここではReactを使うために利用するnode.jsを記載 #基本的には最新版を使うことが望ましい #nodeの公式サイトを確認し、最新版のバージョンをここに記載する #WORKDIR #コンテナ内の作業ディレクトリを記載 【現時点の作業用フォルダの構成】 docker-react-app └── Dockerfile 3.docker-compose.ymlを作成する 次にdocker-compose.ymlファイルを作成する。 ymlファイルとは ローカルPCに作成した作業ディレクトリとDockerにおけるコンテナ内の作業ディレクトリを接続するためのファイル docker-compose.yml version: '3.8' services: node: build: context: . dockerfile: Dockerfile volumes: - ./:/usr/src/app command: sh -c "cd {作成したプロジェクトフォルダ名} && yarn start" ports: - "3000:3000" # 【各項目の説明】 # version:Composeファイルのバージョンを記載。Dockerの最新版を入れている場合は、ここを最新版にする。 # バージョンによっては非対応なのでリファレンスをチェック(https://matsuand.github.io/docs.docker.jp.onthefly/compose/compose-file/compose-versioning/) # dockerfile:先ほど作成したdockerfile名を記載 # volumes:ローカルのディレクトリが接続するDockerコンテナ内の作業ディレクトリを指定 # command:コンテナ内で実行されるコマンドを記載 # ports:外部に対して公開するポート番号 【現時点の作業用フォルダの構成】 docker-react-app ├── Dockerfile └── docker-compose.yml 4.Dockerイメージをビルドする Dockerへnode.jsをベースとしたイメージのビルドを行う。 作成したディレクトリ(Dockerfileが入っているところ)をTerminalで開き、以下のコマンドを打ち込むことでdockerfileに基づいたイメージがビルドされる。 docker-compose build 以下のような画面にFINISHEDという文言が表示されていたらビルド完了 【豆知識】Reactプロジェクト作成場所にしたいフォルダをターミナルで開く方法 方法1:ターミナルからcd(チェンジディレクトリ)コマンドで移動 ・ターミナルを起動 ・コマンドによって階層を移動 ・ターミナルでプロジェクト作成予定のフォルダが参照される 良く使うターミナルのコマンド(これだけは最低でも覚える) cd .. :階層を一つ上がる cd {同じ階層にあるフォルダ名} :同じ階層にある指定のフォルダへ移動 dir :現在の階層にあるファイルやフォルダをリスト形式で表示 方法2:フォルダを作成したあとに、右クリックから開く ・フォルダを新規作成 ・フォルダ内の空白を右クリック ・「Windowsターミナルで開く」をクリック ・ターミナルでプロジェクト作成予定のフォルダが参照される 5.Reactをインストール&プロジェクトを作成 ここではReactのインストールを行い、さらにプロジェクトフォルダも同時に作成する。 ・作成した作業用フォルダをターミナルで開く ※イメージをビルドした直後はターミナルを開いているはずなので飛ばしてOK ・以下のコマンドを実行 コマンド解説 npmコマンドでcreate-react-appを使って、任意のプロジェクト名のフォルダを作成し、さらにReactをインストールしている。 Create-React-Appは、ターミナルで使うコマンドの一つ。簡単にReactの開発環境を構築して開発をスタートできる。 Reactでアプリを作る際は、このコマンドを使うことが公式から推奨。 docker-compose run --rm node sh -c "npm install -g create-react-app && create-react-app {任意のプロジェクト名(英語)}" ・末尾に「Happy hacking!」という文言が表示されたらReactインストール完了 ※たまにエラーが起きるが、再度コマンドを実行すると通る場合も ・実行したコマンドに記述したプロジェクト名のフォルダが、作業用フォルダ内に新しく作成されていることを確認する 【現時点の作業用フォルダの中身】 docker-react-app ├──新しく作成されたプロジェクトフォルダ ├── Dockerfile └── docker-compose.yml React起動編 ここからは実際にReactを起動する手順を解説 1.Dockerを起動する ・まずはDockerを起動 ・クジラのマークのアレ? 2.コンテナを起動し、Reactを実行する ・Docker上でイメージを選択し、Runを押す ・「Optional Settings」を設定可能なので、コンテナ名をわかりやすい名前(プロジェクト名など)に設定する ・Runを押す ・コンテナが作成される ・コンテナを起動 ※起動している状態(緑色)になっていたらここはスキップ ・ターミナルを起動して、作業用フォルダを参照 ※docker上から開くのではなく、PC上からそのままターミナルで開く →ターミナル上で移動するか、フォルダを開いて右クリで起動するかのどちらか。 ・以下のコマンドを実行すると、docker-compose.ymlが実行される docker-compose up ・以下のような文言がターミナルに表示されていたら起動成功 3.Reactプロジェクト画面が立ち上がるか確認 ・Webブラウザを開く ・アドレスバーに http://localhost:3000 と入力して開く →ここの3000とはdocker-compose.ymlファイル内に記載したポート番号3000のこと →変えたい場合は、ymlファイルのポート番号記載を修正してやり直し ・次のような画面が出ればプロジェクト作成成功
- 投稿日:2022-03-03T01:10:29+09:00
Docker+AWS Lambdaのローカルテスト環境を作成する
概要 Lambdaのローカルテスト環境をDockerで作成しました。本記事ではPythonで書いています。 公式ドキュメントを読んでも上手くいかなかったので、記事にします。 用意するもの Dockerコマンドを実行できる環境 構築手順 ディレトリ構成 (プロジェクトルートディレクトリ)/ ├── Dockerfile ├── requirements.txt (不要なら作成しなくて良い) └── app.py ファイル作成 Dockerfile FROM public.ecr.aws/lambda/python:3.8 COPY app.py ${LAMBDA_TASK_ROOT} COPY requirements.txt . RUN pip3 install -r requirements.txt --target "${LAMBDA_TASK_ROOT}" CMD [ "app.handler" ] app.py import sys def handler(event, context): return 'Hello, This is Lambda Test' ※本記事ではrequirements.txtは空で環境作成します。 何か必要なモジュールがあれば追記して次の動作確認をしてください。 環境構築・動作確認 1. イメージ作成 テストでhello-worldという名前のイメージにしていますが、お好きな名前で問題ございません。 $ docker build -t hello-world . 2. コンテナ作成 ローカルはポート9000で公開していますが、こちらもお好きなポートで大丈夫です。コンテナ内の8080ポートについては変更しないでください。 $ docker run -p 9000:8080 hello-world ~~ 02 Mar 2022 15:57:27,797 [INFO] (rapid) exec '/var/runtime/bootstrap' (cwd=/var/task, handler=) 3. 動作確認 別ターミナルを起動し、curlで作成した関数を実行します。/2015-03-31/functions/function/invocationsのパスについてはDockerfileで指定したイメージによるものなので特に考えずに設定してください。 app.pyで設定したレスポンスが表示されます。 $ curl -d '{}' http://localhost:9000/2015-03-31/functions/function/invocations "Hello, This is Lambda Test" コンテナ作成を実行したターミナルのログには以下が表示されます。環境などによって表示が異なりますのでご承知おきください。 02 Mar 2022 15:57:27,797 [INFO] (rapid) exec '/var/runtime/bootstrap' (cwd=/var/task, handler=) 02 Mar 2022 16:00:22,977 [INFO] (rapid) extensionsDisabledByLayer(/opt/disable-extensions-jwigqn8j) -> stat /opt/disable-extensions-jwigqn8j: no such file or directory 02 Mar 2022 16:00:22,977 [WARNING] (rapid) Cannot list external agents error=open /opt/extensions: no such file or directory START RequestId: f96f05b2-cf54-4ebf-94d7-d8399c37afcd Version: $LATEST END RequestId: f96f05b2-cf54-4ebf-94d7-d8399c37afcd REPORT RequestId: f96f05b2-cf54-4ebf-94d7-d8399c37afcd Init Duration: 0.21 ms Duration: 65.85 ms Billed Duration: 66 ms Memory Size: 3008 MB Max Memory Used: 3008 MB まとめ Docker+Lambdaのローカルテスト環境が簡単に作成できました。 テストを書く際はapp.pyを編集したり、requirements.txtに必要なモジュールを記載してからビルドしてください。