使用docker + docker-compose + docker-sync来构建Symfony的环境设置(适用于初学者)

首先

由于Qiita上已经充斥着有关Docker + Laravel环境配置的文章,但是关于Docker + Symfony的文章很少见到,所以我写了这篇文章(虽然与Laravel几乎没有什么不同)。
作为一个Docker初学者,我打算详细解释各种设置等,以便作为备忘录。

形成

主机环境

ツールバージョンMac macOSCatalina 10.15.5docker-compose1.25.5docker-sync0.5.14

构建环境(目标)

    • PHP 7.4

 

    • mysql 5.7

 

    • Apache

 

    Symfony 5

目录结构

将Symfony的源代码放置在app目录中。需要注意的是,与Symfony的.env不同,根目录中的.env是不同的。

project/
  ├ app/
  ├ docker/
  │  ├ apache/
  │  │  └ my_app.conf
  │  ├ php/
  │  │  └ php.ini
  │  └ Dockerfile 
  ├  .env
  ├  docker-compose.yaml
  └  docker-sync.yaml

安装必要的工具。

使用Homebrew在主机环境中安装所需的工具。

Docker – 隔离应用程序的开源平台

$ brew install docker
$ brew cask install docker

DOCKER同步

请按照您的环境适当更改~/.zshrc的部分。

$ brew install ruby
$ echo 'export PATH="/usr/local/opt/ruby/bin:$PATH"' >> ~/.zshrc
$ source ~/.zshrc
$ gem install docker-sync -n /usr/local/bin 

Docker Compose的配置

version: '3'

services:
  app:
    container_name: my_app
    build: ./docker
    ports:
      - 8880:80
    volumes:
      - my_app_symfony:/var/www/html
      - ./docker/php/php.ini:/usr/local/etc/php/php.ini
      - ./docker/apache/my_app.conf:/etc/apache2/sites-enabled/my_app.conf
    depends_on:
      - mysql

  mysql:
    image: mysql:5.7
    container_name: my_app_app_mysql
    environment:
      MYSQL_ROOT_PASSWORD: $DB_ROOT_PASSWORD
      MYSQL_DATABASE: $DB_NAME
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    ports:
      - 3306:3306

volumes:
  my_app_symfony:
    external: true

说明

Docker Compose 是一個可以集中管理多個 Docker 容器的工具。我們可以在 docker-compose.yaml 文件的 services 部分下方記錄各個容器的配置設定。

app的配置文件中,已经写下了作为WEB服务器运行的容器的设置。可以更改container_name的my_app为任意值。

通过写下build: ./docker,按照docker/Dockerfile的内容进行构建。

在ports中,写下了将容器中启动的进程的哪个端口绑定到本地的哪个端口的设置。按照本地:容器的顺序进行写下,所以这次的意思是将本地的8880端口绑定到容器的80端口,意味着发送请求到http://localhost:8880,请求将被转发到容器内的80端口。

在volumes中,写下了在本地和容器之间同步文件或目录的设置。volumes的第2,3行写下了将本地的php.ini和my_app.conf与容器进行同步的设置。第一行写下了将本地symfony项目的app目录同步到容器的/var/www/html目录中的设置,由于symfony的源代码量较大,普通的同步会降低性能,所以我们将使用后面提到的docker-sync进行同步。在这里,我们在最底部的volumes中定义了一个外部卷(由docker-sync创建),并给它取名为my_app_symfony。在app容器的volumes中,指定本地的路径为这个my_app_symfony。

在mysql中,已经写有配置使用mysql容器作为数据库的设置。在这里,我们不使用Dockerfile,而是使用预先公开的镜像。可以在Dockerhub等地方搜索到这个镜像。在Dockerhub的mysql页面中有文档,但在创建容器时,可以通过传递特定的环境变量来进行各种设置。环境变量可以通过在environment中编写来传递,本次使用了MYSQL_ROOT_PASSWORD、MYSQL_DATABASE和TZ这三个。我认为根据名称可以推测出它们的作用,所以省略了解释。另外,虽然也可以直接将变量的值写死在这个文件中,但为了增加灵活性,本次是从本地的环境变量中获取值(有点复杂)。在根目录下有一个.env文件,

DB_ROOT_PASSWORD=root
DB_NAME=app_db

在docker-compose.yaml中写下对应的内容,就能在创建容器时替换变量。command可以用来描述容器创建时在容器内执行的命令。

/docker 目录

memory_limit = 2048M
date.timezone = "Asia/Tokyo"
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html/my_app/public
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
FROM php:7.4-apache

RUN a2dissite 000-default

WORKDIR /var/www/html

RUN apt-get update && apt-get install -y git zip unzip
RUN apt-get install -y wget libjpeg-dev libfreetype6-dev
RUN apt-get install -y  libmagick++-dev \
libmagickwand-dev \
libpq-dev \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
libwebp-dev \
libxpm-dev

RUN docker-php-ext-configure gd --with-freetype=/usr/include/ --with-jpeg=/usr/include/
RUN docker-php-ext-install -j$(nproc) gd

RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && mv /usr/bin/composer.phar /usr/bin/composer

说明

php.ini和my_app.conf文件中没有写入任何特殊内容。请根据需要进行编辑。

在 Dockerfile 中,我们会描述构建容器的步骤。
第一行的 FROM 指定了容器的基础镜像(可以在 Dockerhub 上搜索)。通过使用 RUN xxxx,在容器内执行xxxx命令。需要注意的是,通过 RUN 命令执行的结果不会传递到下一个 RUN 命令,所以可能出现移动了目录(使用 cd)但是文件却不见了的情况!如果需要传递结果,可以使用 && 连接多个命令。
从第二行开始,我们禁用了 Apache 的默认网站,安装了 PHP 的 gd 扩展和 composer。通过 WORKDIR /var/www/html,我们将工作目录设置为 /var/www/html。

docker-sync的配置

version: '2'
syncs:
  my_app_symfony:
    src: './app'
    sync_host_ip: '127.0.0.1'
    sync_host_port: '5000'
    sync_strategy: 'native_osx'
    sync_excludes: ['.git', '.gitignore', 'node_modules']

说明

在syncs的配置中,您可以定义各种音量。您需要确保my_app_symfony与在docker-compose的volumes中指定的音量名称匹配。您需要指定要同步的目录在src中,并分别指定sync_host_ip和sync_host_port为主机的IP和端口。sync_strategy有很多选项,但是我认为使用native_osx应该没有问题(我不是很清楚)。您可以通过sync_excludes指定不需要同步的文件和目录,例如node_modules和大量不在PHP中使用的源代码。

启动

请停止使用使用以下端口的软件:8880端口、8888端口、5000端口、3306端口。

$ docker-sync start
$ docker-compose up -d --build

在这个阶段,各种容器将会启动。

接下来,我们将进入容器,使用composer创建一个Symfony项目。您可以通过使用 “exit” 命令从容器中退出。

# appコンテナでbashを実行
$ docker-compose exec app /bin/bash

# コンテナ内
root@eb419aab1d32:/var/www/html#  composer create-project symfony/skeleton my_app

当您从本地浏览器访问http://localhost:8880时,我认为您将看到Symfony的界面显示!

各种操纵

# コンテナの終了
$ docker-compose stop

# コンテナの再開
$ docker-compose start

# composer install
$ docker-compose exec app composer install

以上!

广告
将在 10 秒后关闭
bannerAds