LoginSignup
1
3

More than 1 year has passed since last update.

Docker+Amazon LinuxでLaravel開発環境を構築

Last updated at Posted at 2020-07-01

Docker環境を作ってみよう!・・・と思い立ったので、コピペできるように纏めました。

マシンスペック

  • Mac mini 2018
  • macOS Catalina(10.15.x)
  • Intel Core-i7 3.2GHz 6コア
  • メモリ 32GB
  • SSD 512GB

Docker環境

  • Amazon Linux2
  • Nginx 1.x
  • PHP(PHP-FPM)7.1.x
  • MySQL 5.7.x
  • Laravel 5.x

やること

  • Dockerのインストール
  • Amazon Linuxで環境構築
  • Macからマウント

補足

各環境を行ったり来たりするので、下記のように記載します。

[Mac]$ MacのターミナルでMac内の作業
[Docker]$ Macのターミナルからコンテナに接続して作業
[Docker]# Macのターミナルからコンテナに接続してroot権限で作業

前提

Homebrewはインストール済み

※参考
macOS(またはLinux)用パッケージマネージャー — Homebrew

Dockerのインストール

Home brewでインストールします。

[Mac]$ brew install --cask docker
Updating Homebrew...
〜 省略 〜
==> Downloading https://desktop.docker.com/mac/stable/45519/Docker.dmg
######################################################################## 100.0%
==> Verifying SHA-256 checksum for Cask 'docker'.
==> Installing Cask docker
==> Moving App 'Docker.app' to '/Applications/Docker.app'.
🍺  docker was successfully installed!

[Mac]$ open /Applications/Docker.app

タスクバーのDockerアイコンが「Docker Desktop is running」になるまで待つ。
下記の画面が表示されるが、閉じて良い。
スクリーンショット 2020-07-01 17.15.38.png

動作確認

[Mac]$ which docker
/usr/local/bin/docker

[Mac]$ docker --version
Docker version 19.03.8, build afacb8b

[Mac]$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete 
Digest: sha256:d58e752213a51785838f9eed2b7a498ffa1cb3aa7f946dda11af39286c3db9a9
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

〜 省略 〜

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

[Mac]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        5 months ago        13.3kB

※参考
Homebrewを使ってDockerをMacにインストール

hello-world削除

[Mac]$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
5b8f790636cd        hello-world         "/hello"            3 minutes ago       Exited (0) 3 minutes ago                       unruffled_villani

[Mac]$ docker rm 5b8f790636cd
5b8f790636cd

[Mac]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        5 months ago        13.3kB

[Mac]$ docker rmi bf756fb1ae65
Untagged: hello-world:latest
Untagged: hello-world@sha256:d58e752213a51785838f9eed2b7a498ffa1cb3aa7f946dda11af39286c3db9a9
Deleted: sha256:bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b
Deleted: sha256:9c27e219663c25e0f28493790cc0b88bc973ba3b1686355f221c38a36978ac63

※参考
Dockerイメージとコンテナの削除方法

コンテナの起動

イメージのダウンロード

[Mac]$ docker pull amazonlinux:2
2: Pulling from library/amazonlinux
a3f8e652bdc4: Pull complete 
Digest: sha256:436544dbd50a2f1f876390b9c2b09e98d73badb222ba188d69d58e649aa1b6b3
Status: Downloaded newer image for amazonlinux:2
docker.io/library/amazonlinux:2

[Mac]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
amazonlinux         2                   7f335821efb5        2 months ago        163MB

Systemdパッケージをインストールする為にコンテナ起動

コンテナ内でsystemctlコマンドを利用する為には、コンテナを/sbin/initで起動する必要がある。
AmazonLinux2のイメージが、初期状態だと/sbin/initできない為、まずはコンテナにSystemdパッケージをインストールする。

[Mac]$ docker run -it -d --privileged --name local -p 8080:80 amazonlinux:2 /bin/bash
[Mac]$ docker exec -it local /bin/bash
bash-4.2# 

