見出し画像

dockerにlaravel開発環境を作成する

最初にgitの初期設定とgithubへのssh接続設定を行います。
なるべく詳しく手順を書いた記事を作成しています。

設定手順はこちら。
https://note.com/noabou/n/n3ba65990e2b1

$ git config --list | grep user

上記コマンドでgitの必須項目であるuser.emailの値とuser.nameの値が設定したとおりに表示されているか確認できます。

githubにssh接続できるかを以下のコマンドで確認

Kyachuo@LAPTOP-MEG3K2VH MINGW64 ~/docker-laravel-handson (master)
$ ssh -T github.com

Warning: Permanently added 'github.com,52.192.72.89' (RSA) to the list of known hosts.
Hi githubtakashi! You've successfully authenticated, but GitHub does not provide shell access.


gitの設定が完了したら、dockerにlaravel開発環境を作成します。


参考にした記事がこちらです。


作業するディレクトリを作成

dockerのコンテナ内にディレクトリを作成する感じかなと思ったのですが、普通に自分のPC内にディレクトリを作成するんですね。

→あとで、自分のpcで変更した内容が自動的にdockerコンテナに反映されるように設定します。

git-bashを立ち上げて作業するときは、まず作業ディレクトリに移動することを忘れないようにします。

作業ディレクトリに移動しないまま作業すると、あとでファイルやディレクトリを移動させないといけないことになっちゃいます。凡ミスですが僕は間違えて作業ディレクトリの外で作業、ディレクトリやファイル作ってしまい、あとで気づいてディレクトリやファイルを作業ディレクトリ内の所定の場所に移動させる事態になりました。

$ mkdir docker-laravel-handson
$ cd docker-laravel-handson


Git Bashでは、使っていると下記のメッセージがでてコマンドを実行できないことがあるらしいです。

the input device is not a TTY. If you are using mintty, try prefixing the command with 'winpty'

上記を防止するためには、Git Bashでコマンドを入力。

exec winpty bash

bashをwinptyにするコマンドとなります。
winptyとは、普通なら互換性がないwindowsネイティブなコマンドとunixの仮想端末をつなぐインターフェースのこと。互換性を確保するためにwinptyコマンドを使う。

上記記事では、ttyについても記載があり、分かりやすかったです。
ttyで他の仮想端末にメッセージを送れたりして、楽しいなと思いました。

僕の場合、winptyコマンドをして文字を入力したら、行の背景にpowershellのブルーの色が出てきて、めっちゃ見ずらくなりました。
この辺は色を調整すれば済む話ですが、めんどくさいので僕はとりあえずメッセージに遭遇したらコマンドを実施することに決めました。


リモートリポジトリを作成する

リモートリポジトリとは、リモートなプロジェクトのこと。ネットワーク上やインターネット上のどこかに作っている作業場所みたいな感じ。複数人で作業するときに便利。


githubのサイトにアクセスし、サイト右上の「+」をクリックしたら出てくるメニューのNew repositoryをクリック。

画像1


Repository nameにdocker-laravel-handsonと入力→Public選択→Create repositoryをクリック。

画像2

作成すると画像のようなページに遷移します。

画像3


以上でgithub上にリモートリポジトリは作成できました。


ローカルリポジトリの作成


作業ディレクトリdocker-laravel-handsonにて下記を実施

$ echo "# docker-laravel-handson" > README.md

README.mdファイルを作成しつつファイルに題名を記載。

なんとなくな理解なので、readmeファイルについて一応ググってみました。

.mdを付けることで、htmlファイルに自動変換されるらしいです。

現在のディレクトリのリポジトリを作成

$ git init

リポジトリを作成したいディレクトリでgit initすることで、gitのローカルリポジトリを作成できる(自動的に必要なディレクトリやファイルが生成されたり各種設定がされる)。



カレントディレクトリ(docker-laravel-handson)の中身をローカルリポジトリにaddし、現在のディレクトリ及び配下で変更があったファイルをすべてadd

$ git add .

ワークツリーで変更があったファイルをindexに追加するコマンドがgit add。
addによってindexに追加することで、コミットの対象にできる。


