简介

创建镜像的方法主要有三种:基于已有镜像的容器创建基于本地模板导入基于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. cpu设计过程

    一款CPU是如何设计出来的? 前面一段,我们了解了芯片的制造过程,也就是如何从沙子中提取硅.把硅切成片,在片上通过离子注入实现PN结.实现各种二极管.三极管.CMOS管.从而实现千万门级大规模集成电路 ...

  2. 推荐一个用于压缩图片的JS插件:localResizeIMG

    惯例,先贴传送门:https://github.com/think2011/localResizeIMG 首先说到,为嘛要压缩图片,这需求一般出现在需要上传照片(尤其是移动端)的情况下,现在手机拍出来 ...

  3. 伪元素的margin值挤压主体元素解决

    伪元素的margin值挤压主体元素解决 主体是两个p标签,需要再其左侧添加一个竖线,很常见的需求 目标 前提条件 1. 右侧的文字个数不固定 问题 1. 需要让before元素为`float:left ...

  4. Python爬虫报错:"HTTP Error 403: Forbidden"

    错误原因:主要是由于该网站禁止爬虫导致的,可以在请求加上头信息,伪装成浏览器访问User-Agent. 新增user-agent信息: headers = {'User-Agent':'Mozilla ...

  5. error: failed to push some refs to 'git@gitee.com:xxxx'

    出现错误的主要原因是向上仓库的一些文件(README.md,LICENSE等文件)不在本地代码目录中 git pull --rebase origin master 通过这行命令, 可以解决 注释福利 ...

  6. Wireshark捕获网易云音乐音频文件地址

    打开Wireshark,开始捕获. 打开网易云音乐,然后播放一首歌. Wireshark停时捕获,然后在不活的文件中搜索字符串"mp3".可以发现有如下信息: 将其中的内容:&qu ...

  7. phpshe xml注入

    *php商城系统 xml注入* **页面样式* *Xml原理参考:* https://www.cnblogs.com/20175211lyz/p/11413335.html *漏洞函数simplexm ...

  8. numpy教程03---ndarray的运算

    欢迎关注公众号[Python开发实战], 获取更多内容! 工具-numpy numpy是使用Python进行数据科学的基础库.numpy以一个强大的N维数组对象为中心,它还包含有用的线性代数,傅里叶变 ...

  9. JavaSE常用类之Object类

    1. hashCode方法 代码: package NeiBuLei; public class hashCode { public static void main(String[] args) { ...

  10. 讲解CPU之NUMA硬件体系以及机制(lscpu查看相关信息)

    先看看从系统层面反映出来的numa cpu信息.采样机器为实体机.80核.128内存. [root@ht2 src]# lscpu Architecture: x86_64 #x86架构下的64位 C ...