在上一章我们介绍了docker镜像的概念,并且介绍了构建镜像的两种方式

  1. 使用docker commit命令提交创建的容器。
  2. 使用Dockerfile文件和docker build命令,这种更为推荐和常见的方式构建docker镜像。

Dockerfile

  • 官方仓库虽然有数十万的镜像资源,但在绝大多数情况下都不符合我们的需求,通常我们都会自己构建镜像。Dockfile 是一种被 Docker 程序解释的脚本, Dockerfile 由一条一条的指令组成,每条指令对应 Linux 下面的一条命令。Docker 程序将这些 Dockerfile 指令翻译真正的Linux命令。Docker 程序将读取 Dockerfile,根据指令生成定制的 image。
  • 每一条指令就相当于给镜像加了一层,一共127层,务必惜字如金。
  • 常用命令如下:
options describe
FROM 基于哪个镜像构建新镜像
LABEL maintainer 镜像维护者信息
RUN 构建镜像时运行的Shell命令
COPY 拷贝文件或目录到镜像中
CMD 运行容器时执行,如果有多个CMD指令,最后一个生效
ENTRYPOINT 运行容器时执行,如果有多个CMD指令,最后一个生效。可单独使用,也可与CMD配合使用
USER 为RUN、CMD、ENTRYPOINT执行指令指定运行用户
EXPOSE 声明容器运行的服务端口
WORKDIR 为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录
VOLUME 指定挂载点,使容器中的一个目录具有持久化存储数据的功能
ENV 设置环境变量

注意的是:

  1. 一次 RUN 指令形成新的一层,进程让shell命令都写在一行,减少镜像层,一个镜像是不能超过 127 层的,在使用 RUN 指令时,可以在每条 shell 命令的结尾用转义换行 ""。
  2. 一次 RUN 形成新的一层,如果没有在同一层删除,无论文件是否最后删除,都会带到下一层,所以要在每一层清理对应的残留数据,减少镜像大小。比如 yum 之后,清一下缓存。

一、构建部署Nginx

$ tree web/
web/
├── base
│?? └── Dockerfile_nginx
└── project
├── Dockerfile_nginx
└── nginx.conf
  • base文件夹下的Dockerfile_nginx如下:(构建通用的nginx镜像)
