Docker 必知必会3----使用自己制作的镜像
前面的两篇文章分别讲了,docker的基础概念,设计思路以及docker的基本操作。
感兴趣的同学可以查阅:
https://www.cnblogs.com/jilodream/p/18177695
https://www.cnblogs.com/jilodream/p/18184687
本文我们将介绍如何使用自己的镜像。
一、制作自己镜像
docker本身已经提供了镜像制作的能力。我们只需要通过编写脚本文件来制作满足业务需要的新镜像。
这里要注意,我们制作的镜像都是基于基础的镜像来完成,不能从0开始创造一个镜像。
而这些基础镜像都是各大厂商提供的,可以直接使用的原始镜像,比如上篇文章中介绍的tomcat镜像。
我们所编写的脚本文件,有一个专属名称:Dockerfile。
话不多说,来看看dockerfile 如何编写:
Dockerfile 类似于 shell 脚本,是一个面相过程的文件脚本。
脚本中常用的关键字如下(注意全部都是大写):
FROM:
选择所继承的基础镜像,类似于java中的extends
MAINTAINER:
维护者,一般就是docker镜像的作者
WORKDIR:
指定工作路径,也就是进入系统中的默认路径。(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )
我们的所有操作都是基于该工作路径进行操作的,无法通过cd 等shell 命令,来回跳转工作路径。
COPY:
复制命令,从当前宿主机中,复制文件到制作的容器中
ADD:
添加命令,和COPY命令很相似,但要更强大,如复制源不一定为宿主机、复制压缩文件后自动解压等。
ENV:
配置容器的环境变量
RUN:
执行命令,后面可以接要执行的shell命令
VOLUME:
挂载卷命令,简单来说,就是将宿主机中的某个文件(或)文件夹映射到容器中。
这样做的好处就是当容器删除后,宿主机中仍然持有该文件。一般常用于数据库的磁盘文件存储,服务的日志文件记录等。
EXPOSE:
声明要暴露的端口号
USER:
镜像中的用户,常用于指定容器使用的默认用户,切换指定用户来处理设定权限的文件等。
CMD:
容器启动时的执行命令
ENTRYPOINT:
容器启动时的执行命令
注意CMD 和ENTRYPOINT命令是有区别的。CMD命令可以有多个,但是只有最后一个命令会被执行,之前的命令会被覆盖。
我一般是使用ENTRYPOINT来追加shell脚本,然后通过shell脚本来跑自己想执行的命令,这样更加灵活和易于维护。(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )
以上就是我们常用的制作镜像的dockerfile文件中的命令。一次性全部要记住会有些吃力,有些命令之间又会比较模糊,所以我们动手制作一个简单的dockerfile 来体验下:
以前文中tomcat镜像为例,由于最新的tomcat镜像,启动后无法直接访问,需要手动调整文件,我们这里就制作一个可以直接访问的tomcat服务。
1 vi Dockerfile
2
3 #指定基础镜像
4 FROM tomcat:my-tomcat-image
5
6 #指定维护人员
7 MAINTAINER wangruoyi "encijietuo@123.com"
8
9 # 设置环境变量
10 ENV BASE_DIR="/usr/local/"
11
12 #指定工作路径
13 WORKDIR /$BASE_DIR
14
15 #删除原有的webapps 文件夹
16 RUN rm -rf ./tomcat/webapps && cp -r ./tomcat/webapps.dist ./tomcat/webapps
17
18 #暴露8080端口,其实没有必要,因为原有的
19 EXPOSE 8080
wq 保存好Dockerfile之后
我们使用 docker build -t 镜像名:tag .
开始制作镜像,注意执行命令时,最后有一个 . 表示,表示使用当前路径中的 Dockerfile文件
1 [root@iZ2ze3bpa0o5cw6gp42ry2Z ~]# docker build -t my-building-image:0.1 .
2 [+] Building 0.1s (7/7) FINISHED docker:default
3 => [internal] load build definition from Dockerfile 0.0s
4 => => transferring dockerfile: 475B 0.0s
5 => [internal] load metadata for docker.io/library/tomcat:my-tomcat-image 0.0s
6 => [internal] load .dockerignore 0.0s
7 => => transferring context: 2B 0.0s
8 => [1/3] FROM docker.io/library/tomcat:my-tomcat-image 0.0s
9 => CACHED [2/3] WORKDIR //usr/local/ 0.0s
10 => CACHED [3/3] RUN rm -rf ./tomcat/webapps && cp -r ./tomcat/webapps.dist ./tomcat/webapps 0.0s
11 => exporting to image 0.0s
12 => => exporting layers 0.0s
13 => => writing image sha256:5bab70215cf8a0f1dc53c5aca3bfbdc5dca2893f591c7d145af7929d146d9ad9 0.0s
14 => => naming to docker.io/library/my-building-image:0.1 0.0s
15
16 [root@iZ2ze3bpa0o5cw6gp42ry2Z ~]# docker images
17 REPOSITORY TAG IMAGE ID CREATED SIZE
18 my-building-image 0.1 5bab70215cf8 13 minutes ago 684MB
制作好镜像之后,直接启动容器
1 [root@iZ2ze3bpa0o5cw6gp42ry2Z ~]# docker run -d -p 9090:8080 --name myTomcat my-building-image:0.1
2 1f181ab958e72993ef889572d798a88d66a86f91f2733193bf86bed7989d0b69
启动之后,我们就可以直接通过浏览器访问,注意这里的端口号变为宿主机的9090 端口了,因为我们在docker run 时指定了9090作为映射端口。
http://ip:9090

