设为首页 收藏本站
查看: 1530|回复: 0

[经验分享] docker:Dockerfile构建LNMP平台

[复制链接]

尚未签到

发表于 2019-2-22 08:56:49 | 显示全部楼层 |阅读模式
1、dockerfile介绍

   Dockerfile是Docker用来构建镜像的文本文件,包含自定义的指令和格式。可以通过docker build命令从Dockerfile中构建镜像。这个过程与传统分布式集群的编排配置过程相似,且提供了一系列统一的资源配置语法。用户可以用这些统一的语法命令来根据需求进行配置,通过这份统一的配置文件,在不同的平台上进行分发,需要使用时就可以根据配置文件自动化构建,这解决了开发/运维人员构建镜像的复杂过程。同时,Dockerfile与镜像配合使用,使Docker在构建时可以充分利用镜像的功能进行缓存,大大提升了Docker的使用效率。

   用通俗一点的话来讲:dockerfile就是根据自己的需要自定义一个镜像,就像你写shell脚本一样,把一连串的过程或步骤全部写进dockerfile文件中,一步一步的执行dockerfile文件中你写的内容。

2、dockerfile指令


3、build命令

  Usage:docker  build  [OPTIONS]  PATH  | URL  | -

  OPTIONS:
-t ,--tag list  #构建后的镜像名称
-f, --file string #指定Dockerfiile文件位置
  示例:
1,docker build .
2,docker build  -t nginx:v10  .
3,docker build -t  nginx:v10  -f /path/Dockerfile  /path
  一般常用第2种方式构建,我们在构建时都会切换到Dockerfile文件的目录下进行构建,所以不需要指定-f参数。如果还不是很明白的话,下面我们来构建nginx镜像、php镜像来理解一下。

4、环境说明
  在本文中我都是基于centos 7官方镜像来构建、nginx和php用的源码包来构建,如果你不想用源码包,也可用yum方式构建:


  • nginx,用的是源码包来构建,版本为nginx-1.12.1.tar.gz,下载地址http://nginx.org/en/download.html/
  • php,也用的源码包来构建,版本为php-5.6.31.tar.gz,下载地址http://php.net/downloads.php
  在来看一下目录结构:

[root@ganbing /]# tree dockerfile/
dockerfile/
├── nginx
│   ├── Dockerfile
│   ├── nginx-1.12.1.tar.gz
│   └── nginx.conf
└── php
├── Dockerfile
├── php-5.6.31.tar.gz
└── php.ini

   其中,在dockerfile目录下创建了两个目录(nginx、php),里面分别存放Dockerfile文件、源码包。nginx目录下还放了nginx.conf配置文件,php目录下也放置了php.ini配置文件。

 有些人会问为什么要把nginx.conf、php.ini配置文件放到这里,有两个原因,其一,把这两个默认的配置文件放在这里可以提前修改好所需要的参数,当容器启动后,就不需要在进入容器去修改了。当然,我这里只是练习环境,并未对这两个文件做任何更改。其二,在实际环境中,这两个文件是经常需要修改的,单独拿出来后在启动容器时你可以把这两个文件mount到容器中,便于管理。

5、nginx构建
  5.1 Dockerfile内容

