zoukankan      html  css  js  c++  java
  • Docker基础

    Dockerfile参数使用

    • FROM:
    1. 指定基础镜像,所有构建的镜像都必须有一个基础镜像,并且 FROM 命令必须是 Dockerfile 的第一个命令
    2. FROM <image> [AS <name>] 指定从一个镜像构建起一个新的镜像名字
    3. FROM <image>[:<tag>] [AS <name>] 指定镜像的版本 Tag
    4. 示例:FROM mysql:5.0 AS database
    • MAINTAINER:
    1. 镜像维护人的信息
    2. MAINTAINER <name>
    3. 示例:MAINTAINER jay888 jay888@qq.com
    • RUN:
    1. 构建镜像时要执行的命令(docker build 时执行)执行结果都会打包进入 image 文件中
    2. 一个 Dockerfile 可以包含多个 RUN 命令
    3. RUN <command>
    4. 示例:RUN [executable, param1, param2]
    • ADD:
    1. 将本地的文件添加复制到容器中去,压缩包会解压,可以访问网络上的文件,会自动下载
    2. ADD <src> <dest>
    3. 示例:ADD *.js /app 添加 js 文件到容器中的 app 目录下
    • COPY:
    1. 功能和 ADD 一样,只是复制,不会解压或者下载文件
    • CMD:
    1. 启动容器后执行的命令(docker run 时运行),和 RUN 不一样,RUN 是在构建镜像时要运行的命令
    2. 一个 Dockerfile 只能有一个 CMD 命令
    3. 当使用 docker run 运行容器的时候,这个可以在命令行被覆盖
    4. 示例:CMD [executable, param1, param2]
    • ENTRYPOINT:
    1. 也是执行命令,和 CMD 一样,只是这个命令不会被 docker run 的命令行参数指定的指令所覆盖
    2. ENTRYPOINT [executable, param1, param2]
    3. 示例:ENTRYPOINT [donnet, myapp.dll]
    4. docker run 的命令行参数会被当作参数给 ENTRYPOINT 指令指定的程序,可以搭配 CMD 命令使用,一般是变参才会使用 CMD ,这里的 CMD 等于在给 ENTRYPOINT 传参。
    5. 示例:ENTRYPOINT ["nginx","-c"] #定参 CMD ["/etc/nginx/nginx.conf"] # 变参
    • LABEL:
    1. 为镜像添加元数据,key-value 形式
    2. LABEL <key>=<value> <key>=<value> ...
    3. 示例:LABEL version=1.0 description=这是一个web应用
    • ENV:
    1. 设置环境变量,有些容器运行时会需要某些环境变量
    2. ENV <key> <value> 一次设置一个环境变量
    3. ENV <key>=<value> <key>=<value> <key>=<value> 设置多个环境变量
    4. 示例:ENV JAVA_HOME /usr/java1.8/
    • EXPOSE:
    1. 暴露对外的端口(容器内部程序的端口,虽然会和宿主机的一样,但是其实是两个端口)
    2. EXPOSE <port>
    3. 容器运行时,需要用 -p 映射外部端口才能访问到容器内的端口
    • VOLUME:
    1. 指定数据持久化的目录,官方语言叫做挂载
    2. VOLUME /var/log 指定容器中需要被挂载的目录,会把这个目录映射到宿主机的一个随机目录上,实现数据的持久化和同步
    3. VOLUME [/var/log,/var/test.....] 指定容器中多个需要被挂载的目录,会把这些目录映射到宿主机的多个随机目录上,实现数据的持久化和同步
    4. VOLUME /var/data var/log 指定容器中的 var/log 目录挂载到宿主机上的 /var/data 目录,这种形式可以手动指定宿主机上的目录
    • WORKDIR:
    1. 设置工作目录,设置之后 ,RUN、CMD、COPY、ADD 的工作目录都会同步变更
    2. WORKDIR <path>
    3. 示例:WORKDIR /app/test
    • USER:
    1. 指定运行命令时所使用的用户,为了安全和权限起见,根据要执行的命令选择不同用户
    2. <user>:[<group>]
    3. 示例:USER test
    • ARG:
    1. 设置构建镜像时要传递的参数
    2. ARG <name>[=<value>]
    3. ARG name=sss

    遵循原则

    • Require明确:需要什么镜像
    • 步骤精简:变化较少的step优先
    • 版本明确:镜像命名明确
    • 说明文档:整个镜像打包步骤可以重现

    我们可以将镜像的内容和创建步骤描述在一个文本文件中(Dockerfile),通过执行 docker build <docker-file>命令可以构建出 Docker 镜像。

    注意:Dockerfile 的指令每执行一次都会在docker上新建一层。所以过多无意义的层,会造成镜像膨胀过大。

    容器和虚拟机的区别

    对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。Docker在Dockerfile中记录了容器构建过程,可在集群中实现快速分发和快速部署。

    Docker 的基本概念

    Docker中包含三个基本的概念:

    • Image(镜像)
    • Container(容器)
    • Repository(仓库)

    镜像是 Docker 运行容器的前提,仓库是存放镜像的场所,可见镜像更是 Docker 的核心。

    Image(镜像)

    Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。

    镜像不包含任何动态数据,其内容在构建之后也不会被改变。镜像(Image)就是一堆只读层(read-only layer)的统一视角,如下图所示:

    从左边我们看到了多个只读层,它们重叠在一起。除了最下面一层,其他层都会有一个指针指向下一层。这些层是 Docker 内部的实现细节,并且能够在主机的文件系统上访问到。统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角。

    这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。我们可以在图片的右边看到这个视角的形式。

    Container(容器)

    容器(Container)的定义和镜像(Image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。

    由于容器的定义并没有提及是否要运行容器,所以实际上,容器 = 镜像 + 读写层。

    Docker 容器就是 Docker 镜像的运行实例,是真正运行项目程序、消耗系统资源、提供服务的地方。Docker Container 提供了系统硬件环境,我们可以使用 Docker Images 这些制作好的系统盘,再加上我们所编写好的项目代码,Run 一下就可以提供服务啦。

    Repository(仓库)

    Docker 仓库是集中存放镜像文件的场所。镜像构建完成后,可以很容易的在当前宿主上运行。但是, 如果需要在其他服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry(仓库注册服务器)就是这样的服务。

    有时候会把仓库(Repository)和仓库注册服务器(Registry)混为一谈,并不严格区分。Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。一个 Docker Registry 中可以包含多个仓库(Repository),每个仓库可以包含多个标签(Tag),每个标签对应着一个镜像。

    Docker的架构

    Docker 提供了一套简单实用的命令来创建和更新镜像,我们可以通过网络直接下载一个已经创建好了的应用镜像,并通过 Docker RUN 命令就可以直接使用。当镜像通过 RUN 命令运行成功后,这个运行的镜像就是一个 Docker 容器。容器可以理解为一个轻量级的沙箱,Docker 利用容器来运行和隔离应用,容器是可以被启动、停止、删除的,这并不会影响 Docker 镜像。

  • 相关阅读:
    书单
    x&(x1)表达式的意义
    约瑟夫环,杀人游戏(静态循环链表实现)
    我的第一个动态规划程序(试图用递归求斐波拉契数)
    NYOJ 2题 括号配对问题
    为什么 C++不叫作++C? o(∩_∩)o
    文字常量区,字符串常量
    括号匹配(栈实现)
    Mybatis的逆向工程(generator)
    Mybatis学习一(介绍/举例/优化)
  • 原文地址:https://www.cnblogs.com/xi-jie/p/14917733.html
Copyright © 2011-2022 走看看