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

在編輯Dockerfile過程中參考了以下相關範例:https://hub.docker.com/_/php/https://hub.docker.com/_/mysql/https://hub.docker.com/_/nginx/在build鏡像時可能報出異常“containerd: container not started”,此時可能需要重啓containerd或系統。

要刪除某些無用的images,可執行如下命令:

sudo docker rmi $(sudo docker images -a|grep none|awk '{print $3 }')

 

 

 

一.安裝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 --privileged=true 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 autoconf 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 \
#默認爲$PREFIX_PHP/lib,php-fpm啓動時將在會自行搜索--sysconfdir[=$PREFIX_PHP/etc]指定目錄下的php.ini,
#但php以cli模式獨立運行時只會在--with-config-file-path[=$PREFIX_PHP/lib]指定目錄下搜索php.ini
--with-config-file-path=$PREFIX_PHP/etc \
--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 mkdir /var/www \
&& chown -R www-data:www-data /var/www
###################Chroot#########################################################
#如果不想chroot,這部分可以刪除
#chroot的配置是一個大坑,如果你使用到session、sendmail、DNS解析等有關api,可能需要添加複製相應的目錄和庫文件
#以下只是本人會涉及到的,很少一部分
RUN chown -R root:root /var/www \
&& cd /var/www \
&& mkdir -p lib 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 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

#install extensions & tools for PHP
RUN pecl install redis \
&& php -r "readfile('https://getcomposer.org/installer');" | php \
&& mv composer.phar /usr/local/bin/composer

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 --privileged=true 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 --privileged=true 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+mariadb服務環境已經創建成功

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章