docker镜像
docker镜像
-
由
Dockerfile
生成 -
呈现层级结构
-
每层镜像包含:镜像文件以及镜像
json
元数据信息
1、镜像和容器
可以在 docker hub网站搜索镜像 https://hub.docker.com/ ,也可以使用 docker search 来搜索镜像
获取容器镜像
docker pull ubuntu
启动容器
docker run -d -p 8080:8080 ubuntu /bin/bash
容器必须要有一个运行的服务,否则容器就是stop状态
镜像和容器的关系
从 docker hub 上 pull 的都是镜像,可以使用 docker run 或 docker create 将镜像启动为容器
docker run:等于 docker create + docker start ,将镜像启动为容器并运行容器
docker create:将镜像启动为容器,但是不会运行容器
docker start:运行容器
2、创建新镜像的两种方式
1. 更新镜像: docker commit
先把一个镜像启动为容器,对容器做了更改之后,使用docker commit命令生成一个新的镜像
2. 构建镜像:docker build
需要创建Dockerfile文件,在最后需要指定路径,当前路径则为 . ,构建镜像时会打包指定路径下的所有文件,所以不要有无用的文件
Dockerfile格式
1.文件内容包含
#注释
指令(大写) 参数(小写)
2.构架镜像时,按顺序执行
3.第一个指令必须是FROM(不包括注释),是为了确定基础镜像
Dockerfile常用指令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | # FROM 指定基础镜像,本地没有会从dockerHub pull FROM <image> FROM <image>:<tag> FROM <image>@<digest> # MAINTAINER 作者,不推荐使用,即将被废弃 MAINTAINER <name> # LABEL 给镜像指定各种元数据,不会对镜像造成影响 LABEL <key>=<value> <key>=<value> ... # COPY 从宿主机复制文件到创建的新镜像文件,可以使用通配符 COPY <from>...<to> COPY [ "<from>" .... "<to>" ] #如 COPY hom*.txt /mydir/ # ADD 用法和COPY一样,ADD还支持URL路径,TAR文件会自动解压 ADD <from>...<to> ADD [ "<from>" .... "<to>" ] # WORKDIR 为Dockerfile中所有的RUN,CMD,ENTRYPOINT,COPY和ADD设定工作目录,只会影响当前WORKDIR之后的指令 WORKDIR <dirpath> # VOLUME 用来在镜像中创建挂载点(镜像中没有会创建),随机挂载宿主机上的卷或者其他容器上的卷,使用docker inspect查看宿主机上的挂载路径 VOLUME <mountpoint> VOLUME [ "<mountpoint>" ] # EXPOSE 镜像要暴露的端口,如要使用端口,在执行docker run -p时生效 EXPOSE 8080 # ENV 用来给镜像定义所需的环境变量,并且可以被Dockerfile文件中位于其之后的其他指令(如ENV,ADD,COPY,WORKDIR等)所调用,使用$varname或${varname} ENV <key> <value> ENV <key>=<value>... # ARG 用法同ENV,指定一个变量,可以在docker build创建镜像的时候,使用--build-arg <varname>=<value>来指定参数 ARG <name>[=< default value>] # RUN 指定docker build过程中运行指定的指令 RUN <command> # <命令行命令> 等同于,在终端操作的 shell 命令 RUN [ "<executable>" , "<param1>" , "<param2>" ] #RUN ["可执行文件", "参数1", "参数2"] # 例如: # RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline # CMD 容器启动时运行的命令,如果存在多个 CMD 指令,仅最后一个生效。 CMD <command> CMD [ "<executable>" , "<param1>" , "<param2>" ] CMD [ "<param1>" , "<param2>" ,...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数 # ENTRYPOINT 在镜像运行为容器后执行的命令,可以写多个,但只有最后一个(CMD和ENTRYPOINT中的一个)会生效 ENTRYPOINT<command> ENTRYPOINT[ "<executable>" , "<param1>" , "<param2>" ] # ONBUILD 用来在Dockerfile中定义一个触发器,可以使用其他指令,在这个镜像被下一次构建镜像且作为基础镜像时生效 ONBUILD <instruction> |
实例,先创建一个文件夹,里面有构建镜像时的必需文件,创建Dockerfile文件,内容为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #this is jingxiang FROM centos ARG myname=yjh MAINTAINER $myname LABEL author=yjh ADD jdk-....tar.gz /usr/local/ ENV JAVA_HOME=/usr/local/jdk-... ENV CLASSPATH=.:$JAVA_HOME/lib ENV PATH=$PATH:$JAVA_HOME/bin WORKDIR $JAVA_HOME RUN yum -y install vim VOLUME [ "/data" ] EXPOSE 8080 CMD ls ENTRYPOINT [ "java" , "-version" ] |
构建镜像: docker build -t mycentos .
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具