Docker 必知必会3----使用自己制作的镜像

docker · 浏览次数 : 0

小编点评

**迁移镜像的操作步骤:** 1. 将镜像保存到磁盘文件中。 2. 在目标机器上执行 `docker load` 命令加载镜像。 3. 删除掉旧的镜像。 4. 将新镜像加载到容器中。 **示例:** ```bash # 保存镜像 docker save -o mytom.tar 5bab70215cf82 3 # 载入镜像 docker load -i mytom.tar # 删除旧的镜像 docker rmi 5bab70215cf8 11 # 加载新的镜像 docker load -i mytom.tar 15 Loaded image ID: sha256:5bab70215cf8a0f1dc53c5aca3bfbdc5dca2893f591c7d145af7929d146d9ad916 ``` **注意:** * 新的镜像名称和 TAG 为 `none` ,可以使用 `docker tag` 命令重新命名和更改镜像的版本。 * 确保目标机器具有与源机器相同的网络连接能力。 * 确保镜像文件没有发生变化。

正文

前面的两篇文章分别讲了,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----使用自己制作的镜像相似的内容:

Docker 必知必会3----使用自己制作的镜像

前面的两篇文章分别讲了,docker的基础概念,设计思路以及docker的基本操作。感兴趣的同学可以查阅: https://www.cnblogs.com/jilodream/p/18177695https://www.cnblogs.com/jilodream/p/18184687 本文我们将介绍

Docker 必知必会4----容器之间的通信

前面几篇文章,我们聊了docker的基本概念,以及基本的操作手段: https://www.cnblogs.com/jilodream/p/18177695 初识dockerhttps://www.cnblogs.com/jilodream/p/18184687 基本操作https://www.cn

Docker 必知必会2----跟我来一步步执行基本操作

通过前文(https://www.cnblogs.com/jilodream/p/18177695)的了解,我们已经大致明白了什么是docker,为什么要用docker,以及docker的基本设计思路是什么。今天来看下,docker的基本操作有哪些? 1、linux下安装docker 首先我们来安装

Docker 必知必会----初识

什么是Docker?Docker 是一个开源的容器管理引擎。开发者可以通过Docker直接管理应用程序所需要的容器。它的logo如下: 为什么需要Docker使用Docker主要有两个原因,1、屏蔽不同环境的硬件差异,减轻开发人员在不同环境上,为了适配环境差异所需要做的工作。如各项系统配置、环境变量

500行代码手写docker开篇-goland远程编译环境配置

(1)500行代码手写docker开篇-goland远程编译环境配置 本系列教程主要是为了弄清楚容器化的原理,纸上得来终觉浅,绝知此事要躬行,理论始终不及动手实践来的深刻,所以这个系列会用go语言实现一个类似docker的容器化功能,最终能够容器化的运行一个进程。 代码最终运行效果 本系列源码已经上

500行代码手写docker-以新命名空间运行程序

(2)500行代码手写docker-以新命名空间运行程序 本系列教程主要是为了弄清楚容器化的原理,纸上得来终觉浅,绝知此事要躬行,理论始终不及动手实践来的深刻,所以这个系列会用go语言实现一个类似docker的容器化功能,最终能够容器化的运行一个进程。 本章的源码已经上传到github,地址如下:

500行代码代码手写docker-将rootfs设置为只读镜像

# (3)500行代码代码手写docker-将rootfs设置为只读镜像 > 本系列教程主要是为了弄清楚容器化的原理,纸上得来终觉浅,绝知此事要躬行,理论始终不及动手实践来的深刻,所以这个系列会用go语言实现一个类似docker的容器化功能,最终能够容器化的运行一个进程。 本章的源码已经上传到git

500代码行代码手写docker-设置网络命名空间

# (4)500代码行代码手写docker-设置网络命名空间 > 本系列教程主要是为了弄清楚容器化的原理,纸上得来终觉浅,绝知此事要躬行,理论始终不及动手实践来的深刻,所以这个系列会用go语言实现一个类似docker的容器化功能,最终能够容器化的运行一个进程。 本章的源码已经上传到github,地址

500行代码手写docker-实现硬件资源限制cgroups

# (5)500行代码手写docker-实现硬件资源限制cgroups > 本系列教程主要是为了弄清楚容器化的原理,纸上得来终觉浅,绝知此事要躬行,理论始终不及动手实践来的深刻,所以这个系列会用go语言实现一个类似docker的容器化功能,最终能够容器化的运行一个进程。 本章的源码已经上传到gith

Docker通信全视角:原理、实践与技术洞察

本文全面深入地探讨了Docker容器通信技术,从基础概念、网络模型、核心组件到实战应用。详细介绍了不同网络模式及其实现,提供了容器通信的技术细节和实用案例,旨在为专业从业者提供深入的技术洞见和实际操作指南。 关注【TechLeadCloud】,分享互联网架构、云服务技术的全维度知识。作者拥有10+年