Docker筆記一:基於Docker容器構建並運行 nginx + php + mysql ( mariadb ) 服務環境

来源:http://www.cnblogs.com/XiongMaoMengNan/archive/2017/01/06/6256799.html
-Advertisement-
Play Games

首先為什麼要自己編寫Dockerfile來構建 nginx、php、mariadb這三個鏡像呢?一是希望更深入瞭解Dockerfile的使用,也就能初步瞭解docker鏡像是如何被構建的;二是希望將來可以定製自己的images,特別是能針對不同的系統環境與目標需求適當對鏡像進行調整改進。在編輯Doc... ...


首先為什麼要自己編寫Dockerfile來構建 nginx、php、mariadb這三個鏡像呢?一是希望更深入瞭解Dockerfile的使用,也就能初步瞭解docker鏡像是如何被構建的;二是希望將來可以定製自己的images,特別是能針對不同的系統環境與目標需求適當對鏡像進行調整改進。在編輯Dockerfile過程中也參考了以下相關範例:

https://hub.docker.com/_/php/

https://hub.docker.com/_/mysql/

https://hub.docker.com/_/nginx/

 

一.安裝Docker

sudo apt-get update 
sudo apt-get install docker.io

  

二.在Home下創建如下docker目錄(含源碼安裝包)

conf:配置文件目錄,包含nginx.conf、php.ini、 my.cnf以及source.list等。當然這些配置文件並非必須的,可在相關的安裝目錄下去複製修改源配置文件,只是個人喜歡先準備好這些將要用到的文件。

packages:安裝包目錄,對於mysql的安裝本人採用mariadb源碼安裝,所有的安裝包都是官方下載的最新版。至於phpMyAdmin包是本人在開發測試時喜歡使用的mysql管理界面(客戶端),如果最後phpMyAdmin能在容器中跑起來,也就初步說明整個創建過程是成功的。

Dockerfile-PHP-FPM:為構建php鏡像而要編寫的Dockerfile

Dockerfile-Mariadb:為構建mariadb鏡像而要編寫的Dockerfile

Dockerfile-Nginx:為構建nginx鏡像而要編寫的Dockerfile

 

三.構建mariadb鏡像並運行mariadb容器

1.編輯Dockerfile-Mariadb

FROM ubuntu
MAINTAINER cenze <[email protected]>

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& groupadd -r mysql \
&& useradd -r -g mysql mysql
ADD conf/sources.list /etc/apt/
RUN apt-get update \
&& apt-get install -y g++ cmake vim libncurses5-dev zlib1g-dev

ENV PKGS="/usr/local/pkgs"
ADD packages/mariadb-10.1.19.tar.gz $PKGS/

# install mariadb
WORKDIR $PKGS/mariadb-10.1.19
ENV PREFIX_MARIADB="/usr/local/mariadb"
RUN mkdir $PREFIX_MARIADB \
&& cmake -DCMAKE_INSTALL_PREFIX="$PREFIX_MARIADB" . \
&& make \
&& make install

ENV PATH $PREFIX_MARIADB/bin:$PATH
ADD conf/my.cnf /etc/
RUN chown -R mysql:mysql $PREFIX_MARIADB/data \
&& cd $PREFIX_MARIADB \
&& ./scripts/mysql_install_db

EXPOSE 3306
CMD ["mysqld"]

2.構建mariadb鏡像

cd ~/docker
sudo docker build -t cenze/mariadb -f Dockerfile-Mariadb .

3.運行mariadb容器

sudo docker run -d --name mariadb cenze/mariadb

 

四.構建php鏡像並運行php-fpm容器

1.編輯Dockerfile-PHP-FPM

FROM ubuntu
MAINTAINER cenze <[email protected]>

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ADD conf/sources.list /etc/apt/
RUN apt-get update \
&& apt-get install -y gcc make vim libssl-dev libpcre3-dev zlib1g-dev libxml2-dev libcurl4-gnutls-dev libpng16-dev libmcrypt-dev \
&& ln -s /usr/lib/x86_64-linux-gnu/libssl.so  /usr/lib/

ENV PKGS="/usr/local/pkgs"
ADD packages/php-7.1.0.tar.gz $PKGS/

#install php
WORKDIR $PKGS/php-7.1.0
ENV PREFIX_PHP="/usr/local/php"
RUN mkdir $PREFIX_PHP \
&& CONFIG_PHP="\
--prefix=$PREFIX_PHP \
--disable-cgi \
--enable-fpm \
--with-fpm-user=www-data \
--with-fpm-group=www-data \
--enable-mbstring \
--with-mysqli \
--with-pdo-mysql \
--with-mcrypt \
--with-zlib \
--with-curl \
--with-openssl \
--with-gd \
--enable-exif \
"\
&& ./configure $CONFIG_PHP \
&& make \
&& make install
ADD conf/php-fpm.conf $PREFIX_PHP/etc/
ADD conf/php.ini $PREFIX_PHP/etc/
ADD conf/www.conf $PREFIX_PHP/etc/php-fpm.d/
ADD conf/php-fpm $PREFIX_PHP/bin/
RUN chown -R www-data:www-data /var/www

