一.Dockerfile指令

指令

描述

指令

描述

FROM

构建的新镜像是基于哪个镜像 例如:FROM centos:6

COPY

拷贝文件或目录到镜像,用法同上例如:COPY ./start.sh /start.sh

MAINTAINER

镜像维护者姓名或邮箱地址 例如:MAINTAINER fruit

ENTRYPOINT

ENTRYPOINT的格式和RUN指令格式一样,分为exec格式和shell格式。ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数。ENTRYPOINT在运行时 也可以替代,不过比CMD要略显繁琐,需要通过docker run的参数–entrypoint来指定。 当指定了ENTRYPOINT后,CMD的含义就发生了改变,不再是直接的运行其命令,而是将CMD的内容作为参数传给ENTRYPOINT指令。

运行容器时执行的Shell命令
例如:
ENTRYPOINT [“/bin/bash", “-c", “/start.sh"]
ENTRYPOINT /bin/bash -c ‘/start.sh’

RUN

构建镜像时运行的Shell命令
例如:
RUN [“yum”, “install”, “httpd”]
(exec执行形式)

RUN yum install httpd. (shell形式,该命令在shell中运行,默认情况下/bin/sh -c在Linux中运行)

VOLUME

指定容器挂载点到宿主机自动生成的目录或其他容器
例如:
VOLUME ["/var/lib/mysql"]

CMD

CMD的主要是为一个正运行的容器提供默认执行命令。

如果存在多个CMD指令,那么只有最后一个会被执行。如果在容器运行时指定了命令,则CMD指定的默认内容会被替代。

通常在最后,启动一个前台服务保证服务可持续运行

运行容器时执行的Shell命令
例如:
CMD [“-c”, “/start.sh”]

CMD ["/usr/sbin/sshd", "-D"]

CMD /usr/sbin/sshd –D

USER

为RUN、CMD和ENTRYPOINT执行命令指定运行用户
USER <user>[:<group>] or USER <UID>[:<GID>]
例如:USER fruit

EXPOSE

声明容器运行的服务端口
例如:EXPOSE 80 443

WORKDIR

为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录
例如:WORKDIR /data

ENV

设置容器内环境变量
例如:ENV MYSQL_ROOT_PASSWORD 123456

HEALTHCHECK

健康检查
HEALTHCHECK --interval=5m --timeout=3s --retries=3 \

CMD curl -f http://localhost/ || exit 1

ADD

拷贝文件或目录到镜像,如果是URL或压缩包会自动下载或自动解压

ADD <src>... <dest>
ADD [“<src>”,... “<dest>”]
ADD https://xxx.com/html.tar.gz /var/www/html

ADD html.tar.gz /var/www/html

ARG

在构建镜像时指定一些参数 例如:
FROM centos:6
ARG user # ARG user=root

USER $user

# docker build --build-arg user=fruit Dockerfile .


二.Build镜像命令  

Usage: docker image build [OPTIONS] PATH | URL | - Options:
  -t, --tag list # 镜像名称
  -f, --file string # 指定Dockerfile文件位置

示例:
  docker build .
  docker build -t shykes/myapp .
  docker build -t shykes/myapp -f /path/Dockerfile /path

  ##从网络中构建

  docker build -t shykes/myapp http://www.example.com/Dockerfile.

三.构建PHP网站环境镜像(切记安装目录中存在php-5.6.31.tar.gz,php.ini)

FROM centos:7
MAINTAINER www.fruit.com
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 && \
    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/" /usr/local/php/etc/php-fpm.conf && \
    sed -i "21a \daemonize = no" /usr/local/php/etc/php-fpm.conf
COPY php.ini /usr/local/php/etc

RUN rm -rf /tmp/php-5.6.31* && yum clean all

WORKDIR /usr/local/php
EXPOSE 9000
CMD ["./sbin/php-fpm", "-c", "/usr/local/php/etc/php-fpm.conf"]

四.构建nginx环境镜像(切记下载依赖包)

----Dockerfile----

FROM centos:7
MAINTAINER www.xubl.com
RUN yum install -y 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-1.12.1* && yum clean all

COPY nginx.conf /usr/local/nginx/conf

WORKDIR /usr/local/nginx
EXPOSE 80
CMD ["./sbin/nginx", "-g", "daemon off;"]

----nginx.conf----

user  root;
worker_processes  auto;

error_log  logs/error.log  info;

pid        logs/nginx.pid;

events {
    use epoll;
}

http {

include       mime.types;
    default_type  application/octet-stream;

log_format  main '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

access_log logs/access.log main;
    sendfile        on;
    keepalive_timeout  65;

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;
        }
    }
}