二、迁移镜像
由于网络或安全等考虑,我们常常需要迁移镜像到其他机器。
主要分为两部分操作,以我们之前做的my-building-image:0.1 镜像为例,操作如下:
1、将镜像保存到磁盘文件中
#docker save -o 指定的文件路径 镜像名/镜像Id
1 docker save -o mytom.tar 5bab70215cf8
2
3 [root@iZ2ze3bpa0o5cw6gp42ry2Z ~]# docker save -o mytom.tar 5bab70215cf8
4 [root@iZ2ze3bpa0o5cw6gp42ry2Z ~]# ls
5 calico.yaml Dockerfile mytom.tar
2、将tar文件传入到指定机器中,并重新载入到文件中
传入到指定机器,大家可以用ftp工具传输,这里就不说了,载入操作如下:
docker load -i 指定的文件路径
1 #docker load -i 指定的文件路径
2 docker load -i mytom.tar
3
4 [root@iZ2ze3bpa0o5cw6gp42ry2Z ~]# docker images
5 REPOSITORY TAG IMAGE ID CREATED SIZE
6 my-building-image 0.1 5bab70215cf8 31 minutes ago 684MB
7
8 #删除掉镜像
9
10 [root@iZ2ze3bpa0o5cw6gp42ry2Z ~]# docker rmi 5bab70215cf8
11 Untagged: my-building-image:0.1
12 Deleted: sha256:5bab70215cf8a0f1dc53c5aca3bfbdc5dca2893f591c7d145af7929d146d9ad9
13
14 [root@iZ2ze3bpa0o5cw6gp42ry2Z ~]# docker load -i mytom.tar
15 Loaded image ID: sha256:5bab70215cf8a0f1dc53c5aca3bfbdc5dca2893f591c7d145af7929d146d9ad9
16 [root@iZ2ze3bpa0o5cw6gp42ry2Z ~]# docker images
17 REPOSITORY TAG IMAGE ID CREATED SIZE
18 <none> <none> 5bab70215cf8 35 minutes ago 684MB
注意重新导入的镜像的镜像id和之前一样,5bab70215cf8。这是由于镜像文件没有发生变化,(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )因此sha256生成的哈希值没有变化,而镜像id实际就是sha256的前几位,因此也相等。
新导入的镜像名称和TAG为none ,可以使用docker tag 来重新更改为所需值。
Docker 必知必会3----使用自己制作的镜像的更多相关文章
- 读书笔记汇总 - SQL必知必会(第4版)
本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...
- 读书笔记--SQL必知必会--建立练习环境
书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL in 10 Minutes - Fourth Edition> MyS ...
- 读书笔记--SQL必知必会12--联结表
12.1 联结 联结(join),利用SQL的SELECT在数据查询的执行中联结表. 12.1.1 关系表 关系数据库中,关系表的设计是把信息分解成多个表,一类数据一个表,各表通过某些共同的值互相关联 ...
- 读书笔记--SQL必知必会18--视图
读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...
- 《MySQL 必知必会》读书总结
这是 <MySQL 必知必会> 的读书总结.也是自己整理的常用操作的参考手册. 使用 MySQL 连接到 MySQL shell>mysql -u root -p Enter pas ...
- 《SQL必知必会》学习笔记(一)
这两天看了<SQL必知必会>第四版这本书,并照着书上做了不少实验,也对以前的概念有得新的认识,也发现以前自己有得地方理解错了.我采用的数据库是SQL Server2012.数据库中有一张比 ...
- SQL 必知必会
本文介绍基本的 SQL 语句,包括查询.过滤.排序.分组.联结.视图.插入数据.创建操纵表等.入门系列,不足颇多,望诸君指点. 注意本文某些例子只能在特定的DBMS中实现(有的已标明,有的未标明),不 ...
- .NET程序员项目开发必知必会—Dev环境中的集成测试用例执行时上下文环境检查(实战)
Microsoft.NET 解决方案,项目开发必知必会. 从这篇文章开始我将分享一系列我认为在实际工作中很有必要的一些.NET项目开发的核心技术点,所以我称为必知必会.尽管这一系列是使用.NET/C# ...
- 0005 《SQL必知必会》笔记01-SELECT语句
1.SELECT基本语句: SELECT 字段名1,···,字段名n FROM 表名 2.检索所有字段,用"*"替换字段名,这会导致效率低下 SELECT * FROM 表名; 3 ...
- 2015 前端[JS]工程师必知必会
2015 前端[JS]工程师必知必会 本文摘自:http://zhuanlan.zhihu.com/FrontendMagazine/20002850 ,因为好东东西暂时没看懂,所以暂时保留下来,供以 ...
随机推荐
- #差分约束系统#CodeChef Digit Matrix&洛谷 7515 [省选联考 2021 A 卷] 矩阵游戏
洛谷传送门 DGMATRIX 分析 先任意构造出一个不一定满足值域的矩阵,现在只需要满足值域就可以了. 可以发现,给一行或一列依次加一减一2*2矩阵的和仍然不变,并且如果有解一定能构造出一组方案. 因 ...
- 重磅官宣,OpenHarmony开发者大会来了!
开放原子开源基金会OpenHarmony开发者大会2023将于4月19日在北京召开. 春风送暖万物新,OpenHarmony正当时.诚邀您参加本届大会,聆听行业大咖分享操作系统和开源的最新前沿研究成 ...
- 面试官:Redis如何实现延迟任务?
延迟任务(Delayed Task)是指在未来的某个时间点,执行相应的任务.也就是说,延迟任务是一种计划任务,它被安排在特定的时间后执行,而不是立即执行. 延迟任务的常见使用场景有以下几个: 定时发送 ...
- openGauss数据库源码学习-指标采集、预测与异常检测
opengauss 源码解析 指标采集.预测与异常检测 代码位置:/gausskernel/dbmind/tools/anomaly_detection 各模组在整体结构上的组合在摩天轮论坛上官方解析 ...
- docker 应用篇————dockerfile[十四]
前言 简单介绍一下dockerfile. 正文 dockerfile就是docker image的构建文件. 然后来运行一下. 然后就产生了test:1.0 这个镜像. 然后启动一下你就发现了这个镜像 ...
- 重新点亮linux 命令树————目录相关[三]
前言 简单介绍一些目录命令 正文 主要介绍三个命令 cd 路径切换 cd 这个命令用于切换当前目录的. 切换有三种形式. 以/开头的是绝对路径,比如/home. 以.开头的是相对路径,比如说./ser ...
- 重新整理.net core 计1400篇[九] (.net core 中的依赖注入的服务的消费)
前言 包含服务注册信息IServiceCollection 集合最终被用来创建作为依赖注入容器的IServiceProvider 对象. 当需要创建某个服务实例的时候(服务消费),我们通过指定服务类型 ...
- mybatis generator生成mapper接口后的代理类,很方便使用。
1.spring 配置: <bean id="superMapperProxy" class="com.qws.v1.daoImpl.MapperProxy&quo ...
- Qt 从 QTransform 逆向解出 Translate/Scale/Rotate(平移/缩放/旋转)分析
QTransform 用于图形绘制,它定义了如何平移(translate).缩放(scale).切变(shear).旋转(rotate)或投射(project)坐标系.注意:QTransform 是作 ...
- 使用Docker搭建MongoDB 5.0版本副本集集群
1.mongodb集群 首先我们需要了解mongodb的集群模式,mongodb安装分为单机安装和集群安装.集群安装分为:主从复制(Master-Slaver)集群.副本集(Replica Set)集 ...