最近强行弄了一份工作,为一个基于ThinkPHP框架的网站添加一点需求功能。于是想着用Docker弄一个开发测试的环境。在配置过程中,遇到了很多的问题,靠着搜索才一步一步的解决了。

基础镜像的选用

Docker中大多数镜像都是基于Ubuntu基础镜像进行了修改构建,但是如果我们也从Ubuntu开始构建,那么工作量可想而知。因此选取一个合适的基础镜像可以加快配置速度,也能减少我们配置的工作量。

根据需要,选取了PHP和MySQL两个镜像作为本次开发环境配置的基础镜像。

1
2
docker pull mysql
docker pull php:7.0-apache

另外说明一下,php的镜像有好多版本,具体版本可以参考DockerHub上面的说明。这里选用的版本是PHP7.0运行在apache上的版本。

启动一个MySQL容器

MySQL作为公共的基础服务,这里配置的MySQL不仅可以供PHP内部使用,也可以在外部连接查询里面的数据。

1
docker run --name mysql -v d:/DockerData/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql

以守护进程-d的模式启动一个名为--name mysql的容器,将d:/DockerData/mysql映射到/var/lib/mysql目录上提供数据存储,配置环境变量MYSQL_ROOT_PASSWORD=123456设置root密码为123456,映射端口3306。可以根据实际需要修改命令行的一些参数。

启动一个PHP容器

PHP容器需要指定/var/www/html目录的位置,为了能使用数据库,还需要链接当上面的MySQL容器。

1
docker run -d --name php-project --link mysql:db -p 81:80 -v h:/Project:/var/www -v h:/Project/public:/var/www/html php:7.0-apache

--link将上面的mysql容器作为db组件链接到该容器中,由于ThinkPHP的特性,这里在/var/www/var/www/html分别挂载了目录。这里在外部使用81端口。

配置PHP容器组件

默认的PHP容器里还缺少一些PHP插件,需要手动进行安装。

进入PHP容器

在PHP容器中执行bash命令,就可以在里面输入命令行了。由于PHP容器的主进程是Apache,所以不能通过docker attach的方式附加到容器上。

1
docker exec -it php-project bash

以下命令都要在容器的bash里执行。

编辑文件的时候发现没有vim,只好安装一个

1
2
apt update
apt install vim

配置ThinkPHP的URL重写

配置ThinkPHP的URL重写分两步,开启重写扩展,修改配置文件。

1
2
a2enmod rewrite //开启扩展
修改配置 /etc/apache2/apache2.conf 中所有的AllowOverride None改为All

安装PHP的PDO、GD等组件

普通情况下,可以通过apt安装PHP的PDO插件,但是由于PHP镜像中没有make和gcc等编译器。其实,官方在容器的 \usr\local\bin 目录下提供了一些命令,用来编译启用PHP的组件。

1
2
3
4
5
root@bb80ba155185:/var/www/html# cd /usr/local/bin
root@bb80ba155185:/usr/local/bin# ls
apache2-foreground docker-php-ext-configure docker-php-ext-install pear pecl phar.phar php-config phpize
docker-php-entrypoint docker-php-ext-enable docker-php-source peardev phar php phpdbg
root@bb80ba155185:/usr/local/bin#

直接运行./docker-php-ext-install可以看到命令能安装的组件。

安装pdo_mysql组件

1
./docker-php-ext-install pdo_mysql

安装gd图形库组件,gd图像库依赖比较多的内容,其实也就是执行的命令稍微麻烦些。先要安装一些依赖库,然后编译安装gd组件。

1
2
3
4
5
6
7
8
9
10
11
12
apt-get install -y \
libfreetype6-dev \
libmcrypt-dev \
libpng12-dev \
libjpeg-dev \
libpng-dev
docker-php-ext-configure gd \
--enable-gd-native-ttf \
--with-freetype-dir=/usr/include/freetype2 \
--with-png-dir=/usr/include \
--with-jpeg-dir=/usr/include \
&& docker-php-ext-install gd

查看MySQL数据库地址

在容器中访问127.0.0.1:3306发现找不到MySQL数据库,数据库的地址发生了改变。可以通过环境变量查看MySQL的地址。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
root@bb80ba155185:/usr/local/bin# env
HOSTNAME=bb80ba155185
DB_NAME=/php-project/db
TERM=xterm
PHP_INI_DIR=/usr/local/etc/php
PHP_ASC_URL=https://secure.php.net/get/php-7.0.16.tar.xz.asc/from/this/mirror
DB_PORT=tcp://172.17.0.2:3306
DB_PORT_3306_TCP_PORT=3306
DB_ENV_GOSU_VERSION=1.7
PHP_CFLAGS=-fstack-protector-strong -fpic -fpie -O2
PHP_MD5=6161aba9d24322d889da5d2ff944bddf
DB_PORT_3306_TCP_PROTO=tcp
PHPIZE_DEPS=autoconf file g++ gcc libc-dev make pkg-config re2c
DB_ENV_MYSQL_ROOT_PASSWORD=123456
PHP_URL=https://secure.php.net/get/php-7.0.16.tar.xz/from/this/mirror
PHP_LDFLAGS=-Wl,-O1 -Wl,--hash-style=both -pie
APACHE_ENVVARS=/etc/apache2/envvars
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
GPG_KEYS=1A4E8B7277C42E53DBA9C7B9BCAA30EA9C0D5763 6E4F6AB321FDC07F2C332E3AC2BF0BC433CFC8B3
PHP_CPPFLAGS=-fstack-protector-strong -fpic -fpie -O2
PWD=/usr/local/bin
DB_PORT_3306_TCP_ADDR=172.17.0.2
SHLVL=1
HOME=/root
PHP_SHA256=244ac39bc657448962860aa7a590e4417f68513ad5e86ee2727b1328b0537309
DB_PORT_3306_TCP=tcp://172.17.0.2:3306
APACHE_CONFDIR=/etc/apache2
DB_ENV_MYSQL_VERSION=5.7.17-1debian8
PHP_EXTRA_BUILD_DEPS=apache2-dev
DB_ENV_MYSQL_MAJOR=5.7
PHP_VERSION=7.0.16
PHP_EXTRA_CONFIGURE_ARGS=--with-apxs2
OLDPWD=/var/www/html
_=/usr/bin/env

在容器中执行env命令,发现数据库在172.17.0.2:3306,成功访问到数据库。

因为之前已经把数据库的端口映射到宿主机的3306端口上,所以在宿主机连接数据库的时候,可以使用127.0.0.1:3306地址。

重启容器

配置完成后记得重启容器。在宿主机执行命令:

1
docker restart php-project

其它

第一次,也算在容器内部手动配置了一下容器。以后有机会,可以尝试使用Dockerfile构建需要的镜像了。

参考文献