在编辑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 <272666745@qq.com> 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

特别说明:此时的MySQL实例只能以 root 从本地访问,可手动配置root密码以及访问权限等。--privileged=true container内的root拥有真正的root权限,容器会被允许直接配置主机的网络堆栈;否则,container内的root只是外部的一个普通用户权限。

四.构建php镜像并运行php-fpm容器

1.编辑Dockerfile-PHP-FPM

FROM ubuntu
MAINTAINER cenze <272666745@qq.com> 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-jpeg-dir=/usr/lib/x86_64-linux-gnu \
--with-png-dir=/usr/lib/x86_64-linux-gnu \
--with-gd \
--enable-exif \
--enable-bcmath \ #如果没有自带libbcmath,就sudo apt-get install php-bcmath
"\
&& ./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 <272666745@qq.com> 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

特别说明:$cfg['Servers'][$i]['host'] = 'your-real-ip';

3)访问地址http://localhost/phpMyAdmin将出现下图,说明基于容器的nginx+php+mariadb服务环境已经创建成功

Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境的更多相关文章

  1. Docker笔记--镜像&基于GO项目创建Docker镜像

    Docker笔记--镜像&基于GO项目创建Docker镜像 核心概念 Doker镜像--包含一个基本的操作系统运行环境和应用程序,镜像是创建Docker容器的基础. Docker容器--如果把 ...

  2. Docker笔记--ubuntu安装docker

    Docker笔记--ubuntu安装docker 1.更换国内软件源,推荐中国科技大学的源,稳定速度快(可选) sudo cp /etc/apt/sources.list /etc/apt/sourc ...

  3. docker笔记(3)—— 容器

    操作环境:mac OS 10.14.6 docker版本:10.03.1 终端:iterm2 3.3 时间:2019年8月 容器相当于镜像的实例,镜像相当于只读模板,容器在镜像所有层级之上创建了一个可 ...

  4. docker笔记(2)-----容器连接

    2019-01-12  13:57:36 Dockerfile基本结构: 基础镜像内容:FROM指明base image 维护者信息: 镜像操作指令:RUN指令,每运行一条RUN指令,镜像添加新的一层 ...

  5. 一、【Docker笔记】进入Docker世界

    ​ 我们平时判断一个电脑的性能主要看什么?磁盘读写?CPU的主频高低?还是内存的大小?可是作为个人使用者来说,这些参数高一些足够我们去使用了,可是对于一个大型系统甚至是超大型系统,当前的硬件是远远达不 ...

  6. Docker笔记1:Docker 的介绍

    目  录 1.Docker 简介 2.Docker 特性 3.Docker 应用场景 4.Docker 优点 1.Docker 简介     Docker 提供了一个可以运行你的应用程序的封套(env ...

  7. docker初识-docker安装、基于docker安装mysql及tomcat、基本命令

    一.docker是什么 用go语言开发,开源的应用容器引擎,容器性能开销极低 二.整体架构图 Docker 包括三个基本概念: 镜像(Image):Docker 镜像(Image),就相当于是一个 r ...

  8. Docker笔记一:Docker介绍

    目录 什么是Docker? Docker的核心概念 Docker镜像命令 Docker容器命令 Docker实战 查看我的镜像 启动Redis Docker中国镜像加速 血与泪的教训 什么是Docke ...

  9. Docker笔记7:Docker 命令自动补齐

    经常大家会碰到这种现象,Docker 已经安装好了,但是使用 docker 命令时 不能自动补齐,即输入 docker 命令后,按 Tab 键无法列出子命令(或参数)的候选项. [机制] Linux ...

随机推荐

  1. java: web应用中不经意的内存泄露

    前面有一篇讲解如何在spring mvc web应用中一启动就执行某些逻辑,今天无意发现如果使用不当,很容易引起内存泄露,测试代码如下: 1.定义一个类App package com.cnblogs. ...

  2. java中的锁

    java中有哪些锁 这个问题在我看了一遍<java并发编程>后尽然无法回答,说明自己对于锁的概念了解的不够.于是再次翻看了一下书里的内容,突然有点打开脑门的感觉.看来确实是要学习的最好方式 ...

  3. 快速构建H5单页面切换骨架

    在Web App和Hybrid App横行的时代,为了拥有更好的用户体验,单页面应用顺势而生,单页面应用简称`SPA`,即Single Page Application,就是只有一个HTML页面的应用 ...

  4. 【声明】前方不设坑位,不收费!~ 我为NET狂官方学习计划

    发个通知,过段时间学习计划相关的东西就出来了,上次写了篇指引文章后有些好奇心颇重的人跟我说:“发现最近群知识库和技能库更新的频率有点大,这是要放大招的节奏啊!” 很多想学习却不知道如何规划的人想要一个 ...

  5. 模仿Linux内核kfifo实现的循环缓存

    想实现个循环缓冲区(Circular Buffer),搜了些资料多数是基于循环队列的实现方式.使用一个变量存放缓冲区中的数据长度或者空出来一个空间来判断缓冲区是否满了.偶然间看到分析Linux内核的循 ...

  6. iOS有关横向TableView的东西

    之前看到Apple store里面有横向的tableview,当然也有可能是collectionview啦. 尤其是项目中只有一条那么需要横向滑动的东西,就没有必要使用庞大的collectionvie ...

  7. Josephus环类问题,java实现

    写出一个双向的循环链表,弄一个计数器,我定义的是到三的时候,自动删除当前节点,很简单. package Com; import java.util.Scanner; /* * 约瑟夫环问题,有n个人组 ...

  8. Hilbert-Huang Transform(希尔伯特-黄变换)

    在我们正式开始讲解Hilbert-Huang Transform之前,不妨先来了解一下这一伟大算法的两位发明人和这一算法的应用领域 Section I 人物简介 希尔伯特:公认的数学界“无冕之王”,1 ...

  9. 使用CocosSharp制作一个游戏 - CocosSharp中文教程

    注:本教程翻译自官方<Walkthrough - Building a game with CocosSharp>,官方教程有很多地方说的不够详细,或者代码不全,导致无法继续,本人在看了G ...

  10. 避免调试代码导致IE出错

    记录一下 if(!window.console){ var names = ["log", "debug", "info", "w ...