FROM centos:latest
LABEL maintainer="jhzhang <zhangjiahao123456@163.com>"
RUN yum install -y gcc gcc-c++ make \
openssl-devel pcre-devel gd-devel libxslt-devel \
iproute net-tools telnet wget curl && \
yum clean all && \
rm -rf /var/cache/yum/* RUN wget http://nginx.org/download/nginx-1.14.0.tar.gz && \
tar -zxf nginx-1.14.0.tar.gz && \
cd nginx-1.14.0 && \
./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_image_filter_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_secure_link_module \
--with-http_stub_status_module \
--with-stream \
--with-stream_ssl_module && \
make -j $(grep processor /proc/cpuinfo | wc -l) && make install && \
cd / && rm -rf nginx-1.14.0* ENV PATH $PATH:/usr/local/nginx/sbin
WORKDIR /usr/local/nginx
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
  • 构建镜像
docker build -t nginx1.14 -f Dockerfile_nginx ./
  • 进入项目project文件夹

    project文件夹下的nginx.conf如下:(构建通用的nginx镜像)
user  nobody;
worker_processes 1;
error_log logs/error.log info;
events {
worker_connections 4096;
}
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"';
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
charset utf-8;
access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
} }
}

project文件夹下的Dockerfile_nginx如下:(构建通用的nginx镜像)

FROM nginx1.14
COPY nginx.conf /usr/local/nginx/conf/
  • 构建项目镜像

    docker build -t nginx:v1 -f Dockerfile_nginx ./
  • 启动容器
docker network create web
docker volume create wwwroot
docker container run -d --name web_nginx -p 88:80 --network lnmp -v wwwroot:/usr/local/nginx/html nginx:v1
  • 浏览器访问127.0.0.1:80

二、构建部署Tomcat

  • Java 程序依赖于 JDK 环境,我们可以把 JDK 放在宿主机上,容器以挂载形式使用,减少镜像大小及提高性能。
tar -zxf jdk-8u91-linux-x64.tar.gz
sudo mv jdk1.8.0_91/ /usr/local/jdk1.8
  • 文件结构
tree java/
java/
├── apache-tomcat-8.5.16.tar.gz
└── Dockerfile
0 directories, 2 files
  • java文件夹下的Dockerfile内容
FROM centos:latest
LABEL maintainer="jhzhang <zhangjiahao123456@163.com>" ENV VERSION=8.5.35
ENV JAVA_HOME=/usr/local/jdk RUN yum install wget curl unzip iproute net-tools glibc.i686 -y && \
yum clean all && \
rm -rf /var/cache/yum/* COPY . / RUN 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/* && \
mkdir /usr/local/tomcat/webapps/ROOT && \
echo '<h1>Hello,Tomcat!</h1>' > /usr/local/tomcat/webapps/ROOT/status.html && \
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 ENV PATH $PATH:/usr/local/tomcat/bin
ENV PATH $PATH:/usr/local/jdk/bin
WORKDIR /usr/local/tomcat
EXPOSE 8080
CMD ["catalina.sh", "run"]
  • 构建镜像

    $ docker build -t tomcat8:latest ./
  • 启动容器

    docker container run -d --name tomcat_srv -p 89:8080 -v /usr/local/jdk1.8/:/usr/local/jdk tomcat8:latest
  • 浏览器打开127.0.0.1:89/status.html

参考

Docker之镜像管理及Dockerfile

Dockerfile命令详解(超全版本)

使用Dockerfile搭建jdk、tomcat运行环境

05_Dockerfile实战(上)的更多相关文章

  1. 云原生强大且灵活的持续集成CI开源框架Tekton实战-上

    @ 目录 概述 定义 常见CICD工具 使用好处 组件 基本概念 安装 前提条件 安装Tekton Pipelines 创建并运行任务 安装Dashboard 安装Cli Pipelines示例演示 ...

  2. 小D课堂 - 新版本微服务springcloud+Docker教程_5-03 feign结合hystrix断路器开发实战上

    笔记 3.Feign结合Hystrix断路器开发实战<上>     简介:讲解SpringCloud整合断路器的使用,用户服务异常情况 1.加入依赖          注意:网上新旧版本问 ...

  3. JUC并发编程与高性能内存队列disruptor实战-上

    JUC并发实战 Synchonized与Lock 区别 Synchronized是Java的关键字,由JVM层面实现的,Lock是一个接口,有实现类,由JDK实现. Synchronized无法获取锁 ...

  4. Apache DolphinScheduler新一代分布式工作流任务调度平台实战-上

    概述 定义 dolphinscheduler 官网地址 https://dolphinscheduler.apache.org/ dolphinscheduler GitHub地址 https://g ...

  5. PyQT5速成教程-4 Qt Designer实战[上]

    本文由 沈庆阳 所有,转载请与作者取得联系! 前言 在前面几节的学习中,我们对PyQt的基本使用.Qt Designer与Python编码的工作流程有了基本的学习.同时也掌握了Qt Designer中 ...

  6. Jsp入门实战上

    前面讲了servlet入门实践现在开始介绍jsp入门实践,开发环境的搭建请参考我前面的tomcat的文章,jsp入门教程分为上下两部分,第一部分简单讲解:jsp语法的规范,以及三大编译指令,七个动作指 ...

  7. 云原生下基于K8S声明式GitOps持续部署工具ArgoCD实战-上

    @ 目录 概述 定义 工作原理 主要组件 核心概念 环境准备 概述 安装Kubekey 创建K8S 安装K9S OpenLB 安装ArgoCD 安装 ArgoCD CLI 从Git库中创建一个应用程序 ...

  8. 成熟企业级开源监控解决方案Zabbix6.2关键功能实战-上

    @ 目录 概述 定义 监控作用 使用理解 监控对象和指标 架构组成 常用监控软件分析 版本选型 俗语 安装 部署方式 部署 zabbix-agent 概述 定义 Zabbix 官网地址 https:/ ...

  9. BDD敏捷开发入门与实战

    BDD敏捷开发入门与实战 1.BDD的来由 2003年,Dan North首先提出了BDD的概念,并在随后开发出了JBehave框架.在Dan North博客上介绍BDD的文章中,说到了BDD的想法是 ...

随机推荐

  1. MyEclipse去除网上复制下来的代码带有的行号(使用正则表达式)

    一.正则表达式去除代码行号 作为开发人员,我们经常从网上复制一些代码,有些时候复制的代码前面是带有行号,如: MyEclipse本身自带有查找替换功能,并且支持正则表达式替换,使用正则替换就可以很容易 ...

  2. js如何获取response header信息

    信息转自网上 普通的请求JS无法获取,只有ajax请求才能获取到. $.ajax({ type: 'HEAD', // 获取头信息,type=HEAD即可 url : window.location. ...

  3. python 类方法的互相调用及self的含义

    每次调用内部的方法时,方法前面加 self.   class MyClass: def __init__(self): pass def func1(self): # do something pri ...

  4. Linux 中常用命令

    命令基本格式: 命令提示符:[root@localhost ~]#      root 代表当前的登录用户(linux当中管理员账号是root)      @ 无实际意义      localhost ...

  5. ListView中Item与Checkable子类控件抢焦点问题

    Android开发中,经常需要为ListView定制Adapter,绑定各种子类控件.如果Item包含Button等Checkable的控件,那么就会发生点击Item无法响应的问题.原因是自己定义的I ...

  6. token 和 服务器端auth0-JWT包的使用

    移动客户端和服务器端在用户登录上经常使用的是一个叫做token的认证方法 token是什么? token顾名思义, 令牌, 意思就是说,第一次用户登录验证之后,服务器返回一个token令牌,之后客户端 ...

  7. Windows server 2008系统各类版本的优缺点比较,Windows2008系统标准版 企业版 数据中心版 WEB版等

    大家都知道Windows Server 2008 发行了多种版本,以支持各种规模的企业对服务器不断变化的需求.Windows Server 2008 有 5 种不同版本,另外还有三个不支持 Windo ...

  8. Android开发精彩博文收藏——UI界面类

    本文收集整理Android开发中关于UI界面的相关精华博文,共大家参考!本文不定期更新! 1. Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各 ...

  9. August 09th 2017 Week 32nd Wednesday

    Find hope from despair, life will become brilliant. 从绝望中寻找希望,人生终将辉煌. Have you ever seen the movie Ba ...

  10. ZT自老罗的博客 Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析

    Android系统的智能指针(轻量级指针.强指针和弱指针)的实现原理分析 分类: Android 2011-09-23 00:59 31568人阅读 评论(42) 收藏 举报 androidclass ...