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}