最近学习了 docker 的一些东西,docker 应该是未来发展的趋势,非常值得研究。

docker是:“一次封装,到处运行”,因为 docker 决绝了应用环境的问题,安装了 docker 的平台就能跑“docker 包”,这样就决绝了“开发环境能跑,一上线就崩”的尴尬。

这里用 docker 搭建 nginx + php + mariadb 的 web 环境。

创建目录,编辑文件

首先创建关于 docker 的目录,方便之后管理,以及 web 网页文件目录。

1
2
$ mkdir -p /home/docker/nginx/conf.d
$ mkdir -p /var/www/testweb

然后编辑本地的 nginx 配置文件。

1
2
3
$ cd /home/docker/nginx/conf.d
$ touch default.conf
$ vim default.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
server {
listen 80;
server_name localhost;

location / {
root /usr/share/nginx/html;
index index.html index.htm index.php;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}

location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;
include fastcgi_params;
}
}
  • php:9000 中 php 是一个标识,当把 php-fpm 与 nginx 的 两个 docker 服务进行连接时,用于指定前者的地址。 9000 是 php-fpm 服务的默认端口。
  • /var/www/html 是 php 容器中网页的存储路径。

然后编辑本地的 web 网页文件。

1
2
3
$ cd /var/www/testweb
$ touch index.php
$ vim index.php
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$servername = "mariadb";
$username = "root";
$password = "root";
// Create the Connetion
$conn = new mysqli($servername, $username, $password);
// Detect the Connetion
if ($conn->connect_error) {
die("Connection Failed." . $conn->connect_error);
}
echo "Connection Success.";
?>
  • servername 设置为 mariadb,原因与上面的 php 同理,是与数据库相连接时的标识。

创建容器

先创建 mariadb 容器:

1
$ docker run --name testmariadb -itd -e MYSQL_ROOT_PASSWORD=root mariadb
  • --name 容器的名字
  • -i 交互模式
  • -t 开启一个伪终端
  • -d 后台运行
  • -e 设置环境变量

再创建 php-fpm 容器:

1
$ docker run --name testphp -itd -v /var/www/testweb:/var/www/html --link testmariadb:mariadb devilbox/php-fpm:5.6-prod
  • -v 指定主机与容器的映射,/var/www/testweb 是本地网页文件目录,/var/www/html 是容器内网页文件目录。
  • --link testmariadb:mariadb,把该容器和 testmariadb 容器链接起来,第二个 mariadb 是该容器在容器间连接时的别名,与之前设置的相对应。

这里没有使用 docker 官方的 php 镜像原因是官方镜像里没有许多扩展模块。devilbox/php-fpm 镜像把一些常用的动态扩展模块如:mysql、redis 都进行了打包。

最后创建 ngnix 容器:

1
docker run --name testnginx -p 8000:80 -itd -v /var/www/testweb:/usr/share/nginx/html -v /root/docker/testweb/conf.d:/etc/nginx/conf.d --link testphp:php nginx
  • -p 8000:80 暴露容器的 80 端口,并映射到主机的 8000 端口。

查看容器是否已正常运行:

1
$ docker ps -a
1
2
3
4
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                  NAMES
7100b7d90c3f nginx "nginx -g 'daemon of…" About an hour ago Up About an hour 0.0.0.0:8000->80/tcp testnginx
6f13e23c30a7 devilbox/php-fpm:5.6-prod "docker-php-entrypoi…" About an hour ago Up About an hour 9000/tcp testphp
5bdc223a7000 mariadb "docker-entrypoint.s…" About an hour ago Up About an hour 3306/tcp testmariadb

此时数据库还无法进行远程连接,因此进入 mariadb 容器内部:

1
$ docker exec -it testmariadb /bin/sh
1
2
3
4
$ mysql -u root -p root
use mysql;
update user set Host = '%' where User = 'root';
FLUSH PRIVILEGES;

开放防火墙后,访问服务器的 8000 端口即可看到测试结果。

到此,docker下搭建 web 服务器的基本配置已经完成。