docker pull ubuntu:18.04
注意:一般默认是拉取标签为latest的镜像,而镜像的latest意味着该镜像的内容会跟踪最新版本的变化而变化,内容是不稳定的!
子命令支持的选项主要包括:
-a, --all-tags=true|false # 默认是false
--disable-content-trust # 取消镜像的内容校验,默认为true
--registry-mirror=proxy_URL # 指定镜像代理服务地址,可用于加速docker镜像获取
docker images
子命令支持的选项主要包括:
-a, --all=true|false # 列出所有(包含临时文件)镜像文件,默认为false
--digests=true|false # 列出镜像的数字摘要,默认为false
-f, --filter=[] # 过滤列出的镜像,也可以指定带有特定标注的镜像等
--format="TEMPLATE" # 控制输出格式,如.ID代表ID信息,.Repository代表仓库信息等
--no-trunc=true|false # 对输出结果中太长的部分是否进行截断,如镜像的ID信息,默认为true
-q,--quiet=true|false # 仅输出ID信息,默认为false
更多命令,可以通过man docker-images
进行查看
例如:
docker tag ubuntu:latest myubuntu:latest
使用inspect命令就可以获取该镜像的详细信息,包括制作者、适应架构、各层的数字摘要等信息
docker [image] insepect ubuntu:18.04
镜像文件由多个层组成,使用该命令可以列出各层的创建信息
docker history ubuntu:18.04
# 也可以加镜像的IMAGE ID
docker history 123443f0f0f0
docker search [option] keyword
其中 option 包括:
-f, --filter filter # 过滤输出内容
--format string # 格式化输出内容
--limit int # 限制输出结果个数,默认为25
--no-trunc # 不截断输出结果
docker rmi
或者docker image rm
,命令格式为docker rmi image [IMAGE...]
支持的选项包括
-f, -force # 强制删除镜像
-no-prune # 不要清理未带标签的父镜像
docker rmi 镜像ID
注意:当该镜像创建的容器存在时,镜像文件无法被删除
也可以使用-f强制删除,通常不推荐,正确的做法是先删除依赖该镜像的所有容器,再删除该镜像。
使用docker一段时间后,系统中可能会遗留一些临时的镜像文件,以及一些没有被使用的镜像,可以通过docker image prune
命令来进行清理
支持的选项包括:
-a, -all # 删除所有的无用镜像,不光是临时镜像
-filter filter # 只清理符合给定过滤器的镜像
-f, -force # 强制删除镜像,而不进行确认提示
创建镜像的方法主要有三种:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建。
该方法主要是使用docker [container] commit
命令。格式为docker [container] commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
主要选项包括:
-a, --author="" # 作者信息
-c, --change=[] # 提交的时候执行Dockerfile命令,包括CMD|ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR等
-m, --message="" # 提交信息
-p, --pause=true # 提交时暂停容器运行
比如执行sudo docker commit -a "Annie" -m "This is a docker commit test" 180a88bdc593 ubuntu:test
利用insepect命令去查看镜像可以看到
主要使用docker [image] import [OPTIONS] file|URL|[REPOSITORY[:TAG]]
这里注意避个坑:一定要是.tar.gz结尾的压缩包文件才可以通过本地模板导入,刚开始我用了.jar文件直接导入是不行的
可以参考这篇文章https://blog.csdn.net/weixin_53246927/article/details/125755563的Dockerfile操作常用命令
以下常用命令皆是借鉴上述连接:
1、FORM镜像
指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令
2、MAINTAINER名字
说明新镜像的维护人信息
3、RUN 命令
在所基于的镜像上执行命令,并提交到新的镜像中
当命令较长时,可以使用\来换行
4、ENTRYPOINT
ENTRYPOINT [“要运行的程序”,“参数1”,“参数2”]
设定容器启动时第一个运行的命令及其参数
可以通过使用命令docker run --entrypoint 来覆盖镜像中的ENTRYPOINT指令的内容。
两种格式:
exec格式(数值格式):ENTRYPOINT [“命令”,“选项”,“参数”]
shell格式:ENTRYPOINT 命令 选项 参数
前面四个命令就可以创建成一个粗略的镜像。
5、CMD
CMD ["要运行的程序","参数1","参数2"]
启动容器时默认执行的命令或者脚本,Dockerfile只能有–条CMD命令。如果指定多条命令,只执行最后一条命令。
如果在dockerrun时指定了命令或者镜像中有ENTRYPOINT,那么cmd就会被覆盖。
CMD可以为ENTRYPOINT 指令提供默认参数
两种格式:
exec形式:CMD [“要运行的程序”,“参数1”, “参数2”]
shell形式: CMD 命令 参数1 参数2
优先级:
docker run–entrypoint > Dockerfile ENTRYPOINT > docker run 命令 > Dockerfile CMD
6、EXPOSE 端口号
指定新镜像加载到Docker时要开启的端口
7、ENV 环境变量变量值
设置一个环境变量的值,会被后面的RUN使用
8、ADD 源文件/目录 目标文件/目录
将源文件复制到镜像中,源文件要与Dockerfile 位于相同目录中,或者是一个URL
注意事项
如果源路径是个文件,且目标路径是以/结尾, 则docker会把目标路径当作一个目录,会把源文件拷贝到该目录下。如果目标路径不存在,则会自动创建目标路径。
如果源路径是个文件,且目标路径是不以/结尾,则docker会把目标路径当作一个文件。如果目标路径不存在,会以目标路径为名创建一个文件,内容同源文件;如果目标文件是个存在的文件,会用源文件覆盖它,当然只是内容覆盖,文件名还是目标文件名。如果目标文件实际是个存在的目录,则会源文件拷贝到该目录下。注意, 这种情况下,最好显示的以/结尾,以避免混淆。
如果源路径是个目录,且目标路径不存在,则docker会自动以目标路径创建一个目录,把源路径目录下的文件拷贝进来。如果目标路径是个已经存在的目录,则docker 会把源路径目录下的文件拷贝到该目录下。
如果源文件是个归档文件(tar、bzip2压缩文件),则docker会自动帮解压。
URL"下载和解压特性不能一 起使用。任何压缩文件通过URL拷贝,都不会自动解压。
9、COPY
COPY 源文件/目录目标文件/目录
只复制本地主机_上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中
ADD和COPY的区别:
ADD和COPY都可以复制本地文件到镜像中。
ADD可以将本地tar包解压后复制到镜像目录,也支持下载源文件。但不支持下载和解压同时使用。
COPY不支持解压,不支持下载。
10、VOLUME [“目录"]
在容器中创建–个挂载点
11、USER 用户名/UID
指定运行容器时的用户
12、WORKDIR 路径
为后续的RUN、CMD、 ENTRYPOINT 指定工作目录
13、ONBUILD 命令
指定所生成的镜像作为一个基础镜像时所要运行的命令。
当在一个Dockerfile 文件中加上ONBUILD指令, 该指令对利用该Dockerfile构建镜像 (比如为A镜像) 不会产生实质性影响。
但是当编写一个新的Dockerfile文件来基于A镜像构建一个镜像 ( 比如为B镜像)时,这时构造A镜像的Dockerfile文件中的ONBUILD指令就生效了,在构建B镜像的过程中,首先会执行ONBUILD指令指定的指令,然后才会执行其它指令。
14、AGR
设置编译镜像时加入的参数
使用ENV指令定义的环境变量始终会覆盖同名的ARG指令
ARG CONT_IMG_VER
ENV CONT_IMG_VER=V1.0.0
RUN echo $CONT_IMG_VER
docker build --build-arg VER=v2.0
15、创建镜像
编写完成Dockerfile之后,可以通过docker build命令来创建镜像。
基本的格式为docker build [选项] 路径,该命令将读取指定路径下(包括子目录)的Dockerfile,并将该路径下所有内容发送给Docker服务端,由服务端来创建镜像。因此一般建议放置Dockerfile的目录为空目录。
另外,可以通过.dockerignore文件(每一行添加一条匹配模式)来让Docker忽略路径下的目录和文件。
要指定镜像的标签信息,可以通过-t选项。
在编写Dockerfile时,有严格的格式需要遵循:
1、第一行必须使用FROM指令指明所基于的镜像名称;
2、之后使用MAINTAINER指令说明维护该镜像的用户信息;
3、然后是镜像操作相关指令,如RUN指令。每运行一条指令,都会给基础镜像添加新的一 层。
4、最后使用CMD指令指定启动容器时要运行的命令操作。
ps:Dockerfile这个操作我还没看懂,等我看懂了再贴演示的图
导出镜像到本地文件使用docker [image] save
命令。该命令支持-o、-output string参数,导出镜像到指定文件中。
可以使用docker [image] load
将导出的tar文件再导入到本地镜像库。支持-i、-input string选项,从指定文件中读取镜像内容。
可以发现再次载入的时候IMAGE ID都是相同的
可以使用docker [image] push
命令上传镜像到仓库,默认上传到Docker Hub官方仓库(需要登录)。命令格式为docker [image] push NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/]NAME["TAG]
失败的原因是因为没有登录docker hub,这个机制有点类似于github,需要先登录一下账号
sudo docker login -u username # username的部分换成自己的docker hub账号名
然后输入密码就行了
然后我发现push的时候还是拒绝,我就去查找了原因,有个博主说需要先执行docker login
这个语句,我去试了发现还是不行,后来我又通过网页登录了我的docker hub去查看发现没建仓库,于是手动建了一个,建完才发现右边有个语句提示
docker tag local-image:tagname new-repo:tagname
docker push new-repo:tagname
建了仓库发现还是失败,然后我就开始了试错的过程,直到我试到下列图片的第一句,我幡然醒悟,发现是自己没tag
然后就成功了,在docker hub就可以查看镜像了