Dockerfile、Docker-Compose基本命令与介绍

36次阅读

共计 4631 个字符,预计需要花费 12 分钟才能阅读完成。

一、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 常用命令

正文完
 0