文档章节

Linux----------容器docker file

o
 osc_g8254g7s
发布于 2019/08/19 17:58
字数 1549
阅读 9
收藏 0

精选30+云产品,助力企业轻松上云!>>>

[toc]

一、Docker file

如果你想要从一个基础镜像开始建立一个自定义镜像,可以选择一步一步进行构建,也可以选择写一个配置文件,然后一条命令(docker build)完成构建,显然配置文件的方式可以更好地应对需求的变更,这个配置文件就是Dockerfile。

Dockerfile其实可以看做一个命令集。每行均为一条命令。每行的第一个单词,就是命令command。后面的字符串是该命令所要接收的参数。比如ENTRYPOINT /bin/bash。ENTRYPOINT命令的作用就是将后面的参数设置为镜像的entrypoint。

1.1 docker原理

从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分布代表软件的三个不同阶段:

  • Dockerfile是软件的原材料
  • Docker镜像是软件的交付品
  • Docker容器则可以认为是软件的运行态 Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。

原理图如下:

1.Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程当交道,这时需要考虑如何设计namespace的权限控制)等等 2.Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行Docker镜像时,会真正开始提供服务 3.Docker容器,容器是直接提供服务的

1.2 docker file执行流程

docker file执行流程:
1.docker从基础镜像运行一个容器
2.执行一条指令并对容器作出修改
3.执行类似docker commit的操作提交一个新的镜像层
4.docker再基于刚提交的镜像运行一个新容器
5.执行dockerfile中的下一条指令直到所有指令都执行完成

1.3 docker file注意事项

dockerfile注意事项:
1.每条保留字指令都必须为大写字母且后面要跟随至少一个参数
2.指令按照从上到下,顺序执行
3. #表示注释
4.每条指令都会创建一个新的镜像层,并对镜像进行提交

二、docker build

docker build 命令用于使用 Dockerfile 创建镜像。

语法:docker build [OPTIONS] PATH | URL | -
OPTIONS说明:
--build-arg=[] :设置镜像创建时的变量;
--cpu-shares :设置 cpu 使用权重;
--cpu-period :限制 CPU CFS周期;
--cpu-quota :限制 CPU CFS配额;
--cpuset-cpus :指定使用的CPU id;
--cpuset-mems :指定使用的内存 id;
--disable-content-trust :忽略校验,默认开启;
-f :指定要使用的Dockerfile路径;
--force-rm :设置镜像过程中删除中间容器;
--isolation :使用容器隔离技术;
--label=[] :设置镜像使用的元数据;
-m :设置内存最大值;
--memory-swap :设置Swap的最大值为内存+swap,"-1"表示不限swap;
--no-cache :创建镜像的过程不使用缓存;
--pull :尝试去更新镜像的新版本;
--quiet, -q :安静模式,成功后只输出镜像 ID;
--rm :设置镜像成功后删除中间容器;
--shm-size :设置/dev/shm的大小,默认值是64M;
--ulimit :Ulimit配置。
--tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
--network: 默认 default。在构建期间设置RUN指令的网络模式
--volumes-from
示例:
docker build -f  /docker/dockerfile1 -t  wang/centos .  (.是必备)
docker run -it --name dc02 --volumes-from dc01 wang/centos

三、Docker File体系结构

Docker File体系结构:
FROM                        基础镜像,当前新镜像是基于哪个镜像的
MAITAINER               镜像维护者的姓名和邮箱地址
RUN                           容器构建时需要运行的命令
EXPOSE                    当前容器对外暴露出的端口
WORKDIR                 指定在创建容器后,终端默认登录的进来工资目录,一个落脚点
ENV                           用来构建镜像过程中设置环境变量
ADD                           将宿主机目录下的文件拷贝进镜像且ADD命令会自动出来URL和解压tar压缩包
COPY                         类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录的文件或目录复制到新的一层的镜像的位置
VOLUME                    容器数据卷,用于数据保存和持久化工作
CMD                           指定一个容器时要运行的命令,可以有多个,但就最后一个生效,CMD会被docker run后的参数替换
ENTRYPOINT            指定一个容器启动时要运行的命令,目的和CMD一样,都是在指定容器启动程序及参数
ONBUILD                   当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

示例1:

# Runner container
FROM registry.cn-hangzhou.aliyuncs.com/aliware2018/debian-jdk8

COPY --from=builder /root/workspace/services/mesh-provider/target/mesh-provider-1.0-SNAPSHOT.jar /root/dists/mesh-provider.jar
COPY --from=builder /root/workspace/services/mesh-consumer/target/mesh-consumer-1.0-SNAPSHOT.jar /root/dists/mesh-consumer.jar
COPY --from=builder /root/workspace/agent/mesh-agent/target/mesh-agent-1.0-SNAPSHOT.jar /root/dists/mesh-agent.jar

