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一样具备容器编排能力呢?
- docker-compose,它恰好满足了刚才的需求,是一个在单机环境里轻量级的容器编排工具,填补了Docker和Kubernetes之间的空白位置。
- docker-compose为Docker引入了"容器编排"的概念,使用YAML来定义容器的启动参数、先后顺序和依赖关系,让用户不再有Docker冗长命令行的烦恼。
- 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-compose
中 wordpress
服务。
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