从零开始学习Docker - 搭建 nginx+mysql+php 环境

Docker 是什么?

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

Docker 有什么特点?

来自官方:

  • 敏捷性:加快软件开发和部署和即时响应客户需求。
  • 可移植性:彻底消除“在我的机器上运行”,获得独立在PREM和云环境。
  • 安全性:在整个生命周期内使用内置的安全功能和配置,使应用程序更安全。
  • 节约成本:优化基础设施资源的使用和简化操作,以节省总成本的50%。

来自用户:

  • 轻量:体现在内存占用小,高密度,轻松在单机上运行上百个container
  • 快速:毫秒启动
  • 隔离:沙盒技术,容器本身依托于内核,因此所有的内核漏洞都是Docker的致命伤。

Docker 常用组件及相关概念

  • Docker Client
    客户端,向Docker服务器进程发起请求,如创建、停止、销毁容器等操作
  • Docker Server
    服务器进程,处理所有Docker的请求,管理所有容器
  • Docker Registry
    Docker镜像仓库,镜像存放的中央仓库,类似于代码仓库的概念,里面包含一系列可执行的镜像。
  • Docker Image
    容器镜像是一个轻量级的、独立的、可执行的软件包,它包含运行它所需的所有东西:代码、运行时、系统工具、系统库、设置。
  • Docker File
    构建镜像的基础,使用它来创建一个镜像,并做一些自定义的操作。有了它,Docker的自动化和可移植性才成为可能。
  • Docker Container
    容器将软件与环境隔离开来,例如开发和模拟环境之间的差异,并帮助减少在同一基础设施上运行不同软件的团队之间的冲突。
  • Docker Compose
    定义与运行多个容器之间编排的应用工具。使用YAML文件来配置你的应用程序的服务。然后,只要使用一个命令,就可以从配置中创建并启动所有服务。

Docker安装

这些常用操作系统的安装方式,没有的自己去Docker官网上找吧
Docker for Mac
Docker for Windows
Docker for CentOS Distribution
Docker for Ubuntu

Docker 实战,搭建简单的Nginx+Mysql+Php-fpm环境

1.部署 Nginx

a) 安装 Nginx
首先,从Docker的公共仓库 Docker Hub 下载 Nginx 镜像:

docker pull nginx:alpine

为什么用nginx:alpine?
因为相比nginx:latest,nginx:alpine有几点优势:

  1. 用的是最新版nginx镜像,功能与nginx:latest一模一样;
  2. alpine镜像用的是Alpine Linux内核,比ubuntu内核要小很多;
  3. nginx:alpine默认支持http2。

Alpine的更多信息请看《Alpine Linux,一个只有5M的Docker镜像》

注意:docker pull命令下载的镜像Docker会进行缓存,所以不用每次都下载容器镜像。

b) 配置 Nginx 支持 php-fpm
我们将 Nginx 容器里的配置文件复制到本地服务器目录:

docker cp nginx:/etc/nginx/conf.d/default.conf /wwwroot/conf/default.conf

修改 Nginx 配置文件,为了节约篇幅,仅列出重要配置。

server {
    listen       80;
    server_name  localhost;
    root   /usr/share/nginx/html;
    index  index.php index.html index.htm;

    # pass the PHP scripts to FastCGI server listening on php-fpm:9000
    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass   php-fpm:9000;
        fastcgi_index  index.php;
        # fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

这里,我们主要修改了两处:
1.把fastcgi_pass改成:php-fpm:9000

也就是,PHP-FPM的侦听主机改成:Nginx links PHP-FPM容器的别名,在docker-compose.yml文件里面我们设置为fpm。这样Nginx容器启动的时候,就会自动修改自己的/etc/hosts,让fpm指向php-fpm容器的IP。

2.把fastcgi_param改成下面这样:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

其中,$document_root就是server块下root所指的路径。让php-fpm的文件路径和nginx文件路径一致。

server {
    root /usr/share/nginx/html;
}

c) 映射HTML代码路径

默认情况下,Nginx 的网站根目录在容器的 /usr/share/nginx/html 目录下。在/wwwroot下面添加html目录,并且在启动docker容器的时候加上-v参数,把容器网站根目录映射到本地服务器。

-v /wwwroot/html:/usr/share/nginx/html

2.拉取默认的 mysql 和 php-fpm 镜像

mysqlphp-fpm 这里都是用官方镜像,暂时不去折腾了,都拉取最新的版本。

docker pull mysql:8.0
docker pull php:fpm-alpine

