首先我们需先安装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. ibatis 学习

    1.$与#的区别: 用到#和$来获取传的参数值,其中#是将传来的值替换(如果是字符串,会将‘’带着替换,比如上面$value$,用#value#的话,就会出错.#与$的使用区别:$中间的变量就是直接替 ...

  2. Linux——基本命令

    目录 一.目录切换命令 二.目录操作命令(增删改查) 2.1增加目录 2.2查看目录 2.3寻找目录(搜索) 2.4修改目录名称 2.5移动目录位置(剪切) 2.6拷贝目录 2.7删除目录 三.文件的 ...

  3. Python集训营45天—Day08 (文件操作)

    目录 1. 文件操作介绍 2. 文件的读写 2.1 文本文件 2.2 二进制文件 2.3 JSON文件 3. 文件的定位,重命名和删除 4. 文件夹的相关操作 1. 文件操作介绍 大家应该听说过一句话 ...

  4. Ubuntu server 安装及jdk+mysql安装教程

    Ubuntu server 安装教程 1.查找及下载Ubuntu镜像文件 可以在以下页面下载想要的版本,我这里选择19.04 server版的iso镜像文件: http://mirrors.163.c ...

  5. Java11月18日

    动手动脑 实验一: 1. 下边的程序运行结果是什么? 2.你如何解释会得到这样的输出? 3.计算机是不会出错的,之所以得到这样的运行结果也是有原因的那么从这些运行结果中,你能总结出Java的哪些语法特 ...

  6. 最全最强 Java 8 - 函数编程(lambda表达式)

    Java 8 - 函数编程(lambda表达式) 我们关心的是如何写出好代码,而不是符合函数编程风格的代码. @pdai Java 8 - 函数编程(lambda表达式) 简介 lambda表达式 分 ...

  7. Linux之shell基础

    Shell基础 一.shell概述 1) shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动.挂起.停止甚至是编写一些程序 ...

  8. Travis CI持续集成使用

    用好这个工具不仅可以提高效率,还能使开发流程更可靠和专业化,从而提高软件的价值.而且,它对于开源项目是免费的,不花一分钱,就能帮你做掉很多事情. 一.什么是持续集成? Travis CI 提供的是持续 ...

  9. [USACO09JAN]安全出行Safe Travel 最短路,并查集

    题目描述 Gremlins have infested the farm. These nasty, ugly fairy-like creatures thwart the cows as each ...

  10. Python开发【第四篇】语句与函数

    语句 statement 语句是由一些表达式组成,通常一条语句可以独立的执行来完成一部分事情,并且形成结果. 多条语句写在一行内要用分号分开 例子: print('hello world') #这是一 ...