FROM centos:7
MAINTAINER blog.运维网.com/ganbing
ENV TIME_ZOME Asia/Shanghai
RUN yum -y install gcc gcc-c++ make openssl-devel pcre-devel
ADD nginx-1.12.1.tar.gz /tmp
RUN cd /tmp/nginx-1.12.1 && \
./configure --prefix=/usr/local/nginx && \
make -j 2 && \
make install
RUN rm -rf /tmp/nginx* && yum clean all && \
echo "${TIME_ZOME}" > /etc/timezone && \
ln -sf /usr/share/zoneinfo/${TIME_ZOME} /etc/localtime
COPY nginx.conf /usr/local/nginx/conf/
WORKDIR /usr/local/nginx/
EXPOSE 80
CMD ["./sbin/nginx","-g","daemon off;"]
  来分析一下上面的内容,当你构建时,它会根据你编排好的内容一步一步的执行下去,如果当中的某一步执行不下去,会立刻停止构建。上面的大部分指令都很好理解,在上文中的dockerifle指令中有介绍,最后一个指令我要详细说明一下:CMD ["./sbin/nginx","-g","daemon off;"]


  • /sbin/nginx 这个没什么说的,就是正常启动nginx服务;
  • -g: 设置配置文件外的全局指令,也就是启动nginx时设置了daemon off参数,默认参数是打开的on,是否以守护进程的方式运行nginx,守护进程是指脱离终端并且在后台运行的进程。这里设置为off,也就是不让它在后台运行。为什么我们启动nginx容器时不让它在后台运行呢,docker 容器默认会把容器内部第一个进程,也就是pid=1的程序作为docker容器是否正在运行的依据,如果docker 容器pid挂了,那么docker容器便会直接退出。
  5.2 nginx.conf内容