3.使用 docker run 启动镜像

# 启动 nginx 镜像
# 上面已经启动了,往下面看吧...

# 启动 mysql 镜像
docker run --name mysql-v1 -d -p 3306:3306 -v /mysql_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -it mysql:8.0

# 启动 php-fpm 镜像
docker run --name php-fpm-v1 --link mysql-v1:mysql -v /wwwroot/html:/usr/share/nginx/html -p 9000:9000 -d php:fpm-alpine

# 启动 nginx 镜像
docker run --name nginx-v1 --link php-fpm-v1 -p 80:80 -v /wwwroot/conf/default.conf:/etc/nginx/conf.d/default.conf -v /wwwroot/html:/usr/share/nginx/html -d nginx

每个命令运行成功后,终端会返回容器的ID号,上面的命令中,参数如下

  • run:创建一个新的容器
  • --name:指定容器的名称(如果未指定,docker会自动分配一个名称)
  • --link:将两个 docker 容器关联起来。格式:--link <container_name>:<alias_name>。这里将mysql-v1容器关联到nginx容器,并设置别名为mysql。
  • -p:映射容器端口到本地服务器端口,格式:-p <local-port>:<container-port>。这里将容器的80端口映射到本地80端口。
  • -v:映射容器目录到本地服务器目录,格式:-v <local-volumes>:<container-volumes>。这里映射了两个目录,一个是nginx配置文件,一个是html代码文件目录。
  • -d:deamon后台启动。
  • nginx:Docker Hub 上下载Nginx镜像名称(如果本地没有可用的镜像,Docker会自动下载一个)

更多docker run参数如下:

Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  -a, --attach=[]            登录容器(以docker run -d启动的容器)
  -c, --cpu-shares=0         设置容器CPU权重,在CPU共享场景使用
  --cap-add=[]               添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
  --cap-drop=[]              删除权限,权限清单详见:http://linux.die.net/man/7/capabilities
  --cidfile=""               运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法
  --cpuset=""                设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
  -d, --detach=false         指定容器运行于前台还是后台
  --device=[]                添加主机设备给容器,相当于设备直通
  --dns=[]                   指定容器的dns服务器
  --dns-search=[]            指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
  -e, --env=[]               指定环境变量,容器中可以使用该环境变量
  --entrypoint=""            覆盖image的入口点
  --env-file=[]              指定环境变量文件,文件格式为每行一个环境变量
  --expose=[]                指定容器暴露的端口,即修改镜像的暴露端口
  -h, --hostname=""          指定容器的主机名
  -i, --interactive=false    打开STDIN,用于控制台交互
  --link=[]                  指定容器间的关联,使用其他容器的IP、env等信息
  --lxc-conf=[]              指定容器的配置文件,只有在指定--exec-driver=lxc时使用
  -m, --memory=""            指定容器的内存上限
  --name=""                  指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
  --net="bridge"             容器网络设置,待详述
  -P, --publish-all=false    指定容器暴露的端口,待详述
  -p, --publish=[]           指定容器暴露的端口,待详述
  --privileged=false         指定容器是否为特权容器,特权容器拥有所有的capabilities
  --restart=""               指定容器停止后的重启策略,待详述
  --rm=false                 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
  --sig-proxy=true           设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理
  -t, --tty=false            分配tty设备,该可以支持终端登录
  -u, --user=""              指定容器的用户
  -v, --volume=[]            给容器挂载存储卷,挂载到容器的某个目录
  --volumes-from=[]          给容器挂载其他容器上的卷,挂载到容器的某个目录
  -w, --workdir=""           指定容器的工作目录

有时候,我们的PHP代码需要某个目录的写权限,默认的,容器中的/var/share/nginx/html目录属于root,我们需要修改为www-data,PHP才能正常写目录。

先进入到容器中,然后修改目录权限:

docker exec -it php-fpm-v1 sh
chown -R www-data:www-data /var/share/nginx/html

这样PHP就能正常读写目录了。

4.使用 docker-compose 编排镜像

使用docker-compose编排镜像,涉及的更多内容请移步《使用Docker一键部署LNMP环境》

补充:批处理脚本

# 关闭所有正在运行容器
docker ps | awk  '{print $1}' | xargs docker stop

# 删除所有容器应用
docker ps -a | awk  '{print $1}' | xargs docker rm
# 或者
docker rm $(docker ps -a -q)

参考文章
https://www.awaimai.com/728.html
https://www.awaimai.com/2120.html

如需转载,请注明出处: https://www.chadou.me/p/218

最新发布