本文链接:用Docker部署PHP+MySQL服务器
迁移服务器的过程比我想象中的快很多,大概花了3个白天的时间就完成了。同时我也学习到了Docker的一些基本操作。下面就来讲一下各个模块是怎样迁移到Docker上来的。
安装Docker
因为我使用的是ubuntu,所以参考Docker的文档就可以安装上Docker了:https://docs.docker.com/install/linux/docker-ce/ubuntu/。主要有以下语句:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
sudo apt-get update sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable" sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io |
如果安装成功,就可以用以下命令看到Docker的状态了:
1 |
sudo docker verison |
默认情况下,Docker必须要使用sudo来运行,但可以将当前用户加入Docker组,就不需要使用sudo了。
1 |
sudo usermod -aG docker $USER |
安装MySQL
只要一句话就可以启动MySQL的容器:
1 2 3 4 5 |
docker container run \ --detach \ --restart unless-stopped \ --name mysql \ mysql |
–detach | 使容器在后台运行 |
–restart unless-stopped | 使容器总能自动重启,除非用stop命令停止 |
–name mysql | 容器的名字 |
mysql | 容器镜像的名字,可以加: 后跟版本 |
这样启动起来的容器,数据和配置都在容器内部,不方便更新,而且如果删了容器数据就没了,所以要将数据的目录映射到宿主机上。因为我是迁移,所以本来我就有配置和数据在宿主机上,如果没有的话,可以用docker cp命令来将内容复制出来:
1 2 |
docker cp mysql:/var/lib/mysql /home/$USER/data/mysql docker cp mysql:/etc/mysql /home/$USER/config/mysql |
然后将启动容器的命令改为:
1 2 3 4 5 6 7 |
docker container run \ --detach \ --restart unless-stopped \ --volume /home/$USER/data/mysql:/var/lib/mysql \ --volume /home/$USER/config/mysql:/etc/mysql \ --name mysql \ mysql |
–volume | 将宿主机上的目录或文件映射到容器内 |
安装PHP
我使用了php-fpm来作为服务器,因为有一些网站需要PHP扩展才能使用,这里就不能直接用现有的Docker镜像,而是要自己做镜像。以下命令为Dockerfile建了目录并打开它以编辑。
1 2 3 |
mkdir -p /home/$USER/docker/my-php-fpm cd /home/$USER/docker/my-php-fpm vi Dockerfile |
在Dockerfile中输入以下内容:
1 2 3 4 5 6 7 8 9 |
FROM php:7.2-fpm RUN docker-php-ext-install mysqli RUN docker-php-ext-install pdo_mysql RUN apt-get -y update RUN apt-get install -y zlib1g-dev && docker-php-ext-install zip RUN apt-get install -y libpng-dev && docker-php-ext-install gd RUN apt-get install -y libicu-dev g++ && docker-php-ext-install intl RUN pecl install apcu |
FROM下面的语句都是用来安装PHP扩展的,可以按需要增加或者减少。同样可以像MySQL类似将配置和数据拿出到宿主机里,之后就可以编译镜像和启动容器了:
1 2 3 4 5 6 7 8 9 10 |
docker build --tag=my-php-fpm:7.2 . docker container run \ --detach \ --link mysql:mysql \ --restart unless-stopped \ --volume /home/$USER/www:/home/$USER/www \ --volume /home/$USER/config/php:/usr/local/etc/php \ --name php-fpm \ my-php-fpm:7.2 |
–tag | 编译生成的镜像文件名和版本 |
–link | 将其他容器用网络映射到此容器内 |
PHP有访问MySQL数据库的需求,比如mysqli_connect
的第一个参数为数据库主机,因为已经用–link参数指定mysql容器的主机名为mysql
,所以这里的第一个参数写"mysql"
就可以了。
安装Nginx
同样把配置文件取出来,然后一句话就可以了:
1 2 3 4 5 6 7 8 9 10 |
docker container run \ --detach \ --publish 80:80 \ --publish 443:443 \ --link php-fpm:php-fpm \ --restart unless-stopped \ --volume /home/$USER/www:/home/$USER/www \ --volume /home/$USER/config/nginx:/etc/nginx \ --name nginx \ nginx |
–publish | 将容器暴露出来的端口映射到宿主机 |
为了方便,我将Nginx的数据目录和PHP的数据目录映射到了相同的目录下。这样当Nginx找到需要PHP处理的文件时,就不需要转换目录了,因为它们是相同目录。这里,需要修改Nginx配置下的php.conf:
1 2 3 4 5 6 |
location ~ .*\.php$ { fastcgi_pass php-fpm:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } |
不同版本下的php.conf可能有所不同,重要的是fastcgi_pass
这一句。在启动Docker的时候已经将php-fpm关联到php-fpm这个主机上,php-fpm的默认端口是9000,所以这里写php-fpm:9000
就可以了。
其他部分就和普通的Nginx配置相同了,这里就不再赘述。
总结
将网站服务器迁移到Docker上是个比较容易的事情,比我想像中要少花了时间,虽然这个过程中Docker还挂了一次,导致我重新开虚拟机,重新做了一些事情,这个过程也很快,不到一小时就恢复了。这篇文章中只讲了大概的做法,有一些细节和更复杂的事情,我会再写下一篇文章的。