###################Chroot#########################################################
#如果不想chroot,這部分可以刪除
#chroot的配置是一個大坑,如果你使用到session、sendmail、DNS解析等有關api,可能需要添加複製相應的目錄和庫文件
#以下只是本人會涉及到的,很少一部分
RUN cd /var/www \
&& mkdir -p public dev etc tmp usr/share/zoneinfo var/log \
&& cp -a /dev/zero /dev/random /dev/urandom /dev/null dev/ \
&& chmod --reference=/tmp tmp/ \
&& chown -R root:root . \
&& chown -R www-data:www-data public var/log \
&& cp /lib/x86_64-linux-gnu/libc.so.6 \
/lib/x86_64-linux-gnu/libdl.so.2 \
/lib/x86_64-linux-gnu/libnss_dns.so.2 \
/lib/x86_64-linux-gnu/libnss_files.so.2 \
/lib/x86_64-linux-gnu/libresolv.so.2 \
lib/ 
###################Chroot End######################################################

ENV PATH $PREFIX_PHP/bin:$PATH

EXPOSE 9000
CMD ["php-fpm","start"]

2.構建php-fpm鏡像

cd ~/docker
sudo docker build -t cenze/php-fpm -f Dockerfile-PHP-FPM .

3.運行php-fpm容器

sudo docker run -d --link mariadb -v /home/cenze/web:/var/www --name php-fpm cenze/php-fpm

特別說明:php-fpm.conf中daemonize = no,否則php-fpm容器無法開啟並運行在後臺;本人在主機~/web下掛載了捲,綁定到容器/var/www

 

五.構建nginx鏡像並運行nginx容器

1.編輯Dockerfile-Nginx

FROM ubuntu
MAINTAINER cenze <[email protected]>

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ADD conf/sources.list /etc/apt/
RUN apt-get update \
&& apt-get install -y gcc make vim libpcre3-dev zlib1g-dev libssl-dev \
&& ln -s /usr/lib/x86_64-linux-gnu/libssl.so  /usr/lib/

ENV PKGS="/usr/local/pkgs"
ADD packages/nginx-1.10.2.tar.gz $PKGS/

# install nginx
WORKDIR $PKGS/nginx-1.10.2
ENV PREFIX_NGINX="/usr/local/nginx"
RUN mkdir $PREFIX_NGINX \
&& ./configure --prefix="$PREFIX_NGINX" --with-http_ssl_module \
&& make \
&& make install
ADD conf/nginx.conf $PREFIX_NGINX/conf/
 
#WORKDIR $PREFIX_NGINX/html
ENV PATH $PREFIX_NGINX/sbin:$PATH

EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;"]

2.構建nginx鏡像

cd ~/docker
sudo docker build -t cenze/nginx -f Dockerfile-Nginx .

3.運行nginx容器

sudo docker run -d -p 443:443 -p 80:80 --link php-fpm -v /home/cenze/web:/usr/local/nginx/html --name nginx cenze/nginx

特別說明:本人在主機~/web下掛載了捲,綁定到nginx容器/usr/local/nginx/html

 

六.創建新項目進行測試 

1.上圖是運行php-fpm容器後主機~/web目錄結構圖,提取~/docker/packages/phpMyAdmin.tar.gz至~/web/public下

2.複製phpMyAdmin配置文件

cd ~/web/phpMyAdmin
cp config.sample.inc.php config.inc.php

 3.訪問地址http://localhost/phpMyAdmin將出現下圖,說明基於容器的nginx/php/mysql服務環境已經創建成功


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 方法一:access函數判斷文件夾或者文件是否存在 函數原型: int access(const char *filename, int mode); 所屬頭文件:io.h filename:可以填寫文件夾路徑或者文件路徑 mode:0 (F_OK) 只判斷是否存在 2 (R_OK) 判斷寫入許可權 ...
  • 大圖輪播 > 1 2 ... ...
  • 這篇文章主要講解Java在創建對象的時候,初始化的順序。主要從以下幾個例子中講解: 繼承關係中初始化順序 初始化塊與構造器的順序 已經載入過的類的初始化順序 載入父類,會不會載入子類 創建子類對象會不會創建父類對象 例子1——繼承關係中初始化順序 先看簡單的情況,看下麵的例子: 其執行的結果如下: ...
  • YII 2.x 模板文件的 beginBlock、beginContent、beginCache ...
  • 1 #include 2 #include 3 #include 4 struct student //定義結構體 5 { 6 char name[7]; //姓名 7 int number; //號碼 8 }student,student1; 9 void menu() //顯示欄 10 { 11... ...
  • 一.圖片驗證碼概述:很多網站都有該實現作用:為了提高系統的安全性有了驗證碼,我們就可以要求用戶在輸入用戶名,密碼等信息後,同時輸入圖片上的文字,用戶提交後,系統會首先從session中提取剛剛生成的驗證碼,並和用戶輸入的驗證碼進行比較,如果比較相等,表示用戶是從登錄界面登錄過來的,否則,表示用戶是非 ...
  • 在Spring+Struts+Hibernate中,有時需要使用到Spring上下文。項目啟動時,會自動根據applicationContext配置文件初始化上下文,可以使用ApplicationContextAware介面去獲得Spring上下文。創建以下的類: 在applicationConte ...
  • 大家好,今天我們學習了Java如何連接資料庫。之前學過.net語言的資料庫操作,感覺就是一通百通,大同小異。 JDBC是Java資料庫連接技術的簡稱,提供連接各種常用資料庫的能力。 JDBC API (主要功能:與資料庫建立連接、執行語句、處理結果): 提供者:Sun公司 內容:供程式員調用的介面與 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...