docker构建

在Docker容器中,咱们能够随意的增删软件,不用的时候直接删除镜像容器,这是至关方便的。可是,若是有其余人想要试用你的软件,怎么办呢?或者你从新换了一台电脑,须要执行Docker pull而后 install吗?
答案确定是不用,由于Docker具体快速部署的特色,接下来咱们学习如何构建Docker镜像。php

docker commit

最直观的思路应该是把咱们建立的容器保存下来,能够经过docker commit命令,格式以下:html

docker commit -a "author" -m "message" <exiting container> <hub-user>/<repo-name>:<tag>

该命令很像咱们经常使用的git commit,其中exiting container 为容器名称或者ID,hub-user为登陆docker-hub的用户名,repo-name为镜像名称,tag为镜像的标签。python

镜像构建成功后就能够进行分享了。
你可使用 docker save <image> | gzip > filename 将image保存为文件,而后拷贝给其余人,再经过docker load -i filename 导入使用。
以上操做和AI模型的操做很相似,先训练模型,训练好以后在save模型,再经过loadd导入模型,因此在计算机的不少领域,思想都是相似的。mysql

这种方式略显麻烦,你能够经过docker push将镜像上传到Docker hub或者本身的私有镜像仓库中,以后就能够随时经过docker pull拉取使用了。
另外,咱们能够经过docker history来查看镜像的构建历史,例如:
image.pngnginx

在这里咱们能够发现,在软件内部增删软件、文件等操做在这里都没法体现,所以咱们的镜像事实上成了一个黑盒,没有文档就不知道其具体有什么功能,即便你添加了文档,通过一次次更改文档极可能也没有同步了,很是不方便别人或者本身之后使用。事实上,docker 提供了更方便强大的方式构建镜像,即 Dockerfile。git

另外,在commit方式在特定场景下也有其用途,好比程序崩溃、被入侵后保护现场。sql

Dockerfile

Dockerfile 是一个文本文件,其内包含了一条条的指令,描述咱们的镜像该如何构建,就像咱们程序的源码。在这以前,补充一个知识,就是咱们的 docker 镜像文件事实上是分层的。你应该注意到拉取 ubuntu 的时候,它 pull 了不少次。而分层的操做也方便不一样镜像间共享相同的层,这显著的节省了客户机的存储空间以及下载时间。
Dockerfile每条指令的内容就是描述该层如何构建的。接下来咱们定制一个nginx镜像。
任意新建一个文件夹,新建一个文本文件,名为Dockerfile,内容以下:docker

FROM nginx
RUN echo "<h1> hello docker </h1>" > /usr/share/nginx/html/index.html

而后执行docker build命令构建镜像:
docker build -t <name>:<tag> pathshell

image.png

能够发现新的镜像分为两层,注意命令后面有一个.,表示当前文件夹。
而后经过docker run启动容器:
image.png
这时访问 http://127.0.0.1:8080 应该就能看到咱们的页面了。注意以前的镜像可能已经绑定了本机 8080 端口,你须要中止它或者换一个端口。还有 -d 参数表示后台运行,注意 -d 并不影响容器的运行时间,只是将其放到了后台,换句话说,若是你的容器自己没有运行不退出的进程,即便加了 -d 容器依然会自动退出。
固然咱们也能够经过docker ps指令查看容器进程:
image.pngdjango

接下来介绍经常使用的dockerfile命令:

  • FROM

FROM 为指定基础镜像,像以前咱们基于官方 nginx 进行定制,这样能够省略大量的重复工做。DockerHub 上有大量的镜像,ubuntu、mysql、php、python 等等,必定要选择合适的做为基础镜像,好比开发 django 就选用 python 或者 django 镜像,而不要去用 php 镜像。

  • RUN

RUN 命令即用来在容器中执行命令的,至关于你以前手动在 docker 里面执行命令。

其格式也很简单,RUN <command> 便可,command 能够是容器内能执行的任何命令。

这里说下本人的经验,RUN 命令不必定能成功执行,你没必要一遍遍更改而后 build 实验,能够直接 run 一个基础镜像,而后去执行命令,等成功了再写入 Dockerfile,会方便不少。

另外,以前说过,每条命令会构建一层,因此不要写太多层 RUN,也不要只有一层,单独的功能模块组合到一层,更利于快速构建以及复用。好比下面这个例子:
FROM php:7.1.22-fpm

# Install PHP and composer dependencies
RUN apt-get update \
    && apt-get install -qq git curl libmcrypt-dev libjpeg-dev libpng-dev libfreetype6-dev libbz2-dev \
    && RUN apt-get clean

# Install needed extensions
RUN docker-php-ext-install pdo pdo_mysql mcrypt zip gd
  • COPY

COPY <源路径> <目标路径>
你能够将须要的文件拷贝到镜像内,注意这里源路径是相对路径,即相对上文构建命令里的最后一个参数所指定的目录(上文例子为.),不能随意引用其它文件。另外,尽可能不要在构建目录里放入无关文件,由于 docker 会将目录下全部文件打包发送给服务进程.

  • CMD

CMD 命令为容器启动时的默认命令,由于容器其实本质是一个进程(后面会细讲)。好比 ubuntu 镜像默认 CMD 命令为 /bin/bash,所以事实上咱们只要执行 docker run -it ubuntu 就能够获得一个交互式 shell。若是咱们传入其它命令,好比 执行 docker run ubuntu uname,容器就会执行咱们指定的命令。

以上就是最经常使用的 Dockerfile 命令,建议你们本身尝试构建一个,会有更深的体会。另外还有不少命令以及细节,能够参考这篇教程,写的特别好,强烈推荐。

相关文章
相关标签/搜索