# 章节介绍

houdunren.com @ 向军大叔

xj-small

本章我们通过配置LNMP环境,学习镜像配置与容器编排,最终在环境中可以良好运行LARAVEL框架,同时使用代理转发构建单一服务器构建多个DOCKER网站。

本章节内容已经创建独立项目,请访问 GITHUBGITEE 查看

完成本章前要注意以下几点

  1. 关闭服务器防火墙

    systemctl stop firewalld.service 
    
  2. 关闭宿主机NGINX | APACHE 服务,因为有可能设置和宿主相同端口,造成个性时不确定在改宿主还是容器

# 目录结构

下面是实验的文件结构,便于有个全局认识

.
├── app										应用目录
│   ├── index.php
│   └── phpinfo.php
├── docker-compose.yaml	
├── mysql									MYSQL容器
│   ├── Dockerfile				镜像配置
│   ├── data							数据结构
│   └── log								运行日志
├── nginx						
│   ├── Dockerfile
│   ├── config
│   │   └── default.conf	NGINX配置
│   └── log								运行日志
│       ├── access.log
│       └── error.log
└── php
    ├── Dockerfile
    └── config
        └── php.ini				PHP配置文件

# DOCKFILE

Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个个性化的新镜像。

# PHP

先可以查看一下官方镜像都安装了哪些扩展,下面命令会下载镜像并进入到新生成的容器中

docker run -ti --rm php /bin/bash

在容器中执行命令可以查看到已经内置的模块,这里没有的模块就需要后面安装了

php -m

# 配置文件

下面是PHP的dockfile配置文件内容

#使用的基础镜像
FROM php:fpm
#作者
MAINTAINER houdunren.com@xiangjun 2300071698@qq.com
#时区
ENV TZ Asia/Shanghai
#换国内源
# RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
# RUN apt-get clean
# RUN apt-get update
#基本更新
RUN apt-get update && apt-get install -y \
    vim \
    curl \
    net-tools \
    iputils-ping \
    libfreetype6-dev \
    libjpeg62-turbo-dev \
    libpng-dev 
#安装GD扩展
RUN docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) gd
#安装REDIS/XDEBUG
RUN apt-get install -y libmemcached-dev zlib1g-dev
RUN pecl install redis-5.1.1 
RUN pecl install memcached 
RUN docker-php-ext-enable redis memcached 
#使用镜像中的生产环境PHP.INI配置文件
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
#添加自定义配置文件
COPY ./config/php.ini $PHP_INI_DIR/php.ini
#容器工作目录
WORKDIR /html

说明

  1. RUN指令是在镜像构建时执行,一般用于安装软件包
  2. 安装软件包最好加上版本号,默认使用最新版本,这可能会造成以后再编译时和新版本不兼容
  3. 如果编译速度慢,可以把上面注释的修改镜像国内源打开

# 编译镜像

下面是对单个镜像的编译,其实使用 docker-compose 可以在编译镜像时同时编译,但下面还是了解一下编译命令的使用。

在 Dockerfile 文件所在目录执行编译镜像操作,-t 用于设置镜像名称

docker build -t houdunren/php . 

也可以为镜像设置版本号,默认的版本是 latest

docker build -t houdunren/nginx:1.0.2 . 

查看镜像编译是否成功

docker images

# NGINX

下面是NGINX的DOCKFILE配置

#使用的基础镜像
FROM nginx
#作者
MAINTAINER houdunren.com@xiangjun 2300071698@qq.com

#基本更新
RUN apt-get update && apt-get install -y \
    vim \
    curl \
    net-tools \
    iputils-ping
#复制app目录到容器WORKDIR
# COPY ./app /www

# MYSQL

mysql的镜像配置不需要过多配置

#使用的基础镜像
FROM mysql
#作者
MAINTAINER houdunren.com@xiangjun 2300071698@qq.com
#基本更新
RUN apt-get update && apt-get install -y \
    vim \
    curl \
    net-tools \
    iputils-ping

# COMPOSE

使用 dock-compose 可以统一编排容器,减少容器单独启动的麻烦,同时也可以将配置一次定义,方便在不同服务器中利用。

# 配置文件

.env 配置文件用于定义配置变量,在 docker-compose.ymal 文件中使用,简化修改大文件的麻烦。

#容器名前缀
CONTAINER_NAME_PRE=houdunren

#宿主机映射到容器的端口
PORT=8080

#宿主机映射到MYSQL容器的端口
MYSQL_PORT=33060
#ROOT管理员密码
MYSQL_ROOT_PASSWORD=admin888