[Docker]# yum -y install systemd
[Docker]# exit

※参考
Docker上のAmazonLinux2でLaravelの環境構築

Systemdパッケージをインストールしたコンテナをイメージ化

[Mac]$ docker commit local amazonlinux:local
[Mac]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
amazonlinux         local               20a6c14cc93c        20 seconds ago      422MB
amazonlinux         2                   7f335821efb5        2 months ago        163MB

コンテナ停止

[Mac]$ docker stop $(docker ps -q)

※参考
コマンドでDockerコンテナを停止・削除、イメージの削除をする

コンテナ起動

[Mac]$ docker run --privileged -d -p 8080:80 --name amazonlinux amazonlinux:local /sbin/init
67f478ad9855289bd0c041cfde25869ec79d007bb222ee52905287aef565777c
[Mac]$ docker exec -it amazonlinux /bin/bash
bash-4.2# 

コンテナ作業あれこれ(インストールとか)

yumあれこれ

[Docker]# yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
[Docker]# yum -y install epel-release
[Docker]# yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
[Docker]# yum -y update
[Docker]# yum -y install yum-utils
[Docker]# sed -i -e "s/priority=10/priority=99/g" /etc/yum.repos.d/amzn2-core.repo

ユーザー作成

[Docker]# useradd docker
[Docker]# ls /home
docker

sudo設定

[Docker]# yum install -y sudo
[Docker]# visudo

★下記の点線内を追記
---
docker ALL=(ALL)       NOPASSWD: ALL
---
:wq

PHPのインストール

[Docker]# yum-config-manager --enable remi-php71
[Docker]# yum -y install --enablerepo=remi,remi-php71 php php-devel php-mbstring php-pdo php-gd php-xml php-mcrypt php-mysqlnd php-fpm php-pecl-xdebug php-pecl-zip php-bcmath

Nginxのインストール

[Docker]# vi /etc/yum.repos.d/nginx.repo
★点線内をコピペ
---
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
enabled=0
gpgcheck=0
---
:wq
[Docker]# yum -y --enablerepo=nginx install nginx

PHPの設定

[Docker]# vi /etc/php.ini
★点線内を末尾(Gで移動)にコピペ
---
xdebug.remote_enable = On
xdebug.remote_autostart = On
xdebug.remote_connect_back = 1
xdebug.remote_port = 9000
xdebug.scream = 0
xdebug.show_local_vars = 1
xdebug.idekey=PHPSTORM
---
:wq

PHP-FPMの設定

[Docker]# vi /etc/php-fpm.d/www.conf
★下記を点線内に編集
user = apache
group = apache
listen = 127.0.0.1:9000
;listen.owner = nobody
;listen.group = nobody
;listen.mode = 0660
↓
---
user = nginx
group = nginx
listen = /var/run/php-fpm/php-fpm.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
---
:wq

Nginxの設定

[Docker]# cd /etc/nginx
[Docker]# cp nginx.conf nginx.conf.org
[Docker]# cd /etc/nginx/conf.d
[Docker]# cp default.conf default.conf.org
[Docker]# vi /etc/nginx/conf.d/default.conf
★点線内に置き換え
---
server {
    listen 80;
    server_name laravel.local;

    charset UTF-8;
    access_log  /var/log/nginx/access.log;
    location / {
        root /home/vagrant/laravel/public;
        try_files $uri /index.php?$query_string;
    }

    #error_page 404 /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page 500 502 503 504  /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }

    location ~ \.php$ {
        root /home/docker/laravel/public;
        fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}
---
:wq
PHP-FPMとNginxの起動および自動起動設定
[Docker]# systemctl start php-fpm
[Docker]# systemctl enable php-fpm
[Docker]# systemctl start nginx
[Docker]# systemctl enable nginx

MySQLのインストール、DB作成、ユーザー作成

[Docker]# rpm -Uvh https://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/mysql57-community-release-el7-10.noarch.rpm
[Docker]# yum -y install --enablerepo=mysql57-community mysql-community-server
[Docker]# systemctl enable mysqld.service
[Docker]# systemctl start mysqld.service
[Docker]# grep 'temporary password' /var/log/mysqld.log
2020-06-26T09:21:06.925606Z 1 [Note] A temporary password is generated for root@localhost: XXXXXX
[Docker]# mysql_secure_installation
Enter password for user root: XXXXXX
★パスワードは「英字小文字、英字大文字、数字、記号」の組み合わせにしたら通る
 例)docker#DOCKER1234
