docker搭建php環境


前言

本文根據參考文章,自己動手試了搭建PHP環境,對里面的Dockerfile的編寫
做了最新的修改,以此記錄,完整代碼查看傳送門
說明:

  • 鏡像下載過慢,可使用國內鏡像加速,具體可自行查詢
  • 根據此方法是 用了四個鏡像,生成了四個容器,容器之間的啟動,根據docker-compose管理
    當然也可以 用一個基礎鏡像,在此鏡像的基礎上 安裝 nginx php等軟件,容器也只有一個,就像本機安裝一樣

目錄結構

app # 項目目錄
	index.php
	test
		-test.php
data # 數據目錄
	mysql
	redis

logs # 日志目錄
	nginx
	mysql
	php-fpm

docker_self # docker目錄
	docker-compose.yml
	mysql
		-Dockerfile
		-conf.d
			-my.conf
	nginx
		-Dockerfile
		-nginx.conf
		-conf.d
			-www.conf
	php
		-Dokcerfile
		-php-fpm.conf
		-php-fom.d
			-www.conf
		-idc.ini
	redis
		-Dockerfile

php的dockerfile

FROM php:7.2-fpm

# 設置時區
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 更新安裝依賴包和PHP核心拓展
RUN apt-get update && apt-get install -y \
        git \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libpng-dev \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd \
    && docker-php-ext-install zip \
    && docker-php-ext-install pdo_mysql \
    && docker-php-ext-install opcache \
    && docker-php-ext-install mysqli \
    && rm -r /var/lib/apt/lists/*


# 安裝 PECL 拓展,這里我們安裝的是redis psr
# 最新的phalcon擴展,需要 psr
RUN pecl install redis-5.0.2 \
    && pecl install psr \
    && docker-php-ext-enable redis psr

# 安裝第三方拓展,這里是 Phalcon 拓展
RUN cd /home \
    && git clone --depth=1 git://github.com/phalcon/cphalcon.git \
    && cd cphalcon/build \
    && ./install \
    && echo "extension=phalcon.so" > /usr/local/etc/php/conf.d/phalcon.ini \
    && rm -rf /home/*

# 添加配置文件,新添加的phalcon項目需要
COPY idc.ini /data/app/idc/idc.ini

WORKDIR /data
  • 我們使用了 php:7.2-fpm 的鏡像
  • php的擴展安裝分為 核心擴展 和 pcel擴展 以及源代碼的安裝
    具體可參考官方文檔
  • phalcon的擴展,利用了git下載源文件的方式
    git在api-get時已安裝

其他的dockerfile

nginx:

FROM nginx:alpine

# set timezome
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

mysql:

FROM mysql:5.7

# set timezome
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

redis:

FROM redis:alpine

# set timezome
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

注意:

  • nginx的配置文件中 php-fpm 不為本機 127.0.0.1
    而且 docker-compose.yml中的名稱 php-fpm

docker-compose的編寫

version: '3.2'
services:
  php-fpm:
    build: ./php
    ports:
      - "9000:9000"
    links:
      - mysql-db:mysql-db
      - redis-db:redis-db
    volumes:
      - ../app:/data/www:rw
      - ./php/php.ini:/usr/local/etc/php/php.ini:ro
      - ./php/php-fpm.conf:/usr/local/etc/php/php-fpm.conf:ro
      - ./php/php-fpm.d:/usr/local/etc/php/php-fpm.d:ro
      - ../logs/php-fpm:/var/logs/php-fpm
      - ../logs/contento:/data/logs/contento:rw
    restart: always
    command: php-fpm

  nginx:
    build: ./nginx
    depends_on:
      - php-fpm
    links:
      - php-fpm:php-fpm
    volumes:
      - ../app:/data/www:rw
      - ./nginx/conf.d:/etc/nginx/conf.d:ro
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ../logs/nginx:/var/logs/nginx
    ports:
      - "80:80"
      - "8080:8080"
      - "443:443"
    restart: always
    command: nginx -g 'daemon off;'

  mysql-db:
      build: ./mysql
      ports:
        - "3306:3306"
      volumes:
        - ../data/mysql:/var/lib/mysql:rw
        - ../logs/mysql:/var/lib/mysql-logs:rw
        - ./mysql/conf.d:/etc/mysql/conf.d:ro
      environment:
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: test
        MYSQL_USER: test
        MYSQL_PASSWORD: test123
      restart: always
      command: "--character-set-server=utf8"

  redis-db:
      build: ./redis
      ports:
        - "6379:6379"
      volumes:
        - ../data/redis:/data
      restart: always
  • php以及nginx等的配置文件映射為外部文件
    方便修改其配置
  • 項目的日志文件以及nginx和php的日志文件映射為外部目錄
    防止容器重啟后,無日志的情況

啟動與停止

  • 編寫好完畢后,可使用 docker-compose up 啟動
    有錯誤,則根據輸出調試
  • 啟動沒問題后,以后可使用 docker-compose up -d 后台啟動
    docker container ls 查看啟動容器
    docker image ls 查看鏡像列表
  • 停止服務,可使用 docker-compose stop

缺點

  • 鏡像太大
    FROM php:7.2-fpm
    非 alpine的鏡像,默認是以 ubanutu 為基礎的,
    可以使用 apt-get,docker-php-ext-* 等命令
    但生成的鏡像 非常大
    alpine鏡像 只能 使用 apk 的方式安裝軟件包

待做

  • alpine鏡像的制作
  • laradock的使用

參考

參考文章
官方文檔
傳送門


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM