docker 搭建 lnmp 環境

OMGZui發表於2019-01-20

有收穫的話請加顆小星星,沒有收穫的話可以 反對 沒有幫助 舉報三連

一、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

二、docker-compose

詳細請檢視 https://docker_practice.gitee.io/compose/

  • 服務 (service):一個應用的容器,實際上可以包括若干執行相同映象的容器例項。

  • 專案 (project):由一組關聯的應用容器組成的一個完整業務單元,在 docker-compose.yml 檔案中定義。

三、docker-compose編排lnmp環境

1、mysql

這裡我們使用了mysql5.5版本,沒其它用意,相比5.7以上版本,佔記憶體和硬碟最小的一個版本

我們準備了一個my.cnf作為額外配置,這裡我修改了資料庫的時區

[mysqld]

default-time-zone = '+8:00'
FROM mysql:5.5

COPY my.cnf /etc/mysql/conf.d

EXPOSE 3306

2、redis

我們使用準備的配置檔案redis.conf覆蓋容器預設啟動的配置檔案,修改了ip繫結密碼

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

3、mongo

mongodb我們沒有特殊處理

FROM mongo:latest

EXPOSE 27017

4、nginx

我們準備了一份nginx.conf和虛擬目錄conf.d,為了以後可以動態的配置網站的代理和負載均衡

還有一個日誌目錄,放在外層logs目錄裡面,記錄nginx的訪問日誌

特別注意的是fastcgi_pass php:9000;而不是fastcgi_pass 127.0.0.1:9000;,目前自己也沒明白

FROM nginx:alpine

COPY nginx.conf /etc/nginx/nginx.conf

EXPOSE 80

5、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

6、完整版

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

四、參考

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章