docker常见用法之镜像构建1

系列文章目录

docker常见用法之镜像构建1


一、镜像的分层结构

在这里插入图片描述
共享宿主机的内核(kernel)(容器的安全把宿主机安全管控好就好)
base镜像提供的是最小的linux发行版
同一docker主机支持运行多种linux发行版(因为linux内核一样,不一样的是文件系统)
采用分层结构的最大好处:共享资源(底层共享资源)
分层结构:降低了网络带宽和磁盘空间
(下载网上的镜像时候会判断你有该层没,你有相同层的话,你便不用下载了已经有的层。本机只要存储同样的镜像层一份,本机的镜像也可以共享)
在这里插入图片描述Copy-on-Write(linux内核的写时复制技术)容器层可以写
容器层以下都不可以写(都是只读)
docker从上往下依次查找文件
容器层保存镜像变化的部分,并不会对镜像本身进行任何的修改
一个镜像最多127层(一般不会有那么大,因为优化就是减少镜像层)


二、容器的用法

容器常用用法:

-i交互式-t打开一个tty终端
-d打入后台-name给容器起个名字
ctrl +d 退出容器终端并且容器停掉docker ps显示正在运行的容器
ctrl +pq 退出容器终端并且容器后台运行docker ps +a 显示所有的容器
docker rm +容器名字 删掉已经停止的容器容器正在running状态需要先stop,在rm
强制删除,不用停止容器直接删除rm-f + 容器名字docker -p 宿主机端口:容器内的端口,用宿主机的端口号映射容器内的端口
docker start + 容器名字,开启容器docker container attach +容器名字,进入该容器
docker images 查看容器已经有的镜像docker history +容器名字,查看之前打包的历史记录
docker rmi +镜像名字,删除镜像docker load 导入镜像
docker port + 容器名字,可以查看容器的端口映射–restart=always随着docker引擎的开启该容器自动启动
docker inspect + 容器名字或者id,查看容器具体信息docker inspect +镜像,查看镜像的具体信息
docker -v 宿主机路径:容器路径,数据持久化docker exec -it 容器名字 sh 重新进入交互式容器中不能tab补齐
docker -v 将宿主机资源挂载到容器内
docker exec -it 容器名字 bash 重新进入交互式容器中能tab补齐
[root@docker1 docker]# docker container 
attach   diff     kill     port     rm       stop     wait     
commit   exec     logs     prune    run      top      
cp       export   ls       rename   start    unpause  
create   inspect  pause    restart  stats    update   

三、镜像的构建

镜像的名称是不能冲突的

3.1docker commit 构建新镜像三部曲

不推荐该方法

运行容器docker run
修改容器
将容器保存为新的镜像
缺点:效率低、可重复性弱、容易出错
       使用者无法对镜像进行审计,存在安全隐患

3.1.1运行容器并且修改容器

[root@docker1 docker]# docker run -it --name test busybox
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # touch file1
/ # touch file2
/ # touch file3
/ # ls
bin    etc    file2  home   root   tmp    var
dev    file1  file3  proc   sys    usr
ctrl +d
[root@docker1 docker]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@docker1 docker]# docker start test 
test
[root@docker1 docker]# docker container attach test 
/ # 
ctrl +pq
[root@docker1 docker]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
7d589bd8615e        busybox             "sh"                27 minutes ago      Up 5 minutes                            test

3.1.2提交容器

[root@docker1 docker]# docker commit --help
Usage:	docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
[root@docker1 docker]# docker commit -m "v1" test test:v1
sha256:dc00eef3c58e0c21318a3a8bc9f4586f75e18b460211cb4bed1f565134924cf4
[root@docker1 docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test                v1                  dc00eef3c58e        55 seconds ago      1.24MB
busybox             latest              beae173ccac6        3 weeks ago         1.24MB

missing 表示在别人机器上打包的你看不到,v1创建了3个文件
只能看到sh,不知道用户在其中具体干了什么,不便于用户审计和重用,安全隐患。

[root@docker1 docker]# docker history test:v1 
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
dc00eef3c58e        2 minutes ago       sh                                              166B                v1
beae173ccac6        3 weeks ago         /bin/sh -c #(nop)  CMD ["sh"]                   0B                  
<missing>           3 weeks ago         /bin/sh -c #(nop) ADD file:6db446a57cbd2b7f4…   1.24MB              
[root@docker1 docker]# docker history busybox:latest 
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
beae173ccac6        3 weeks ago         /bin/sh -c #(nop)  CMD ["sh"]                   0B                  
<missing>           3 weeks ago         /bin/sh -c #(nop) ADD file:6db446a57cbd2b7f4…   1.24MB              

分层结构的好处,共享资源。两个镜像都用了最后2层,但操作系统上面只用保存一份。彼此共享,镜像层是只读的

[root@docker1 docker]# docker run -it --name demo test:v1
/ # ls
bin    dev    etc    file1  file2  file3  home   proc   root   sys    tmp    usr    var

3.1.2删除docker镜像

删除原先docker三部曲创建的镜像
当前有容器占用镜像,所以删不了该镜像。删除镜像的时候,先保证没有容器占用该镜像

[root@docker1 docker]# docker rmi test:v1
Error response from daemon: conflict: unable to remove repository reference "test:v1" (must force) - container 1e534ccc1bb7 is using its referenced image dc00eef3c58e

docker ps-a 找到占用镜像的容器删掉,然后删除容器镜像

[root@docker1 docker]# docker rm -f demo 
demo
[root@docker1 docker]# docker rmi test:v1 
Untagged: test:v1
Deleted: sha256:dc00eef3c58e0c21318a3a8bc9f4586f75e18b460211cb4bed1f565134924cf4
Deleted: sha256:9e982fbda3a1bbb95e62de21d15b305daef87bab314f218a62afbfd3f9939c2e

3.2Dockerfile构建镜像

创建一个Dockerfile (必须在一个空目录中创建) 因为一开始会发送内容给Docker引擎,如果在很大/目录上面构建,会把整个/发送去构建
构建镜像

[root@docker1 docker]# cd 
[root@docker1 ~]# ls
[root@docker1 ~]# mkdir docker 
[root@docker1 ~]# cd docker/
[root@docker1 docker]# ls
[root@docker1 docker]# vim Dockerfile

FROM 从那个基础镜像开始构建,给予它一个环境(构建方式,通过基础镜像,运行一个容器,(后台)在里面执行指令)
RUN在容器里面运行什么指令
.是从当前目录读取

[root@docker1 docker]# cat Dockerfile 
FROM busybox
RUN touch file1
RUN mkdir dir1
RUN mv file1 dir1

里面有构建镜像的具体参数

[root@docker1 docker]# docker build --help

每一个RUN,一层。相当于,你每一次运行,执行了一次Docker commit

[root@docker1 docker]# docker build -t test:v1 .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM busybox
 ---> beae173ccac6
Step 2/4 : RUN touch file1
 ---> Running in 0121d9c6c701
Removing intermediate container 0121d9c6c701
 ---> 884a1d2fcbd4
Step 3/4 : RUN mkdir dir1
 ---> Running in f45072d8860b
Removing intermediate container f45072d8860b
 ---> 3f7259a48bfc
Step 4/4 : RUN mv file1 dir1
 ---> Running in 612208e6db5b
Removing intermediate container 612208e6db5b
 ---> b6b7f570cc47
Successfully built b6b7f570cc47
Successfully tagged test:v1

在这里插入图片描述
便于审计并且便于重用,因为这个文件Dockerfile已经写下来了
在Dockerfile中写的每一行通过Docker commit提交成镜像层
在这里插入图片描述


END

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值