一、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 \&& apt-get install -ylibsnappy-dev zliblg-dev libbz2-dev \&& rm -rf /var/cache/apt
CMD
指定启动容器时默认执行的命令
支持三种格式: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
配置工作目录
指定当前工作目录,相当于 cd
ARG
指定镜像内使用的参数 (例如版本号信息等)
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.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www
#WORKDIR 相当于 cd
WORKDIR /usr/local/nginx-1.8.0
RUN ./configure –prefix=/usr/local/nginx –user=www –group=www –with-http_ssl_module –with-pcre && make && make install
RUN echo “daemon off;” >> /etc/nginx.conf
#EXPOSE 映射端口
EXPOSE 80
#CMD 运行以下命令
CMD [“nginx”]
三、构建镜像
3.1 编写 Dockerfile 文件
vim Dockerfile
FROM alpine:latest
MAINTAINER troy
CMD 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/bash
2. 保存对容器的修改(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.yml
depends_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 db
172.12.2.186 database
172.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: mydriver
volumes_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 常用命令