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常用指令
# 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文件,内容为
#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 .