• 马哥-docker 10节课程笔记


    第一讲
    系内核中直接进行虚拟化的资源有以下几种
    • UTS  HOSTNAME
    • MOUNT  挂载点,首次登陆Linux(
    • IPC   进程间通信 
    • PID    "chroot"进程树
    • USER  将本地的虚拟user-id映射到真实的user-id
    • NET   网络访问,包括接口(之后的文章会讲到)
     全部满足以下条件的至少内核为3.8  至少使用centos7以下的系统  
    Cgroup = Control Group  
        对系统资源进行管理的程序

    第一个容器化产品  LXC   Linux  Container  = 管理了 Cgroup+namespace + chroot 技术
    Docker 和 LXC的区别
    角度LXCDocker
    运行方式使用namespace运行多个进程一个docker只能运行一个进程
    安装方式自行现场安装直接从hub下载,无须自行定义





    • 大规模使用docker时必须有编排工具,否则相比虚拟机来说是增加了工作量
    • docker运行方式    “分层构建  联合挂载”    那么意思是不是docker run时可以挂载两个image镜像呢? (不是那样的,意思是一个运行在centos7.2的nginx镜像已经打包了底层依赖环境,不需要运维人员来操作,可直接挂载使用。)
    • 使用docker的思想  一个docker启动一个进程,  他就是一个普通的进程,非常方便,挂再外部目录进行存贮
    为什么需要容器编排工具:
    1、我们有很多台服务器,为了使资源不滥用或过度空闲  ,就需要将需求(业务端)和资源端(服务器)对接起来,将这个需求放到最合适的服务器上并开始构建,人是不知道那台服务器闲置的(或需要提前查验),编排工具就可以;
    2、一些服务启动或关闭有依赖关系(dependent)关系,这些docker本身也无法解决,也需要编排工具来解决。 如lnmp搭配的系统 ; 
     k8s是谷歌出的  后来捐献给了 CNCF  
    目前容器领域是 k8s +docker 两种方式,虽然 不论是在编排领域还是容器领域都有替代者,但这两者已经成为事实上的工业标准  
    第二讲
    docker 支持restful风格,所有的资源都是一种资源,支持增删改查的操作  ,如下面的对象
    • Image
    • Containers
    • Networks
    • Volumes
    • Plugins And Other Object  
     默认创建的docker 使用的网络为 bridge 桥,除非特别指定了网络 
    docker inspect host_nginx   #检查某一个Container 的参数  情况
    [root@vhost-xiaoshancun docker]# docker network   ls    #显示所有的网桥
    NETWORK ID          NAME                DRIVER              SCOPE
    59ef2c6e4969        bridge              bridge              local
    f8bd30438a48        host                host                local
    68447dbf6019        none                null                local
    docker 的状态转换及常用命令 


    第三讲:  docker network   
    docker之间互联使用的是SDN类型的通信
    yum install bridge-util
    [root@vhost-xiaoshancun ~]# brctl  show   #显示虚拟交换机上端口的连接情况
    docker使用的是 overlay  network 类型   叠加网络  
    意思是 如果两台docker位于两台不同的物理主机上  
    C1到C2的报文发送顺序为:

    1、C1发起tcp请求,  源地址为C1,目标地址为C2
    2、C1所在的物理主机上生成的DOCKER逻辑网桥 发现c2不在本物理主机上(ip list show 能看到本机的的设备)
    3、C1所的逻辑网络会将次报文转发给物理主机的网卡(nat地址转换),主机会进行二次三层封装,在原来报文基础上增加物理主机的包头 ,   源地址为H1主机,目标为H2主机
    4、H2主机收到后会解开报文,发现目标地址为C2的报文,然后会转给C2的逻辑网桥,
    5、C2所在的逻辑网桥会转发报文给C2的DOCKER   至此完成报文转发过程  



    如果需要进一步共享的话  最多再共享 UTS NET IPC 三种资源 。 
    [root@vhost-xiaoshancun ~]# docker  network  ls
    NETWORK ID          NAME                DRIVER              SCOPE
    0865d189a638        bridge              bridge              local	# 普通的叠加网络效果
    f8bd30438a48        host                host                local	# 直接管理宿主机网络,修改会影响宿主机		
    68447dbf6019        none                null                local	#指定的docker不启用网络功能
    另外默认的还有   macvlan overlay  网络机制  除此之外 还可以自定义网络    
    第四讲: 容器虚拟化网络概述 

    docker能使用的网络容器可以分为以下四种  
    1. 无网络接口的  Close container    none 
    2. 桥接的 bridged container 
    3. 部分共享名称空间后直联的docker   -联盟式容器 (两个容器有独立的MOUNTUSERPID ,但共享netIPCUTS)
    4. 直接使用宿主机的网络     host 


    常用命令:
     [root@vhost-xiaoshancun ~]#docker inspect host_nginx  #最后会docker container名称  可以显示container的详细配置信息
     [root@vhost-xiaoshancun ~]# ip link  show   #显示虚拟网卡情况
     [root@vhost-xiaoshancun ~]# brctl  show   #显示虚拟交换机上端口的连接情况
    
    
    第五讲: docker网络2
    docker网络名称空间的 测试方法
    使用ip 命令  可以测试设备在不同名称空间的移动效果   ,能确定不同的设备同一时刻只能从属于某一个名称空间  
    各种容器的创建方法   如果容器里有多个端口需要暴露的话可多次使用-p即可 
    [root@vhost-xiaoshancun ~]# docker run  --name t1  --rm  --network bridge  -it  busybox      #bridge桥接方式
    [root@vhost-xiaoshancun ~]# docker run  --name t1  --rm  --network host  -it  busybox  # 创建host方式网卡
    [root@vhost-xiaoshancun ~]# docker run  --name t1  --rm  --network none   -it  busybox  #创建none无网卡主机 
    root@vhost-xiaoshancun ~]# docker run --name host_nginx  -p 81:80  --rm  -d nginx
    [root@vhost-xiaoshancun ~]# docker port  host_nginx     #绑定指定端口,所有宿主机IP
    80/tcp -> 0.0.0.0:81
    
    [root@vhost-xiaoshancun ~]# docker run --name host_nginx  -p 192.168.72.129::80  --rm  -d nginx #    第三种是指定IP的
    [root@vhost-xiaoshancun ~]# docker port  host_nginx 
    80/tcp -> 192.168.72.129:32768
    
    [root@vhost-xiaoshancun ~]# docker run --name host_nginx  -P  --rm  -d nginx  #大写的p 自动暴露容器中所有服务
     
    

    创建带IP端口映射的容器
    [root@vhost-xiaoshancun ~]# docker run --name host_nginx  --rm -p 80  -d nginx  #随机端口映射
    [root@vhost-xiaoshancun ~]# docker port host_nginx  #查看某一个容器的具体映涉信息 
    80/tcp -> 0.0.0.0:32769
    创建 joiner Container 联合容器    第二个容器使用第一个容器的网络  
    注: 网桥host是一种特殊的joiner模式  
    [root@vhost-xiaoshancun ~]# docker run --name host1 --rm  -itd nginx
    [root@vhost-xiaoshancun ~]# docker run --name host2  --network container:host1  --rm  -d nginx
    修改docker bridge 的IP地址
    默认bridge的网段为172.16.0.0  网段,这个可以修改  ,方法为修改/etc/docker/deamon.json 文件,添加如下内容
    "bip":"10.0.0.1/16"    # 后面的IP和网段可以修改
    默认docker命令只能管理运行在本机的docker容器和image  ,如果需要将本机的docker分享出来让其他管理器访问并维护管理的话可以修改本机的deamon.json文件   增加以下选项
    "hosts":["tcp://192.168.1.2:2375","unix///var/run/docker.sock "]
    远程服务器调用时 使用  docker -H  192.16.1.2:2375  ps 命令等

    自定义网桥(软交换机) 并配置使用
    [root@vhost-xiaoshancun ~]# docker network create  -d bridge  --subnet "172.26.0.0/16" --gateway "172.26.0.1" mybr0
    docker run  --name host2  -it  --network mybr0   busybox
     按说在同一主机上不同网段的docker是可以通信的,但实际上并没有通信 

    第六讲 06-Docker存储卷
     docker在使用image启动docker时会自动在最上层添加一个读写层  ,叫“写时复制”
    通常容器可当做一个进程使用,启动时创建,关闭时自动删除  ,也就是需要加 -rm参数  
    容器使用存储卷技术实现数据持久化存储 。  -V使用 共享存储实现   
    常见的服务可以分成有状态的服务和无状态的服务两种, 
    1. 有状态的服务: mysql、redis、tomcat   需要持久存储。 
    2. 无状态的服务: nginx 
    docker volumn 默认是使用宿主机的存储资源,但如果能结合共享存储的话会实现随意部署   存在的意义  
    1. 实现了运行 运行基础 image和  volumn  ,实现了volumn重用
    2. 实现了 容器和 volumn的分离,  可以让容器部署在任意的主机,不在和某一台主机绑定  为云计算和资源编排打下良好基础;
    docker 有两种volume 
    1. bind container volumn    即需要手工指定宿主机和容器内目录的绑定关系
    2. docker manger volumn  不需要特别指定绑定关系,而由docker管理, 一般绑定的目录为 /var/lib/docker/volumes/contanier id 目录下 
    实例操作
        docker mangager管理方式 此方式创建的文件会在容器删除后自动删除,不能实现真正的持久化  
    [root@vhost-xiaoshancun ~]# docker  run  --name  node1  --rm -itd -v /data  busybox
    容器内的/data挂载到了宿主机的 /var/lib/docker/volumes/ca6b361b2398ceb7f11eb2ab131d1f58a52040c18f38f478e0d135e7613b81c2/_data
    宿主主内外都可以修改  注意 dockerid目录会在docker删除后会自动删除  
    [root@vhost-xiaoshancun _data]# docker inspect  node1   #查看node1的配置 mount环节 可以看到mount类型为volume 
    
    
            "Mounts": [
                {
                    "Type": "volume",
                    "Name": "ca6b361b2398ceb7f11eb2ab131d1f58a52040c18f38f478e0d135e7613b81c2",
                    "Source": "/var/lib/docker/volumes/ca6b361b2398ceb7f11eb2ab131d1f58a52040c18f38f478e0d135e7613b81c2/_data",
                    "Destination": "/data",
                    "Driver": "local",
                    "Mode": "",
                    "RW": true,
                    "Propagation": ""
                }
    
    
                
    bind 方式创建的目录在容器删除后依旧可以实现持久化存储,不会删除或灭失
    绑定时指定的宿主机目录不需要事先创建,会在启动container时自动建立
    [root@vhost-xiaoshancun ~]# docker  run  --name  node1  --rm -itd -v /dockers/volumen/node1:/data  busybox
    
    在宿主机的/dockers/volumen/node 中修改增加的文件会在容器中体现  ,相反一致 
    [root@vhost-xiaoshancun _data]# docker inspect  node1   #查看node1的配置 mount环节 可以看到mount类型为bind 
    "Mounts": [
                {
                    "Type": "bind",
                    "Source": "/dockers/volumen/node1",
                    "Destination": "/data",
                    "Mode": "",
                    "RW": true,
                    "Propagation": "rprivate"
                }
    
    [root@vhost-xiaoshancun node1]# docker inspect  -f {{.Mounts}} node1 #只看某一段数据
     [{bind  /dockers/volumen/node1 /data   true rprivate}]
       
    联合容器     共享同一组 net、IPC、mount 
    在单机中编排容器时,可以使用docker-compare软件(ebey阮一鸣也讲到了这个软件)
    创建nginx1容器时,网络使用node1,存储设备也可以此用
    [root@vhost-xiaoshancun ~]# docker run --name nginx1 --rm  --network container:node1  --volumes-from node1  nginx
    第七讲:dockerfile文件详解 

    dockerfile文件  是一个基于image文件生成container文件的一个描述文件,加载了能够生成container时需要用到的source code 
    dockfile文件中应该包含的内容及举例子
    • 样式是LABEL <key>=<value>
    • 使用LABEL标签将元数据添加到image中
    • 一个image可以有多个key-value键值对
    • add 宿主机的tar.gz文件到容器中时,相当于执行了 -x -C指令,解压并放到指定的目录中
    • add 一个url(非宿主机)的tar.gz文件到容器中时,只是添加了文件,并不会解压 
    • ENV 指令  用于在编译image和生成容器RUN时使用的环境变量,一次定义,两次都可直接使用。
    • RUN  用于编译新的image时执行的命令     CMD执令是用户基于新的image生成container时使用的命令
    • EXPOSE 暴露出容器对外服务的端口 ,可一次性提供多个端口  在宿主机上绑定时还需要使用-P指令   双向暴露才会真正提供服务
    • WORKDIR  指定容器内的当前工作目录
    docker build  -t xiaoshancun/httpd:V0.1-10  .  #编译生成新的image文件

     docker run --name httpd1  --rm  xiaoshancun/httpd:V0.1-7 /bin/httpd -f -h /usr/local/html/ #启动一个带端口的http服务
    [root@vhost-xiaoshancun Docker_dockfile]# docker run --name httpd1  --rm -P  xiaoshancun/httpd:V0.1-7 /bin/httpd -f -h /usr/local/html
    [root@vhost-xiaoshancun Docker_dockfile]# docker port httpd1    #可以看出已经暴露了端口
    80/tcp -> 0.0.0.0:32769      


    以下示例Dockerfile文件中常用的一些参数,  已经测试过可以正常使用     对应上面所说的各种情况,可配合使用
    # Dockerfile文件示例
    FROM busybox:latest
    MAINTAINER "likaifeng<likaifeng@126.com>"
    ENV DOC_ROOT="/usr/local/html/" 
                    NGINX_VERSION="nginx-1.16.1"
    COPY index.html ${DOC_ROOT:-/usr/local/html/}
    COPY yum.repos.d /etc/yum.repos.d/
    ADD http://nginx.org/download/nginx-1.16.1.tar.gz /usr/local/src/
    WORKDIR /usr/local/src/
    #ADD nginx-1.16.1.tar.gz ./
    RUN cd /usr/local/src/ && 
            tar -xzvf nginx-1.16.1.tar.gz
    VOLUME /data/mysql/
    EXPOSE 80/tcp
    第八节 : Dockerfile 详解2
    进程运行的几种方式
    #COMMAND    #运行在当前shell之下的一个子进程
    #COMMAND  & #放到当前shell之下的一个后台子进程 ,shell中不能这样写
    #nohub  command &  #由当前shell生成一个子进程,但不把依赖关系放给init使用  shell关闭后command进程不会终止
    docker 运行时可以给出多个cmd指令,但只运行最后一个

    在使用docker  run 时使用-e参数可传入ENV参数 
    dockerfile文件中的指令学习
    • ARGS    在docker build过程中定义变量
    • ENTRYPOINT 指令  为系统服务提供参数  ,本身仅提供参数  默认为/bin/bash  -c  来运行 
    • HEALTHCHECK  容器服务状态监测  
    • ONBUILD 在dockfile中定义触发器    在这里定义的ONBUILD指令本次不运行,仅在以后别人引用本image时才会触发。   不能嵌套,可以任意指令,但接add,或  copy 时需注意是否有源文件
    • USER  容器中使用指定的用户身份来运行 
    docker启动时及以后需要进行生命检测   HEALTHCHECK
    以下为相关参数
    • --interval   默认30S  监测间隔时间
    • --timeout 默认30S    超时时间
    • --start-period =  默认0s  从docker启动完成后多长时间开始检测服务是否正常
    • resered   当监测失败后重试次数  默认为3次
    状态码 :
      0 :监测成功   1: 生命值状态异常  2  resered
    信号值    stop  指令是  9  kill信号值为 15
     1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
     6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
    11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
    16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
    21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
    26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
    31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
    38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
    43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
    48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
    53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
    58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
    63) SIGRTMAX-1	64) SIGRTMAX
    docker官方有entruypoint.sh示例,可以多阅读。理解docker运行原理 
    第九节 :使用Harbour 构建docker私有仓库
    实际使用docker时由于需要广泛部署docker,并不在一台主机上,所以需要使用私有repo  
      (需要补充查看)

    第十节:  Docker的系统资源限制及验正
    1. 内存
    默认情况下的容器可以无限制使用主机的CPU,MEMORY,BLOCK io资源, 为了限制这一切行为,避免容器出现OOME(OUT OF MEMORY EXCEPTION)的情况,就需要对容器使用的 CPU,MEMORY,IO资源进行管理, 而这一切是基于linux 内核的 capabilities 功能

    关于内存限制资源的使用说明
    要 想限制swap分区,必须要设置物理memory内存的大小;   设置swap分区和物理分区时应当遵守以上原则    
    --oom-kill-disable  选项   意思是当系统发行oom时是否将此容器kill掉  ,如果这个容器很重要的话要设置成 True

    1. CPU资源
    进程是有优先级的  调度优先级 1-99  20- -12    详细材料

    测试
    [root@vhost-xiaoshancun ~]# docker run --name stress  --rm  -m 512MB -it lorel/docker-stress-ng stree --vm 3 
    限制docker使用512MB内存,使用测试程序进行性能测试,启动vm * 2  单个vm为 256MB 已超过设置,但查看设置时并为超过使用限制
    [root@vhost-xiaoshancun ~]# docker stats stress 
    
    ONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
    6a527d8cc34b        stress              252.00%             512MiB / 512MiB     100.00%             586B / 0B           1.59GB / 2.15GB     7

    [root@vhost-xiaoshancun ~]# docker run --name stress  --rm  --cpus 2 -it lorel/docker-stress-ng stree --cpu 3 
    
    问题集:
    1、既然docker客户机和共享宿主机内核的,那么在linux上能运行windows的的docker吗? 或者反过来可以操作吗?
           现在好像可以了,以前的版本不行  ,不可以,在linux平台上下载windows的服务,如IIS时,会提示“no matching manifest for linux/amd64 in the manifest list entries”
    2、在一台虚拟机上创建两个docker container ,使用不同的网段,如何让他能够互联互通?

    3、在dockerfile文件中定义的maintanier项目编译完成后,应该使用那种命令或在那里查看maintainer ?
    [root@vhost-xiaoshancun Docker_dockfile]# docker image inspect nginx:latest  
    4、限制docker的CPU,MEMROY消费需要基于linux kernel 那么,是不是运行在windows环境的docker就无法限制资源使用情况了?





  • 相关阅读:
    关系数据库&&NoSQL数据库
    NoSQL
    大数据时代的数据存储,非关系型数据库MongoDB
    判断是否为BST
    百度2017暑期实习生编程题
    memset()实现及细节
    在必须返回一个对象时,不要去尝试返回一个引用
    返回局部变量指针
    用引用返回值
    数组形参
  • 原文地址:https://www.cnblogs.com/xiaoshancun/p/12352981.html
Copyright © 2020-2023  润新知