# docker image build -t nginx:v1 -f Dockerfile .

五.部署lnmp

1、自定义网络

docker network create lnmp

2、创建PHP容器

# docker run -itd --name lnmp_php --net lnmp --mount type=bind,src=/app/wwwroot/,dst=/usr/local/nginx/html php:v1

3、创建Nginx容器

# docker run -itd --name lnmp_nginx --net lnmp -p 888:80 --mount type=bind,src=/app/wwwroot/,dst=/usr/local/nginx/html nginx:v1

4、创建MySQL容器(如果之前存在lnmp_mysql可不执行)

# docker run -itd --name lnmp_mysql --net lnmp -p 3306:3306 --mount src=mysql-vol,dst=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 --character-set-server=utf8

 
  
测试是否部署成功:
echo "<?php phpinfo();?>"  > /app/wwwroot/index.php
http://192.168.2.73:888/
http://192.168.2.73:88/wordpress

六.构建JAVA网站环境镜像

FROM centos:7
MAINTAINER www.xubl.com

ADD jdk-8u45-linux-x64.tar.gz /usr/local
ENV JAVA_HOME /usr/local/jdk1.8.0_45

ADD apache-tomcat-8.0.46.tar.gz /usr/local
COPY server.xml /usr/local/apache-tomcat-8.0.46/conf

WORKDIR /usr/local/apache-tomcat-8.0.46
EXPOSE 8080
ENTRYPOINT ["./bin/catalina.sh", "run"]

创建容器:

mkdir -p /app/webapps/

docker
run -itd --name=tomcat -p 8080:8080 --mount
type=bind,src=/app/webapps/,dst=/usr/local/apache-tomcat-8.0.46/webapps 
tomcat:v1

mkdir -p /app/webapps/ROOT/

vim /app/webapps/ROOT/index.html

hello

http://192.168.2.73:8080/

七.书写Dockerfile总结

  1.先创建一个基础系统镜像,然后exec进入到容器内,再把无问题的部署命令复制到dockerfile中

2.不经常修改的文件打包到镜像中,经常改变的配置文件可以用type=bind方式每次只要修改宿主机文件或者nfs文件即可.

备注:依赖包下载地址

tomcat 链接:https://pan.baidu.com/s/1jkC8VoGODK_1JaZKpcc8aw  密码:ndj2

nginx  链接:https://pan.baidu.com/s/1hCPMigLSCuoJpRzCa3bq7w  密码:4le2

pph 链接:https://pan.baidu.com/s/1sRv7azcx5rAnuk5zZZyPzA  密码:5ffk

Docker进阶之九:Dockerfile 及 通过Dockerfile搭建lnmp的更多相关文章

  1. docker创建nginx+php-fpm+mysql环境(一分钟搭建lnmp)

    下载镜像 docker pull bitnami/php-fpm #下载php-fpm镜像 docker pull nginx #下载nginx镜像docker pull mysql:5.5.59 # ...

  2. Docker快速搭建LNMP环境

    一.使用Dockerfile制作镜像 前面的博客中已经介绍了如何基于容器制作镜像,此方法的原理是使用一个正在运行的容器,根据生产所需进行配置更改等操作后,使其满足生产环境,再将这个容器打包制作为镜像, ...

  3. Docker进阶:容器卷、DockerFile、Docker网络原理

    1.Docker镜像 1.1镜像是什么 镜像是一种轻量级.可执行的独立软件包,用来打包软件运行环境和机遇运行环境开发的软件. 包含一个软件的所有内容.蒋所有的应用和环境,直接打包为docker镜像,直 ...

  4. Docker学习笔记之二,基于Dockerfile搭建JAVA Tomcat运行环境

    前言 在第一篇文字中,我们完全人工方式,一个命令一个命令输入,实现一个 java tomcat运行环境,虽然也初见成效,但很累人.如果依靠依靠脚本构建一个Tomcat容器实例,一个命令可以搞定,何乐而 ...

  5. Docker入门系列之三:如何将dockerfile制作好的镜像发布到Docker hub上

    这个系列的前两篇文章,我们已经把我们的应用成功地在Docker里通过nginx运行了起来,并且用dockerfile里制作好了一个镜像. Docker入门系列之一:在一个Docker容器里运行指定的w ...

  6. 面试官:你说你精通 Docker,那你来详细说说 Dockerfile 吧

    接上一篇:30分钟快速上手Docker,看这篇就对了! 一. 带着问题学Dockerfile 1.疑问 我们都知道从远程仓库可以pull一个tomcat等镜像下来,然后docker run启动容器,然 ...

  7. 掌握了Docker Layer Caching才敢自称精通Dockerfile

    长话短说: 本次原创将向您展示在Docker中使用Layer Cache以加快镜像构建. 这个话题的初衷在于:应用程序打包过程是很慢的(下载并安装框架&第三方依赖包.生成assets),这在D ...

  8. Docker:四、Docker进阶 Windows Docker IIS 部署

    前面的三篇docker 文档大家看的肯定不过瘾,自己可能也已经上手一试了...不知道有没有发现问题... 哈哈... 我来说说我遇到的问题哦 一.windows docker 镜像越来越大 默认的do ...

  9. 测试工程师Docker进阶

    学习整理来源 B站 狂神说Java https://space.bilibili.com/95256449/ 四.docker镜像 1.镜像是什么 镜像是一种轻量级.可执行的独立软件包,用来打包软件运 ...

