镜像的操作:
- docker pull 拉取远程仓库的镜像到本地
- docker tag 重命名镜像
- docker image 查看本地存在的镜像
- docker rmi 删除无用镜像
- 构建镜像:
- docker build 基于dockerfile构建镜像
- docker commit 基于已运行的容器提交为镜像
构建镜像的方式:
1,使用docker commit
说几个选项的含义:
选项 | 选项简写 | 说明 |
---|---|---|
–detach | -d | 在后台运行容器,并且打印容器id。 |
–interactive | -i | 即使没有连接,也要保持标准输入保持打开状态,一般与 -t 连用。 |
–tty | -t | 分配一个伪tty,一般与 -i 连用。 |
-it其实就是分配一个连接的伪tty;
正题:以busybox镜像为例,从busybox容器中提交为镜像
docker run --rm --name=busybox -it busybox sh 创建一个busybox容器并进入
touch hello.sh && echo "echo \"hello\"" > hello.sh && chmod +x hello.sh 在容器里创建一个hello脚本
现在新开一个窗口:
使用docker commit busybox busybox:hello 即将当前容器提交为了一个hello镜像
2,基于dockerfile的方式:
dockerfile常见指令
FROM:Dockerfile 除了注释第一行必须是 FROM ,FROM 后面跟镜像名称,代表我们要基于哪个基础镜像构建我们的容器。
RUN:RUN 后面跟一个具体的命令,类似于 Linux 命令行执行命令。
ADD: 拷贝本机文件或者远程文件到镜像内
COPY: 拷贝本机文件到镜像内
USER: 指定容器启动的用户
ENTRYPOINT: 容器的启动命令
CMD: CMD 为 ENTRYPOINT 指令提供默认参数,也可以单独使用 CMD 指定容器启动参数
ENV: 指定容器运行时的环境变量,格式为 key=value
ARG: 定义外部变量,构建镜像时可以使用 build-arg = 的格式传递参数用于构建
EXPOSE: 指定容器监听的端口,格式为 [port]/tcp 或者 [port]/udp
WORKDIR: 为 Dockerfile 中跟在其后的所有 RUN、CMD、ENTRYPOINT、COPY 和 ADD 命令设置工作目录。
Dockerfile 的每一行命令,都生成了一个镜像层,每一层的 diff 夹下只存放了增量数据,这样分层使得docker镜像非常轻量。每一层根据镜像的内容都有一个唯一的 ID 值,当不同的镜像之间有相同的镜像层时,便可以实现不同的镜像之间共享镜像层的效果。
镜像的实现原理:
镜像是由一系列的镜像层(layer )组成,每一层代表了镜像构建过程中的一次提交,当我们需要修改镜像内的某个文件时,只需要在当前镜像层的基础上新建一个镜像层,并且只存放修改过的文件内容。分层结构使得镜像间共享镜像层变得非常简单和方便。
清理容器多余数据相关的命令有两条,分别是:docker image prune -af 仅仅清除没有被容器使用的镜像文件docker system prune -f 清除多余的数据,包括停止的容器、多余的镜像、未被使用的volume等等。