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 镜像。

  • 相关阅读:
    函数
    python操作文件
    POJ-2689-Prime Distance(素数区间筛法)
    POJ-2891-Strange Way to Express Integers(线性同余方程组)
    POJ-2142-The Balance
    POJ-1061-青蛙的约会(扩展欧几里得)
    Educational Codeforces Round 75 (Rated for Div. 2) D. Salary Changing
    Educational Codeforces Round 75 (Rated for Div. 2) C. Minimize The Integer
    Educational Codeforces Round 75 (Rated for Div. 2) B. Binary Palindromes
    Educational Codeforces Round 75 (Rated for Div. 2) A. Broken Keyboard
  • 原文地址:https://www.cnblogs.com/xi-jie/p/14917733.html
Copyright © 2011-2022 走看看