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、參考

相關文章
相關標籤/搜索