docker搭建lnmp环境

有收获的话请加颗小星星,没有收获的话能够 反对 没有帮助 举报三连php

1、Dockerfile定制镜像

# FROM 指定基础镜像
FROM 镜像

FROM php:7.2-fpm

# RUN 执行
RUN <命令>
or
RUN ["可执行文件", "参数1", "参数2"]

RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
RUN ["php", "-S", "0.0.0.0:8080"]

# COPY 复制文件
COPY <源路径>... <目标路径>

COPY swoole-4.2.10.tgz /home
COPY nginx.conf /etc/nginx/nginx.conf

# ADD 复制文件或目录,若是是.tgz,会被解压缩
ADD <源路径>... <目标路径>

ADD nginx.conf /etc/nginx/nginx.conf

# CMD 容器启动
CMD echo $HOME => CMD [ "/bin/sh", "-c", "echo $HOME" ]

CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]

# ENTRYPOINT 入口点
ENTRYPOINT ["docker-entrypoint.sh"]
存在 ENTRYPOINT 后,CMD 的内容将会做为参数传给 ENTRYPOINT

# ENV 环境变量
ENV <key> <value>

ENV MYSQL_ROOT_PASSWORD root

# ARG与ENV差很少
ARG 所设置的构建环境的环境变量,在未来容器运行时是不会存在这些环境变量的

ENV MYSQL_ROOT_PASSWORD root

# VOLUME 匿名卷
VOLUME ["<路径1>", "<路径2>"...]

VOLUME ["/data"]

# EXPOSE 暴露端口
EXPOSE <端口1> [<端口2>...]

EXPOSE 80 443

# WOEKDIR 指定工做目录,进入容器后的落地目录
WORKDIR <工做目录路径>

WORKDIR /var/www

# USER 指定当前用户
USER <用户名>

USER root
复制代码

2、docker-compose

详细请查看 https://docker_practice.gitee.io/compose/html

  • 服务 (service):一个应用的容器,实际上能够包括若干运行相同镜像的容器实例。mysql

  • 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。linux

3、docker-compose编排lnmp环境

一、mysql

这里咱们使用了mysql5.5版本,没其它用意,相比5.7以上版本,占内存和硬盘最小的一个版本nginx

咱们准备了一个my.cnf做为额外配置,这里我修改了数据库的时区git

[mysqld]

default-time-zone = '+8:00'

复制代码
FROM mysql:5.5

COPY my.cnf /etc/mysql/conf.d 
EXPOSE 3306
复制代码

二、redis

咱们使用准备的配置文件redis.conf覆盖容器默认启动的配置文件,修改了ip绑定密码github

bind 0.0.0.0
requirepass root
复制代码
FROM redis:latest

COPY redis.conf /usr/local/etc/redis/redis.conf 
CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ] 
EXPOSE 6379
复制代码

三、mongo

mongodb咱们没有特殊处理redis

FROM mongo:latest

EXPOSE 27017
复制代码

四、nginx

咱们准备了一份nginx.conf和虚拟目录conf.d,为了之后能够动态的配置网站的代理和负载均衡sql

还有一个日志目录,放在外层logs目录里面,记录nginx的访问日志mongodb

特别注意的是fastcgi_pass php:9000;而不是fastcgi_pass 127.0.0.1:9000;,目前本身也没明白

FROM nginx:alpine

COPY nginx.conf /etc/nginx/nginx.conf 
EXPOSE 80
复制代码

五、php

php算是这里面最难搞定的,由于咱们须要额外的添加php扩展,虽然php的docker官方提供了docker-php-ext-configure, docker-php-ext-install, docker-php-ext-enable,仍是有些扩展须要经过手动编译或者pecl安装

因为pecl官网下载慢,咱们事先下载好了几个须要的扩展

php-fpm用的是debian的linux系统,下载也很慢,咱们备用了阿里云的镜像sources.list

咱们还准备了php的默认配置php.iniopcache.ini

好比swoole扩展安装,记得安装包用完后清理,还有得用COPY命令,ADD会解压缩

# swoole
COPY swoole-4.2.10.tgz /home RUN pecl install /home/swoole-4.2.10.tgz && \ docker-php-ext-enable swoole && \ rm /home/swoole-4.2.10.tgz 复制代码

六、完整版

version: '3'

networks: 
 frontend:
 driver: bridge
 backend:
 driver: bridge

volumes: 
 mysql: 
 driver: local
 mongo:
 driver: local
 redis:
 driver: local

services: 
 php:
 build: ./php
 volumes: 
 - ${WORKER_DIR}:/var/www
 ports: 
 - 9100:9000
 depends_on: 
 - mysql
 - redis
 - mongo
 networks: 
 - backend

 nginx:
 build: ./nginx
 volumes: 
 - ${WORKER_DIR}:/var/www
 - ./logs/nginx:/var/log/nginx
 - ./nginx/conf.d:/etc/nginx/conf.d
 ports: 
 - 8000:80
 depends_on: 
 - php
 networks: 
 - frontend
 - backend

 mysql:
 build: ./mysql
 environment: 
 - MYSQL_ROOT_PASSWORD=root
 volumes: 
 - ${DATA_PATH}/mysql:/var/lib/mysql
 ports: 
 - 3310:3306
 networks: 
 - backend
  
 mongo:
 build: ./mongo
 environment: 
 - MONGO_INITDB_ROOT_USERNAME=root
 - MONGO_INITDB_ROOT_PASSWORD=root
 ports: 
 - 27010:27017
 volumes: 
 - ${DATA_PATH}/mongo:/data/db
 networks: 
 - backend
  
 redis:
 build: ./redis
 volumes: 
 - ${DATA_PATH}/redis:/data
 ports: 
 - 6310:6379
 networks: 
 - backend

复制代码

4、参考

相关文章
相关标签/搜索