工具docker net core

docker基础相关分享

2018-11-13  本文已影响34人  jun_yin

什么是docker?


        Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。 

一个完整的Docker有以下几个部分组成:

dockerClient客户端

Docker Daemon守护进程

Docker Image镜像

DockerContainer容器 

docker基本架构介绍:


docker架构图 结构图简

docker与传统虚拟技术对比:


         VM(传统虚拟机技术)在宿主机器、宿主机器操作系统的基础上创建虚拟层、虚拟化的操作系统、虚拟化的仓库,然后再安装应用;

        Container(Docker容器),在宿主机器、宿主机器操作系统上创建Docker引擎,在引擎的基础上再安装应用。

vm docker对比 size对比

docker优势: 更高效的利用系统资源,更快的启动时间,一致的运行环境,持续交付和部署。更轻松的迁移,更轻松的维护和扩张。

Docker安装部署


docker安装非常简单,支持各种平台,请到官网自行安装下载

Docker常用命令


使用示例:以nginx镜像为例

检索docker远程仓库

docker search nginx

运行结果如下:

查看镜像

获取镜像(拉取nginx镜像到本地镜像库)

docker pull nignx 

pull命令从仓库获取所需要的镜像。与github很相似

运行结果:

查看本地镜像列表

docker images

查看本地镜像库

启动nginx容器

docker run -p 8080:80 -d nginx

运行结果:

运行nginx容器

进入容器

docker exec -it d35d42b6a4e3 /bin/bash

-t:在新容器内指定一个伪终端或终端。

-i:允许你对容器内的标准输入 (STDIN) 进行交互

运行结果:

验证容器状态

docker ps

运行结果:

查看容器

访问容器,浏览器访问localhost:8080

访问容器

到此容器已正常启动运行

docker网络配置-容器的互联


实例准备:dockerfile内容如下

FROM ubuntu:14.04

RUN sed -i 's/aechive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list

RUN apt-get install -y ping

RUN apt-get update

RUN apt-get install -y nginx

RUN apt-get install -y curl

EXPOSE 80

CMD /bin/bash

          执行上文中创建镜像命令,images name:cct,创建镜像,同时根据镜像启动容器cct1,cct2,...等,具体操作如下:

启动cct1,cct2容器

启动容器

1.允许所有容器互联

        默认情况下,docker允许容器间互联,例如在cct2中执行ping或curl到cct1,运行结果如下:

进入cct2容器命令:

docker exec -it cct2 /bin/bash

与cct1容器联通性验证(curl、ping):

2.拒绝容器间互联

        修改docker配置文件,添加配置项如下:

        "icc" : false

    重启dicker服务,重启容器

3.允许指定容器互联

修改docker配置文件,添加配置项如下:

   "icc" : false

    “iptables”:true

重启docker服务后,启动容器时,添加--link命令,具体如下:

docker run -it --name=cct3 --link=cct1:webcct1 cct

参数介绍:

link=cct1 :表示与cct1建立连接

:webcct1 :连接别名,可用于curl webcct1 测试连接,类似虚拟域名

利用 Dockerfile 来创建镜像


        Dockfile是一个用于编写docker镜像生成过程的文件,其有特定的语法。在一个文件夹中,如果有一个名字为Dockfile的文件,其内容满足语法要求,在这个文件夹路径下执行命令:docker build --tag name:tag .,就可以按照描述构建一个镜像了。name是镜像的名称,tag是镜像的版本或者是标签号,不写就是lastest。注意后面有一个空格和点。

dockerfile实例文件如下:

基本指令介绍:

指令表

 FROM

  用法:FROM <image>

  说明:第一个指令必须是FROM了,其指定一个构建镜像的基础源镜像,如果本地没有就会从公共库中拉取,没有指定镜像的标签会使用默认的latest标签,可以出现多次,如果需要在一个Dockerfile中构建多个镜像。

MAINTAINER

  用法:MAINTAINER <name> <email>

  说明:描述镜像的创建者,名称和邮箱

RUN

  用法:RUN "command" "param1" "param2"

  说明:RUN命令是一个常用的命令,执行完成之后会成为一个新的镜像,这里也是指镜像的分层构建。一句RUN就是一层,也相当于一个版本。这就是之前说的缓存的原理。我们知道docker是镜像层是只读的,所以你如果第一句安装了软件,用完在后面一句删除是不可能的。所以这种情况要在一句RUN命令中完成,可以通过&符号连接多个RUN语句。RUN后面的必须是双引号不能是单引号(没引号貌似也不要紧),command是不会调用shell的,所以也不会继承相应变量,要查看输入RUN "sh" "-c" "echo" "$HOME",而不是RUN "echo" "$HOME"。

