系列文章目录
docker常见用法之镜像构建1docker
一、镜像的分层结构
共享宿主机的内核(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