Dockerfile与docker-compose

 Dockerfile 记录单个镜像的构建过程, docker-compse.yml 记录一个项目(project, 一般是多个镜像)的构建过程。

一、Dockerfile

 

一些特殊说明

1)docker build [选项] 上下文路径  

  docker build的构建原理:

Docker 在运行时分为 Docker 引擎(也就是服务端守护进程)和客户端工具。Docker 的引擎提供了一组 REST API,被称为 DockerRemote API,而如 docker 命令这样的客户端工具,则是通过这组 API 与 Docker 引擎交互,从而完成各种功能。因此,虽然表面上我们好像是在本机执行各种 docker 功能,但实际上,一切都是使用的远程调用形式在服务端(Docker 引擎)完成。也因为这种 C/S 设计,让我们操作远程服务器的 Docker 引擎变得轻而易举。

  当我们进行镜像构建的时候,并非所有定制都会通过 RUN 指令完成,经常会需要将一些本地文件复制进镜像,比如通过 COPY 指令、 ADD 指令等。而 docker build 命令构建镜像,其实并非在本地构建,而是在服务端,也就是 Docker 引擎中构建的。那么在这种客户端/服务端的架构中,如何才能让服务端获得本地文件呢?

  这就引入了上下文的概念。当构建的时候,用户会指定构建镜像上下文的路径, docker build 命令得知这个路径后,会将路径下的所有内容打包,然后上传给 Docker 引擎。这样Docker 引擎收到这个上下文包后,展开就会获得构建镜像所需的一切文件。

如docker build -t nginx:v3 .   这里的实际上是在指定上下文的目录, docker build 命令会将该目录下的内容打包交给 Docker 引擎以帮助构建镜像

一般来说,应该将Dockerfile置于一个空目录下,或者项目根目录下。如果该目录下没有所需文件,那么应该把所需文件复制一份过来;如果目录下有些东西确实不需要构建时传给Docker引擎,那么可以写一个.dockerignore文件,该文件用于剔除不需要作为上下文传递给Docker引擎的。

2)FROM 镜像名(即base镜像) 中有CMD 且之后的Dockerfile中也有CMD,那么base镜像中的CMD不会执行,只会执行Dockerfile中的最后一个CMD

  可在dockerhub查看base 镜像的构建步骤

 

 

 

Dockerfile指令

FROM 镜像名(特别地,除了选择现有镜像为基础镜像外,Docker 还存在一个特殊的镜像,名为 scratch 。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像)

WORKDIR 路径 :相当于cd

ADD  :从build context复制文件到镜像,如果src是归档文件会被自动解压到dest,官方推荐使用copy

COPY: src dest 将sr(只能指定build context中的文件或目录)复制到镜像

RUN:是在 docker build时运行,等同于在终端操作的 shell 命令

CMD:在docker run 时运行,如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。

ENTRYPOINT:类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,使用说明详见如下链接

https://www.runoob.com/docker/docker-dockerfile.html

ENV:设置环境变量

VOLUME:

ARG:

EXPOSE:

 

二、docker-compse

1.安装docker-compose,参考官方教程:https://docs.docker.com/compose/install/

#可在github上查看Docker Compose的所有发行版本(https://github.com/docker/compose/releases),要安装其他版本的 Compose,请替换下述命令中的1.24.1
[chenjl@ipha-dev71-1 ~]$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose [chenjl@ipha-dev71-1 ~]$ cd /usr/local/bin [chenjl@ipha-dev71-1 bin]$ ll total 15792 -rw-r--r-- 1 root root 16168192 Sep 18 10:03 docker-compose [chenjl@ipha-dev71-1 bin]$ sudo chmod +x /usr/local/bin/docker-compose # 赋予所有用户可执行权限 [chenjl@ipha-dev71-1 bin]$ docker-compose version # 查看docker-compose版本 docker-compose version 1.24.1, build 4667896b docker-py version: 3.7.3 CPython version: 3.6.8 OpenSSL version: OpenSSL 1.1.0j 20 Nov 2018

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

在此过程中遇到一个问题:我是使用chenjl安装的docker-compose,执行docker-compose version能正确显示docker-compose版本,但是用切换到root执行docker-compose version,却提示“docker-compose: command not found”,然后我执行 sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose 后,该问题就解决了(我也不明白是什么原因,这里先记录一下)

2.卸载docker-compose

3.使用实例

源码:https://github.com/wmm0165/composetest

posted @ 2019-09-18 10:33  爱打盹的猫猫  阅读(776)  评论(0编辑  收藏  举报