CMD

  用法:CMD command param1 param2

  说明:CMD在Dockerfile中只能出现一次,有多个,只有最后一个会有效。其作用是在启动容器的时候提供一个默认的命令项。如果用户执行docker run的时候提供了命令项,就会覆盖掉这个命令。没提供就会使用构建时的命令。

 EXPOSE

  用法:EXPOSE <port> [<port>...]

  说明:告诉Docker服务器容器对外映射的容器端口号,在docker run -p的时候生效。

 ENV

  用法:EVN <key> <value> 只能设置一个

       EVN <key>=<value>允许一次设置多个

  说明:设置容器的环境变量,可以让其后面的RUN命令使用,容器运行的时候这个变量也会保留。

 ADD

  用法:ADD <src>   <dest>

  说明:复制本机文件或目录或远程文件,添加到指定的容器目录,支持GO的正则模糊匹配。路径是绝对路径,不存在会自动创建。如果源是一个目录,只会复制目录下的内容,目录本身不会复制。ADD命令会将复制的压缩文件夹自动解压,这也是与COPY命令最大的不同。

COPY

  用法:COPY <src> <dest>

  说明:COPY除了不能自动解压,也不能复制网络文件。其它功能和ADD相同。

 ENTRYPOINT

  用法:ENTRYPOINT "command" "param1" "param2"

  说明:这个命令和CMD命令一样,唯一的区别是不能被docker run命令的执行命令覆盖,如果要覆盖需要带上选项--entrypoint,如果有多个选项,只有最后一个会生效。

 VOLUME

  用法:VOLUME ["path"]

  说明:在主机上创建一个挂载,挂载到容器的指定路径。docker run -v命令也能完成这个操作,而且更强大。这个命令不能指定主机的需要挂载到容器的文件夹路径。但docker run -v可以,而且其还可以挂载数据容器。

volume实现容器之外的数据持久化存储,例:

        启动docker容器时,设置volume,具体命令如下:

docker run -p 8080:80 -d -v $PWD/html:/var/www/html 镜像名称

# -v $PWD/html:/var/www/html  表示将容器的/var/www/html 与本机/html目录关联

USER

  用法:USER daemon

  说明:指定运行容器时的用户名或UID,后续的RUN、CMD、ENTRYPOINT也会使用指定的用户运行命令。

WORKDIR

  用法:WORKDIR path

  说明:为RUN、CMD、ENTRYPOINT指令配置工作目录。可以使用多个WORKDIR指令,后续参数如果是相对路径,则会基于之前的命令指定的路径。如:WORKDIR  /home  WORKDIR test 。最终的路径就是/home/test。path路径也可以是环境变量,比如有环境变量HOME=/home,WORKDIR $HOME/test也就是/home/test。

ONBUILD

  用法:ONBUILD [INSTRUCTION]

  说明:配置当前所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。意思就是,这个镜像创建后,如果其它镜像以这个镜像为基础,会先执行这个镜像的ONBUILD命令。

STOPSIGNAL

语法:

STOPSIGNAL signal

        STOPSIGNAL命令是的作用是当容器推出时给系统发送什么样的指令

HEALTHCHECK

         容器健康状况检查命令

        语法有两种:

            1. HEALTHCHECK [OPTIONS] CMD command

            2. HEALTHCHECK NONE

        第一个的功能是在容器内部运行一个命令来检查容器的健康状况

        第二个的功能是在基础镜像中取消健康检查命令

[OPTIONS]的选项支持以下三中选项:

    --interval=DURATION 两次检查默认的时间间隔为30秒

    --timeout=DURATION 健康检查命令运行超时时长,默认30秒

    --retries=N 当连续失败指定次数后,则容器被认为是不健康的,状态为unhealthy,默认次数是3

    注意:

        HEALTHCHECK命令只能出现一次,如果出现了多次,只有最后一个生效。

        CMD后边的命令的返回值决定了本次健康检查是否成功,具体的返回值如下:

        0: success - 表示容器是健康的

        1: unhealthy - 表示容器已经不能工作了

        2: reserved - 保留值

    例子:

                HEALTHCHECK --interval=5m --timeout=3s \

                CMD curl -f http://localhost/ || exit 1

        健康检查命令是:curl -f http://localhost/ || exit 1

        两次检查的间隔时间是5秒

        命令超时时间为3秒

常见问题


1.dockerfile 中 ARG 与 ENV 的区别?

        ARG指令定义了用户可以在编译时或者运行时传递的变量,如使用如下命令: --build-arg <varname>=<value>

        ENV指令是在dockerfile里面设置环境变量,不能在编译时或运行时传递

以下是ARG和ENV的有效结合:

ARG var

ENV var=${var}

2.CMD和ENTRYPOINT指令差异?

        差异1:CMD指令指定的容器启动时命令可以被docker run指定的命令覆盖,而ENTRYPOINT指令指定的命令不能被覆盖,而是将docker run指定的参数当做ENTRYPOINT指定命令的参数。

        差异2:CMD指令可以为ENTRYPOINT指令设置默认参数,而且可以被docker run指定的参数覆盖;

3.COPY和ADD指令差异?

        COPY指令和ADD指令的唯一区别在于是否支持从远程URL获取资源。COPY指令只能从执行docker build所在的主机上读取资源并复制到镜像中。而ADD指令还支持通过URL从远程服务器读取资源并复制到镜像中。

        满足同等功能的情况下,推荐使用COPY指令。ADD指令更擅长读取本地tar文件并解压缩。


相关资料:

docker中文社区:http://www.docker.org.cn/book/install/supported-platform-17.html

上一篇下一篇

猜你喜欢

热点阅读