docker部署lnmp环境(二)

谈谈自己的理解

帮助大家快速使用docker,我就简单的谈谈自己理解的docker,前面我们安装的docker,我们可以称之为一个docker服务,或者一个docker引擎,千万别以为docker就是容器,这样理解容易混淆。


在docker中,拥有许多镜像文件,镜像文件可以在docker hub上下载拉取,或者直接自己构建镜像文件,就算是自己构建镜像文件,也是基于一个基础镜像文件然后进行构建的。


这些镜像文件进行运行,就会产生一个我们所说的容器


部署lnmp环境

第一步:上面说提到的镜像文件,这里我们布置环境的时候,其实就是分别拉取了nginx、mysql、php三个镜像文件(你也可以自己构建,后期要添加php扩展,就必须自己构建镜像文件)

命令:查找nginx 在docker hub上的镜像文件


命令:拉去所需要的镜像文件,后面的1.11可以不写,默认最新的nginx镜像

 

第二步:

分别运行拉取的镜像文件,生成三个容器,运行的时候注意之间的依赖关系,和挂载参数。可参考:http://www.runoob.com/docker/docker-install-nginx.html


使用docker-compose 的方式

前提:记得安装docker-compose命令 例:pip install docker-compose


第一步:

分别运行很麻烦,我们可以使用docker-compose 的方式,进行一键生成

首先编辑一个docker-compose.yml文件


可参考:https://segmentfault.com/a/1190000008833012

http://www.cnblogs.com/s-b-b/p/8624491.html


version: "2"

services: 

  # Nginx 1.11.10: https://hub.docker.com/_/nginx/

  web:

    image: nginx:1.11.10

    ports:

      # 将主机的 8080 端口映射到容器的 80 端口

      - 8080:80

    depends_on:

      - php

    # 同 php 一起共享 ./apps 目录

    volumes_from:

      - php

    # 创建一个数据卷,由 ./images/nginx/config => /etc/nginx/conf.d

    volumes:

      - ./images/nginx/config:/etc/nginx/conf.d:ro

  # PHP 7.1-fpm: https://hub.docker.com/_/php/

  php:

    image: php:7.1-fpm

    volumes: 

      - ./apps:/mnt/apps

  # MySQL 5.7: https://hub.docker.com/_/mysql/

  database: 

    image: mysql:5.7

    # 配置一些环境变量,具体的环境变量细节可以访问上面的网址查看

    environment:

      MYSQL_ROOT_PASSWORD: "root"

      MYSQL_USER: "dailybird"

      MYSQL_PASSWORD: "dailybirdo"

    volumes:

      - ./database:/var/lib/mysql



第二步:

创建一个lnmp的文件夹,把上述编写的docker-compose.yml文件移入lnmp文件夹下。然后在该目录下运行以下命令

# 运行docker-compose服务
$ docker-compose up -d
# 停止服务
$ docker-compose stop
# 删除该服务相关的容器
$ docker-compose rm
# 运行已存在docker-compose的服务
$ docker-compose start


docker宿主机无法访问容器中的服务
1、每个镜像都定义了可对外提供的接口,Nginx镜像只默认提供了80443端口,你自然无法访问到容器内的8080端口。
2、只需要在docker create或者docker run创建容器时携带--expose参数,就能把指定的端口开放出来。
--expose Expose a port or a range of ports

参考网址:https://segmentfault.com/q/1010000008776168



容器启动时报错

iptables:No chain/target/match by the name

一般出现这个错误,大部分原因就是我们修改了防火墙的规则导致(例如:删除了防火墙中的docker链)。因为docker 服务启动的时候,docker服务会向iptables(防火墙)注册一个链,以便让docker服务管理的containner所暴露的端口之间进行通信

通过命令 iptables -L可以查看iptables 链

要解决这个问题,只要重启docker服务,之后,正确的规则就会被重新创建出来。



扩展知识

其实上述所说的挂载数据卷,无非就是把宿主机中指定的文件夹下的文件拷贝到容器中指定的位置,容器运行当中产生的数据也会自动备份到挂载的宿主机的目录中,实现了一个数据持久化的一个功能,因为容器运行中产生的数据,如果没有进挂载,则重新启动容器的时候,会还原当初最原始的配置,除非每次容器产生变化的时候,你进行命令commit保存容器,但是这其实相当于产生了一个新的镜像文件。(其实就是我们首先要知道每个容器产生的数据或者配置文件的默认位置是在哪,然后进行挂载相应的目录,挂载相当于把这些配置或者数据拷贝到了宿主机的目录中,然后启动的时候宿主机目录的文件拷贝到容器的默认位置,实现了持久化)

猜你喜欢

转载自blog.csdn.net/panjiapengfly/article/details/80010371