COPY --from=builder /usr/local/bin/docker-entrypoint.sh /usr/local/bin
COPY start-agent.sh /usr/local/bin

RUN set -ex && mkdir -p /root/logs

ENTRYPOINT ["docker-entrypoint.sh"]

示例2:GitHub上的centos的dockerfile源码

FROM scratch
MAINTAINER The CentOS Project <cloud-ops@centos.org>
ADD c68-docker.tar.xz /
LABEL name="CentOS Base Image" \
    vendir="CentOS"  \
    license="GPLv2" \
    build-date="2016-06-02"

# Default command
CMD ["/bin/bash"]

四、容器间传递共享

  • 先启动一个父容器dc01 docker build -f /docker/dockerfile1 -t wang/centos . (.是必备)

  • 再启动dc02、dc03继承自dc01,并创建文件 docker run -it --name dc02 --volumes-from dc01 wang/centos docker run -it --name dc02 --volumes-from dc01 wang/centos touch a.txt

  • 回到dc01 可以看到02/03各自添加的都能共享了 docker attach dc01 ll 查看

  • 删除dc01,dc02修改后,dc03可否访问 docker rm -f dc01 docker rm -f dc02 docker attach dc 03 ll 查看

  • 新建dc04继续dc03再删除dc03 docker run -it --name dc04 --volumes-from dc03 wang/centos docker rm -f dc03 docker attach dc04 ll 查看

&&容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
如何在Ubuntu中安装Docker和运行 Docker容器

如何在Ubuntu中安装Docker和运行 Docker容器 转https://www.linuxidc.com/Linux/2019-03/157339.htm Docker是一种开源且流行的操作系统级虚拟化(俗称“容器化”)技术,主要在Linux和Windo...

osc_w6m3b1pz
01/02
7
0
Linux系统常用命令

linux 001第二部分 Linux系统常用命令 Linux命令的通用格式 命令字 [命令选项] [命令参数] 命令中所有字符区分大小写 命令选项分为短格式(-)及长格式(--) 必须在命令行提示符下输入命令 ...

osc_9gm4ypss
2019/09/27
2
0
Docker实战应用

一、基本概念 镜像(pwpicpath):只读的模板 容器(container):从镜像创建的运行实例。 镜像是只读的,容器在启动的时候创建一层可写层作为最上层。 仓库(repository):集中存放镜像文件...

bobo365
2017/01/17
0
0
将日志输出到Docker容器外

原文:将日志输出到Docker容器外 1.1 使用 Docker 容器日志 我们可以利用 命令查看 Docker 容器内部应用程序运行时所产生的日志,可以免除首先进入 Docker 容器,再打开应用程序的日志文件的过...

osc_tj0is418
04/30
18
0
理解Docker镜像分层

关于base镜像 base 镜像有两层含义: 不依赖其他镜像,从 scratch 构建。 其他镜像可以之为基础进行扩展。 所以,能称作 base 镜像的通常都是各种 Linux 发行版的 Docker 镜像,比如 Ubuntu...

osc_bgoqj0sj
2019/02/14
2
0

没有更多内容

加载失败,请刷新页面

加载更多

dict.items()和dict.iteritems()有什么区别?

问题: Are there any applicable differences between dict.items() and dict.iteritems() ? dict.items()和dict.iteritems()之间是否有适用的区别? From the Python docs: 从Python文档中......

法国红酒甜
19分钟前
20
0
R中“ =”和“ <-”赋值运算符有什么区别?

问题: What are the differences between the assignment operators = and <- in R? R中赋值运算符=和<-之间有什么区别? I know that operators are slightly different, as this example ......

fyin1314
50分钟前
14
0
之间的区别 和

问题: I'm learning Spring 3 and I don't seem to grasp the functionality behind <context:annotation-config> and <context:component-scan> . 我正在学习Spring 3,并且似乎不太了解<......

javail
今天
15
0
业内首款,百度工业视觉智能平台全新亮相

本文作者:y****n 业内首款全国产化工业视觉智能平台——百度工业视觉智能平台亮相中国机器视觉展(Vision China),该平台所具有的核心AI能力完全自主可控,在质检、巡检等场景中具有高效、...

百度开发者中心
昨天
7
0
我们如何制作xkcd样式图? - How can we make xkcd style graphs?

问题: Apparently, folk have figured out how to make xkcd style graphs in Mathematica and in LaTeX . 显然,民间已经想出了如何在Mathematica和LaTeX中制作xkcd风格的图形。 Can we d......

富含淀粉
今天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部