1. Docker版本:docker-ce-18.06.1.ce-3.el7.x86_64

docker-ce的配置文件:/etc/docker/daemon.json
docker镜像站点在国外,可以配置加速器来进行镜像拉取加速:
	docker cn
		将下列字符串添加到:/etc/docker/daemin.json
		{"registry-mirrors":["https://registry.docker-cn.com"]}
	中国科技大学
	阿里云加速器:需要注册阿里云,然后获得专用加速器

2. 制作镜像

2.1 基于容器
2.2 基于Dockerfile

使用docker build 命令制作镜像,docker build --help
使用Dockerfile制作镜像时,默认将工作目录下的所有文件都包括,可以使用 .dockeringore 命令将工作目录下的文件排除在外

3. Dockerfile Instructions

  • FROM
    必须是Docekerfile文件开篇的第一个非注释行,用于为镜像文件构建过程指定基准镜像
FROM <repositiry>[:<tag>]
FROM <repository>@<digest>(digest:哈希码)
  • MAINTAINER
    可以是任务文本信息,约定俗称的是作者信息
    新版docker已经废弃可以使用LABEL;
  • LABEL
    添加元数据
<key>=<value> <key>=<value> ...   命令形式
  • COPY
    用于从Docker主机复制文件至创建的新镜像文件
COPY <src> ... <dest>
COPY ["<src>",... "<dest>"]
	src源文件或目录,支持通配符
	dest目标路径,建议使用绝对路径
		如果src是目录,其内部文件或子目录会被递归复制,但<src>目录本身不会被复制(相当于 /*)
  • ADD
    类似于COPY命令,ADD支持使用tar文件和url路径
ADD <src> ... <dest>
ADD ["<src>",... "<dest>"]
	ADD后跟url的时候是下载文件,但不解压;ADD后面跟本地tar文件的时候,是直接解压到目标目录
  • WORKDIR
    工作目录;在dockerfile里面切换到WORKDIR目录
  • VOLUME
    用于在image中创建一个挂载点目录,以挂在Docker host的卷或其他容器的卷
VOLUME <mountpoint>
VOLUME <"<mountpoint>">
  • EXPOSE
    用于为容器打开指定要监听的端口以实现与外部通信
EXPOSE <port>[/<protocol>][<port>][/<protocol>] ...
	protocol指定传输的协议;默认是tcp
	也可以一次指定多个端口:EXPOSE 11211/udp 11212/tcp
  • ENV
    用于为镜像定义所需的环境变量;并可被Dockerfile文件中位于其后的其它指令(ENV,ADD,COPY)所调用
ENV <key> <value>
ENV <key>=<value>
  • RUN
    用于指定docker build过程中运行的程序,其可以是任何命令
RUN <command>	command通常是一个shell命令,且以"/bin/bash -c"来运行它			或	
RUN ["<executable>","<param1>","<param2>"]
	参数是一个JSON格式的数据,executable后面为要运行的命令,paramN为传递给命令的选项或参数
	依赖shell特性的话,可以将其替换为:RUN ["/bin/bash","-c","<executable>","<param1>"]
  • CMD
    RUN指令运行于镜像文件构建过程中,而CMD指令运行于基于Dockerfile构建出的新镜像文件启动一个容器时
CMD <command>
CMD ["<executable","<param1>","<param2>"]
CMD ["<param1>","<param2>"]
  • ENTRYPOINT
    类似CMD指令的功能,用于为容器指定默认运行程序,从而使得容器像是一个单独的可执行程序,与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run定的参数所覆盖,而且,这些命令行参数会被当作参数传递给ENTRYPOINT指定的程序
    注意:docker run命令的 --entrypoint选项的参数可覆盖ENTRYPOINT指令指定的程序
ENTRYPOINT <command>
ENTRYPOINT ["<executable>","<param1>","<patam2>"]
	docker run 命令传入的命令参数回覆盖CMD指令的内容并且附加到ENTRYPOINT命令最后作为其参数使用
	Dockerfile文件中也可以存在多个ENTRYPOINT指令,但仅有最后一个会生效
  • SHELL
    指定shell程序,默认是 /bin/shell -c
  • STOPSIGNAL
    -15的信号,发送停止的信号给container
  • ARG
    是一个变量,只在build的过程中使用
  • ONBUILD
    用于在Dockerfile中定义有一个触发器;Dockerfile用于build镜像文件,此映像文件亦可作为base image被另一个Dockerfile用作FROM指令的参数,并以之构建新的映像文件;在后面的Dockerfile中的FROM指令在build过程中被执行时,将会“触发”其base image的Dockerfile文件中的ONBUILD指令定义的触发器

练习

  • Dockerfile Test1:
FROM busybox:latest
MAINTAINER "chenmx <chenmx@163.com>"
#LABEL mailtainer="chenmx <chenmx@163.com>"
ENV DOC_ROOT /data/web/html/
#COPY index.html /data/web/html/
COPY index.html $DOC_ROOT
COPY index.html ${DOC_ROOT:-/data/web/html/}
COPY yum.repos.d /etc/yum.repos.d/
#ADD http://nginx.org/download/nginx-1.15.6.tar.gz /usr/local/src/
ADD nginx-1.15.6.tar.gz /usr/local/src
WORKDIR /usr/local/src
VOLUME /data/mysql
EXPOSE 80/tcp
RUN cd /usr/local/src && \
	tar -x nginx-1.15.6.tar.gz && \
	mv nginx-1.15.6 webserver
  • Dockerfile Test2:
FROM busybox
LABEL maintainer="chenmx <chenmx@163.com>" app="httpd"
ENV WEB_DOC_ROOT="/data/web/html/"
RUN mkdir $WEB_DOC_ROOT && \
	echo '<h1>Busybox httpd server</h1>' > ${WEB_DOC_ROOT}/index.html
CMD /bin/httpd -f -h ${WEB_DOC_ROOT}
ENTRYPOINT /bin/httpd -f -h ${WEB_DOC_ROOT}