前言
本文根據參考文章,自己動手試了搭建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的使用