docker镜像

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常用指令

	# 指定基础镜像,本地没有会从dockerHub pull
	FROM 
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>

	# 作者,不推荐使用,即将被废弃
	MAINTAINER(depreacted)
MAINTAINER <name>

	# 给镜像指定各种元数据,不会对镜像造成影响
	LABEL
LABEL <key>=<value> <key>=<value> ...

	# 从宿主机复制文件到创建的新镜像文件,可以使用通配符
	COPY
COPY <from>...<to>
COPY ["<from>"...."<to>"]
#如 COPY hom*.txt /mydir/

	# 用法和COPY一样,ADD还支持URL路径,TAR文件会自动解压
	ADD
ADD <from>...<to>
ADD ["<from>"...."<to>"]

	# 为Dockerfile中所有的RUN,CMD,ENTRYPOINT,COPY和ADD设定工作目录,只会影响当前WORKDIR之后的指令
	WORKDIR
WORKDIR <dirpath>
 
	# 用来在镜像中创建挂载点(镜像中没有会创建),随机挂载宿主机上的卷或者其他容器上的卷,使用docker inspect查看宿主机上的挂载路径
	VOLUME
VOLUME <mountpoint>	
VOLUME ["<mountpoint>"]

	# 镜像要暴露的端口,如要使用端口,在执行docker run -p时生效
	EXPOSE

	# 用来给镜像定义所需的环境变量,并且可以被Dockerfile文件中位于其之后的其他指令(如ENV,ADD,COPY,WORKDIR等)所调用,使用$varname或${varname}
	ENV
ENV <key> <value>
ENV <key>=<value>...

	# 用法同ENV,指定一个变量,可以在docker build创建镜像的时候,使用--build-arg <varname>=<value>来指定参数
	ARG
ARG <name>[=<default value>]

	# 指定docker build过程中运行指定的指令
	RUN
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 指令指定的程序提供默认参数

	# 在镜像运行为容器后执行的命令,可以写多个,但只有最后一个(CMD和ENTRYPOINT中的一个)会生效
	ENTRYPOINT
ENTRYPOINT<command>
ENTRYPOINT["<executable>","<param1>","<param2>"]

	# 用来在Dockerfile中定义一个触发器,可以使用其他指令,在这个镜像被下一次构建镜像且作为基础镜像时生效
	ONBUILD
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 .

原文地址:https://www.cnblogs.com/yjh1995/p/12584559.html