不会飞的章鱼

熟能生巧,勤能补拙;念念不忘,必有回响。

Docker 搭建 WordPress 网站

架构图


MariaDB 作为后面的关系型数据库,端口号是 3306;WordPress 是中间的应用服务器,使用 MariaDB 来存储数据,它的端口是 80;Nginx 是前面的反向代理,它对外暴露 80 端口,然后把请求转发给 WordPress。

使用 docker pull 拉取镜像

1
2
3
docker pull wordpress:5
docker pull mariadb:10
docker pull nginx:alpine

启动 MariaDB

1
2
3
4
5
6
7
docker run -d --rm \
--env MARIADB_DATABASE=db \
--env MARIADB_USER=wp \
--env MARIADB_PASSWORD=123 \
--env MARIADB_ROOT_PASSWORD=123 \
mariadb:10
44a276483f97035da17cf0d00bd0ff69d5f2f7f2a1f077e23be62dff8dfb008e

因为 Docker 的 bridge 网络模式的默认网段是“172.17.0.0/16”,宿主机固定是“172.17.0.1”,而且 IP 地址是顺序分配的,可以通过 docker inspect 命令来查看IP地址:

1
2
3
4
$ docker inspect 44a |grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",

启动 WordPress

1
2
3
4
5
6
7
docker run -d --rm \
--env WORDPRESS_DB_HOST=172.17.0.2 \
--env WORDPRESS_DB_USER=wp \
--env WORDPRESS_DB_PASSWORD=123 \
--env WORDPRESS_DB_NAME=db \
wordpress:5
03b25fef47dc1032b31994a018a2eda16f080abc4bca8e34e5d3c281673bc93d

WordPress 容器在启动的时候并没有使用 -p 参数映射端口号,所以外界是不能直接访问的,我们需要在前面配一个 Nginx 反向代理,把请求转发给 WordPress 的 80 端口。

配置 Nginx 反向代理必须要知道 WordPress 的 IP 地址,同样可以用 docker inspect 命令查看:

1
2
3
4
$ docker inspect 03b |grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.3",
"IPAddress": "172.17.0.3",

启动Nginx反向代理

新建一个配置文件:

1
2
3
4
5
6
7
8
9
10
server {
listen 80;
default_type text/html;

location / {
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_pass http://172.17.0.3;
}
}

有了这个配置文件,最关键的一步就来了,我们需要用 -p 参数把本机的端口映射到 Nginx 容器内部的 80 端口,再用 -v 参数把配置文件挂载到 Nginx 的“conf.d”目录下。这样,Nginx 就会使用刚才编写好的配置文件,在 80 端口上监听 HTTP 请求,再转发到 WordPress 应用:

1
2
$ docker run -d --rm -p 80:80 -v `pwd`/wp.conf:/etc/nginx/conf.d/default.conf nginx:alpine
3dcbe51c07db920e6cd90be901f54c1402ec3cd1f73981ce77dd45c11736e1dc

验证

检查三个容器的运行情况:

1
2
3
4
5
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fbbfccd67370 nginx:alpine "/docker-entrypoint.…" 3 seconds ago Up 1 second 0.0.0.0:81->80/tcp, :::81->80/tcp compassionate_herschel
e78d0bafc7d8 wordpress:5 "docker-entrypoint.s…" About a minute ago Up About a minute 80/tcp nervous_neumann
844a80ff2f90 mariadb:10 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 3306/tcp optimistic_elbakyan

本地访问http://127.0.0.1

总结

容器技术是后端应用领域的一项重大创新,它彻底变革了应用的开发、交付与部署方式,是“云原生”的根本。

容器基于 Linux 底层的 namespace、cgroup、chroot 等功能,虽然它们很早就出现了,但直到 Docker“横空出世”,把它们整合在一起,容器才真正走近了大众的视野,逐渐为广大开发者所熟知。

容器技术中有三个核心概念:容器(Container)、镜像(Image),以及镜像仓库(Registry):

从本质上来说,容器属于虚拟化技术的一种,和虚拟机(Virtual Machine)很类似,都能够分拆系统资源,隔离应用进程,但容器更加轻量级,运行效率更高,比虚拟机更适合云计算的需求。

镜像是容器的静态形式,它把应用程序连同依赖的操作系统、配置文件、环境变量等等都打包到了一起,因而能够在任何系统上运行,免除了很多部署运维和平台迁移的麻烦。

镜像内部由多个层(Layer)组成,每一层都是一组文件,多个层会使用Union FS技术合并成一个文件系统供容器使用。这种细粒度结构的好处是相同的层可以共享、复用,节约磁盘存储和网络传输的成本,也让构建镜像的工作变得更加容易。

为了方便管理镜像,就出现了镜像仓库,它集中存放各种容器化的应用,用户可以任意上传下载,是分发镜像的最佳方式。

容器技术有很多具体的实现,Docker 是最初也是最流行的容器技术,它的主要形态是运行在 Linux 上的“Docker Engine”。我们日常使用的 docker 命令其实只是一个前端工具,它必须与后台服务“Docker daemon”通信才能实现各种功能。

操作容器的常用命令有 docker ps、docker run、docker exec、docker stop 等;操作镜像的常用命令有 docker images、docker rmi、docker build、docker tag 等;操作镜像仓库的常用命令有 docker pull、docker push 等。

容器技术思维导图:

------ 本文结束------
如果本篇文章对你有帮助,可以给作者加个鸡腿~(*^__^*),感谢鼓励与支持!