最简单的dockerfile使用教程 - 创建一个支持SSL的Nginx镜像
什么是dockerfile?简单的说就是一个文本格式的脚本文件,其内包含了一条条的指令(Instruction),每一条指令负责描述镜像的当前层(Layer)如何构建。
下面通过一个具体的例子来学习dockerfile的写法。
新建一个dbuild文件夹,创建一个自定义的Nginx首页,逻辑很简单,显示一个自定义的图片文件train.jpg.
我想基于标准的Nginx镜像做一些修改,让Nginx支持SSL。SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。
为此我首先需要创建一个针对SSL的配置文件。
cat << '__EOF' > ssl.conf
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
__EOF
使用如下命令创建nginx.key和nginx.crt文件:
openssl req -x509 -nodes -newkey rsa:4096 -keyout nginx.key -out nginx.crt -days 365 -subj "/CN=$(hostname)"
一切就绪之后,下面就应该创建dockerfile了:
FROM nginx:stable
# copy the custom website into the image
COPY train.jpg /usr/share/nginx/html/
COPY index.html /usr/share/nginx/html/
# copy the SSL configuration file into the image
COPY ssl.conf /etc/nginx/conf.d/ssl.conf
# download the SSL key and certificate into the image
COPY nginx.key /etc/nginx/ssl/nginx.key
COPY nginx.crt /etc/nginx/ssl/nginx.crt
# expose the https port
EXPOSE 443
所有dockerfile第一行指令必定是FROM XXXX。
FROM的作用是指定基准镜像。该dockerfile以FROM后面指定的镜像为基础,在其上进行定制。
在 Docker Store 上有很多高质量的官方镜像,主要分为以下三大类:
开箱即用的服务类的镜像,比如网络服务器nginx ,也有数据库服务器诸如redis 、 mongo 、mysql 等;
方便开发、构建、运行各种语言应用的镜像,如 node 、 openjdk 、 python 等。
相对前两大类更为基础的操作系统镜像,如ubuntu 、 debian 、 centos 等
当然您如果不愿意基于这些官方已有镜像开始镜像构建,而是想从头开始,这也是可以的。Docker存在一个特殊的镜像,名为 scratch 。它是一个虚拟的概念,
表示一个空白的镜像。
直接使用FROM scratch 会让镜像体积更加小巧。
接下来的一系列copy指令都很好理解。
dockerfile开发完毕之后,执行命令:
docker build -t jerry-nginx:1.0 .
意思是基于当前目录开始构建镜像,注意末尾的.必不可少,代表“当前目录”。
通过docker build执行输出的日志可以观察到里面每一行的指令被逐行执行:
最后一行日志提示标签为jerry-nginx:1.0的景象被成功构建。
用下面的命令基于刚刚制作好的镜像运行一个容器:
docker run -d -p 443:443 -p 1082:80 jerry-nginx:1.0
基于http协议访问没有问题:
基于https访问也能正常工作:
要获取更多Jerry的原创文章,请关注公众号"汪子熙":
最简单的dockerfile使用教程 - 创建一个支持SSL的Nginx镜像的更多相关文章
- 用Docker搭建一个支持https的nginx代理服务
用Docker搭建一个支持https的nginx代理服务 说明:本文所提的服务只是作者平常测试使用,可能含有未知bug或不成熟的解决方案,仅供参考,请不要用于正式环境,当然,使用过程中有任何问题欢迎提 ...
- [译]NeHe教程 - 创建一个OpenGL窗体
原文: Setting Up An OpenGL Window 欢迎阅读我的OpenGL教程.我是一个热爱OpenGL的普通码农!我第一次听到OpenGL是在3Dfx刚发布他们给Voodoo I显卡的 ...
- 创建一个支持异步操作的operation
NSOperationQueue时iOS中常用的任务调度机制.在创建一个复杂任务的时候,我们通常都需要编写NSOperation的子类.在大部分情况下,重写main方法就可以满足要求.main方法执行 ...
- 弄了一个支持SSL的TCP客户端
近日需要做一些TCP的收发的调试,到网上去找TCP调试工具,找了好几款,发现不是功能不全就是不支持HEX,更重要的SSL也不支持,于是动手写了一款,叫TCPRunner,有以下特性: 使用异步IO方式 ...
- 创建一个包含TC的Alpine镜像
镜像的创建 更换镜像至ustc(为了测试时的速度) 安装musl-dev make gcc linux-headers bison flex以使TC可以编译 拷贝进TC的源代码 进入源代码文件夹进行编 ...
- 使用Windows Service Wrapper快速创建一个Windows Service 如nginx
前言 今天介绍一个小工具的使用.我们都知道Windows Service是一种特殊的应用程序,它的好处是可以一直在后台运行,相对来说,比较适合一些需要一直运行同时不需要过多用户干预的应用程序,这一类我 ...
- 创建一个支持ES6的Nodejs项目
文章来自于:https://www.codementor.io/iykyvic/writing-your-nodejs-apps-using-es6-6dh0edw2o 第一步:创建项目文件夹并初始化 ...
- 使用Dockerfile创建支持SSH服务的镜像
1.前面我们学习了使用Dockerfile,那接下来我们就用Dockerfile创建一个支持SSH服务的镜像. 2.首先创建一个目录ssh_centos [root@rocketmq-nameserv ...
- 用django创建一个简单的sns
用django创建一个简单的sns 1.首先创建一个工程newsns django-admin.py startproject newsns 在工程目录下新建一个文件夹templates,在该文件夹下 ...
随机推荐
- 剑指offer——面试题5:替换空格
利用STL: #include"iostream" #include"stdio.h" #include"algorithm" using ...
- Docker:网络模式详解
Docker作为目前最火的轻量级容器技术,牛逼的功能,如Docker的镜像管理,不足的地方网络方面. Docker自身的4种网络工作方式,和一些自定义网络模式 安装Docker时,它会自动创建三个网络 ...
- 企业的VI设计需要包含哪些元素
VI设计,即视觉识别系统,企业VI设计是企业品牌建设的重中之重.最近很多人都在问,一套完整的企业VI设计都包括哪些内容?现在我们站在一个高级设计师的角度,来简单谈一谈VI设计包括哪些内容.文中指出,一 ...
- jenkins 部署应用
一,安装rpm包 安装jdk 安装jenkins 查看jdk是否安装成功 启动jenkins systemctl start jenkins 开机自启 systemctl enable jenkins ...
- Bootstrap 斜体、文本对齐、缩略图、地址、列表等
目录1.标题2.页面主体3.强调 a.小号文本 b.着重 c.斜体 d.对齐class e.强调class4.缩略语5.地址6.列表 a.无序列表 b.有序列 ...
- Nginx实践:(2) Nginx语法之localtion
1. 概念 location是根据uri进行不同的定位.在虚拟主机的配置中,是必不可少的.location可以将网站的不同部分,定位到不同的处理方式上. location语法格式如下: locatio ...
- springboot整合rabbitmq,支持消息确认机制
安装 推荐一篇博客https://blog.csdn.net/zhuzhezhuzhe1/article/details/80464291 项目结构 POM.XML <?xml version= ...
- Bootstrap入门(第一天)
一直都想认真的学习一下Bootstrap,但是由于种种原因,一直没有行动,虽然期间有使用过Bootstrap,但是都没有系统的学习过.最近工作室(学校老师的工作室)安排了一个前端任务让我跟进,主要是根 ...
- js【jquery】 - DOM操作
1.修改元素样式 js方式: var div2 = document.getElementById("") div2.style.width = '200px'; div2.cla ...
- 在List中常用的linq表达式
为了下面举例方便,先声明一个集合: public List<Model.Resume> GetResumeList() { var list = new List<Model.Res ...