通过docker/docker compose搭建WordPress网站(nginx/wordpress/mariadb)

WordPress网站

wordpress网站需要用到三个容器:WordPress、MariaDB、Nginx,它们都是非常流行的开源项目,在Docker Hub网站上有官方镜像。

docker pull wordpress:5
docker pull mariadb:10
docker pull nginx:alpine

这个系统可以说是比较典型的网站了。

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

通过Docker 搭建WordPress网站

安装MariaDB

我们先来运行MariaDB。根据说明文档,需要配置"MARIADB_DATABASE"等几个环境变量,用 --env 参数来指定启动时的数据库、用户名和密码,这里我指定数据库是"db",用户名是"wp",密码是"123",管理员密码(root password)也是"123"。

下面就是启动MariaDB的 docker run 命令:

ini 复制代码
docker run -d --rm \
 --env MARIADB_DATABASE=db \
 --env MARIADB_USER=wp \
 --env MARIADB_PASSWORD=123 \
 --env MARIADB_ROOT_PASSWORD=123 \
 mariadb:10
  • --env 参数来指定启动时的数据库、用户名和密码,这里我指定数据库是"db",用户名是"wp",密码是"123",管理员密码(root password)也是"123"

启动之后,我们还可以使用 docker exec 命令,执行数据库的客户端工具"mysql",验证数据库是否正常运行:

sql 复制代码
docker exec -it 649e mysql -u wp -p


Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 10.6.5-MariaDB-1:10.6.5+maria~focal mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| db                 |
| information_schema |
+--------------------+
2 rows in set (0.001 sec)

输入刚才设定的用户名"wp"和密码"123"之后,我们就连接上了MariaDB,可以使用 show databases;show tables; 等命令来查看数据库里的内容。

因为Docker的bridge网络模式的默认网段是"172.17.0.0/16",宿主机固定是"172.17.0.1",而且IP地址是顺序分配的,所以如果之前没有其他容器在运行的话,MariaDB容器的IP地址应该就是"172.17.0.2",这可以通过 docker inspect 命令来验证:

bash 复制代码
/learn/k8s/wordpress_docker_compose  docker inspect mariadb | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAddress": "172.17.0.2",

启动WordPress

现在数据库服务已经正常,该运行应用服务器WordPress了,它也要用 --env 参数来指定一些环境变量才能连接到MariaDB,注意"WORDPRESS_DB_HOST"必须是MariaDB的IP地址,否则会无法连接数据库:

ini 复制代码
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

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

javascript 复制代码
~/learn/k8s/wordpress_docker_compose  docker inspect wordpress | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.3",
                    "IPAddress": "172.17.0.3",

启动Nginx

配置Nginx反向代理必须要知道WordPress的IP地址,同样可以用 docker inspect 命令查看,如果没有什么意外的话它应该是"172.17.0.3",所以我们就能够写出如下的配置文件:

bash 复制代码
touch wp.conf
vim wp.conf
ini 复制代码
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应用:

bash 复制代码
docker run -d --rm \
-p 80:80 \
-v `pwd`/wp.conf:/etc/nginx/conf.d/default.conf \
nginx:alpine

验证

三个容器都启动之后,我们再用 docker ps 来看看它们的状态:

bash 复制代码
docker ps

CONTAINER ID   IMAGE                       COMMAND                   CREATED          STATUS          PORTS                NAMES
f2ec197db7ff   nginx:alpine                "/docker-entrypoint...."   21 minutes ago   Up 21 minutes   0.0.0.0:80->80/tcp   determined_lederberg
b65fbee8f474   wordpress:5                 "docker-entrypoint.s..."   30 minutes ago   Up 30 minutes   80/tcp               strange_babbage
649e34c722b1   mariadb:10                  "docker-entrypoint.s..."   32 minutes ago   Up 32 minutes   3306/tcp             nervous_snyder