New password: docker#DOCKER1234
Re-enter new password: docker#DOCKER1234
〜 以降の質問は全て y で回答 〜
All done!

[Docker]# mysql -u root -p
Enter password: docker#DOCKER1234

★DB:hoge、USER:fuga、PASSWORD:docker#DOCKER1234(※好きなのに変える)
mysql> create database hoge;
mysql> CREATE USER fuga@'%' IDENTIFIED BY 'docker#DOCKER1234';
mysql> GRANT ALL ON hoge.* TO fuga@'%';
mysql> CREATE USER fuga@'localhost' IDENTIFIED BY 'docker#DOCKER1234';
mysql> GRANT ALL ON hoge.* TO fuga@'localhost';
mysql> FLUSH PRIVILEGES;
mysql> quit

[Docker]# vi /etc/my.cnf
★点線内を追記
---
character-set-server = utf8
default_password_lifetime = 0
---
:wq

[Docker]# systemctl restart mysqld.service
[Docker]# exit

※参考
CentOS7.1にMySQL 5.7をインストール

ユーザー指定でコンテナに接続する

[Mac]$ docker exec -u docker -it amazonlinux /bin/bash

コンテナ作業の続き

Laravelのインストールの準備

[Docker]$ cd ~
[Docker]$ curl https://getcomposer.org/installer | php
[Docker]$ sudo mv -i composer.phar /usr/local/bin/composer
[Docker]$ sudo yum -y install unzip
★Nginxが/home/docker配下を実行できるようにする
[Docker]$ chmod 701 /home/docker
[Docker]$ exit

イメージ化

[Mac]$ docker commit amazonlinux amazonlinux:local2

マウントする

[Mac]$ docker stop $(docker ps -q)
[Mac]$ docker rm $(docker ps -q -a)
[Mac]$ mkdir -p ~/Work/MountPoint/docker/mount
[Mac]$ docker run --privileged -d -p 8080:80 -v ~/Work/MountPoint/docker/mount:/home/docker --name amazonlinux amazonlinux:local2 /sbin/init
[Mac]$ docker exec -u docker -it amazonlinux /bin/bash

※参考
【Docker】Dockerでホストのディレクトリをマウントする

コンテナ作業の続き其の弐

Laravelのインストール、設定

[Docker]$ cd ~
[Docker]$ composer create-project --prefer-dist laravel/laravel laravel "5.6.*"
[Docker]$ cd laravel
[Docker]$ composer require --dev barryvdh/laravel-ide-helper
[Docker]$ composer require --dev squizlabs/php_codesniffer
[Docker]$ chmod -R 777 storage
[Docker]$ chmod -R 777 bootstrap/cache

[Docker]$ vi .env
★下記を点線内に編集
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
↓
---
DB_DATABASE=hoge
DB_USERNAME=fuga
DB_PASSWORD=docker#DOCKER1234
---
:wq

[Docker]$ php artisan migrate
[Docker]$ php artisan db:seed

[Docker]$ mkdir bin
[Docker]$ vi bin/clear-laravel.sh
★下記を点線内をコピペ
---
#!/bin/bash
php artisan view:clear
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan clear-compiled
php artisan config:cache
composer dump-autoload
php artisan ide-helper:generate
php artisan ide-helper:models -N
php artisan ide-helper:meta
find . -name '._.DS_Store' -type f -ls -delete
---
:wq
[Docker]$ chmod 755 bin/clear-laravel.sh
[Docker]$ bin/clear-laravel.sh

ブラウザで動作確認

無題.png

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3