随机推荐

  1. bzoj2437 [Noi2011]兔兔与蛋蛋

    二分图博弈果然都是一个套路,必经点必胜,非必经点必败, 但是肯定不能每走一步就重新建图判断必胜还是必败,那么我们可以这样:每走一步就把这个点删掉,然后find他原来的匹配,如果找不到,就说明他是必经点 ...

  2. codeForces 472D 最小生成树

    题目大意:给出一个图中点的两两距离,问是否是一棵树,若是,求出平均边权最大的点 prim最小生成树,若原图是树,则最小生成树的距离就是原距离.否则不是. 搞出来树了,第二问随便dfs就好了. #inc ...

  3. bzoj 4318 OSU 概率期望dp

    可以发现:f[i]转移到f[i+1]只和最后一串1的长度和平方有关, 因为如果新加的位置是1,贡献就是(x+1)^3-x^3=3x^2+3x+1,否则为0: 所以对于每一个位置,处理出期望的f,x和x ...

  4. QTimer在QThread环境中失效的问题

    QTimer在非QThread的环境下能正常工作.但在QThread环境下,需要做一些改动才能正常工作. 创建Qt的线程有两种方式: 1. 子例化QThread 可以在虚函数run中启动定时器,大致的 ...

  5. Python多版本管理-pyenv

    经常遇到这样的情况: 系统自带的Python是2.x,自己需要Python 3.x,此时需要在系统中安装多个Python,但又不能影响系统自带的Python,即需要实现Python的多版本共存,pye ...

  6. Java注解(二):实战 - 直接使用对象列表生成报表

    通过对Java注解(一):介绍,思想及优点学习了解,相信大家对Java注解有一定程度的了解,本篇文章将实战项目中的应用来加深对Java注解的了解. 本实例实现根据指定字段的JavaBean,生成对应列 ...

  7. asp.net core系列 53 IdentityServer4 (IS4)介绍

    一.概述 在物理层之间相互通信必须保护资源,需要实现身份验证和授权,通常针对同一个用户存储.对于资源安全设计包括二个部分,一个是认证,一个是API访问. 1 认证 认证是指:应用程序需要知道当前用户的 ...

  8. java游戏开发杂谈 - 实现游戏主菜单

    经常玩游戏的同学,大家都知道,游戏都会有个主菜单,里面有多个菜单选项:开始游戏.游戏设置.关于游戏.退出游戏等等,这个菜单是怎么实现的呢. 有一定桌面软件开发基础的同学可能会想到,用JButton组件 ...

  9. 【由浅至深】redis 实现发布订阅的几种方式

    非常感谢依乐祝发表文章<.NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐>,对csredis作了一次完整的诠释. 前言 提到消息队列,最熟悉无疑是 rabbitmq,它基 ...

  10. 游戏UI框架设计(6): 消息传递中心

    游戏UI框架设计(6) --消息传递中心 最近一直忙于一个益智类游戏的研发工作,所以博客有段时间没有更新了.经过朋友的督促,决定这两天立刻完成最后的两篇博客讲解(UI框架).说起“消息传递中心”,或者 ...