可以看到,WordPress和MariaDB虽然使用了80和3306端口,但被容器隔离,外界不可见,只有Nginx有端口映射,能够从外界的80端口收发数据,网络状态和我们的架构图是一致的。

现在整个系统就已经在容器环境里运行好了,我们来打开浏览器,输入本机的"127.0.0.1",就可以看到WordPress的界面:

在创建基本的用户、初始化网站之后,我们可以再登录MariaDB,看看是否已经有了一些数据:

sql 复制代码
 ✘ xuyatao@evan171206  ~/docker/label/compose_label/flask-redis  docker exec -it 649e34c722b1 /bin/bash
root@649e34c722b1:/# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 15
Server version: 10.6.5-MariaDB-1:10.6.5+maria~focal mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| db                 |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.001 sec)

MariaDB [(none)]> use db;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [db]> show tables;
+-----------------------+
| Tables_in_db          |
+-----------------------+
| wp_commentmeta        |
| wp_comments           |
| wp_links              |
| wp_options            |
| wp_postmeta           |
| wp_posts              |
| wp_term_relationships |
| wp_term_taxonomy      |
| wp_termmeta           |
| wp_terms              |
| wp_usermeta           |
| wp_users              |
+-----------------------+
12 rows in set (0.001 sec)

可以看到,WordPress已经在数据库里新建了很多的表,这就证明我们的容器化的WordPress网站搭建成功。

通过Docker-compose搭建WordPress 网址

Kubernetes的确是非常强大的容器编排平台,但强大的功能也伴随着复杂度和成本的提升,不说那几十个用途各异的API对象,单单说把Kubernetes运行起来搭建一个小型的集群,就需要耗费不少精力。但是,有的时候,我们只是想快速启动一组容器来执行简单的开发、测试工作,并不想承担Kubernetes里apiserver、scheduler、etcd这些组件的运行成本。

显然,在这种简易任务的应用场景里,Kubernetes就显得有些"笨重"了。即使是"玩具"性质的minikube、kind,对电脑也有比较高的要求,会"吃"掉不少的计算资源,属于"大材小用"。

那到底有没有这样的工具,既像Docker一样轻巧易用,又像Kubernetes一样具备容器编排能力呢?

  1. docker-compose,它恰好满足了刚才的需求,是一个在单机环境里轻量级的容器编排工具,填补了Docker和Kubernetes之间的空白位置。
  2. docker-compose为Docker引入了"容器编排"的概念,使用YAML来定义容器的启动参数、先后顺序和依赖关系,让用户不再有Docker冗长命令行的烦恼。
  3. docker-compose自身的定位是管理和运行多个Docker容器的工具,很显然,它没有Kubernetes那么"宏伟"的目标,只是用来方便用户使用Docker而已,所以学习难度比较低,上手容易,很多概念都是与Docker命令一一对应的。

修改nginx配置文件

wp_compose.conf

