docker下搭建web服务器

最近学习了 docker 的一些东西,docker 应该是未来发展的趋势,非常值得研究。
docker是:“一次封装,到处运行”,因为 docker 决绝了应用环境的问题,安装了 docker 的平台就能跑“docker 包”,这样就决绝了“开发环境能跑,一上线就崩”的尴尬。

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

创建目录

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

1
2
mkdir -p /root/docker/nginx/conf.d
mkdir -p /var/www/web-1

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

1
2
3
cd /root/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-fpm 服务的端口。
  • /var/www/html 是 php-fpm 服务中网页文件的存储路径。

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

1
2
3
cd /var/www/web-1
touch index.php
vim index.php

1
2
3
<?php
echo "<h1>Hello, world!</h1>";
?>

启动 php-fpm

解释执行 php 需要 php-fpm

1
docker run --name myphp -itd -v /var/www/web-1:/var/www/html php:7.1-fpm

  • --name 容器的名字
  • -i 交互模式
  • -t 开启一个伪终端
  • -d 后台运行
  • -v 指定主机与容器的映射
  • /var/www/web-1 是本地网页文件目录,/var/www/html 是容器内网页文件目录

启动 ngnix

1
docker run --name mynginx -p 8080:80 -itd -v /var/www/web-1:/usr/share/nginx/html -v /root/docker/nginx/conf.d:/etc/nginx/conf.d --link myphp:php nginx
  • -p 8080:80 暴露容器的 80 端口,并映射到主机的 8080 端口
  • --link myphp:php 把该容器和 myphp 容器链接起来,php 是该容器在 link 下的别名
  • /var/www/web-1 是本地网页文件目录,/usr/share/nginx/html 是容器内 nginx 服务的网页文件存储目录
  • /root/docker/nginx/conf.d 是本地 nginx 配置文件的存储目录,/etc/nginx/conf.d 是容器内 nginx 配置文件的存储目录

查看已运行容器

1
docker ps -a
1
2
3
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:8080->80/tcp mynginx
6f13e23c30a7 php:7.1-fpm "docker-php-entrypoi…" About an hour ago Up About an hour 9000/tcp myphp

进入容器内部

1
docker exec -it myphp /bin/sh
  • myphp 是后台容器的 NAMES, 用 CONTAINER ID 也可以
  • /bin/sh 是固定写法,会进入容器的 bash

进入容器内部可以查看容器与主机的文件映射情况。