【Docker学习之四】Docker自定义容器镜像
环境
docker-ce-19.03.1-3.el7.x86_64
centos 7

一、使用已有容器创建镜像-docker commit
1、查看本地已有镜像
[root@node105 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 5a3221f0137b days ago 126MB
hello-world latest fce289e99eb9 months ago .84kB
training/webapp latest 6fae60ef3446 years ago 349MB
查看本地正在运行的容器
[root@node105 ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
15ff843a3404 training/webapp "python app.py" minutes ago Up minutes 0.0.0.0:->/tcp stoic_moore
db8b3e2f1c64 nginx "nginx -g 'daemon of…" About an hour ago Up minutes 0.0.0.0:->/tcp nginx-test
[root@node105 ~]#
查看所有容器运行情况
[root@node105 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cdb6408b8370 training/webapp "/bin/bash" minutes ago Exited () minutes ago funny_ramanujan
15ff843a3404 training/webapp "python app.py" minutes ago Up minutes 0.0.0.0:->/tcp stoic_moore
db8b3e2f1c64 nginx "nginx -g 'daemon of…" About an hour ago Up minutes 0.0.0.0:->/tcp nginx-test
[root@node105 ~]#
2、以交互方式进入容器并进行修改
[root@node105 ~]# docker run -ti training/webapp /bin/bash
root@cdb6408b8370:/opt/webapp# ls
Procfile app.py requirements.txt tests.py
root@cdb6408b8370:/opt/webapp# touch app1.py
root@cdb6408b8370:/opt/webapp# ls
Procfile app.py app1.py requirements.txt tests.py
root@cdb6408b8370:/opt/webapp# exit
exit
[root@node105 ~]#
3、提交修改生成新的镜像
[root@node105 ~]# docker commit -m "Added app1.py" -a "cac2020" 15ff843a3404 training/webapp:v2
sha256:71b135d88d62ba40637c839c2cd955c10c23e187d48e6902f8b8095cf379f251
[root@node105 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
training/webapp v2 71b135d88d62 seconds ago 349MB
nginx latest 5a3221f0137b days ago 126MB
hello-world latest fce289e99eb9 months ago .84kB
training/webapp latest 6fae60ef3446 years ago 349MB
-m 来指定提交的说明信息,跟我们使用的版本控制工具一样;-a 可以指定更新的用户信息;之后是用来创建镜像的容器的 ID;最后指定目标镜像的仓库名和 tag 信息。创建成功后会返回这个镜像的 ID 信息
4、删除镜像-dcoker rmi
[root@node105 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
training/webapp v2 71b135d88d62 minutes ago 349MB
nginx latest 5a3221f0137b days ago 126MB
hello-world latest fce289e99eb9 months ago .84kB
training/webapp latest 6fae60ef3446 years ago 349MB
[root@node105 ~]# docker rmi 71b135d88d62
Untagged: training/webapp:v2
Deleted: sha256:71b135d88d62ba40637c839c2cd955c10c23e187d48e6902f8b8095cf379f251
[root@node105 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 5a3221f0137b days ago 126MB
hello-world latest fce289e99eb9 months ago .84kB
training/webapp latest 6fae60ef3446 years ago 349MB
二、使用Dockerfile创建镜像-docker build
1、Dockerfile语法:
(1)#是注释符
(2)FROM 指定一个依赖的镜像,一个镜像不能超过 127 层
(3)LABEL 为镜像生成元数据标签信息
(4)MAINTAINER 作者信息,写在FROM后
(5)COPY 当复制一个目录时,并不会复制目录本身,而是会递归复制其下子目录 至目标目录下
(6)ADD ADD指令类似于COPY指令,ADD支持使用TAR文件和URL路径
(7)WORKDIR 用于为Dockerfile中所有RUN、CMD、ENTRYPOINT、COPY和ADD指令设定工作目录
(8)RUN 接受命令作为参数并用于创建镜像,在之前的commit层上形成新的层。
(9)CMD 类似于RUN指令,CMD指令也可用于运行任何命令或应用程序,不过,二者的运行时间点不同
RUN 指令运行于映像文件构建过程中,而CMD指令运行于基于Dockerfile构建出的新镜像文件启动一个容器时。
CMD指令的首要目的在于为启动的容器指定默认要运行的程序,且其运行结束后,容器也将终止;不过,CMD指定的命令其可以被docker run的命令行选项所覆盖
在Dockerfile中可以存在多个CMD指令,但仅最后一个生效;
CMD会在启动容器的时候执行,build时不执行,而RUN只是在构建镜像的时候执行,后续镜像构建完成之后,启动容器就与RUN无关了。这个命令就相当于在/etc/rc.d/rc.local中写命令
(10)ENTRYPOINT 类似CMD指令的功能,用于为容器指定默认运行程序,从而使得容器像是一具单独的可执行程序
(11)EXPOSE 用来指定端口,使容器内的应用可以通过端口和外界交互。
(12)ENV ENV指令可以用于docker容器设置环境变量
(13)USER 用于指定运行image时的或运行Dockerfile中任何RUN、CMD或ENTRYPOINT指令指定的程序时的用户名或UID
默认情况下,container的运行身份为root用户
(14)ONBUILD 用于在Dockerfile中定义一个触发器
Dockerfile用于build映像文件,此映像文件亦可作为base image被另一个Dockerfile用作FROM指令的参数,并以之构建新的映像文件
在后的这个Dockerfile中的FROM指令在build过程中被执行时,将会“触发”创建其base image的Dockerfile文件中的ONBUILD指令定义的触发器
(15)HEALTHCHECK Docker 1.12版本后引入的判断容器状态是否正常
2、docker build 语法
docker build [OPTIONS] PATH | URL | -
build执行过程:它要做的第一件事情就是上传这个 Dockerfile 内容,因为所有的操作都要依据 Dockerfile 来进行。然后,Dockfile 中的指令被一条一条的执行。每一步都创建了一个新的容器,在容器中执行指令并提交修改(就跟之前介绍过的 docker commit 一样)。当所有的指令都执行完毕之后,返回了最终的镜像 id。所有的中间步骤所产生的容器都被删除和清理了。
三、本地文件系统导入构建镜像-docker import
要从本地文件系统导入一个镜像,可以使用 openvz(容器虚拟化的先锋技术)的模板来创建:openvz 的模板下载地址为templates 。
1、先下载了一个 ubuntu-14.04 的镜像,之后使用以下命令导入:
sudo cat ubuntu-14.04-x86_64-minimal.tar.gz |docker import - ubuntu:14.04
2、然后查看新导入的镜像
docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 05ac7c0b9383 17 seconds ago 215.5 MB
四、上传镜像-docker push
把创建的镜像上传到仓库中来共享。Docker Hubhuo或者自己搭建的仓库。
docker push 镜像名
五、存储和载入镜像
1、保存镜像为文件
docker save -o 要保存的文件名 要保存的镜像
eg:
docker save -o java8.tar lwieske/java-8
2、从文件载入镜像
docker load --input 文件
或者
docker load < 文件名
eg:
docker load < java8.tar
参考:
创建docker镜像的两种方式
Docker 创建镜像、修改、上传镜像
【Docker学习之四】Docker自定义容器镜像的更多相关文章
- [转]Docker学习之四:使用docker安装mysql
本文转自:https://blog.csdn.net/qq_19348391/article/details/82998391 Docker学习之一:注册Docker Hub账号 Docker学习之二 ...
- Docker学习之Docker镜像基本使用
Docker学习之Docker镜像基本使用 获取镜像 命令格式:docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签] 例如: docker pull ...
- Docker学习之Docker容器基本使用
Docker学习之Docker容器基本使用 新建容器并启动 命令格式:docker run --options repository:tag 后台运行 命令格式:-d 已存在的容器相关操作 启动:do ...
- Docker学习笔记 — Docker私有仓库搭建
Docker学习笔记 — Docker私有仓库搭建 目录(?)[-] 环境准备 搭建私有仓库 测试 管理仓库中的镜像 查询 删除 Registry V2 和Mavan的管理一样,Dockers ...
- Docker学习总结(二)—— 镜像,容器
1.Docker镜像 1.1相关概念:registry :用于保存Docker镜像,包括镜像层次结构和镜像元数据,类似于git仓库之类的实体. repository:某个Docker镜像所有迭代版本 ...
- docker学习笔记之把容器commit成镜像
docker提供了两种镜像制作的方式,提高了使用的灵活性: 1.可以将更改后的容器提交,制作成镜像(这是接下来要说明的) 2.通过Dockerfile来制作镜像 下面通过一个例子来展示方法1. 本地有 ...
- Docker系列(三):Docker自定义容器镜像
将容器编程镜像: docker commit [repo:tag] 网上有这句话:当我们在制作自己的镜像的时候,会在container中安装一些工具.修改配置,如果不做commit保存 起来,那么co ...
- docker学习笔记(3)- 镜像
简介 在docker学习笔记(1)- 架构概述一节中可以看到镜像是docker三大组件之一,可以将Docker镜像类比为虚拟机的模版. 镜像由多个层组成,每层叠加之后从外部看就像一个独立的对象,镜像的 ...
- Docker学习笔记 - Docker容器内部署redis
Docker学习笔记(2-4)Docker应用实验-redist server 和client的安装使用 一.获取redis容器(含客户端和服务端) 二.创建服务端容器 1.在终端A中运行redis- ...
随机推荐
- 在阿里云CentOS服务器上安装Python3.7并设置为默认Python
1.引言 Linux操作系统自带一个python2.7,没有python3,在开发的时候非常不便,因此需要安装一个python3,并且将python3设置系统默认python,同时还不能影响那些Lin ...
- netflix flamescope 方便的不同时间范围的火焰图查看工具
flamescope 是netflix 开源的方便的火焰图查看工具,我们可以选择不同时间范围的数据,方便分析调用链 环境准备 使用docker-compose运行,基于官方的dockerfile 创建 ...
- 分享一个Centos8的国内yum源
使用的是清华大学开源镜像站,文件地址: https://github.com/hackyoMa/docker-centos/blob/8/CentOS-Base.repo 使用方法: cd /etc/ ...
- Python3 连接各类数据库
Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口.它定义了一系列必须的对象和数据库存取方式, 以便为各种各样的底层数据库系统和多 ...
- 洛谷2051 [AHOI2009]中国象棋
题目链接 题意概述:n行m列棋盘放若干个棋子每行每列最多两个求方案总数,答案对9999973取模. 可以比较容易看出这是个dp,设f[i][j][k]表示前i行j列放1个棋子k列放2个棋子的方案总数. ...
- 第09组 Alpha事后诸葛亮
组长博客链接 组长博客 参考邹欣老师的问题模板进行总结思考 设想和目标(2分) 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 解决的问题 我们软件初期旨在解决 ...
- 【BigData】Java基础_冒泡排序
1.实现需求 根据已经存在的数组,使用冒泡排序将数组中的元素排序后输出. 2.代码 package cn.test.logan.day02; /** * 冒泡排序在数组上的实现 * @author Q ...
- cgdsR 下载TCGA数据
TCGA 的数据可以在5个组织机构获取,它们都提供了类似的接口来供用户下载数据. cgdsR 包是cBioPortal 提供的R包 http://www.cbioportal.org/rmatlab ...
- Jdk8 DNS解析
注:JDK7和JDK8关于DNS解析的实现有差异,该问题在JDK7下可能不存在: Java中的DNS解析一般是通过调用下面的方法: public static InetAddress getByNam ...
- 自动创建Kibana索引
参考 https://www.cnblogs.com/dance-walter/p/10471950.html 参考 https://www.elastic.co/guide/en/kibana/cu ...