docker-8-镜像制作原理

1 Docker镜像原理

(1-1)思考
Docker镜像本质是什么?
Docker中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要有几个GB?
Docker中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70多MB?
(1-2)操作系统组成部分:
进程调度子系统
进程通信子系统
内存管理子系统
设备管理子系统
【文件管理子系统】
网络通信子系统
作业控制子系统
(1-3)文件管理子系统
Linux文件系统由bootfs和rootfs两部分组成
bootfs:包含bootloader(引导加载程序)和kernel(内核)。
rootfs:root文件系统,包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。
不同的Linux发行版,bootfs基本一样,而rootfs不同,如ubuntu,centos等。
(1-4)Docker镜像原理

(1-4-1)Docker镜像是由特殊的文件系统叠加而成
最底端是bootfs,并使用宿主机的bootfs。
第二层是root文件系统rootfs,称为base image。
然后再往上可以叠加其他的镜像文件。

例如:
【镜像(tomcat)】
【镜像(jdk)】
【rootfs基础镜像(centos/ubuntu)】
【bootfs】

(1-4-2)统一文件系统技术(union File System)
能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在。
在用户的角度来看,只存在一个文件系统。
【所以tomcat镜像看来有500多MB】
(1-4-3)一个镜像可以放在另一个镜像上面
位于下面的镜像称为父镜像,最底部的镜像称为基础镜像。
(1-4-4)当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器

(1-5)思考答案
Docker镜像本质是什么?
【分层文件系统】
Docker中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要有几个GB?
【centos的iso镜像文件包含bootfs和rootfs,而docker的centos镜像复用操作系统的bootfs,只有rootfs和其他镜像层】
Docker中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70多MB?
【由于Docker中镜像是分层的,tomcat虽然只有70多MB,但他需要依赖于父镜像和基础镜像,所以整个对外暴露的tomcat镜像大小500多MB】

2 Docker镜像如何制作

(方式1)容器转为镜像
docker commit 容器id 新镜像名称:版本号
docker save -o 压缩文件名称 镜像名称:版本号
docker load -i 压缩文件名称

【主要目的在于将镜像转成压缩文件,分发传递】
#docker commit f01f6 mytomcat:1.0
#docker save -o mytomcat.tar mytomcat:1.0
#docker rmi mytomcat:1.0
#docker load -i mytomcat.tar
#docker run -it --name=new_tomcat mytomcat:1.0 /bin/bash
这种方式,开启的容器,之前通过数据卷映射的文件就不存在了,若想看到,需要在启动时进行挂载。

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

3 镜像制作flask应用阿里pip加速

(1)需求
自定义python镜像。要求:【运行python flask程序】

(2)实现步骤
(2-1)定义父镜像:FROM python:3.6
(2-2)定义作者信息:MAINTAINER bingbing 123456789@qq.com
(2-3)更新pip至最新:RUN pip3 install pip -U
(2-4)配置阿里源:RUN pip3 config set global.index-url http://mirrors.aliyun.com/pypi/simple
(2-4)配置阿里源:RUN pip3 config set install.trusted-host mirrors.aliyun.com
(2-5)安装依赖包:RUN pip3 install flask
(2-6)将代码添加到容器:ADD myflask.py app.py
(2-7)定义容器启动执行的命令:CMD python app.py

(3)执行实现
#mkdir docker-files
#cd /root/docker-files/

(3-1)# vi myflask.py
【内容如下】

from flask import Flask
app = Flask(__name__)

@app.route("/")
def test_link():
    return "the link is Good11"

if __name__=="__main__":
    app.run(host="0.0.0.0",port=5000,debug=False)

(3-2)# vi myflask_dockerfile
【内容如下】

FROM python:3.6
MAINTAINER bingbing <123456789@qq.com>
RUN pip3 install pip -U
RUN pip3 config set global.index-url http://mirrors.aliyun.com/pypi/simple
RUN pip3 config set install.trusted-host mirrors.aliyun.com
RUN pip3 install flask
ADD myflask.py app.py
CMD python app.py

(3-3)基于dockerfile创建镜像
#docker build -f myflask_dockerfile -t myflask:1.0 .

(3-4)启动容器
#docker run -id --name=f1 -p 5000:5000 myflask:1.0
【注意不要加 /bin/bash】

(3-5)停止容器
#docker stop f1

(3-6)启动容器
#docker start f1

(4)映射文件,在宿主机更改后容器内随之而变
#docker run -id --name=f1 -p 5000:5000 -v /root/docker-files/myflask.py:/app.py myflask:1.0
修改宿主机中的文件
#vi myflask.py
#docker restart f1重启容器

(5)映射目录,目录中有内容
映射时,宿主机目录有什么,容器对应目录中也有什么
#mkdir /root/myflasktest
#cd /root/myflasktest
#cp /root/docker-files/myflask.py ./app.py
#docker run -id --name=f1 -p 5000:5000 -v /root/myflasktest/app.py:/app.py -v /root/myflasktest:/root/myflasktest myflask:1.0
#docker exec -it f1 /bin/bash

4 案例

4.1 案例一

#docker run -it --name=c1 centos:7
[root@444c96814bb4 /]# 工作目录在/下
[root@444c96814bb4 /]# vim【bash: vim: command not found】
Docker官方提供的centos镜像,默认没有vim。
(1)需求
自定义centos7镜像。要求:【默认登录路径为/usr,可以使用vim】
(2)实现步骤
(2-1)定义父镜像:FROM centos:7
(2-2)定义作者信息:MAINTAINER bingbing 123456789@qq.com
(2-3)执行安装vim命令:RUN yum -y install vim
(2-4)定义默认的工作目录:WORKDIR /usr
(2-5)定义容器启动执行的命令:CMD /bin/bash

(3)执行实现
#mkdir docker-files
#cd /root/docker-files/
#vi centos_dockerfile
【内容如下】

FROM centos:7
MAINTAINER bingbing <123456789@qq.com>
RUN yum -y install vim
WORKDIR /usr
CMD /bin/bash

基于dockerfile创建镜像
#docker build -f centos_dockerfile -t mycentos:1.0 .
#docker run -it --name=c2 mycentos:1.0 /bin/bash
[root@73728b154ee7 usr]#

4.2 案例二

(1)需求
自定义python镜像。要求:【运行python程序,打印输出1-10】
(2)实现步骤
(2-1)定义父镜像:FROM python:3.6
(2-2)定义作者信息:MAINTAINER bingbing 123456789@qq.com
(2-3)将代码添加到容器:ADD count.py app.py
(2-4)定义容器启动执行的命令:CMD python app.py

(3)执行实现
#mkdir docker-files
#cd /root/docker-files/

(3-1)# vi count.py
【内容如下】

for i in range(1,11):
        print(i)

(3-2)# vi python_dockerfile
【内容如下】

FROM python:3.6
MAINTAINER bingbing <123456789@qq.com>
RUN mkdir /app
ADD count.py /app/app.py
WORKDIR /app
CMD python app.py

(3-3)基于dockerfile创建镜像
#docker build -f python_dockerfile -t mypython:1.0 .

(3-4)启动容器
#docker run -it --name=p1 mypython:1.0
1
2
3
4
5
6
7
8
9
10
打印输出了1-10
并且只能运行一次
【注意不要用 docker run -it --name=p1 mypython:1.0 /bin/bash】
【如果加了/bin/bash会替代CMD python app.py这个命令】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮皮冰燃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值