网站首页 > 技术文章 正文
俩种方式:
- 更新镜像 docker commit
- 构建镜像 docker build
更新镜像
先使用基础镜像创建一个容器,然后对容器内容进行更改,然后使用 docker commit 命令提交为一个新的镜像(以tomcat为例)。
# 根据基础镜像,创建容器
> docker run --name tom1 -p 80:8080 -d tomcat
# 修改容器内容
> docker exec -it tom1 /bin/bash
> cd webapps/ROOT rm -f index.jsp
> echo hello world > index.html
> exit
# 提交为新镜像 - 在本地生成
# docker commit -m="描述消息" -a="作者" 容器ID或容器名 镜像名:TAG
docker commit -m="修改了首页" -a="jimmy" tom1 jimmy/tomcat:v1.0
# 使用新镜像运行容器
docker run --name tom2 -p 8080:8080 -d jimmy/tomcat:v1.0
构建镜像
构建镜像需要使用Dockerfile
Dockerfifile常用指令
- FROM FROM指令是最重要的一个并且必须为Dockerfifile文件开篇的第一个非注释行,用于为镜像文件构建过程指定基础镜像,后续的指令运行于此基础镜像提供的运行环境。这个基础镜像可以是任何可用镜像,默认情况下docker build会从本地仓库找指定的镜像文件,如果不存在就会从Docker Hub上拉取。FROM <image>FROM <image>:<tag> FROM <image>@<digest>
- MAINTAINERDockerfifile的制作者提供的本人详细信息.Dockerfifile不限制MAINTAINER出现的位置,但是推荐放到FROM指令之后MAINTAINER <name>可以用LABLE替代
- LABEL给镜像指定各种元数据LABEL <key>=<value> <key>=<value> <key>=<value>...
- COPY用于从宿主机复制文件到创建的新镜像文件。COPY <src>...<dest>COPY ["<src>",..."<dest>"]# <src>:要复制的源文件或者目录,可以使用通配符 # <dest>:目标路径,即正在创建的image的文件系统路径;建议<dest>使用绝对路径,否则COPY指令则以WORKDIR为 其起始路径 a.<src> 必须是build上下文中的路径,不能是其父目录中的文件b.如果 <src> 是目录,则其内部文件或子目录会被递归复制,但 <src> 目录自身不会被复制c.如果指定了多个 <src> ,或在 <src> 中使用了通配符,则 <dest> 必须是一个目录,则必须以/符号结尾d.如果 <dest> 不存在,将会被自动创建,包括其父目录路径
- ADD基本用法和COPY指令一样,ADD支持使用TAR文件和URL路径。ADD <src>...<dest>ADD ["<src>",..."<dest>"]add会自动解压压缩包
- WORKDIR用于为Dockerfifile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD指定设定工作目录,只会影响当前WORKDIR之后的指令。WORKDIR <dirpath>
- VOLUME用来创建挂载点,可以挂载宿主机上的卷或者其他容器上的卷VOLUME <mountpoint>VOLUME ["<mountpoint>"]
- EXPOSE用于给容器打开指定要监听的端口以实现和外部通信EXPOSE <port>[/<protocol>] [<port>[/<protocol>]...]
- ENV用来给镜像定义所需要的环境变量,并且可以被Dockerfifile文件中位于其后的其他指令(如ENV、ADD、COPY等)所调用,调用格式:$variable_name或者${variable_name}ENV <key> <value>ENV <key>=<value>...
- ARG指定一个变量,可以在docker build创建镜像的时候,使用 --build-arg <varname>=<value> 来指定参数ARG <name>[=<default value>]
- RUN用来指定docker build过程中运行指定的命令RUN <command>:参数一般是一个shell命令,以 /bin/sh -c 来运行它RUN ["<executable>","<param1>","<param2>"]:参数是一个JSON格式的数组,当中 <executable> 是要运行的命令,后面是传递给命令的选项或者参数;
- CMD容器启动时运行的命令CMD <command>CMD ["<executable>","<param1>","<param2>"]CMD ["<param1>","<param2>"]RUN和CMD区别:RUN指令运行于镜像文件构建过程中,CMD则运行于基于Dockerfifile构建出的新镜像文件启动为一个容器的时候CMD指令的主要目的在于给启动的容器指定默认要运行的程序,且在运行结束后,容器也将终止;不过,CMD命令可以被docker run的命令行选项给覆盖Dockerfifile中可以存在多个CMD指令,但是只有最后一个会生效
- ENTRYPOINT类似于CMD指令功能,用于给容器指定默认运行程序ENTRYPOINT<command>ENTRYPOINT["<executable>","<param1>","<param2>"]
- ONBUILD用来在Dockerfifile中定义一个触发器ONBUILD <instruction>Dockerfifile用来构建镜像文件,镜像文件也可以当成是基础镜像被另外一个Dockerfifile用作FROM指令的参数在后面这个Dockerfifile中的FROM指令在构建过程中被执行的时候,会触发基础镜像里面的ONBUILDONBUILD不能自我嵌套,ONBUILD不会触发FROM和MAINTAINER指令在ONBUILD指令中使用ADD和COPY要小心,因为新构建过程中的上下文在缺少指定的源文件的时候会失败
实例使用dockerfile构建自己的镜像
# 找到一个目录
> mk dir /usr/local/dockerfile
# 将tomcat.tar.gz 和 jdk.tar.gz 压缩文件上传至这个文件夹
# 创建`Dockerfile`文件
> vim Dockerfile
# 写入内容:
~FROM centos:7
~LABEL author=jimmy
~# 挂载
~VOLUME ["/data1"]
~
~# 解压文件
~ADD apache-tomcat-7.0.92.tar.gz /usr/local/
~ADD jdk-8u60-linux-x64.tar.gz /usr/local/
~
~# 环境变量
~ENV JAVA_HOME=/usr/local/jdk1.8.0_60
~ENV CLASSPATH .:$JAVA_HOME/lib
~ENV CATALINA_HOME=/usr/local/apache-tomcat-7.0.92
~ENV PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
~
~# 暴露端口
~EXPOSE 8080
~
~# 指定工作目录
~WORKDIR $CATALINA_HOME
~# 执行命令
~RUN yum install -y vim
~
~# 容器默认启动程序
~ENTRYPOINT ["catalina.sh","run"]~
# 保存Dockerfile,然后执行docker build。注意最后一个 . 这个表示当前目录不可省略
docker build -t jimmy/tomcat7.0.92:v1 .
猜你喜欢
- 2024-09-12 64.手把手使用Docker
- 2024-09-12 kubernetes基础知识之docker容器和镜像
- 2024-09-12 docker 安装MongoDB(docker 安装mongodb4.4.4)
- 2024-09-12 Docker入门与实践:容器操作方法详细介绍
- 2024-09-12 Docker实战四之Docker 容器使用(docker 容器运行命令)
- 2024-09-12 【docker】:全面认识Docker和基本指令
- 2024-09-12 Docker 学习小总结(docker基础教程)
- 2024-09-12 运行Docker遇到权限问题应该如何处理?
- 2024-09-12 史上超全!Docker命令全集,值得收藏
- 2024-09-12 Docker容器最常用命令(docker容器操作命令)
- 最近发表
- 标签列表
-
- cmd/c (64)
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- sqlset (64)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)