05_Dockerfile实战(上)
在上一章我们介绍了docker镜像的概念,并且介绍了构建镜像的两种方式
- 使用
docker commit
命令提交创建的容器。 - 使用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 | 设置环境变量 |
注意的是:
- 一次 RUN 指令形成新的一层,进程让shell命令都写在一行,减少镜像层,一个镜像是不能超过 127 层的,在使用 RUN 指令时,可以在每条 shell 命令的结尾用转义换行 ""。
- 一次 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实战(上)的更多相关文章
- 云原生强大且灵活的持续集成CI开源框架Tekton实战-上
@ 目录 概述 定义 常见CICD工具 使用好处 组件 基本概念 安装 前提条件 安装Tekton Pipelines 创建并运行任务 安装Dashboard 安装Cli Pipelines示例演示 ...
- 小D课堂 - 新版本微服务springcloud+Docker教程_5-03 feign结合hystrix断路器开发实战上
笔记 3.Feign结合Hystrix断路器开发实战<上> 简介:讲解SpringCloud整合断路器的使用,用户服务异常情况 1.加入依赖 注意:网上新旧版本问 ...
- JUC并发编程与高性能内存队列disruptor实战-上
JUC并发实战 Synchonized与Lock 区别 Synchronized是Java的关键字,由JVM层面实现的,Lock是一个接口,有实现类,由JDK实现. Synchronized无法获取锁 ...
- Apache DolphinScheduler新一代分布式工作流任务调度平台实战-上
概述 定义 dolphinscheduler 官网地址 https://dolphinscheduler.apache.org/ dolphinscheduler GitHub地址 https://g ...
- PyQT5速成教程-4 Qt Designer实战[上]
本文由 沈庆阳 所有,转载请与作者取得联系! 前言 在前面几节的学习中,我们对PyQt的基本使用.Qt Designer与Python编码的工作流程有了基本的学习.同时也掌握了Qt Designer中 ...
- Jsp入门实战上
前面讲了servlet入门实践现在开始介绍jsp入门实践,开发环境的搭建请参考我前面的tomcat的文章,jsp入门教程分为上下两部分,第一部分简单讲解:jsp语法的规范,以及三大编译指令,七个动作指 ...
- 云原生下基于K8S声明式GitOps持续部署工具ArgoCD实战-上
@ 目录 概述 定义 工作原理 主要组件 核心概念 环境准备 概述 安装Kubekey 创建K8S 安装K9S OpenLB 安装ArgoCD 安装 ArgoCD CLI 从Git库中创建一个应用程序 ...
- 成熟企业级开源监控解决方案Zabbix6.2关键功能实战-上
@ 目录 概述 定义 监控作用 使用理解 监控对象和指标 架构组成 常用监控软件分析 版本选型 俗语 安装 部署方式 部署 zabbix-agent 概述 定义 Zabbix 官网地址 https:/ ...
- BDD敏捷开发入门与实战
BDD敏捷开发入门与实战 1.BDD的来由 2003年,Dan North首先提出了BDD的概念,并在随后开发出了JBehave框架.在Dan North博客上介绍BDD的文章中,说到了BDD的想法是 ...
随机推荐
- BZOJ1492 [NOI2007]货币兑换
Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下 简称B券).每个持有金券的顾客都有一个自己的帐户.金券的数目可以是一个 ...
- 洛谷P3763 [TJOI2017]DNA(后缀数组 RMQ)
题意 题目链接 Sol 这题打死我也不会想到后缀数组的,应该会全程想AC自动机之类的吧 但知道这题能用后缀数组做之后应该就不是那么难了 首先把\(S\)和\(S0\)拼到一起跑,求出Height数组 ...
- JS 写入到文件
//js写文件 function doSave(value, type, name) { var blob; if (typeof window.Blob == "function" ...
- 已有Web项目添加Maven支持
IDE:MyEclipse 当我们在现有的Web开发项目中集成 Maven 的时候,需要修改以下几个地方: 1.将以下代码拷贝到工程根路径下的 .project 文件中的 <buildSpec& ...
- webstorm git 怎么断开版本控制 webstorm git for windows 禁止 自动运行
也是无语啊,今天装了下最新版本的webstorm , 发现特别卡,老动不动就卡死, 看了下进程, 牛X 啊, git for windows 一直蹭蹭蹭的疯狂增长,一开始的一点到后来的庞然大物. ...
- SparseArray代替HashMap
相信大家都明白,手机软件的开发不同于PC软件的开发,因为手机性能相对有限,内存也有限,所谓“寸土寸金”,可能稍有不慎,就会导致性能的明显降低.Android为了方便开发者,特意在android.uti ...
- 最好的原型和流程图绘制工具:OmniGraffle_交互设计
原文地址:http://www.shangxueba.com/jingyan/2230668.html 使用哪种原型设计工具"大概是设计师闲聊时出现频率最高的话题之一.据我了解一般以Visi ...
- 常用的自动化测试框架及测试框架的发展(Alpha)
前言:自动化测试在过去的20年已经有了很大的发展.最初的测试工具只提供了简单的捕捉/回访功能,维护性较差.而且脚本工具实现需要很强的开发技术和经验,而且数量众多的测试脚本加上没有文档记录因此维护起来较 ...
- 数据预处理(Python scikit-learn)
在机器学习任务中,经常会对数据进行预处理.如尺度变换,标准化,二值化,正规化.至于采用哪种方法更有效,则与数据分布和采用算法有关.不同算法对数据的假设不同,可能需要不同的变换,而且有时无需进行变换,也 ...
- leetcode Ch2-Dynamic Programming I
一. 1. Edit Distance class Solution { public: int minDistance(string t1,string t2) { int len1=t1.size ...