Dockerfile

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dockerfile相关的知识,希望对你有一定的参考价值。

Dockerfile格式

Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。Dockerfile从FROM命令开始,紧接着跟随者各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像。

技术分享图片

Dockerfile指令

技术分享图片

Build镜像 --》存为镜像

编辑dockerfile文件
[[email protected] wwwroot]# vi httpdfile

FROM centos:latest
MAINTAINER jacker
RUN yum install httpd -y
COPY index.html /var/www/html/
ENV HTTP_V=2.0
EXPOSE 80
WORKDIR /data/wwwroot
CMD ["httpd","-D","FOREGROUND"] #这个是httpd在前台运行

index.html 是放在/data/wwwroot/ 中,所以在最后要指定,不然系统找不到
[[email protected] ~]# docker build -t httpd:v1 -f httpdfile /data/wwwroot/

技术分享图片

[[email protected] wwwroot]# docker run -d httpd:v2

验证:
进入容器后,可以看到更改了index.html

构建业务基础镜像

快速部署LNMP网站平台

技术分享图片

构建php服务器

结构:
[[email protected] php-docker]# tree
.
├── Dockerfile-php
├── php-5.6.32.tar.gz
├── php-fpm.conf
└── php.ini

0 directories, 4 files

[[email protected] php-docker]# cat Dockerfile-php
FROM centos:7
MAINTAINER jacker
ENV VERSION=5.6.32
RUN yum install epel-release -y &&     yum install -y gcc gcc-c++ make gd-devel libxml2-devel     libcurl-devel libjpeg-devel libpng-devel openssl-devel     libmcrypt-devel libxslt-devel libtidy-devel autoconf     iproute net-tools telnet wget curl &&     yum clean all &&     rm -rf /var/cache/yum/*
COPY php-${VERSION}.tar.gz /

RUN cd / &&     tar zxf php-${VERSION}.tar.gz &&     mv php-${VERSION} /usr/local/ &&     cd /usr/local/php-${VERSION} &&     ./configure --prefix=/usr/local/php     --with-config-file-path=/usr/local/php/etc     --enable-fpm --enable-opcache     --with-mysql --with-mysqli --with-pdo-mysql     --with-openssl --with-zlib --with-curl --with-gd     --with-jpeg-dir --with-png-dir --with-freetype-dir     --enable-mbstring --with-mcrypt --enable-hash &&     make -j 4 && make install &&     cp php.ini-production /usr/local/php/etc/php.ini &&     cp sapi/fpm/php-fpm.conf /usr/local/php/etc/php-fpm.conf &&     sed -i "90a daemonize = no" /usr/local/php/etc/php-fpm.conf &&     mkdir /usr/local/php/log &&     cd / && rm -rf php* &&     cd /usr/local/ && rm -rf php-${VERSION}
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

ENV PATH $PATH:/usr/local/php/sbin
COPY php.ini /usr/local/php/etc/
COPY php-fpm.conf /usr/local/php/etc/
WORKDIR /usr/local/php
EXPOSE 9000
CMD ["php-fpm"]

执行(这一步是创建镜像):docker build -t php:v5.6.32 -f Dockerfile-php .

  • 说明:
  • 执行dockerfile是从上往下执行,跟shell执行顺序一致
  • ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 这个是设置时间,因为容器精装版的系统,没有crontab任务计划模块,需要自己安装
  • WORKDIR 工作目录,进入容器后就是/usr/local/php
  • 自己配置好php.ini、php-fpm.conf 再复制到容器上
  • EXPOSE:转发的端口
  • CMD:前台运行php-fpm ,这样好处:创建容器时就自动在前台运行,不用进入虚拟机开启php服务

构建nginx服务器
[[email protected] nginx-docker]# tree
.
├── Dockerfile-nginx
└── nginx.conf

[[email protected] nginx-docker]# cat Dockerfile-nginx 
FROM centos:7
MAINTAINER jacker
RUN yum install -y gcc gcc-c++ make          openssl-devel pcre-devel gd-devel          iproute net-tools telnet wget curl &&          yum clean all &&          rm -rf /var/cache/yum/*
RUN wget http://nginx.org/download/nginx-1.15.5.tar.gz &&         tar zxf nginx-1.15.5.tar.gz &&         cd nginx-1.15.5 &&         ./configure --prefix=/usr/local/nginx          --with-http_ssl_module          --with-http_stub_status_module &&         make -j 4 && make install &&         rm -rf /usr/local/nginx/html/* &&        echo "ok" >> /usr/local/nginx/html/status.html &&        cd / && rm -rf nginx-1.15.5* &&        ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

ENV PATH $PATH:/usr/local/nginx/sbin
COPY nginx.conf /usr/local/nginx/conf/nginx.conf
WORKDIR /usr/local/nginx
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

执行(这一步是创建镜像):docker build -t nginx:v1.15 -f Dockerfile-nginx-1.15 .

说明:
CMD:nginx前台运行,避免断开
nginx+php结合:是通过nginx.conf配置文件

技术分享图片

lnmp验证:
1、自定义网络
docker network create lnmp
2、创建Mysql容器
docker run -d --name lnmp_mysql --net lnmp --mount src=mysql-vol,dst=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wordpress mysql:5.7 --character-set-server=utf8
3、创建PHP容器
docker run -d --name lnmp_php --net lnmp --mount src=wwwroot,dst=/wwwroot php:v1
4、创建Nginx容器
docker run -d --name lnmp_nginx --net lnmp -p 88:80 --mount type=bind,src=$(pwd)/nginx.conf,dst=/usr/local/nginx/conf/nginx.conf --mount src=wwwroot,dst=/wwwroot nginx:v1
5、以wordpress博客为例
https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz
6、mv wordpress /var/lib/docker/volumes/wwwroot/_data/
7、cd  /var/lib/docker/volumes/wwwroot/_data/
8、[[email protected] _data]# cat test.php 
<?php phpinfo()?>
9、[[email protected] _data]# cat index.html 
lnmp

10、访问 http://192.168.1.13:88/wordpress/
                http://192.168.1.13:88/test.php
                                http://192.168.1.13:88 是否正常

11、数据库名是容器名称,这样来通信
技术分享图片

JAVA项目

以上是关于Dockerfile的主要内容,如果未能解决你的问题,请参考以下文章

构建 Dockerfile 使用非零代码 139 执行

dockerfile部署goweb项目

dockerfile部署goweb项目

dockerfile部署goweb项目

Dockerfile的理解

当使用CICD的Conducto时,我必须创建自己的dockerfile吗?