Docker系列教程04-Docker构建镜像的三种方式
简介
创建镜像的方法主要有三种:基于已有镜像的容器创建
、基于本地模板导入
、基于Dockerfile创建
。
今天就逐一讲述为大家讲述,如何构建属于自己的docker镜像。
1、基于容器构建镜像
基于已有容器构建镜像主要是通过docker commit
命令来构建新的镜像,语法规则如下:
下面将演示下如何基于已有容器构建镜像
1、首先,创建一个容器,并在其容器内创建一个test文件,之后退出。代码如下:
root@ubuntu:~# docker run -it ubuntu:18.04 /bin/bash
root@b66c08d61f9e:/# echo "DIY" > /test
root@b66c08d61f9e:/# exit
exit
2、基于该容器使用docker commit
命令构建新的镜像
root@ubuntu:~# docker commit -m "new_image" -a "cnLinuxer" b66 myubuntu:v1
sha256:de7a0211f27fb71ca34c3a5c1829f6d2a69c15ef74cd397a52f2cc8a5e98e1b9
参数解释:上面
-m
选项指定了新镜像的提交信息,-a
标注作者信息,b66
是容器ID,myubuntu:v1
是指定的新镜像名称。
3、此时本地镜像库已生成myubuntu:v1
镜像
root@ubuntu:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myubuntu v1 de7a0211f27f 8 minutes ago 64.2MB
...
4、使用新生成的镜像构建容器,测试自定义数据有无丢失
root@ubuntu:~# docker run -it myubuntu:v1 /bin/bash
root@d11d9577f31b:/# cat /test
DIY
root@d11d9577f31b:/#
基于已有容器构建镜像,其实质就是将容器里运行的程序以及该程序的运行环境打包起来生成新的镜像。
2、基于本地模板导入
用户也可以从模板文件中导入镜像,主要使用docker import
命令
下面演示基于本地模板导入镜像
1、首先,创造出一个模板,即 将容器导入到一个模板文件中
root@ubuntu:~# docker export b66 > /root/myubuntu.tar
root@ubuntu:~# ls /root
/root/myubuntu.tar
2、利用模板导入成镜像
root@ubuntu:~# docker import /root/myubuntu.tar qinlulu/ubuntu:18.04
sha256:498afccbfb2ddcc7b8ce5a697e982f5bc8d3af9a55adf6a7cc2fd1121dbee36e
3、此时本地镜像仓库多出一个qinlulu/ubuntu:18.04
镜像
root@ubuntu:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
qinlulu/ubuntu 18.04 498afccbfb2d 6 seconds ago 64.2MB
3、基于Dockerfile构建
基于Dockerfile构建镜像就目前而言是使用最为广泛的。Dockerfile是由一组指令组成的文件,其每条指令对应Linux中的一条命令,Docker程序通过读取Dockerfile中的指令最终生成镜像。
下面演示基于Dockerfile文件构建nginx镜像的实例
1、准备工作:
创建一个目录,在该目录里编写dockerfile及存放nginx软件包
root@ubuntu:~# mkdir -p /opt/nginx
root@ubuntu:~# wget -P /opt/nginx http://nginx.org/download/nginx-1.11.1.tar.gz
root@ubuntu:~# touch /opt/nginx/Dockerfile
// 需要准备好以下两个文件
root@ubuntu:~# ls /opt/nginx/
Dockerfile nginx-1.11.1.tar.gz
2、编写dockerfile文件,代码如下:
root@ubuntu:~# vim /opt/nginx/Dockerfile
FROM centos:7.5.1804 #指定父镜像
MAINTAINER mynginx #指定维护者信息
ADD nginx-1.11.1.tar.gz /usr/local #将本地nginx软件包上传至容器/usr/local/下
RUN yum -y install vim wget gcc gcc-c++ make openssl-devel pcre-devel #yum安装依赖软件
WORKDIR /usr/local/nginx-1.11.1/ #进入nginx工作目录
RUN ./configure --prefix=/usr/local/nginx && make && make install #编译并安装nginx服务
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf #关闭nginx后台运行
ENV PATH /usr/local/nginx/sbin:$PATH #添加nginx的环境变量
EXPOSE 80 #将容器的80端口映射出来
CMD ["nginx"] #执行nginx命令,启动nginx
3、构建nginx镜像
root@ubuntu:/opt/nginx# docker build -t mynginx:v1
输出两个Successfully即为构建成功!如下图:
4、运行nginx镜像
root@ubuntu:~# docker run -itd -p 888:80 mynginx:v1
e93a52fffd9ea4928a062f00613e4325296042a143307602700ddf0c463c02c9
5、测试nginx服务
更多Dockerfile的内容将通过后面大量的构建实例再为大家详细介绍。
Docker系列教程04-Docker构建镜像的三种方式的更多相关文章
- Hibernate 系列 07 - Hibernate中Java对象的三种状态
引导目录: Hibernate 系列教程 目录 1. Java对象的三种状态 当应用通过调用Hibernate API与框架发生交互时,需要从持久化的角度关注应用对象的生命周期. 持久化声明周期是Hi ...
- docker系列(二):镜像
1 引言 将docker与汽车生产线类比,如果说docker引擎是汽车生产车间,那么容器就是最终的产品——汽车,而本节要介绍的镜像就如同汽车设计图纸,其重要性不言而喻——只有有了设计图(镜像),才能生 ...
- Docker系列教程05-Docker数据卷(Data Volume)学习
引言 在Docker中,容器的数据读写默认发生在容器的存储层,当容器被删除时其上的数据将会丢失.要想实现数据的持久化,需要将数据从宿主机挂载到容器中.目前Docker提供了三种方式将数据从宿主机挂载到 ...
- CentOS环境Docker安装教程(官方推荐的docker三种方式安装)
CentOS环境Docker安装教程(官方推荐的docker三种方式安装) 一.使用yum方式安装 1.安装依赖包 $ sudo yum install -y yum-utils device-map ...
- CentOS安装docker ce的三种方式
参考文章: CentOS安装docker ce的三种方式: 1.环境 CentOS Linux release 7.6.1810 (Core) 2.卸载旧版本 sudo yum remove dock ...
- SpringBoot系列教程web篇Servlet 注册的四种姿势
原文: 191122-SpringBoot系列教程web篇Servlet 注册的四种姿势 前面介绍了 java web 三要素中 filter 的使用指南与常见的易错事项,接下来我们来看一下 Serv ...
- 容器间通信的三种方式 - 每天5分钟玩转 Docker 容器技术(35)
容器之间可通过 IP,Docker DNS Server 或 joined 容器三种方式通信. IP 通信 从上一节的例子可以得出这样一个结论:两个容器要能通信,必须要有属于同一个网络的网卡. 满足这 ...
- SpringBoot 系列教程之事务不生效的几种 case
SpringBoot 系列教程之事务不生效的几种 case 前面几篇博文介绍了声明式事务@Transactional的使用姿势,只知道正确的使用姿势可能还不够,还得知道什么场景下不生效,避免采坑.本文 ...
- 更新k8s镜像版本的三种方式
一.知识准备 更新镜像版本是在k8s日常使用中非常常见的一种操作,本文主要介绍更新介绍的三种方法 二.环境准备 组件 版本 OS Ubuntu 18.04.1 LTS docker 18.06.0-c ...
随机推荐
- SpringDataJdbc命名查询
当使用SpringDataJdbc命名查询时,需要配置几处:官方文档:https://docs.spring.io/spring-data/jdbc/docs/2.0.4.RELEASE/refere ...
- ACM - 图论- 网络流 - 算法模板
\(EK\) 算法模板 #include <iostream> #include <queue> #include<string.h> using namespac ...
- 详解BI系统中的任务调度
任务调度是一个通用的计算机概念,可以简单地理解为计算机基于一定时间频率,自动执行一项进程任务.任务调度是操作系统的重要组成部分,Windows系统中的定时任务和Linux的Crontab都是常用的系统 ...
- 前端进阶(8) - 前端开发需要了解的工具集合:webpack, eslint, prettier, ...
前端开发需要了解的工具集合:webpack, eslint, prettier, ... 前端开发需要了解的一些工具,这些工具能够帮助你在项目开发中事半功倍. 1. nrm: npm registry ...
- 让IE兼容background-size的方法_background-size ie下使用
ie6,ie7,ie8下对css background-size并不支持,那么如何在ie下兼容background-size呢?在ie下把图片完整的居中显示在一定范围内在css中添加如下代码: fil ...
- 怎样用JavaScript和HTML5 Canvas绘制图表
原文:https://code.tutsplus.com/zh-...原作:John Negoita翻译:Stypstive 在这篇教程中,我将展示用JavaScript和canvas作为手段,在饼状 ...
- android:text 文字阴影设置
<SPAN style="FONT-SIZE: 16px"><TextView android:id="@+id/text" a ...
- 让子弹飞,零成本让你的网站更快一点,boxopened http/3 (QUIC) 协议实战
最近HTTP-over-QUIC 协议被正式命名为 HTTP/3,协议带来的最大改变是协议底层将采用UDP协议,而不再是TCP协议,这样的好处吗,就是更低时延,更好的拥塞控制,更精确的RTT时间,更高 ...
- 从路由原理出发,深入阅读理解react-router 4.0的源码
react-router等前端路由的原理大致相同,可以实现无刷新的条件下切换显示不同的页面.路由的本质就是页面的URL发生改变时,页面的显示结果可以根据URL的变化而变化,但是页面不会刷新.通过前 ...
- Android bluetoothAdapter.startDiscovery()无法搜索设备问题解决办法
Android6.0以上要定位权限,要手动把手机软件的定位权限打开,又被坑了好长时间