zoukankan      html  css  js  c++  java
  • Docker

    一、容器概念

    虚拟化技术:

    • 主机级虚拟化:VMware,xen,kvm等
      • Type-I:硬件上直接跑虚拟机
      • Type-II:硬件上装宿主机操作系统,在宿主机中安装虚拟化软件
    • 容器级虚拟化
      • FreeBSD:jail(监狱)
      • vserver(linux平台,chroot功能)
      • lxc,docker

    名称空间:namespaces

    • 主机名和域名:UTS
    • 文件系统:Mount
    • 进程间通信:IPC
    • 进程编号:PID
    • 用户和用户组:User
    • 网络设备,网络栈,端口:Network

    资源控制:C Group

    二、LXC

    Linux Container:linux容器

    # yum install lxc lxc-templates -y
    # lxc-create -n test01 -t centos
    # chroot /var/lib/lxc/test01/rootfs passwd
    # lxc-start -n centos
    # lxc-ls -f
    # lxc-console -n centos
    

    三、docker

    镜像:分层镜像,联合挂载

    docker的编排工具

    • machine + swarm + compose
    • mesos + marathon
    • kubernets

    容器引擎:lxc -- libcontainer -- runC

    由client向docker daemon发起docker run命令,docker host会向registry拉取images,并加载到本地,在containers中运行

    • image == 镜像名:标签,如:nginx:latest,nginx:stable等

    Docker objects

    • images
    • containers
    • nerworks
    • volumes
    • plugins

    1、docker环境

    依赖的基础环境

    • 64 bits CPU
    • Linux Kernel 3.10+
    • Linux Kernel cgroups and namespaces

    CentOS 7

    • "Extras" repository
    • "Docker-ce" repository

    2、安装docker

    配置yum源

    # vim /etc/yum.repos.d/docker-ce.repo
    [docker-ce-stable]
    name=Docker CE Stable - $basearch
    baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/$basearch/stable
    enabled=1
    gpgcheck=1
    gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
    

    安装docker-ce

    # wget https://mirrors.aliyun.com/centos-vault/7.3.1611/extras/x86_64/Packages/container-selinux-2.9-4.el7.noarch.rpm
    # yum localinstall container-selinux-2.9-4.el7.noarch.rpm -y
    # yum install docker-ce -y
    

    配置docker镜像加速器:docker cn ,中国科技大学 或 阿里云(需要注册)

    # vim /etc/docker/daemon.json
    {
      "registry-mirrors": ["https://registry.docker-cn.com"]
    }
    

    启动docker daemon

    # systemctl start docker
    # systemctl enable docker
    

    3、docker的基本使用

    查看版本及信息

    # docker version
    # docker info
    

    常用命令

    docker search
    docker pull
    docker images
    docker create
    docker start
    docker run
    docker attach  #重新连入终端
    docker ps
    docker logs
    docker restart
    docker stop
    docker kill
    docker rm
    

    pull镜像

    # docker image pull nginx:1.14-alpine
    # docker pull busybox:latest
    

    查看镜像

    # docker image ls
    # docker image ls --no-trunc
    

    删除镜像

    # docker image rm nginx:1.14-alpine
    # docker rmi busybox:latest
    

    列出所有容器

    # docker ps
    # docker container ls
    # docker container ls -a
    

    启动一个容器

    # docker run --name b1 -it busybox:latest
    

    查看容器的详细信息

    # docker inspect b1
    # docker inspect b1 |grep -w IPAddress
    

    启动、停止容器

    # docker stop b1
    # docker start b1
    # docker exec -it b1 sh
    

    启动nginx容器

    # docker run --name web1 -d nginx:1.14-alpine
    # docker exec -it web1 sh
    

    获取docker中进程日志

    # docker logs web1
    

    显示docker网络

    # docker network ls
    

    四、docker的镜像

    docker采用分层构建机制,最底层为bootfs,其之为rootfs

    • bootfs:用于系统引导的文件系统,包括bootloader和kernel,容器启动完成后会被卸载以节约内存资源;
    • rootfs:位于bootfs之上,表现为docker容器的根文件系统

    Aufs:advanced multi-layered unification filesystem 高级多层统一文件系统,aufs是之前的UnionFS的重新实现,2006年由Junjiro Okajima开发

    overlayfs:叠加文件系统,从3.18版后被合并到linux内核

    Docker Registry 分类

    • Sponsor Registry:第三方的registry,供客户和Docker社区使用
    • Mirror Registry:第三方的registry,供客户使用,如阿里云,docker cn等
    • Vendor Registry:由发布docker镜像的供应商提供的registry
    • Private Registry:通过设有防火墙和额外的安全层的私有实体提供的registry

    1、制作镜像

    # docker run --name b2 -it busybox
    / # mkdir -p /data/html
    / # vi /data/html/index.html
    welcome httpd busybox page.
    在不关闭容器的前提下做以下操作
    # docker commit -p b2
    # docker tag 17c6e41feabd dongfei/httpd:v0.1-1
    # docker tag dongfei/httpd:v0.1-1 dongfei/httpd:latest
    # docker run --name b3 -it dongfei/httpd:latest
    

    2、制作制定启动进程

    # docker commit -a "dongfei <www.dongfei.tech>" -c 'CMD ["/bin/httpd","-f","-h","/data/html"]' -p b2 dongfei/httpd:v0.2
    # docker run --name b4 dongfei/httpd:v0.2
    # docker inspect b4 |grep IPAddress
    # curl http://172.17.0.5/
    

    3、将镜像推送到docker hub

    # docker login -u dongfeimg
    # docker push dongfeimg/httpd:v0.1
    

    4、将镜像推送到阿里云仓库

    # docker login --username=xxxx@xxx.com registry.cn-beijing.aliyuncs.com
    # docker tag dongfeimg/httpd:v0.1 registry.cn-beijing.aliyuncs.com/dongfeimg/httpd:v0.1
    # docker push registry.cn-beijing.aliyuncs.com/dongfeimg/httpd:v0.1
    

    5、将镜像打包及解包

    # docker save -o myimages.gz dongfei/httpd:v0.1-1 dongfei/httpd:v0.2
    # docker load -i myimages.gz
    

    五、docker网络

    • OVS:OpenVSwitch
    • Overlay Network:叠加网络
    # docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    eb6d42cfdd58        bridge              bridge              local
    b21811ec07ff        host                host                local
    10ea20daaeb9        none                null                local
    

    四种网络模式

    • 仅主机
    • NET
    • 桥接
    • 隧道:使用IP封装IP报文,如Overlay Network 叠加网络
    # yum install bridge-utils
    # brctl show
    bridge name     bridge id               STP enabled     interfaces
    docker0         8000.0242d1a3e859       no              veth605c425
                                                            veth62c6501
                                                            vethd7e0b6c
    
    # ip link show  #查看网卡信息
    

    docker的网络类型

    • bridge:表示容器连接到docker0网桥上
    • host:表示容器使用物理机的网络名称空间
    • none:表示只给容器lo网络,不给外界通信的网络
    # docker network inspect bridge
    

    网络名称空间(ip命令由iproute包提供)

    # ip netns add r1  #增加网络名称空间
    # ip netns add r2
    # ip netns list  #列出网络名称空间
    # ip netns exec r1 ifconfig -a  #在网络名称空间中查看网卡信息
    # ip link add name veth1.1 type veth peer name veth1.2  #创建虚拟网卡对
    # ip link show
    # ip link set veth1.2 netns r1  #将veth1.2连接到r1名称空间中
    # ip netns exec r1 ip link set dev veth1.2 name eth0  #将r1中的veth1.2改名为eth0
    # ip netns exec r1 ifconfig -a
    # ifconfig veth1.1 10.0.0.1/24 up
    # ip netns exec r1 ifconfig eth0 10.0.0.2/24 up
    # ping 10.0.0.2
    # ip link set dev veth1.1 netns r2
    # ip netns exec r2 ifconfig veth1.1 10.0.0.3/24 up
    # ip netns exec r2 ping 10.0.0.2
    

    docker使用网络名称空间

    # docker run --name t1 -it --rm busybox:latest
    # docker run --name t1 -it --network bridge --rm busybox:latest
    # docker run --name t1 -it --network none --rm busybox:latest
    # docker run --name t1 -it --network none -h t1.dongfei.tech --rm busybox:latest
    # docker run --name t1 -it --network none -h t1.dongfei.tech --dns 114.114.114.114 --rm busybox:latest
    # docker run --name t1 -it --network none -h t1.dongfei.tech --dns 114.114.114.114 --add-host www.dongfei.tech:1.1.1.1 --rm busybox:latest
    

    将容器端口映射到宿主机

    # docker run --name t1 -it --network bridge -p 80 --rm dongfeimg/httpd:v0.1
    # docker run --name t2 -it --network bridge -p 192.168.0.8::80 --rm dongfeimg/httpd:v0.1
    # docker run --name t3 -it --network bridge -p 80:80 --rm dongfeimg/httpd:v0.1
    # docker port t3
    

    联盟式容器网络

    # docker run --name by1 -it busybox
    # docker run --name by2 --network container:by1 -it --rm busybox
    

    使用宿主机的网络名称空间

    # docker run --name nginx --network host -it --rm nginx
    

    修改docker0桥的配置

    # vim /etc/docker/daemon.json
    {
      "registry-mirrors": ["https://l41p0ay6.mirror.aliyuncs.com"],
      "bip": "10.0.0.1/16"
    }
    # systemctl restart docker
    

    docker deamon监听本机端口

    # vim /etc/docker/daemon.json
    {
      "registry-mirrors": ["https://l41p0ay6.mirror.aliyuncs.com"],
      "bip": "10.0.0.1/16",
      "hosts": ["tcp://0.0.0.0:2375","unix:///var/run/docker.sock"]
    }
    # systemctl restart docker
    # docker -H 192.168.0.8:2375 image ls
    

    创建docker桥

    # docker network create -d bridge --subnet "172.20.0.0/16" --gateway "172.20.0.1" mybr0
    # ip link set br-d02527a671f3 down
    # ip link set dev br-d02527a671f3 name docker1
    

    六、docker镜像

    Docker镜像由多个只读叠加而成,启动容器时,Docker会加载只读镜像层并在镜像栈顶部添加一个读写层

    如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本任然存在,只是已经被读写层中该文件的副本所隐藏,此即“写时复制COW”机制

    • volume 存储卷:是容器上的一个或多个目录,此类目录可绕过联合文件系统,与宿主机上的某目录绑定关联
    • 在容器中使用volumes
    由docker deamon管理的卷
    # docker run --name b5 -it -v /data busybox
    # docker inspect b5 |grep Source
    
    手动指定的卷路径
    # docker run --name b6 -it -v /data/volumes/b6:/data busybox
    # docker inspect -f {{.Mounts}} b6
    
    • 复制其他容器的卷配置
    # docker run -it --name b7 --volumes-from b6 busybox
    

    七、Dockerfile

    # mkdir img1
    # cd img1/
    img1]# vim Dockerfile
    # Description: test image
    FROM busybox:latest
    LABEL maintainer="Dongfei <652117746@qq.com>"
    COPY index.html /data/web/html/
    img1]# vim index.html
    this is a test page.
    img1]# docker build -t tinyhttpd:v0.1 ./
    # docker run --name tinyweb1 --rm tinyhttpd:v0.1 cat /data/web/html/index.html
    this is a test page.
    
    • COPY指令
    # Description: test image
    FROM busybox:latest
    LABEL maintainer="Dongfei <652117746@qq.com>"
    COPY index.html /data/web/html/
    COPY yum.repos.d /etc/yum.repos.d/
    
    • ADD指令
    ADD http://nginx.org/download/nginx-1.15.5.tar.gz /usr/local/src/
    # docker build -t tinyhttpd:v0.3 ./
    

    使用ADD命令,如果是本地压缩包则在容器中展开,如果是url则会下载到容中

    img1]# wget http://nginx.org/download/nginx-1.15.5.tar.gz
    img1]# vim Dockerfile
    # Description: test image
    FROM busybox:latest
    LABEL maintainer="Dongfei <652117746@qq.com>"
    COPY index.html /data/web/html/
    COPY yum.repos.d /etc/yum.repos.d/
    WORKDIR /usr/local/src/
    ADD nginx-1.15.5.tar.gz ./
    img1]# docker build -t tinyhttpd:v0.4 ./
    # docker run --rm tinyhttpd:v0.4 ls /usr/local/src/nginx-1.15.5/
    
    • VOLUME
    VOLUME /data/mysql/
    
    • EXPOSE
    EXPOSE 80/tcp
    # docker run -P --name tinyweb1 --rm tinyhttpd:v0.6 /bin/httpd -f -h /data/web/html
    
    • ENV
    ENV DOC_ROOT=/data/web/html/ 
        WEB_SERVER_PACKAGE="nginx-1.15.5"
    
    • RUN:在docker build过程中运行
    WORKDIR /usr/local/src/
    ADD http://nginx.org/download/nginx-1.15.5.tar.gz ./
    RUN cd /usr/local/src && 
        tar -xf nginx-1.15.5.tar.gz
    
    • CMD:镜像启动为容器时默认运行的命令
    FROM busybox
    LABEL maintainer="Dongfei <652117746@qq.com>" app="httpd"
    ENV WEB_DOC_ROOT="/data/web/html/"
    RUN mkdir ${WEB_DOC_ROOT} && 
        echo '<h1>Busybox httpd server.</h1>' > ${WEB_DOC_ROOT}/index.html
    CMD /bin/httpd -f -h ${WEB_DOC_ROOT}
    
    CMD ["/bin/sh","-c",/bin/httpd","-f","-h /data/web/html"]
    
    • ENTRYPOINT
    ENTRYPOINT /bin/httpd -f -h ${WEB_DOC_ROOT}
    
    • 制作一个nginx
    img3]# vim entrypoint.sh
    #!/bin/sh
    cat > /etc/nginx/conf.d/www.conf << EOF
    server {
        server_name $HOSTNAME;
        listen ${IP:-0.0.0.0}:${PORT:-80};
        root ${NGX_DOC_ROOT:-/usr/share/nginx/html};
    	}
    EOF
    exec "$@"
    img3]# vim Dockerfile
    FROM nginx:1.14-alpine
    LABEL maintainer="Dongfei <652117746@qq.com>"
    ENV NGX_DOC_ROOT='/data/web/html'
    ADD index.html ${NGX_DOC_ROOT}
    ADD entrypoint.sh /bin/
    CMD ["/usr/sbin/nginx","-g","daemon off"]
    ENTRYPOINT ["/bin/entrypoint.sh"]
    
    • USER指定运行容器的用户
    • HEALTHCHECK
    HEALTHCHECK --start-period=3s CMD wget -O - -q http://${IP:-0.0.0.0}:${PORT:-80}/
    
    • ARG
    • ONBUILD

    八、Docker Registry

    • Sponsor Registry:第三方的registry,供客户和Docker社区使用
    • Mirror Registry:第三方的registry,只让客户使用
    • Vendor Registry:由发布Docker镜像的供应商提供的registry
    • Private Registry:通过设有防火墙和额外的安全层的私有提供的registry

    1、部署docker-distribution

    1、安装

    # yum install docker-registry
    

    2、配置

    # vim /etc/docker-distribution/registry/config.yml
    version: 0.1
    log:
      fields:
        service: registry
    storage:
        cache:
            layerinfo: inmemory
        filesystem:
            rootdirectory: /var/lib/registry
    http:
        addr: :5000
    

    3、启动服务

    # systemctl start docker-distribution
    

    4、将registry标记为非https

    # vim /etc/docker/daemon.json
    {
        "insecure-registries": ["node01.dongfei.tech:5000"]
    }
    # systemctl restart docker
    

    5、推送image

    # docker tag myweb:v0.3 node01.dongfei.tech:5000/myweb:v0.3
    # docker push node01.dongfei.tech:5000/myweb:v0.3
    

    2、harbor安装使用

    1、获取

    # wget https://storage.googleapis.com/harbor-releases/release-1.4.0/harbor-offline-installer-v1.4.0.tgz
    

    2、安装

    # yum install docker-compose -y (epel)
    # tar xf harbor-offline-installer-v1.4.0.tgz -C /usr/local/
    # cd /usr/local/harbor
    # vim harbor.cfg
    hostname = node01.dongfei.tech
    harbor_admin_password = Harbor12345
    db_password = root123
    # ./install.sh
    

    访问:192.168.0.8 admin/Harbor12345

    九、资源限制

    • 内存限制
    -m or --memory=
    --memory-swap
    
    • CPU限制
    --cpu-shares:按比例分配
    --cpus:分配几个CPU
    --cpuset-cpus:分配哪些CPU
    

    压力测试

    # docker pull lorel/docker-stress-ng
    # docker run --name stress -it --rm -m 256m lorel/docker-stress-ng stress --vm 2
    # docker top stress
    # docker state
    
    # docker run --name stress -it --rm --cpus 2 lorel/docker-stress-ng stress  --cpu 8
    # docker run --name stress -it --rm --cpuset-cpus 0,2 lorel/docker-stress-ng stress  --cpu 8
    # docker run --name stress -it --rm --cpu-shares 1024 lorel/docker-stress-ng stress  --cpu 8
    # docker run --name stress2 -it --rm --cpu-shares 512 lorel/docker-stress-ng stress  --cpu 8
    

    感谢阅读!

  • 相关阅读:
    Mishka and Interesting sum
    Tree Restoring
    LIB 配置文件读写器
    WCF 采用net.tcp协议实践
    MVC ViewEngineResult实际上是一种设计
    MVC 依赖注入扩展
    功能权限设计
    代理上网荟萃
    MD5算法 简介
    MVC _ViewStart文件的作用
  • 原文地址:https://www.cnblogs.com/L-dongf/p/9795067.html
Copyright © 2011-2022 走看看