はじめてのコミットを実施

git commit -m "first commit"

indexの内容をローカルリポジトリに記録し保管するコマンドがgit commit。
-mオプションでメッセージを添えられる。


githubで作ったリモートリポジトリをgitに登録

git@github...の部分は自分のgithubリモートリポジトリのsshの方をコピペする。

git remote add origin git@github.com:githubtakashi/docker-laravel-handson.git

登録した内容を確認

$ git remote -v
origin  git@github.com:githubtakashi/docker-laravel-handson.git (fetch)
origin  git@github.com:githubtakashi/docker-laravel-handson.git (push)

originと表示されていればOK。


間違えた場合の修正は下記のコマンドを実施して修正する

$ git remote set-url origin  [リモートリポジトリ]

commit後のpushを実施

$ git push -u origin master

-u は--set-upstreamのことで、初回push時に推奨されるオプション。リモートリポジトリの上流にpushすること。

-uオプションについてはまた調べて追記します。

次回のpushはgit push がgit push origin masterと同じ意味に解釈されるそうなので、入力は少しラクになります。

僕の場合、下記エラーが発生して初回pushできませんでした。

$ git push -u origin master
error: src refspec master does not match any
error: failed to push some refs to 'github.com:githubtakashi/docker-laravel-handson.git'


git statusコマンドで確認すると、コミットが何もされていないことが分かります。

$ git status
On branch master

No commits yet

Untracked files:
 (use "git add <file>..." to include in what will be committed)
       .gitignore
       README.md

git add してgit commitしてあるのに、Untracked filesとしてREADME.mdがあったり、この時点で不思議な気がします。

解決方法1

README.mdの中身を編集し、内容を変更する。
→add、commit、pushする。

または、git statusでNo commits yetと表示されているように、ローカルリポジトリにcommitしているファイルが何もない、つまりローカルリポジトリが空の状態が原因なので、空ファイルを作成してローカルリポジトリにコミットする→githubのリモートリポジトリにpushすることで解決。

$ touch initial
$ git add initial
$ git commit -m "initial commit"
$ git push -u origin master


解決方法2

この解決方法では、README.mdをgithubのリモートリポジトリにマージする形でpushできました。

この解決方法は、解決方法1のときと状況が違います。参考にしていた記事が全面的に改訂されたので、それに合わせてもう一度hansonをはじめからやり直したときの状況です。なので、解決方法1と状況が違い、pushしたときのメッセージも違っています。

まずgit push しますが、rejectされます。


Kyachuo@LAPTOP-MEG3K2VH MINGW64 ~/docker-laravel-handson (master)
$ git push -u origin master

Warning: Permanently added 'github.com,52.69.186.44' (RSA) to the list of known hosts.
To github.com:githubtakashi/docker-laravel-handson.git
! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'github.com:githubtakashi/docker-laravel-handson.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Kyachuo@LAPTOP-MEG3K2VH MINGW64 ~/docker-laravel-handson (master)
$ git status
On branch master
nothing to commit, working tree clean

ローカルリポジトリにものがない。みたいなことが書かれています。別のローカルリポジトリがあって、同じリモートリポジトリにpushすること原因であることが多いみたいなことが書かれています。

心当たりないのでスッキリしないです。
git statusで確認すると、追跡されているものに変更されたものがないと表示されました。

→よくよく作業の順番をみたら、最初にREADME.mdを作成して、それからgit add、commitしているので、README.mdの作成が変更としてgitに認識されていないからでした。

git add . した後にREADME.mdを作成したら変更がgitに検知されるはずです。→git add, commit, pushでうまくいくはずです。

git statusで確認し追跡されているものに変更されたものがないと表示された状態で無理やりpushする方法が下記。

下記コマンドを順番に実行します。

git fetch && git merge origin/master

git merge --allow-unrelated-histories origin/master

git push -u origin master

実際に実行したら下記のようになります。

Kyachuo@LAPTOP-MEG3K2VH MINGW64 ~/docker-laravel-handson (master)
$ git fetch && git merge origin/master

