首先我们需先安装docker环境,这个比较简单,以centos7为例

  docker在centos7上安装需要系统内核版本3.10+,可以通过uname -r查看内核版本号,如果版本不符请自行查阅资料更换。

  准备好之后使用以下命令安装docker服务

yum install -y docker

  安装完成后启动docker服务,下面是docker启动、停止、重启等命令

systemctl restart docker #重启

systemctl stop docker #停止

systemctl start docker #启动

systemctl enable docker #开机自启动

systemctl status docker #服务状态

  至此docker服务就准备好了,我们可以通过docker -v查看docker版本

然后我们使用docker搭建php环境

  我们先简单介绍一下docker的一些常用命令,如下所示:

#从docker镜像仓库搜索镜像,示例docker search mysql
docker search [需要查找的镜像名] #拉取远程镜像到本地,示例docker pull mysql:5.7.
docker pull [镜像名]:[版本号] #自定义创建一个镜像,注意需要当前目录下有一个Dockerfile文件
#注意结尾处有个 “.”是必须的
docker build -t [自定义镜像名] . #查看本地镜像,可以看到镜像名,镜像id,版本号,创建时间及镜像大小
docker images #删除镜像,需注意删除的镜像要没有container占用,镜像id不用全部输入完整
#示例docker image rm 7bc
docker image rm [镜像id] #查看所有container及详情,可以看到容器名,容器id、容器状态等信息
docker ps -a #启动容器,容器id也不需要写全,示例docker start 88d
docker start [容器id] #停止容器
docker stop [容器id] #重启容器
docker restart [容器id] #创建一个镜像,后续会对详细说明
docker run [参数1] [参数2] ... 镜像名 #进入容器内部交互
docker exec -it [容器名/容器id] /bin/bash

  整个docker环境流程大致可以理解为三步,获取镜像->创建容器->运行容器。

下载php镜像,php-fpm

  首先我们需要一个php的镜像,镜像获取有两种方式,一种是直接获取docker镜像库里面已有的镜像,另一种是自己编辑dockerfile文件自定义一个镜像,首先我们采用第一种方式,因为比较简单,后面再说第二种方式

  我们使用docker pull 拉去一个已有的php镜像,这里我推荐 leleos/php-fpm:7.1 镜像,基本能使用上的扩展都配置好了

docker pull leleos/php-fpm:7.1

  

构建nginx镜像

  之前我们是直接下载别人的镜像拿来用,这次我们自己使用dockerfile文件创建一个自定义的镜像,首先在目录下创建一个 "Dockerfile" 文件(建议Dockerfile作为文件名),写入以下内容

#设置容器基础镜像,这里我们以centos系统为基础镜像
FROM hub.c..com/public/centos:latest #设置作者信息
MAINTAINER Taurus12C<@qq.com> #安装依赖
RUN rpm --rebuilddb && yum install -y autoconf automake make wget proc-devel net-tools zlib zlib-devel make gcc g++ openssl-devel pcre pcre-devel tar #下载nginx软件压缩包
RUN wget http://nginx.org/download/nginx-1.17.1.tar.gz # 解压到当前目录
RUN tar -zxvf nginx-1.17..tar.gz # 设置当前操作目录
WORKDIR nginx-1.17. # 配置nginx
RUN ./configure --prefix=/usr/local/nginx && make && make install
RUN rm -rf ../nginx* && yum clean all \
&& echo "${TIME_ZOME}" > /etc/timezone \
&& ln -sf /usr/share/zoneinfo/${TIME_ZOME} /etc/localtime # 设置当前操作目录
WORKDIR /usr/local/nginx #暴露容器端口
EXPOSE #启动容器后执行语句
CMD ["./sbin/nginx","-g","daemon off;"]

  这里我们大致说一下上面文件的命令含义,注意命令必须全部大写

  FROM —— 设置基础镜像

  MAINTAINER —— 设置这个dockerfile的作者信息

  RUN —— 这个比较关键,就是你接下来对于容器的配置或者是依赖的一步步操作,因为这里我们是创建一个nginx的镜像,所以上面的RUN操作都是在容器里面安装nginx服务

  WORKDIR —— 设置当前操作容器内的路径,类似于cd操作

  EXPOSE —— 这个是给容器暴露端口让宿主机完成映射

  CMD —— 这是容器创建启动后自动执行的命令,这里的命令是启动nginx服务的意思

  其他的命令可以去查阅资料自行了解,这里我们只讲解这些,让大家有个概念

  编辑好了之后我们在当前目录下执行build来构建一个镜像,如果你的文件是Dockerfile直接执行就好了。注意后面的 "."不要忘了