#新建数据库
MYSQL_DATABASE=houdunren

#新建普通用户帐号密码
MYSQL_USER=houdunren
MYSQL_PASSWORD=houdunren

#MYSQL初始后强制ROOT帐号改密码
MYSQL_ONETIME_PASSWORD=no

#允许MYSQL空密码
MYSQL_ALLOW_EMPTY_PASSWORD

下面是 docker-compose.ymal 配置文件用来编排容器,放在项目的根目录(请看上面目录结构)

version: "3.3"
services:
  nginx:
    #DOCKFILE文件所在目录
    build: ./nginx
    #设置生成的镜像名
    image: houdunren/nginx
    #容器名称
    container_name: houdunren-nginx
    #DOCKER进程重起时重起容器
    restart: always
    #端口映射
    ports:
      - "${PORT}:80"
    #容器依赖
    depends_on:
      - php
    #目录映射
    volumes:
      - ./nginx/config:/etc/nginx/conf.d
      - ./nginx/log:/var/log/nginx
      - ./app:/www
  php:
    build: ./php
    image: houdunren/php
    container_name: houdunren-php
    restart: always
    volumes:
      - ./app:/www
  mysql:
    build: ./mysql
    image: houdunren/mysql
    container_name: houdunren-mysql
    restart: always
    environment: 
      - MYSQL_ROOT_PASSWORD=admin888
      - MYSQL_DATABASE=${MYSQL_DATABASE}
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
      - MYSQL_ONETIME_PASSWORD=${MYSQL_ONETIME_PASSWORD}
    volumes: 
      - ./mysql/data:/var/lib/mysql
      - ./mysql/log:/var/log/mysql

注意事项

因为NGINX与PHP需要通过容器名来通信,所以如果修改了容器名称需要修改 nginx/config/default 文件,将配置文件中的 houdunren-php 修改为新的PHP容器名称。

location ~ \.php$ {
  ...
  fastcgi_pass   houdunren-php:9000;
  ...
}

# 项目配置

系统包括NGINX、PHP等软件的项目配置文件,修改这些配置文件不需要重新编译,只需要在docker-compose.yaml文件所在目录下重起容器就可以了。

docker-compose restart

# 执行构建

使用以一命令启动构建

docker-compose up -d

如果修改过 docker-compose.ymal配置文件,再次执行命令即可重新构建容器

docker-compose up -d

# 容器访问

经过编排的过镜像已经在一个网络中,互相可以使用容器名来访问,这是后面做代理转发的前提。

下面是在houdunren-php 容器中来连接 houdunren-nginx 容器的试验

  1. 查看容器列表

    docker ps -a
    
  2. 进入 houdunren-php容器

    docker exec -ti houdunren-php /bin/bash
    
  3. 来PING容器houdunren-nginx

    ping houdunren-nginx
    

# LARAVEL

下面来安装LARAVEL项目,你可以安装任何其它PHP项目来使用,具体可以查看后盾人在线文档或视频学习LARAVEL的安装使用。

cd app
rm *
laravel new .

因为LARAVEL要解析到public目录,修改NGINX配置文件 nginx/config/default.conf 目录相关内容

location / {
	...
  root   /www/public; 
  ...
}
...
location ~ \.php$ {
  ...
  fastcgi_param  SCRIPT_FILENAME  /www/public$fastcgi_script_name;
  ...
}

修改配置后需要生起容器服务

docker-compose restart

现在访问就可以看到LARAVEL欢迎页面了

image-20200112124436521

# 数据库连接

下面我们使用MYSQL管理GUI工具DBeaver连接容器数据库,默认MYSQL端口是33060可以在.env文件中修改。

如果修改了.env 中的配置需要重新编译容器

docker-compose up -d

MYSQL远程连接步骤如下:

  1. 进入容器

    docker exec -it houdunren-mysql /bin/bash
    
  2. 登录mysql

    $ mysql -uroot -p
    
  3. 修改权限

    mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'admin888';
    mysql> flush privileges;
    
  4. 使用DBeaver访问

    image-20200112130002715

# 发布镜像

制作好的镜像可以上传到网上,以供其他人下载使用

登录 docker hub

docker login

推送镜像到仓库

docker push houdunren/php

登录 https://hub.docker.com/ 就可以在 Repositories 中查看到刚者提交的镜像了。

现在其他用户可以使用以下命令安装我们的镜像了。

docker pull houdunren/php

退出 docker hub

docker logout