Warning: Permanently added 'github.com,52.69.186.44' (RSA) to the list of known hosts.
warning: no common commits
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 190 bytes | 12.00 KiB/s, done.
From github.com:githubtakashi/docker-laravel-handson
* [new branch]      master     -> origin/master
fatal: refusing to merge unrelated histories


Kyachuo@LAPTOP-MEG3K2VH MINGW64 ~/docker-laravel-handson (master)
$ git merge --allow-unrelated-histories origin/master

Merge made by the 'recursive' strategy.
initial | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 initial

Kyachuo@LAPTOP-MEG3K2VH MINGW64 ~/docker-laravel-handson (master)
$ git push -u origin master

Warning: Permanently added 'github.com,52.69.186.44' (RSA) to the list of known hosts.
Enumerating objects: 6, done.
Counting objects: 100% (6/6), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (5/5), 541 bytes | 270.00 KiB/s, done.
Total 5 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:githubtakashi/docker-laravel-handson.git
  651adba..988eb87  master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.

Kyachuo@LAPTOP-MEG3K2VH MINGW64 ~/docker-laravel-handson (master)
$ git push -u origin master

githubのリモートリポジトリをかくにんしてみると、上記のファイルが確認されましたのでOKです。

gitとgithubによるローカルリポジトリとリモートリポジトリのやりとりだけでも結構、書いてある通りにやってもエラーとかでつまづくので、慣れが必要と思いました。空ファイルを作ってpushしたり削除したり僕は練習しました。


画像4


以下、編集します。9/14


Dockerの.env(環境変数)ファイルを作成する

Dockerのdocker-composeが参照する環境変数を設定するファイルが.envファイル。


.envファイルを作成

$ touch .env


.envファイルの内容を書く。

DB_NAME=homestead
DB_USER=homestead
DB_PASS=secret
TZ=Asia/Tokyo

データベースの接続情報とタイムゾーンを環境変数として登録する。

homesteadとは、laravelの開発環境で必要なプログラミング言語であるphpとlaravel自体も入っていて、webサーバーなどパッケージ化された便利なパッケージ。仮想環境で使うパッケージ。


アプリケーションのサーバーコンテナを作成する

phpアプリケーションのサーバーコンテナをつくる。
→phpで作ったアプリを動作させることができるサーバーのコンテナ(=dockerイメージ)をつくる。という意味。


docker-compose.ymlファイルを作成

ymlファイルとは、テキストファイルで、主にデータの受け渡しでプログラムが参照するファイル。

$ touch docker-compose.yml

docker-compose.yml ファイルは、インデント(半角スペース)が意味を持つらしいので、書く際は注意です。



docker-composeファイルの中身を書く。

version: "3"
services:
 app:
   build:
     context: ./docker/php
     args:
       - TZ=${TZ}
   volumes:
     - ./src:/work
     - ./logs:/var/log/php
     - ./docker/php/php.ini:/usr/local/etc/php/php.ini
   working_dir: /work
   environment:
     - DB_CONNECTION=mysql
     - DB_HOST=db
     - DB_DATABASE=${DB_NAME}
     - DB_USERNAME=${DB_USER}
     - DB_PASSWORD=${DB_PASS}
     - TZ=${TZ}

version: docker-composeファイルの書式バージョン。1、2もあるみたい。

services: サービス設定しますよの宣言。servicesの中に、各種設定項目が存在する。ここでは、app, build,volumes,...など。

app: appコンテナのこと。appの中に各種設定をしていることがインデントから分かる。インデントが意味を持つので意識することが大切だと思えてきました。

buildのcontext: dockerfileのパスを指定

buildのargs: argsにオプションの設定項目を定義

volumes: PC側のディレクトリをコンテナ側のディレクトリにマウントを行うディレクトリを設定する。

例)- ./src:/work の意味
./src:/workは、[PC側のディレクトリ]:[コンテナ側のディレクトリ]の意味で、 
PC側のディレクトリ ./srcを 
コンテナ側のディレクトリ /workにマウントするの意味。
マウントするので、PCで変更した内容が、コンテナにも反映される感じ。