docker build -t nginx .

 执行完毕之后我们使用 docker images 查看本地镜像已经有了nginx和leleos/php-fpm两个镜像了。然后我们就可以使用容器创建一个php的环境运行php项目了

创建dcoker自定义网络

  有的时候我们需要容器之间能够连接,比如nginx就需要使用fpm,但是nginx和leleos/php-fpm不在一个容器内,这个时候我们就需要想办法让容器之间能互相访问,这里有几种办法

  1、在启动容器时使用 --link实现容器之间的连接,然后在nginx容器内修改nginx配置文件里面的fastcgi_pass对应地址

  2、获取到php-fpm容器的内网ip,然后在nginx容器内修改nginx配置文件里面的fastcgi_pass对应地址

  3、创建docker自定义网络,然后在nginx容器内修改nginx配置文件里面的fastcgi_pass对应地址

  这里作者推荐使用第三种方法,其他两种如果需要可以自行了解

  创建docker自定义网络命令,docker network create [网络组名称]

docker network create lnmp

  执行之后我们可以用docker network ls 查看刚刚创建的网络组

创建容器,使用docker搭建PHP环境

  上面说了那么多都是准备工作,现在我们正式把环境搭建起来

  创建nginx容器

docker run -itd --name nginx --network lnmp -p : -v /var/www/html:/var/www/html -v /usr/local/nginx/conf/vhost:/usr/local/nginx/conf/vhost nginx

  解释一下上面指令的意思

  docker run:创建启动一个容器

  -itd:这里是缩写,对应 -i -t -d ,-i 交互式操作、-t 终端 、-d后台运行

  --name:给容器指定名称

  --network:给容器指定网络组

  -p:映射宿主机与容器内的端口

  -v:给容器挂载目录,通俗理解来说就是给容器加了个存储文件的空间,并且空间内的文件宿主机和容器是共用的。这里我挂载了两个目录,一个是项目目录html,一个是配置文件目录vhost,这样就不用进入容器内就能修改了

  nginx:指定容器使用的镜像为nginx镜像

  

  创建php服务容器

docker run -itd --name php-fpm --network lnmp -p : -v /var/www/html:/var/www/html leleos/php-fpm:7.1

  需要注意的是项目目录需要nginx和php容器配置在体哦那个一个目录下。至此我们容器也启动了,可以通过docker ps -a 查看我们刚刚创建并启动的容器状态。

  到了这里还没完还有最后一步操作,那就是进行正确的nginx配置。首先我们进到nginx容器里面docker exec -id [容器名/容器id] /bin/bash

docker exec -it nginx /bin/bash

  输入上面这段命令我们就能进入到nginx容器里面,如果需要退出返回到宿主机里面,只需要在容器内输入exit就可以了

  进入/usr/local/nginx/conf目录编辑nginx.conf文件,文件内容如下

#user  nobody;
worker_processes ; #error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info; #pid logs/nginx.pid; events {
worker_connections ;
} http {
include mime.types;
default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on;
#tcp_nopush on; #keepalive_timeout ;
keepalive_timeout ; #gzip on; server {
listen ;
server_name localhost;                   #域名
  index index.html index.htm index.php;
root /var/www/html;                     #这里填写刚刚挂载的项目目录
#charset koi8-r; #access_log logs/host.access.log main; #error_page /.html; # redirect server error pages to the static page /50x.html
#
error_page /50x.html;
location = /50x.html {
root html;
} # proxy the PHP scripts to Apache listening on 127.0.0.1:
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:
#   location ~ \.php$ {
root html;
fastcgi_pass lnmp_php:;             #这里注意使用php容器的网络组内端口,我们创建php容器时使用的网络组和映射的端口
fastcgi_param SCRIPT_FILENAME /var/www/html$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;
  #}
  }
