当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
1、从已经创建的容器中更新镜像,并且提交这个镜像
2、使用 Dockerfile 指令来创建一个新的镜像
容器是镜像实例化而来,容器即进程,镜像即文件。一个镜像可以启动多个容器,镜像类似于虚拟机中的只读模板,属于一个独立的文件系统。
通过命令启动一个新容器
docker ps -a 查看所有容器
docker run < 容器ID >
可以看到该ubuntu系统
使用-d,表示不进入该容器,该容器后台运行
目前该容器已启动
我们进入该容器
docker exec -it f03b00737af7 /bin/bash
进入交互界面
执行
apt-get update
退出容器终端
exit
通过命令 docker commit 来提交容器副本
docker commit -m="has update" -a="eve" f03b00737af7 eve/ubuntu:v2022-6-13
执行成功
参数说明:
-m: 提交的描述信息
-a: 指定镜像作者
f03b00737af7:容器 ID
eve/ubuntu:v2022-6-13: 指定要创建的目标镜像名,后面是tag
文章参考:
https://blog.csdn.net/m0_46090675/article/details/121846718
https://www.runoob.com/docker/docker-image-usage.html
使用命令
docker images
可以看到,我们本地仓库上有这个镜像。
我们可以看到,该镜像虽然创立,但是没有开启一个容器实例。
docker run 7ddb91f00874 将镜像启动,创建一个容器
进入该容器看看
docker run -it 7ddb91f00874 /bin/bash
成功进入,但是提示没有ipv4的地址
输入pwd和ls,也确实可以使用。
前面说过,镜像是一个文件。我们构建一个新的镜像,就是构建一个新文件。
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),用于构建镜像。每一条指令构建一层镜像,因此每一条指令的内容,就是描述该层镜像应当如何构建。
完整的镜像
执行过程
参数解析
参数分析
我们先来看网上的dockerfile文件
Dockerfile
[root@localhost dockerfile]# cat Dockerfile
FROM centos:7
MAINTAINER ZYQ <714840265@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim net-tools
EXPOSE 80
CMD /bin/bash
参数解释
1、FROM centos:7 该image文件继承官方的centos7
2、ENV MYPATH /usr/local:设置环境变量MYPATH
3、WORKDIR $MYPATH:直接使用上面设置的环境变量,指定/usr/local为工作目录
4、RUN yum -y install vim && net-tools:在/usr/local目录下,运行yum -y install vim和yum -y install net-tools命令安装工具,注意安装后的所有依赖和工具都会打包到image文件中
5、EXPOSE 80:将容器80端口暴露出来,允许外部连接这个端口
6、CMD:指定容器启动的时候运行命令
执行build命令
docker build -t mycentos:1.0 .
正在执行
中途报错,我们来看看错误原因
不能安装yum、vim等工具。
这不影响我们生成镜像
docker images 查看docker所有镜像
生成的镜像有204M
使用命令进入创建的新镜像
docker run -it 260ab087f6e6 /bin/bash
看到可以正常操作
我们来验证下系统版本
主机为7.6.1819版本
下节将进行容器之间的通讯。