Docker镜像原理

  • Docker镜像是 由特殊的文件系统叠加而成
  • 最底端是bootfs, 并使用宿主机的bootfs
  • 第二层是root文件系统rootfs称为base image
  • 然后再往上可以叠加其他的镜像文件
  • 统一文件系统(UnionFile System) 技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。
  • 一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础境像。
  • 当从一个镜像启动容器时,Docker会在最顶展加载一个读写文件系统作为容器。

docker 从本地校验镜像 docker运行本地镜像_docker 从本地校验镜像

容器转成镜像

把容器变成镜像

如果容器挂载了数据卷,挂载的文件或者目录不会被打包成镜像。

docker commit [容器id] [镜像名]:[版本号]

把镜像打包成压缩文件

docker save -o [压缩文件名称] [镜像名称]:[版本号]

把压缩文件还原成镜像

docker load -i [压缩文件名称]

dockerfile制作镜像

概念

  • Dockerfile 是一个文本文件
  • 包含了一条条的指令
  • 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
  • 对于开发人员:可以为开发团队提供一个完全一致的开发环境
  • 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了
  • 对于运维人员:在部署时,可以实现应用的无缝移植

dockerfile关键字

  • FROM- 镜像从那里来
  • MAINTAINER- 镜像维护者信息
  • RUN- 构建镜像执行的命令,每一次RUN都会构建一层
  • CMD- 容器启动的命令,如果有多个则以最后一个为准,也可以为ENTRYPOINT提供参数
  • VOLUME- 定义数据卷,如果没有定义则使用默认
  • USER- 指定后续执行的用户组和用户
  • WORKDIR- 切换当前执行的工作目录
  • HEALTHCHECH- 健康检测指令
  • ARG- 变量属性值,但不在容器内部起作用
  • EXPOSE- 暴露端口
  • ENV- 变量属性值,容器内部也会起作用
  • ADD- 添加文件,如果是压缩文件也解压
  • COPY- 添加文件,以复制的形式
  • ENTRYPOINT- 容器进入时执行的命令

制作SpringBoot项目镜像

第一步:准备一个springboot项目,打成jar包,确保可以运行

docker 从本地校验镜像 docker运行本地镜像_学习_02

第二步:把jar上传到宿主机,在shell命令界面使用alt+p,使用put命令

docker 从本地校验镜像 docker运行本地镜像_docker_03

第三步:编写dockerfile文件

vim test_dockerfile
# 基础镜像
FROM java:8

# 镜像作者信息
MAINTAINER this <this@163.com>

# 添加jar包
ADD dockertest-1.0-SNAPSHOT.jar app.jar

# 容器启动后执行的命令
CMD java -jar app.jar

第四步:通过dockerfile构建镜像,最后还有一点不要忽略

docker build -f [dockerfile文件路径] -t [镜像名称]:[版本号] .

docker 从本地校验镜像 docker运行本地镜像_linux_04

第五步:使用镜像启动容器

docker 从本地校验镜像 docker运行本地镜像_linux_05

 【注意】

  • 记得加上端口映射,否则外部无法访问容器内的服务
  • 千万不要在后面加上 /bin/bash,否则dockerfile的CMD命令失效
docker run -id --name=app_test -p 8080:8080  678f9980f43f

第六步:验证

容器启动成功,留意一下command是否有 ”java -jar XXX" 字样

docker 从本地校验镜像 docker运行本地镜像_linux_06

页面也能成功访问,这样就实现了一个简单的dockerfile制作镜像了

docker 从本地校验镜像 docker运行本地镜像_jar_07

自定义CentOs镜像

需求:默认登录路径为/usr,可使用vim

第一步:编写dockerFile

touch centos_dockerfile
# 指定父镜像
FROM centos:7

# 作者信息
MAINTAINER this <this@163.com>

# 执行命令
RUN yum install -y vim

# 指定工作目录
WORKDIR /usr

# 命令
CMD /bin/bash

第二步:构建镜像

docker build -f ./centos_dockerfile -t mycentos:1 .

观察构建镜像过程,总共做了5个step,每一个step就是一层镜像

Sending build context to Docker daemon  17.63MB
Step 1/5 : FROM centos:7
 ---> eeb6ee3f44bd
Step 2/5 : MAINTAINER this <this@163.com>
 ---> Running in 27e36ee7e9ae
Removing intermediate container 27e36ee7e9ae
 ---> 29ac09de92f8
Step 3/5 : RUN yum install -y vim
 ---> Running in 920c58c2ac1d
Loaded plugins: fastestmirror, ovl
.....
Step 4/5 : WORKDIR /usr
 ---> Running in f3dfb551e878
Removing intermediate container f3dfb551e878
 ---> 9e68774c5c1c
Step 5/5 : CMD /bin/bash
 ---> Running in 62301cd97756
Removing intermediate container 62301cd97756
 ---> e725a59bcb38
Successfully built e725a59bcb38

第三步:使用镜像启动容器

docker run -it mycentos:1 /bin/bash