AppServer/

Docker 笔记之搭建 WordPress

发布
更新
字数
1360
阅读
3 分钟

最近 Docker 好火呀,确实是个好东西。对于之前习惯于使用 VM 之类的虚拟化的,这种轻量级的虚拟化技术,让人耳目一新。以下引自百度百科:

text
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

下面我们来试着在 Docker 下面弄个 WordPress 出来。

先装一个 MySQL 数据库容器,命令如下:

bash
docker run --name db -d mysql:5.7

在这里,–name 指定容器运行时的名字,使用 -d 参数指定容器在后台运行, mysql:5.7 是指定数据库名称及其相应的版本号。如果本机没有 mysql 的镜像,那么 Docker 会从 Docker Pull 下载。
然后使用

bash
docker ps

命令查看运行结果,没有发现有 db 的容器在后台运行,使用

bash
docker logs db

来查看镜像日志,可以看到一堆日志。一般来说,我们需要为此运行的容器指定相应的环境变量,在这儿由于我们没有指定数据库的 root 密码,所以容器不能正常运行。
我们先删除这个容器,然后再重新生成它:

bash
docker rm db
docker run --name db -e MYSQL_ROOT_PASSWORD=rootpassword -d mysql:5.7

再次运行

bash
docker logs db

查看日志记录,可以看到正常的运行记录。
当然,也可以使用 MYSQL_DATABASE 参数来指定预告创建好的数据库:

bash
docker run --name db -e MYSQL_ROOT_PASSWORD=rootpassword -e MYSQL_DATABASE=blog-db -d mysql:5.7

其它更多的相关参数,可以查看官方文档: https://registry.hub.docker.com/_/mysql/

需要注意的是,容器的 IP 会随着启动而变化,我们可以使用:

bash
docker inspect --format='{{.NetworkSettings.IPAddress}}' db

来获取容器 db 的 IP 。

再建立一个运行 PHP 的容器:

bash
docker run --name blog php:5.6-apache

如果想让容器中可以访问宿主机中的 PHP 程序文件,可以先进入宿主机中的程序目录,然后再使用如下命令:

bash
docker run --name blog -v "$PWD/":/var/www/html -p:80:80 php:5.6-apache

或,直接引用绝对路径:

bash
docker run --name blog -v "/opt/www/":/var/www/html -p:80:80 php:5.6-apache

这个命令的作用就是将宿主机上指定目录映射到 blog 容器的 /var/www/html 这个目录中,并将 blog 容器的 80 端口映射到宿主机的 80 端口上。
然后再在 /opt/www 这个目录下面放置一个内容为:

bash
<?php phpinfo(); ?>

的 index.php 文件,
现在访问宿主机的 http://ip 就可以看到 phpinfo 的页面了。

官方的 php 镜像没有提供 mysql 扩展,所以需要自己手动写 Dockerfile 来安装扩展:

bash
more /opt/php-mysql/Dockerfile
FROM php:5.6-apache
RUN docker-php-ext-install mysqli
CMD ["apache2-foreground"]

然后建立这个镜像,名称为 php-mysql:

bash
docker build -t php-mysql php-mysql/.

然后再次启动 WordPress:

bash
docker run --name blog -v "$PWD/":/var/www/html -p 80:80 php-mysql

有个问题,如果重启了 db 容器怎么办? IP 会变的,从而可能导致 blog 容器无法连接到 db 容器中的 mysql 数据库。
在这儿 docker 提供了一个参数,让我们可以把一个容器连接到另一个容器。

bash
docker run --name blog --link db:mysql -v "$PWD/":/var/www/html -p 80:80 php-mysql

在这里,–link 参数的作用是将 db 连接到 blog 容器内。这样在 blog 容器中直接使用 mysql 名称就可以引用 db 了。
可以测试一下:

bash
docker exec -it blog ping -c 3 mysql

可以得到 172 网段的 IP ,而且还有返回结果,就是没问题了。

然后下载好 wordpress ,将其放到宿主机的 /opt/www/ 目录下面,然后打开 http://宿主机ip/ 就可以看到 wordpress 的安装页面了。

但在这里还有一个问题,安装好的 wordpress 不能上传文件、安装插件和主题,是因为 blog 容器内的 apache 对文件系统没有写权限,所以需要对 php-mysql 镜像的 Dockerfile 进行调整:

bash
FROM php:5.6-apache
RUN docker-php-ext-install mysqli
COPY entrypoint.sh /entrypoint.sh
RUN chmod 777 /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
CMD ["apache2-foreground"]

然后再创建一个 entrypoint.sh 文件:

bash
#!/bin/bash
chown -R www-data:www-data .
exec "$@"

现在做一个新的镜像:

bash
docker build -t php-mysql:v2 .

然后停止运行旧的容器,然后再删除,然后重新生成:

bash
# 先停止运行,再删除
docker stop blog
docker stop db
docker rm blog
docker rm db

# 当然也可以强制删除容器
docker rm -f blog
docker rm -f db

# 重新生成容器
docker run --name db -e MYSQL_ROOT_PASSWORD=rootpassword -e MYSQL_DATABASE=blog-db -d mysql:5.7
docker run --name blog --link db:mysql -v "$PWD/":/var/www/html php-mysql:v2

OK,这样就算是基本完成了。

这份笔记是之前在网上查资料的时候边测试边记下来的,其中部分资料的引用源头已不可考了,如有版权问题,请联系。

评论

正在载入评论…

留下评论

人机验证
四位数字,看不清可点击图片刷新

评论经审核后显示。

回到顶部 ↑