一、Dockerfile基本命名指令说明备注FROM指定所创建镜像的基础镜像第一条指令必须为 FROM 指令。格式为 FROM <image> 或FROM <image>:<tag> 。MAINTAINER指定维护者信息格式为 MAINTAINER <name>RUN运行命令在镜像中要执行的命令,格式为 RUN <command> 或 RUN [“executable”, “param1”, “param2”]。前者默认将在 shell 终端中运行命令,即 /bin/bash -c ;后者则使用 exec 执行。指定使用其它终端可以通过第二种方式实现,例如 RUN [“/bin/bash”, “-c”,”echo hello”] 。每条RUN指令将在当前镜像的基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用换行。例如:RUN apt-get update &amp;& apt-get install -ylibsnappy-dev zliblg-dev libbz2-dev &amp;& rm -rf /var/cache/aptCMD指定启动容器时默认执行的命令支持三种格式:1. CMD[“executable”,“param1”,“param2”] 使用 exec 执行,推荐方式;2. CMD command param1 param2 在 /bin/bash 中执行,提供给需要交互的应用;3. CMD [“param1”,“param2”] 提供给 ENTRYPOINT 的默认参数;LABEL指定生成镜像的元数据标签信息 EXPOSE声明镜像内服务所监听的端口指定容器要打开的端口ENV指定环境变量格式为 ENV <key> <value> 。 指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持。ADD赋值指定的路径下的内容到容器中的路径下,可以为URL;如果为tar文件,会自动解压到路径下相当于 COPY,但是比 COPY 功能更强大COPY赋值本地主机的路径下的内容到容器中的路径下;一般情况下推荐使用COPY而不是ADD复制本地主机的 (为 Dockerfile 所在目录的相对路径)到容器中的ENTRYPOINT指定镜像的默认入口 VOLUME创建数据挂载点挂载目录,格式为VOLUME ["/data"]USER指定运行容器时的用户名或UID WORKDIR配置工作目录指定当前工作目录,相当于 cdARG指定镜像内使用的参数(例如版本号信息等) ONBUILD配置当前所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作的命令 STOPSIGNAL容器退出的信号 HEALTHCHECK如何进行健康检查 SHELL指定使用SHELL时的默认SHELL类型 二、Dockerfile 基本结构    一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。’#’ 为 Dockerfile 中的注释。先看下面一个小例子:# This my first nginx Dockerfile# Version 1.0# Base images 基础镜像FROM centos#MAINTAINER 维护者信息MAINTAINER tianfeiyu #ENV 设置环境变量ENV PATH /usr/local/nginx/sbin:$PATH#ADD 文件放在当前目录下,拷过去会自动解压ADD nginx-1.8.0.tar.gz /usr/local/ ADD epel-release-latest-7.noarch.rpm /usr/local/ #RUN 执行以下命令 RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpmRUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean allRUN useradd -s /sbin/nologin -M www#WORKDIR 相当于cdWORKDIR /usr/local/nginx-1.8.0 RUN ./configure –prefix=/usr/local/nginx –user=www –group=www –with-http_ssl_module –with-pcre && make && make installRUN echo “daemon off;” >> /etc/nginx.conf#EXPOSE 映射端口EXPOSE 80#CMD 运行以下命令CMD [“nginx”]三、构建镜像3.1 编写Dockerfile文件vim DockerfileFROM alpine:latestMAINTAINER troyCMD echo “Hello Workd!“3.2 构建镜像docker build -t hello_world .3.3 运行镜像docker run hello_world记:1.表示当前用户使用的shell是/bin/bash,所谓的shell你可以理解为操作系统和人之间交互的平台。例如windows系统的桌面环境就是一个shell。bin目录中基本上都是可执行的命令。启动容器并启动bash(交互方式):$docker run -i -t <image_name/continar_id> /bin/bash2.保存对容器的修改(commit) 当你对某一个容器做了修改之后(通过在容器中运行某一个命令),可以把对容器的修改保存下来,这样下次可以从保存后的最新状态运行该容器。$docker commit ID new_image_name 当然如果在保存成新镜像的时候想添加新的 dockerfile命令,比如,启动进入新的目录。docker commit -c “WORKDIR /usr/bin” 07c5f9ed32b0 test-images当然你也可以在旧镜像的基础上写一个新的dockerfile,用dockerfile生成新的镜像。Note: image相当于类,container相当于实例,不过可以动态给实例安装新软件,然后把这个container用commit命令固化成一个image。四、Docker-Compose    一句话:docker-compose 是用来做docker 的多容器控制,是一个用来把 docker 自动化的东西。有了 docker-compose 你可以把所有繁复的 docker 操作全都一条命令,自动化的完成。4.1 常用命令docker-compose up -d nginx 构建建启动nignx容器docker-compose exec nginx bash 登录到nginx容器中docker-compose down 删除所有nginx容器,镜像docker-compose ps 显示所有容器docker-compose restart nginx 重新启动nginx容器docker-compose run –no-deps –rm php-fpm php -v 在php-fpm中不启动关联容器,并容器执行php -v 执行完成后删除容器docker-compose build nginx 构建镜像 。 docker-compose build –no-cache nginx 不带缓存的构建。docker-compose logs nginx 查看nginx的日志 docker-compose logs -f nginx 查看nginx的实时日志docker-compose config -q 验证(docker-compose.yml)文件配置,当配置正确时,不输出任何内容,当文件配置错误,输出错误信息。 docker-compose events –json nginx 以json的形式输出nginx的docker日志docker-compose pause nginx 暂停nignx容器docker-compose unpause nginx 恢复ningx容器docker-compose rm nginx 删除容器(删除前必须关闭容器)docker-compose stop nginx 停止nignx容器docker-compose start nginx 启动nignx容器4.2 docker-compose.ymldepends_on在使用 Compose 时,最大的好处就是少打启动命令,但是一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动了应用容器,这时候应用容器会因为找不到数据库而退出,为了避免这种情况我们需要加入一个标签,就是 depends_on,这个标签解决了容器的依赖、启动先后的问题。例如下面容器会先启动 redis 和 db 两个服务,最后才启动 web 服务:version: ‘2’services: web: build: . depends_on: - db - redis redis: image: redis db: image: postgres注意的是,默认情况下使用 docker-compose up web 这样的方式启动 web 服务时,也会启动 redis 和 db 两个服务,因为在配置文件中定义了依赖关系。links还记得上面的depends_on吧,那个标签解决的是启动顺序问题,这个标签解决的是容器连接问题,与Docker client的–link一样效果,会连接到其它服务中的容器。格式如下:links: - db - db:database - redis使用的别名将会自动在服务容器中的/etc/hosts里创建。例如:172.12.2.186 db172.12.2.186 database172.12.2.187 redis相应的环境变量也将被创建。volumes挂载一个目录或者一个已存在的数据卷容器,可以直接使用 [HOST:CONTAINER] 这样的格式,或者使用 [HOST:CONTAINER:ro] 这样的格式,后者对于容器来说,数据卷是只读的,这样可以有效保护宿主机的文件系统。Compose的数据卷指定路径可以是相对路径,使用 . 或者 .. 来指定相对目录。数据卷的格式可以是下面多种形式:volumes: // 只是指定一个路径,Docker 会自动在创建一个数据卷(这个路径是容器内部的)。 - /var/lib/mysql // 使用绝对路径挂载数据卷 - /opt/data:/var/lib/mysql // 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器。 - ./cache:/tmp/cache // 使用用户的相对路径(~/ 表示的目录是 /home/<用户目录>/ 或者 /root/)。 - ~/configs:/etc/configs/:ro // 已经存在的命名的数据卷。 - datavolume:/var/lib/mysql如果你不使用宿主机的路径,你可以指定一个volume_driver。volume_driver: mydrivervolumes_from从其它容器或者服务挂载数据卷,可选的参数是 :ro或者 :rw,前者表示容器只读,后者表示容器对数据卷是可读可写的。默认情况下是可读可写的。volumes_from: - service_name - service_name:ro - container:container_name - container:container_name:rw参考文档:1. docker与dockerfile教程 2. Docker系列教程22-docker-compose.yml常用命令