working_dir: 作成されたコンテナの作業ディレクトリを指定

.envファイルに書いた値をdocker-compose.ymlファイルに${環境変数名}で受け渡し可能。

argsのTZ(タイムゾーン)はDockerfileから参照され使用される。

environment: 環境変数を追加する。
TZはphp.iniで参照され使用される。
php.iniとは、phpの設定ファイル。php.iniについては下記の記事が分かりやすかったです。
https://wa3.i-3-i.info/word13611.html

environmentのDB_* 設定値はLaravel側の設定で使われる環境変数。laravelから参照され使用される。


アプリケーションサーバーのコンテナを作成するためのDockerfileを作成

Dockerfileについて:
dockerイメージを自動的に作成するためにDockerfileを使用する。Dockerfileに書いた環境設定やコマンドの内容をdockerが読み込み、dockerイメージを作成してくれる。→手動で手入力しなくていいのでラクだし作業が速くなる。Dockerfileのおかげで、いつでもどこでもすぐにイメージが作成できる。

docker-composeとの違い:
Dockerfileとdocker-composeの違いを調べてみました。下記の記事を参照しました。
https://qiita.com/hiyuzawa/items/81490020568417d85e86#docker-compose

docker-composeのファイルは、composeという名前が付いていることからも予想できそうな通り、複数のコンテナをまとめて、一つのアプリとして構成したいときに設定内容を書くファイル。

Dockerfileの書き方、項目についても、公式ドキュメントに記載されています。まずは基本を読んで理解した方がよさそうです。FROMの記載から始めないといけないなど書かれています。

Dockerfileの内容はコピペだけで理解あまりしなくても進められそうだけど、基礎の基礎は最低限知っといたほうがいいかなと思い、別記事でまとめていってます。公式ドキュメントを元にまとめていっているので、基本を確認したい際はこちらの記事を参照。



./docker/php/Dockerfileを作成

mkdir -p docker/php

-pオプションの意味は、ペアレントオプション。
no error if existing, make parent directories as needed ディレクトリもなければ同時に作ってくれる。

touch docker/php/Dockerfile

Dockerfileの中身を編集(vi docker/php/Dockerfile)

FROM php:7.3-fpm-alpine
LABEL maintainer "your-name"
ARG TZ
ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer
RUN set -eux && \
 apk add --update-cache --no-cache --virtual=.build-dependencies tzdata && \
 cp /usr/share/zoneinfo/${TZ} /etc/localtime && \
 apk del .build-dependencies && \
 docker-php-ext-install bcmath pdo_mysql && \
 curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer && \
 composer config -g repos.packagist composer https://packagist.jp && \
 composer global require hirak/prestissimo

Dockerfileのフォーマットについては、公式ドキュメントを参照です。
一通りざっとドキュメントに目を通しておきました。

# Comment
UPPERCASE  arguments

 の形式で書くことで、項目と引数を分かりやすくするのが慣例の書き方になっているそう。

 例えば、上記のDockerfileの内容では「 FROM php:7.3-fpm-alpine」のような書き方。uppercaseに該当するのがFROMで、argumentsに該当するのがphp:7.3-fpm-alpine。

コメントは「# comment」の形式で書く。 

作成したdockerfileの概要(どんなことやっているか)

- Time Zoneを設定
- Composer コマンドをインストール
→laravelで必要となってくるおなじみのComposerですね。

- Laravelに必要なPHP拡張機能をインストール
→bcmath、pdo_mysqlを追加でインストール

bcmathとは、phpの関数で、任意精度の小数点を扱える関数。通常はインストールされてなく、phpの拡張機能なのでインストールして使うみたいです。ググったところ、浮動小数点絡みのComposerのエラーとかあるみたいなので、必要みたい。

pdo_mysqlとは、phpからmysqlのデータベースにアクセスするために必要なインターフェースを実装したドライバ。


Dockerfileの詳細
- alpineのphp7.3をベースに使用
- 作成するイメージのAuthorを記載
- タイムゾーンの設定 








続きは引き続き更新します。







この記事が気に入ったらサポートをしてみませんか?