......
省略其它默认配置
......
server {
listen 80;
server_name localhost;
root html;
index index.html index.php;
location ~ \.php$ {
root html;
fastcgi_pass lnmp_php:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

  配置中主要添加了 location ~ .php这一段的内容,其中fastcgi_pass的 lnmp_php,这个是后面启动php容器时的名称。了解nginx原理的朋友应该能理解,当匹配到php的请求时,它会转发给lnmp_php这个容器php-fpm服务来处理。正常情况下,如果php服务不是跑在容器中,lnmp_php这个内容一般写php服务器的Ip地址。
  5.3 build构建
nginx源码包、nginx.conf、Dockerfile都准备好了之后,现在我们可以来用docker build来构建这个镜像了:

切换到nginx目录下:
[root@ganbing /]# cd /dockerfile/nginx/
[root@ganbing nginx]# ls
Dockerfile  nginx-1.12.1.tar.gz  nginx.conf
构建:
[root@ganbing nginx]# docker build  -t nginx:1.12.1 .
  5.4 查看镜像是否构建成功

[root@ganbing /]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               1.12.1              19b0dc5eb6bb        15 minutes ago      419MB
centos              7                   ff426288ea90        7 weeks ago         207MB

  nginx镜像已经构建好了,是不是还多了一个centos:7的镜像呢,这主要是在Dockerfile文件中你的FROM指令写的是centos:7,如果你的宿主机没有这个镜像,它就会从 hub.docker.co 中去pull这个镜像。

6、php构建
  6.1 Dockerfile内容

FROM centos:7
MAINTAINER blog.运维网.com/ganbing
ENV TIME_ZOME Asia/Shanghai
RUN yum install -y gcc gcc-c++ make gd-devel libxml2-devel libcurl-devel libjpeg-devel libpng-devel openssl-devel
ADD php-5.6.31.tar.gz /tmp/
RUN cd /tmp/php-5.6.31 && \
./configure --prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--with-mysql --with-mysqli \
--with-openssl --with-zlib --with-curl --with-gd \
--with-jpeg-dir --with-png-dir --with-iconv \
--enable-fpm --enable-zip --enable-mbstring && \
make -j 4 && \
make install
RUN cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf && \
sed -i 's/127.0.0.1/0.0.0.0/g' /usr/local/php/etc/php-fpm.conf && \
sed -i "21a daemonize=no" /usr/local/php/etc/php-fpm.conf && \
echo "${TIME_ZOME}" > /etc/timezone && \
ln -sf /usr/share/zoneinfo/${TIME_ZOME} /etc/localtime
COPY php.ini /usr/local/php/etc/
RUN rm -rf /tmp/php* && yum clean all
WORKDIR /usr/local/php/
EXPOSE 9000
CMD ["./sbin/php-fpm","-c","/usr/local/php/etc/php-fpm.conf"]
  上面内容和nginx的Dockerfile风格差不多,也是一步一步的来。先安装依赖包、解压、配置并编译,然后修改下配置文件,启动php-fpm服务。是不是发现写Dockerfile挺简单的,就是把你平时部署php服务的步骤思路写到这个Dockerfile里面。
  6.2 php.ini内容

  这个内容我没有修改,是默认的配置内容。

  6.3 build构建
php源码包、php.ini、Dockerfile都准备好了之后,现在我们可以来用docker build来构建这个镜像了:

切换到php目录下:
[root@ganbing /]# cd /dockerfile/php/
[root@ganbing php]# ls
Dockerfile  php-5.6.31.tar.gz  php.ini
构建:
[root@ganbing nginx]# docker build  -t php:5.6.31 .
  6.4 查看镜像是否构建成功

[root@ganbing php]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
php                 5.6.31              9ed5ccce1735        3 minutes ago       1GB
nginx               1.12.1              19b0dc5eb6bb        About an hour ago   419MB
centos              7                   ff426288ea90        7 weeks ago         207MB
7、运行容器

7.1 创建自定义网络lnmp
  先创建一个自定义网络,运行ningx、php这些容器的时候加入到lnmp网络中来:

先来查看一下默认的网络:
[root@ganbing php]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
8be78de1f4b8        bridge              bridge              local
d77497b635bb        host                host                local
637e45b21ed3        none                null                local
创建:
[root@ganbing php]# docker network  create  lnmp
49fbb89c7e83e5aa817973cab0db06eea9f3090597dc29d2649d79a8c23d8304
7.2 创建php容器
  创建容器:

[root@ganbing php]# docker run -itd --name lnmp_php --network lnmp --mount type=bind,src=/app/wwwroot,dst=/usr/local/nginx/html php:5.6.31
5676b229125a9372c454488a4e55e8542ca761cd682c34f061c051c511df2340
  参数说明:
-itd:   在容器中打开一个伪终端进行交互操作,并在后台运行;
--name: 为容器分配一个名字lnmp_php;
--network:为容器指定一个网络环境为lnmp网络;
--mout: 把宿主机的/app/wwwroot目录挂载到容器的/usr/local/nginx/html目录,挂载也相当于数据持久化;
php:5.6.31:指定刚才构建的php镜像来启动容器;
  查看php容器是否运行:

[root@ganbing php]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
5676b229125a        php:5.6.31          "./sbin/php-fpm -c /…"   3 seconds ago       Up 3 seconds        9000/tcp            lnmp_php
7.3 创建nginx容器
  创建容器:

[root@ganbing php]# docker run -itd --name lnmp_nginx --network lnmp -p 80:80 --mount type=bind,src=/app/wwwroot,dst=/usr/local/nginx/html nginx:1.12.1
5468c0acc0246eea4f931361218656721666f1ed4a292bb425f25880880e2b10
  上面的参数和创建php容器的参数差不多
  查看nginx容器是否运行:

[root@ganbing php]# docker ps -l
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
5468c0acc024        nginx:1.12.1        "./sbin/nginx -g 'da…"   30 seconds ago      Up 29 seconds       0.0.0.0:80->80/tcp   lnmp_nginx
  -l:这个参数的意思是显示最后创建的容器

7.4 测试访问
  其实到了这一步,我们可以创建一个index.html静态页面来访问一下:

[root@ganbing wwwroot]# echo "Dockerfile lnmp test" > /app/wwwroot/index.html
  我们把宿主机的/app/wwwroot目录已经挂载到容器的/usr/local/nginx/html目录中,所以直接弄个index.html来测试就行。
  用浏览器访问这台宿主机的ip:

  我们在弄个index.php文件来测试一下:

[root@ganbing wwwroot]# echo "

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-675569-1-1.html 上篇帖子: 通过 Service 访问 Pod 下篇帖子: docker:用registry快速搭建私有镜像仓库
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表