一般来说我们不需要自己构建镜像,这些镜像在docker hub上面已经有现成的了,比如常用的数据库、应用软件等。
某些情况我们还是需要自己来构建:
找不到现成的镜像,比如自己开发的应用程序
需要在镜像中加入特定的功能/软件
docker commit 命令
Dockerfile 文件
docker commit [容器ID] [仓库名:版本号]
缺点:
手工创建生成,容易出错,重复性低
安全问题
根据已有容器来构建新的镜像
例:根据已经有的tomcat容器,构建新的镜像 c1_tomcat:0.0.1
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。Dockerfile从FROM命令开始,紧接着跟随着各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像。
指定base镜像(尽量使用官方的镜像作为base镜像),在哪一个image的基础上创建
FROM centos:7.8.2003 FROM ubuntu:14.04 FROM tomcat:8.5.40 //里面包含了jdk FROM mysql:5.7
指定镜像所属信息(作者/版本/描述等)
LABEL maintainer="[email protected]" LABEL version="1.0" LABEL description="description info"
通常用于安装软件包 / 执行...命令
RUN yum install -y vim
设置当前的工作目录
WORKDIR /test #如果目录不存在则自动创建
⚠️需要注意的是尽量使用绝对路径
从主机的文件系统上复制文件到镜像中
WORKDIR /home COPY hello .
与COPY类似,不同的是,如果文件是压缩文件,会自动解压缩
WORKDIR /home ADD test.tar.gz .
设置环境变量
WORKDIR /opt ADD jdk-8u121-linux-x64.tar.gz . ENV CLASSPATH $JAVA_HOME/lib
向外暴露端口
expose 8080 //向外暴露8080端口
两者都是作为容器启动时运行的命令
首先要明确docker run指令中的参数是什么?(原文链接:Docker之docker run参数覆盖Dockerfile中CMD命令以及CMD与ENTRYPOINT的区别_docker run 覆盖cmd-CSDN博客
—— docker run 指令(-it/-p/-d等) 镜像名 参数(/bin/sh、bash等),即docker run命令中,镜像名后面的 都是给容器执行的命令参数
docker run 运行容器时,不加任何参数,会自动执行CMD,
如果添加参数则会忽略CMD,比如:docker run -it test bash中的bash命令参数覆盖了CMD。
如果有多个CMD,则只有最后一个会执行,其他都会被忽略
运行容器时,如果添加参数不会忽略ENTRYPOINT
docker build -t [仓库名]:[版本号] -f [Dockerfile文件名] .
docker build -t ch_ubuntu:0.0.1 -f ch_dockerfile .