Docker 笔记之搭建 WordPress
最近 Docker 好火呀,确实是个好东西。对于之前习惯于使用 VM 之类的虚拟化的,这种轻量级的虚拟化技术,让人耳目一新。以下引自百度百科:
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
下面我们来试着在 Docker 下面弄个 WordPress 出来。
先装一个 MySQL 数据库容器,命令如下:
docker run --name db -d mysql:5.7
在这里,–name 指定容器运行时的名字,使用 -d 参数指定容器在后台运行, mysql:5.7 是指定数据库名称及其相应的版本号。如果本机没有 mysql 的镜像,那么 Docker 会从 Docker Pull 下载。
然后使用
docker ps
命令查看运行结果,没有发现有 db 的容器在后台运行,使用
docker logs db
来查看镜像日志,可以看到一堆日志。一般来说,我们需要为此运行的容器指定相应的环境变量,在这儿由于我们没有指定数据库的 root 密码,所以容器不能正常运行。
我们先删除这个容器,然后再重新生成它:
docker rm db docker run --name db -e MYSQL_ROOT_PASSWORD=rootpassword -d mysql:5.7
再次运行
docker logs db
查看日志记录,可以看到正常的运行记录。
当然,也可以使用 MYSQL_DATABASE 参数来指定预告创建好的数据库:
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 会随着启动而变化,我们可以使用:
docker inspect --format='{{.NetworkSettings.IPAddress}}' db
来获取容器 db 的 IP 。
再建立一个运行 PHP 的容器:
docker run --name blog php:5.6-apache
如果想让容器中可以访问宿主机中的 PHP 程序文件,可以先进入宿主机中的程序目录,然后再使用如下命令:
docker run --name blog -v "$PWD/":/var/www/html -p:80:80 php:5.6-apache
或,直接引用绝对路径:
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 这个目录下面放置一个内容为:
<?php phpinfo(); ?>
的 index.php 文件,
现在访问宿主机的 http://ip 就可以看到 phpinfo 的页面了。
官方的 php 镜像没有提供 mysql 扩展,所以需要自己手动写 Dockerfile 来安装扩展:
more /opt/php-mysql/Dockerfile FROM php:5.6-apache RUN docker-php-ext-install mysqli CMD ["apache2-foreground"]
然后建立这个镜像,名称为 php-mysql:
docker build -t php-mysql php-mysql/.
然后再次启动 WordPress:
docker run --name blog -v "$PWD/":/var/www/html -p 80:80 php-mysql
有个问题,如果重启了 db 容器怎么办? IP 会变的,从而可能导致 blog 容器无法连接到 db 容器中的 mysql 数据库。
在这儿 docker 提供了一个参数,让我们可以把一个容器连接到另一个容器。
docker run --name blog --link db:mysql -v "$PWD/":/var/www/html -p 80:80 php-mysql
在这里,–link 参数的作用是将 db 连接到 blog 容器内。这样在 blog 容器中直接使用 mysql 名称就可以引用 db 了。
可以测试一下:
docker exec -it blog ping -c 3 mysql
可以得到 172 网段的 IP ,而且还有返回结果,就是没问题了。
然后下载好 wordpress ,将其放到宿主机的 /opt/www/ 目录下面,然后打开 http://宿主机ip/ 就可以看到 wordpress 的安装页面了。
但在这里还有一个问题,安装好的 wordpress 不能上传文件、安装插件和主题,是因为 blog 容器内的 apache 对文件系统没有写权限,所以需要对 php-mysql 镜像的 Dockerfile 进行调整:
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 文件:
#!/bin/bash chown -R www-data:www-data . exec "$@"
现在做一个新的镜像:
docker build -t php-mysql:v2 .
然后停止运行旧的容器,然后再删除,然后重新生成:
# 先停止运行,再删除 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,这样就算是基本完成了。
这份笔记是之前在网上查资料的时候边测试边记下来的,其中部分资料的引用源头已不可考了,如有版权问题,请联系。