Dockerfile格式

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

docker Dockerfile、构建php、java、lnmp项目

Dockerfile指令

docker Dockerfile、构建php、java、lnmp项目

Build镜像 --》存为镜像

编辑dockerfile文件
[root@docker 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/ 中,所以在最后要指定,不然系统找不到
[root@docker ~]# docker build -t httpd:v1 -f httpdfile /data/wwwroot/

docker Dockerfile、构建php、java、lnmp项目

[root@docker wwwroot]# docker run -d httpd:v2

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

构建业务基础镜像

快速部署LNMP网站平台

docker Dockerfile、构建php、java、lnmp项目

构建php服务器

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

0 directories, 4 files

docker Dockerfile、构建php、java、lnmp项目

[root@docker 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服务器
[root@docker nginx-docker]# tree
.
├── Dockerfile-nginx
└── nginx.conf

docker Dockerfile、构建php、java、lnmp项目

[root@docker 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配置文件

docker Dockerfile、构建php、java、lnmp项目

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、[root@docker _data]# cat test.php 
<?php phpinfo()?>
9、[root@docker _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、数据库名是容器名称,这样来通信
docker Dockerfile、构建php、java、lnmp项目

JAVA项目
[root@docker tomcat-docker]# tree -L 1
.
├── apache-tomcat-8.5.32
├── apache-tomcat-8.5.32.tar.gz
├── Dockerfile-tomcat
├── jdk-8u11-linux-x64.tar.gz
├── jdk-8u65-linux-x64.gz
├── jenkins.war
├── profile
├── setclasspath.sh
└── update_war
docker Dockerfile、构建php、java、lnmp项目

[root@docker tomcat-docker]# cat Dockerfile-tomcat
FROM centos:7
MAINTAINER jacker

ENV VERSION=8.5.32
COPY jdk-8u11-linux-x64.tar.gz /
COPY apache-tomcat-8.5.32.tar.gz /

RUN yum install wget curl unzip iproute net-tools -y && \
yum clean all && \
rm -rf /var/cache/yum/*

RUN cd / && \
tar xf jdk-8u11-linux-x64.tar.gz && mv jdk1.8.0_11/ /usr/local/jdk1.8
#RUN wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v${VERSION}/bin/apache-tomcat-${VERSION}.tar.gz && \
RUN cd / && \
tar zxf apache-tomcat-${VERSION}.tar.gz && \
mv apache-tomcat-${VERSION} /usr/local/tomcat && \
rm -rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat/webapps/* && \
sed -i '1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"' /usr/local/tomcat/bin/catalina.sh && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
COPY setclasspath.sh /usr/local/tomcat/bin
#COPY profile /etc
#RUN source /etc/profile
ENV PATH $PATH:/usr/local/tomcat/bin

WORKDIR /usr/local/tomcat

EXPOSE 8080
CMD ["catalina.sh", "run"]

**说明:
setclasspath.sh 添加如下三行:
export JAVA_HOME=/usr/local/jdk1.8/
export JAVA_BIN=/usr/local/jdk1.8/bin
export JRE_HOME=/usr/local/jdk1.8/jre

**
docker Dockerfile、构建php、java、lnmp项目

构建镜像:
必须在/data/docker/tomcat-docker 目录下,因为. 表示copy的文件都在这个目录
docker build -t tomcat:v8.5.32 -f Dockerfile-tomcat .

docker run -d --name tomcat-op --mount src=webapps,dst=/usr/local/tomcat/webapps/ -p 8180:8080 tomcat:v8.5.32
ln -sf /var/lib/docker/volumes/webapps/_data webapps
cp jenkins.war /data/webapps/

访问:http://192.168.1.13:8180/jenkins/login?from=%2Fjenkins%2F

注意:构建完成镜像后查看如果容器是关闭的,说明有问题
以下是正常的
docker Dockerfile、构建php、java、lnmp项目

查看日志:
docker logs b8a04a1bfe34 -f