include /usr/loca/nginx/conf/vhost/*.conf;   #这里是我们挂载配置文件目录地址,这样我们添加新的项目就不需要到容器内来修改nginx.conf文件,只需要在宿主机上修改重启容器即可 # another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias; # location / {
# root html;
# index index.html index.htm;
# }
#} # HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost; # ssl_certificate cert.pem;
# ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on; # location / {
# root html;
# index index.html index.htm;
# }
#} }

  编辑好了之后我们重载nginx配置文件,进入/usr/local/nginx/sbin目录下执行 ./nginx reload 。然后退出容器exit

  进入/var/www/html目录下创建index.php测试一下换进是否搭建成功,index.php文件内写入

<?php

    echo 'Hello World!';

  打开浏览器访问服务器地址或域名,如果输出”Hello World!“就代表环境搭建成功

其他

  至此我们已经掌握了docker的一些用法,可以尝试自己搭建redis、mysql等服务容器啦,如果遇到什么问题可以在下方给我评论进行询问

Docker入门详解——安装docker并利用docker搭建lnmp的更多相关文章

  1. docker入门详解

    这可能是最为详细的Docker总结 Docker是什么? 在计算机技术日新月异的今天, Docker 在国内发展的如火如荼,特别是在一线互联网公司, Docker 的使用是十分普遍的,甚至成为了一些企 ...

  2. Docker入门详解(转载)

    来源 http://dockone.io http://dockone.io/article/6051 Docker是世界领先的软件容器平台,所以想要搞懂Docker的概念我们必须先从容器开始说起. ...

  3. Docker命令详解

    Docker命令详解   最近学习Docker,将docker所有命令实验了一番,特整理如下: # docker --help Usage: docker [OPTIONS] COMMAND [arg ...

  4. Docker入门之 - 如何安装Docker CE

    原文:Docker入门之 - 如何安装Docker CE 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u012055638/article/det ...

  5. Python安装与环境变量配置 入门详解 - 精简归纳

    Python安装与环境变量配置 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 9 / 24 转载请注明出处!️ 目录 Python安装与环境变量配置 入门详解 - 精简归纳 一.下载Py ...

  6. gcc g++ 安装与配置 入门详解 - 精简归纳

    gcc g++ 安装与配置 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 9 / 24 转载请注明出处!️ 目录 gcc g++ 安装与配置 入门详解 - 精简归纳 一.下载MinGW ...

  7. GoSDK的安装及环境变量配置 入门详解 - 精简归纳

    GoSDK的安装及环境变量配置 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 10 / 29 转载请注明出处!️ 目录 GoSDK的安装及环境变量配置 入门详解 - 精简归纳 一.进入G ...

  8. Redis快速入门详解

    Redis入门详解 Redis简介 Redis安装 Redis配置 Redis数据类型 Redis功能 持久化 主从复制 事务支持 发布订阅 管道 虚拟内存 Redis性能 Redis部署 Redis ...

  9. 学会Git玩转GitHub(第二篇) 入门详解 - 精简归纳

    学会Git玩转GitHub(第二篇) 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 10 / 25 转载请注明出处!️ 目录 学会Git玩转GitHub(第二篇) 入门详解 - 精简归纳 ...

随机推荐

  1. Linux 部署vsftp服务及详解

    一.FTP服务概述: FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务. FTP(File Transf ...

  2. Spring Environment的加载

     这节介绍environment,默认环境变量的加载以及初始化.  之前在介绍spring启动过程讲到,第一步进行环境准备时就会初始化一个StandardEnvironment.下图为Environm ...

  3. Angular ngx-echarts图表

    1. 安装echarts包.ngx-echarts包 npm install echarts --save npm install ngx-echarts --save 2. angular.json ...

  4. eShopOnContainers学习系列(三):RabbitMQ消息总线实践

    今天研究了下eShopOnContainers里的RabbitMQ的使用,在项目里是以封装成消息总线的方式使用的,但是仍然是以其发布.订阅两个方法作为基础封装的,我们今天就来实际使用一下. 为了简单起 ...

  5. JAVA错误提示:The operation is not applicable to the current selection.Select a field which is not declared as type variable or a type that declares such fields.

    平时没怎么注意,今天用Eclipse自动生成Set Get方法时提示错误,错误信息如下: The operation is not applicable to the current selectio ...

  6. 浅析十大常见排序(含C++代码)

    首先声明一下,本文只对十种排序算法做简单总结,并参照一些资料给出自己的代码实现,并没有对某种算法理论讲解,更详细的 了解可以参考以下资料: 1.<data structure and algor ...

  7. CSS样式手册

    字体属性:(font) 大小 {font-size: x-large;}(特大) xx-small;(极小) 一般中文用不到,只要用数值就可以,单位:PX.PD 样式 {font-style: obl ...

  8. e课表项目第二次冲刺周期第七天

    昨天干了什么? 昨天我查找相关的资料实现对之前的信息连接数据库进行显示,完成修改的功能,并且返回到数据库当中.然后下午,我和我们小组的成员,讨论了第二个界面的具体功能和布局,我们一致同意,引用之前的第 ...

  9. 我眼中的如何成为一名合格的PHP高级开发工程师

    转眼间搞PHP已超过10年准确的说12年,混在帝都,也经历过大公司小公司,有个同行朋友问我,我就思考下,如何成为一名合格的PHP高级开发 所有的所有仅限综合知识,因为PHP其实内容也很多,有的人专门研 ...

  10. 微信小程序学习总结

    微信小程序开发环境安装以及相关设置配置 微信小程序前端页面书写 微信小程序前端样式WXSS书写 微信小程序中事件 微信小程序自定义组件 微信小程序发起请求 微信小程序登入流程 微信小程序路由跳转 微信 ...