• docker环境准备及理论


    1.预热

      内核运行在内核空间,进程运行在用户空间,linux进程特性:父进程负责子进程的创建和回收,白发人送黑发人.容器就是为了保护它里面的内容物,不受其他容器干扰,也不去干扰其他容器.容器让进程认为自己的用户空间是当前系统上唯一的.

      CPU:可压缩性资源,进程来申请,如果没有空闲cpu,进程就挂起,等cpu空闲了,就给你;memory:非可压缩性资源,进程来申请,如果没有空余内存,进程就会被kill.

    主机级虚拟化(各主机用的不是同一个内核):在创建伊始,可以限制其使用的资源;

    容器级虚拟化(各主机用的是同一个内核):Control Groups(cgroups):实现对用户空间的资源分配.内核通过chrootnamespacescgroups等核心技术实现虚拟化.

      LXC:LinuX Container,容器是linux内核技术,docker是将LXC封装并且有自己特色的容器技术,后来不用LXC了.LXC->libcontainer->runC(CNCF让docker指定容器标准,叫runC).将容器当成进程,所以容器就有了生命周期,可以随时被杀掉,因为数据在硬盘上.

      容器编排:machine+swarm+compose;mesos+marathon;kubernetes->k8s.

      docker hub上一个仓库通常只放一种应用程序的镜像,仓库名就是应用程序名,镜像的标识是标签,镜像是静态的,类似于程序;容器是动态的,类似于进程.

    extras中的docker镜像版本比较老,用清华的镜像:https://mirrors.tuna.tsinghua.edu.cn

    2.下载docker

    wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
    yum clean all
    yum provides docker 
    yum provides docker-ce
    # 替换源
    vim docker-ce.repo
    :%s#https://download.docker.com#https://mirrors.tuna.tsinghua.edu.cn/docker-ce#g
    我先升级内核到4.20,然后下载docker-ce,接着给docker添加加速器
    yum -y install docker-ce
    mkdir /etc/docker
    tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://jh4x39ut.mirror.aliyuncs.com"]
    }
    EOF
    systemctl enable docker.service
    systemctl start docker.service
    docker version
    

      下载完成之后发现CentOS7.4之前的版本,在Storage Driver这方面不行,最少得7.4,所以目前实验的版本是7.6,docker rm 删的是容器,rmi删的是镜像.

    3.镜像管理基础

      docker初始网段为172.17.0.1/24,docker network ls查看所有Docker网络,docker start可以将停止的容器给启动.在容器中跑任何程序,都要将其放在前台运行.

      镜像是只读的,不允许改变,镜像的构建机制:分层构建,联合挂载.

    位于下层的镜像称为父镜像,最底层的称为基础镜像(Base Image),比如此时安装了一个vim,那就多了一层,又安装了一个nginx,那就又多了一层,这些镜像都是不可写的,在启动nginx时,会把所有镜像从下往上全部挂载,最上层的为"可读写"层,其余的均为"只读"层.

    # 下载其他站点的镜像
    docker pull quay.io/coreos/flannel:v0.10.0-amd64
    
    # 可以给一个镜像打很多标签
    docker tag 某镜像ID mowang/httpd:v0.1.1
    docker tag mowang/httpd:v0.1.1 mowang/httpd:latest
    # 基于busybox更改默认命令
    运行一个镜像mowang/httpd:v0.1.1,--name b1,这个镜像的默认命令是sh,想要改变其默认命令,用-c参数
    docker commit -c 'CMD ["/bin/httpd","-f","-h","/data/html"]' -p b1 mowang/httpd:v0.2
    -f:don't daemonize不前台启动,-h:指定家目录
    # 打包多个镜像到执行文件
    docker save -o myimages.gz mowang/httpd:v0.1.1 mowang/httpd:latest
    # 在另一台服务器上导入
    docker load -i myimages.gz
    
    执行docker info出现如下警告
    WARNING: bridge-nf-call-iptables is disabled
    WARNING: bridge-nf-call-ip6tables is disabled
    vi /etc/sysctl.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    sysctl -p
    

    4.docker网络

    每次创建一个容器,都会自动创建一对虚拟网卡(通过软件实现的),一个'插'在容器上,一个'插'在交换机上.

    epel源莫名其妙就报错(找到原因了,网卡文件中写了两个DNS1):Could not resolve host: mirrors.aliyun.com
    systemctl stop NetworkManager.service
    systemctl disable NetworkManager.service
    systemctl restart network.service
    
    docker pull busybox
    docker run --name busy1 busybox
    WARNING: IPv4 forwarding is disabled. Networking will not work
    # 需要开启转发功能
    echo net.ipv4.ip_forward=1 >> /usr/lib/sysctl.d/00-system.conf
    systemctl restart network && systemctl restart docker
    docker run -it --name busy1 busybox
    
    yum -y install bridge-utils
    brctl show
    bridge name	bridge id		STP enabled	interfaces
    docker0		8000.02422f5c4da8	no		vethd058add
    
    ip link show
    9: vethd058add@if8: <BROADCAST,MULTICAST,UP,LOWER_UP>
    

      充分说明:一对虚拟网卡,一个在容器上,一个在docker0上,容器将docker0当做交换机,物理机将docker0当做同一个机子上的网卡.

      net网络做的是映射,不实用;overlay network:叠加网络,node1上的process1访问node2上的process2,通过隧道的方式直接访问.

    每一个容器都有这六个东西:User:账号,Mount:文件系统,Pid:进程号,UTS:主机名,Net:网络,IPC:进程间通信.

    docker的三种网络架构:bridge host none

    bridge:创建容器时,默认用的是bridge,将docker0当做交换机,是一种nat桥,而不是物理桥;

    none:不给ip,没有网络;

    host:有两种:

    a.joined container,有各自的User、Mount、Pid,但共享一套UTS、Net、IPC;

    b.open container,共享宿主机的主机名、网络.

    docker network inspect bridge  # inspect:查看一个docker对象的详细信息

    5.ip netns常见操作

    ip netns help  # 操作网络名称空间的命令
    ip netns add r1
    ip netns add r2 # 创建两个网络名称空间r1、r2
    ip netns list
    ip link add name veth1.1 type veth peer name veth1.2  #创建一对网卡
    ip link show
    ip link set dev veth1.2 netns r1 # 将一块网卡移到r1
    ip netns exec r1 ifconfig -a     # 在r1中执行查看网卡的命令
    ip netns exec r1 ip link set dev veth1.2 name eth0  # 改名
    ifconfig veth1.1 10.1.0.1/24 up  # 激活veth1.1
    ip netns exec r1 ifconfig eth0 10.1.0.2/24 up  # 激活r1中的eth0
    ip link set dev veth1.1 netns r2 # 将虚拟网卡veth1.1移到r2
    ip netns exec r2 ifconfig veth1.1 10.1.0.3/24 up # 默认没有激活,需要手动激活
    ip netns exec r2 ping 10.1.0.2
    
  • 相关阅读:
    Sizzle之tokenize
    直转字符串为数组
    Sizzle前奏
    (242-528)
    (177-240)
    (92-176)
    (63~91)
    一些变量(39~62)
    mysql导入导出sql文件
    vim编辑器的一些操作
  • 原文地址:https://www.cnblogs.com/fawaikuangtu123/p/10420033.html
Copyright © 2020-2023  润新知