ini 复制代码
server {
   listen 80;
   default_type text/html;

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

其中 proxy_pass http://wordpress 表示下面 docker-composewordpress 服务。

docker compose 文件

wp_compose.yml

yaml 复制代码
services:
  nginx:
    image: nginx:alpine
    container_name: nginx

    environment:
      TZ: Asia/Shanghai
    restart: always

    ports:
      - "80:80"
    depends_on:
      - wordpress
    volumes:
      - ${PWD}/wp_compose.conf:/etc/nginx/conf.d/default.conf

  wordpress:
    image: wordpress:5
    container_name: wordpress

    environment:
      WORDPRESS_DB_HOST: mariadb
      WORDPRESS_DB_USER: wp
      WORDPRESS_DB_PASSWORD: "123"
      WORDPRESS_DB_NAME: db

      TZ: Asia/Shanghai
    restart: always
    depends_on:
      - mariadb

  mariadb:
    image: mariadb:10
    container_name: mariadb

    environment:
      MARIADB_DATABASE: db
      MARIADB_USER: wp
      MARIADB_PASSWORD: "123"
      MARIADB_ROOT_PASSWORD: "123"

      TZ: Asia/Shanghai
    restart: always

启动应用

typescript 复制代码
 ✘ xuyatao@evan171206  ~/learn/k8s/wordpress_docker_compose  docker-compose  -f wp_compose.yml -p service_app up -d

[+] Building 0.0s (0/0)                                                                                                                                 docker:desktop-linux
[+] Running 4/4
 ✔ Network service_app_default  Created                                                                                                                                 0.0s
 ✔ Container mariadb            Started                                                                                                                                 0.0s
 ✔ Container wordpress          Started                                                                                                                                 0.0s
 ✔ Container nginx              Started                                                                                                                                 0.0s

因为docker-compose在底层还是调用的Docker,所以它启动的容器用 docker ps 也能够看到:

bash 复制代码
 xuyatao@evan171206  ~/learn/k8s/wordpress_docker_compose  docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS          PORTS                NAMES
a448df141393   nginx:alpine   "/docker-entrypoint...."   40 minutes ago   Up 40 minutes   0.0.0.0:80->80/tcp   nginx
3da37512463a   wordpress:5    "docker-entrypoint.s..."   40 minutes ago   Up 40 minutes   80/tcp               wordpress
40d2538b80ed   mariadb:10     "docker-entrypoint.s..."   40 minutes ago   Up 40 minutes   3306/tcp             mariadb

不过,我们用 docker-compose ps 能够看到更多的信息:

bash 复制代码
 xuyatao@evan171206  ~/learn/k8s/wordpress_docker_compose  docker-compose -p service_app ps

NAME        IMAGE          COMMAND                   SERVICE     CREATED          STATUS          PORTS
mariadb     mariadb:10     "docker-entrypoint.s..."   mariadb     32 seconds ago   Up 31 seconds   3306/tcp
nginx       nginx:alpine   "/docker-entrypoint...."   nginx       32 seconds ago   Up 31 seconds   0.0.0.0:80->80/tcp
wordpress   wordpress:5    "docker-entrypoint.s..."   wordpress   32 seconds ago   Up 31 seconds   80/tcp

通过127.0.0.1 访问wordpress服务

关闭服务

typescript 复制代码
 xuyatao@evan171206  ~/learn/k8s/wordpress_docker_compose  docker-compose -p service_app down

[+] Running 4/4
 ✔ Container nginx              Removed                                                                                                                                 0.2s
 ✔ Container wordpress          Removed                                                                                                                                 1.1s
 ✔ Container mariadb            Removed                                                                                                                                 0.4s
 ✔ Network service_app_default  Removed
相关推荐
无名指的等待71240 分钟前
SpringBoot中使用ElasticSearch
java·spring boot·后端
.生产的驴1 小时前
SpringBoot 消息队列RabbitMQ 消费者确认机制 失败重试机制
java·spring boot·分布式·后端·rabbitmq·java-rabbitmq
AskHarries2 小时前
Spring Boot利用dag加速Spring beans初始化
java·spring boot·后端
苹果酱05672 小时前
一文读懂SpringCLoud
java·开发语言·spring boot·后端·中间件
掐指一算乀缺钱3 小时前
SpringBoot 数据库表结构文档生成
java·数据库·spring boot·后端·spring
计算机学姐5 小时前
基于python+django+vue的影视推荐系统
开发语言·vue.js·后端·python·mysql·django·intellij-idea
JustinNeil5 小时前
简化Java对象转换:高效实现大对象的Entity、VO、DTO互转与代码优化
后端
青灯文案15 小时前
SpringBoot 项目统一 API 响应结果封装示例
java·spring boot·后端
微尘86 小时前
C语言存储类型 auto,register,static,extern
服务器·c语言·开发语言·c++·后端
计算机学姐6 小时前
基于PHP的电脑线上销售系统
开发语言·vscode·后端·mysql·编辑器·php·phpstorm