小 忆 博 客
有梦想,有精彩

Docker学习笔记:搭建NMP环境

目录

  1. 什么是Docker?
  2. 下载并安装Docker
  3. 更换Docker镜像库
    1. 为什么要更换Docker镜像库?
    2. 更换Docker镜像库
  4. 部署NMP环境
    1. 创建资源文件夹
    2. 部署MySQL
      1. 拉取镜像
      2. 运行容器
      3. 进入容器测试
      4. 进入MySQL
    3. 部署PHP
      1. 拉取镜像
      2. 运行容器
    4. 部署Nginx
      1. 拉取镜像
      2. 运行容器
      3. 编辑配置文件
    5. 填坑

什么是Docker?

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

上面一段文字是百度百科对Docker的解释,其实Docker就是把开发环境或者生产环境打包,然后可以放到任何Linux或macOS、windows机器上运行,不过听说Docker对windows兼容不是很好(已经很久不用windows了)。

下载并安装Docker

首先去Docker官网

在macOS环境下安装和安装其他软件没什么不同,这里不多做介绍,其他平台的安装请自行查阅官方文档。

更换Docker镜像库

为什么要更换Docker镜像库?

俗话说,工欲善其事必先利其器,Docker自带的镜像库是国外,下载镜像的速度很缓慢,不利于我们工作。

更换Docker镜像库

在macOS下运行Docker后,会在菜单栏上出现一个这样一个图标,单击该图标(首次可能会让你登录Docker.com的账号)。

点击Preferences… -> Daemon

我这里使用的是阿里的镜像库,可以去阿里开发者平台获取一个镜像库地址。在管理控制台->容器镜像服务->镜像加速器 可查看到你的镜像库地址。

填写好镜像库地址后,点击Apply & Restart按钮,等待Docker重启并应用配置的镜像加速器。

部署NMP环境

NMP是nginx、php、mysql的缩写。。。

创建资源文件夹

既然安装好了Docker,我们创建容器后,我们需要映射一些配置文件或网站程序文件到宿主机,所以我们创建一些文件夹来存放这些东西。

1
2
3
4
5
6
7
8
/docker
/mysql 存放数据库备份
/nginx nginx配置文件
/conf
/wwwroot 网站文件
/wwwlogs 日志
/source 程序源代码
/download 下载目录

部署MySQL

拉取镜像

在终端中执行:

1
docker pull mysql:5.7

运行容器

1
2
3
4
5
6
7
8
docker run --name mysql5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

参数说明
-d 让容器在后台运行
-p 添加主机到容器的端口映射,前面是映射到本地的端口,后面是需要映射的端口
-e 设置环境变量,MYSQL_ROOT_PASSWORD这里是设置mysql的root用户的初始密码
--name 容器的名字,随便取,但是必须唯一
最后一个参数是容器名:容器版本(tag 标签)

进入容器测试

1
2
3
4
5
docker exec -it mysql5.7 /bin/bash

参数说明
-t 在容器里生产一个伪终端
-i 对容器内的标准输入 (STDIN) 进行交互

进入MySQL

1
mysql -uroot -p123456

如果可以成功登录到MySQL,说明MySQL部署成功。(测试发现Docker中MySQL 5.7版本中默认开启远程连接)

部署PHP

拉取镜像

1
docker pull php:7.0-fpm

运行容器

1
2
3
4
5
6
7
8
9
docker run -d -p 9000:9000 -v /Users/xiaoyi/docker/wwwroot:/usr/share/nginx/html --link mysql5.7:mysql --name php-fpm7.0 php:7.0-fpm

参数说明
-d 让容器在后台运行
-p 添加主机到容器的端口映射
-v 添加目录映射
–-name 容器的名字,随便取,但是必须唯一
--link link 是在两个contain之间建立一种父子关系,父container中的web,可以得到子container db上的信息。
通过link的方式创建容器,我们可以使用被Link容器的别名进行访问,而不是通过IP,解除了对IP的依赖。

部署Nginx

拉取镜像

1
docker pull nginx

运行容器

1
docker run -d -p 80:80 -v /Users/xiaoyi/docker/wwwroot:/usr/share/nginx/html -v /Users/xiaoyi/docker/nginx/nginx.conf:/etc/nginx/nginx.conf -v /Users/xiaoyi/docker/nginx/conf:/etc/nginx/conf.d -v ~/docker/wwwlogs:/var/log/nginx --link php-fpm7.0:phpfpm --name m_nginx nginx:latest

编辑配置文件

修改/Users/xiaoyi/docker/nginx/conf/default.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
server {
listen 80;
server_name localhost;

#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;

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

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root /usr/share/nginx/html;
fastcgi_pass phpfpm:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}

以上是我的配置,分享给大家参考。

配置完成之后,在wwwroot目录中新建一个info.php文件测试一下。

1
2
3
<?php
phpinfo();
?>

填坑

1、php代码连接MySQL,不能使用localhost或者127.0.0.1,必须是运行容器时指定的名字,否则会出现连接MySQL错误。本文php运行容器的名字是:php-fpm7.0

2、启动MySQL容器时,如果遇到端口被占用,并且没有其他软件占用3306的情况下,退出Docker重新开启Docker。

1
lsof -i :3306  #查看端口占用情况

3、使用软件连接MySQL时,使用127.0.0.1,但不能使用localhost。

4、Docker镜像库中的php版本没有mysqli,pdo_mysql等扩展,需要进入到容器中安装:

1
2
3
4
5
6
#安装
docker-php-ext-install pdo_mysql
docker-php-ext-install mysqli

#查看php扩展
php -m