简介

创建镜像的方法主要有三种:基于已有镜像的容器创建基于本地模板导入基于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构建镜像的三种方式的更多相关文章

  1. Hibernate 系列 07 - Hibernate中Java对象的三种状态

    引导目录: Hibernate 系列教程 目录 1. Java对象的三种状态 当应用通过调用Hibernate API与框架发生交互时,需要从持久化的角度关注应用对象的生命周期. 持久化声明周期是Hi ...

  2. docker系列(二):镜像

    1 引言 将docker与汽车生产线类比,如果说docker引擎是汽车生产车间,那么容器就是最终的产品——汽车,而本节要介绍的镜像就如同汽车设计图纸,其重要性不言而喻——只有有了设计图(镜像),才能生 ...

  3. Docker系列教程05-Docker数据卷(Data Volume)学习

    引言 在Docker中,容器的数据读写默认发生在容器的存储层,当容器被删除时其上的数据将会丢失.要想实现数据的持久化,需要将数据从宿主机挂载到容器中.目前Docker提供了三种方式将数据从宿主机挂载到 ...

  4. CentOS环境Docker安装教程(官方推荐的docker三种方式安装)

    CentOS环境Docker安装教程(官方推荐的docker三种方式安装) 一.使用yum方式安装 1.安装依赖包 $ sudo yum install -y yum-utils device-map ...

  5. CentOS安装docker ce的三种方式

    参考文章: CentOS安装docker ce的三种方式: 1.环境 CentOS Linux release 7.6.1810 (Core) 2.卸载旧版本 sudo yum remove dock ...

  6. SpringBoot系列教程web篇Servlet 注册的四种姿势

    原文: 191122-SpringBoot系列教程web篇Servlet 注册的四种姿势 前面介绍了 java web 三要素中 filter 的使用指南与常见的易错事项,接下来我们来看一下 Serv ...

  7. 容器间通信的三种方式 - 每天5分钟玩转 Docker 容器技术(35)

    容器之间可通过 IP,Docker DNS Server 或 joined 容器三种方式通信. IP 通信 从上一节的例子可以得出这样一个结论:两个容器要能通信,必须要有属于同一个网络的网卡. 满足这 ...

  8. SpringBoot 系列教程之事务不生效的几种 case

    SpringBoot 系列教程之事务不生效的几种 case 前面几篇博文介绍了声明式事务@Transactional的使用姿势,只知道正确的使用姿势可能还不够,还得知道什么场景下不生效,避免采坑.本文 ...

  9. 更新k8s镜像版本的三种方式

    一.知识准备 更新镜像版本是在k8s日常使用中非常常见的一种操作,本文主要介绍更新介绍的三种方法 二.环境准备 组件 版本 OS Ubuntu 18.04.1 LTS docker 18.06.0-c ...

随机推荐

  1. 如何确保消息正确地发送至 RabbitMQ? 如何确保消息接收方消费了消息?

    发送方确认模式 将信道设置成 confirm 模式(发送方确认模式),则所有在信道上发布的消息都 会被指派一个唯一的 ID. 一旦消息被投递到目的队列后,或者消息被写入磁盘后(可持久化的消息),信 道 ...

  2. springboot使用自定义注解和反射实现一个简单的支付

    优点: 未使用if else,就算以后增加支付类型,也不用改动之前代码 只需要新写一个支付类,给添加自定义注解@Pay 首先: 定义自定义注解 Pay 定义 CMBPay ICBCPay 两种支付 根 ...

  3. ACM - 最短路 - AcWing 851 spfa求最短路

    AcWing 851 spfa求最短路 题解 以此题为例介绍一下图论中的最短路算法 \(Bellman\)-\(Ford\) 算法.算法的步骤和正确性证明参考文章最短路径(Bellman-Ford算法 ...

  4. 算法导论 - 基础知识 - 算法基础(插入排序&归并排序)

    在<算法导论>一书中,插入排序作为一个例子是第一个出现在该书中的算法. 插入排序: 对于少量元素的排序,它是一个有效的算法. 插入排序的工作方式像许多人排序一手扑克牌.开始时,我们手中牌为 ...

  5. 项目启动的缓慢之“Build completed with 1 error and 18 warnings in 3 m 51 s”

    一.问题 idea编译项目writing classes很慢,等很久之后项目也启动不起来,如下图 二.解决方案 1.File->Invalidate Caches/Restart...清下缓存 ...

  6. 深入理解ES6之《块级作用域绑定》

    众所周知,js中的var声明存在变量提升机制,因此ESMAScript 6引用了块级作用域来强化对变量生命周期的控制let const 声明不会被提升,有几个需要注意的点1.不能被重复声明 假设作用域 ...

  7. java1.7之后的比较器特别之处

    在jdk1.7环境下使用Collectons.sort()方法: 比如:Collections.sort(list, new Comparator<Integer>()); 就可能会出现异 ...

  8. ssm项目框架搭建(增删改查案例实现)——(SpringMVC+Spring+mybatis项目整合)

    Spring 常用注解 内容 一.基本概念 1. Spring 2. SpringMVC 3. MyBatis 二.开发环境搭建 1. 创建 maven 项目 2. SSM整合 2.1 项目结构图 2 ...

  9. js 生成 pdf 文件

    话不多说好吧, 直接上demo图: 直接上代码好吧:(要引入的两个js  链接我放最后) <!DOCTYPE html> <html> <head> <met ...

  10. mongodb安装错误以及原理

    安装mongodb,默认是安装到"C:\Program Files\MongoDB\"这里的,我在注册表里没有找到mongodb的信息,所以猜测它只是将其解压到那个位置而已,它只是 ...