• 简介

      • Docker-2013-GO-PAAS
      • 组成
        • 主机
        • 服务端
        • 客户端
        • 仓库
        • 镜像
        • 容器
      • 对比虚拟机
        • 资源利用率更高:可运行上百个容器
        • 开销更小:不需要启动单独的虚拟机占用资源
        • 启动速度快:可以在数秒内完成启动
        • 简化配置:环境打包至容器,使用时直接启动
        • 快速迁移和扩展:可以跨平台迁移,兼容性良好
      • Namespace
        • 各个docker容器运行在同一主进程中并使用同一宿主机内核,各docker容器的用户空间相互隔离,实现运行指定服务的运行环境,包含宿主机内核不受其他进程的干扰和影响
      • control groups
        • 避免容器将宿主机的资源占用完,有必要对容器进行资源分配限制
      • docker核心技术
        • runtime
          • 定义版本信息,PID ,ID,容器创建,容器生命周期等规范,并以json格式保存至/run/docker/runtime-runc/moby/容器ID/state.json文件,此文件根据容器的状态实时更新内容
        • 容器镜像
          1. - **tag:标签,用于将用户指定的、具有描述性的名称对应到镜像ID**
          2. - **os:定义类型**
          3. - **architecture:定义CPU架构**
          4. - **author:作者信息**
          5. - **create:镜像创建日期**
        • registry
          1. - **统一保存镜像而且是多个不同镜像版本的地方**
        • 编排工具
          1. - **docker swarm**
          2. - **kubernetes**
      • 依赖技术
        • 容器网络
          • docker自带的网络仅支持管理单机上的容器网络,当多主机运行时,需要使用第三方开源网络
        • 服务发现
          • 容器的动态扩容特性决定了容器IP也会随之发生变化,因此需要有一种机制可以自动识别并将用户请求动态转发到新创建的容器上,kubernetes自带服务发现功能,需要结合kube-dns服务解析内部域名
        • 容器监控
          • 可以通过原生命令docker ps/top/stats 查看容器状态,也可以结合heapster/Prometheus进行监控
        • 数据管理
          • 容器的动态迁移回导致其在不同的host之间迁移,因此如何保证与容器相关的数据也能随之迁移或者随时访问,可以使用逻辑卷/存储挂载等方式解决
        • 日志收集
          • docker原生的日志查看工具docker logs ,容器内部的日志需要通过ELK等专门工具进行分析和展示处理
      • Docker安装

    1. containerd 在 dockerd 启动时被启动,然后 containerd 启动 grpc 请求监听, containerd 处理 grpc 请求,根据请求做相应动作。 /usr/bin/dockerd -H fd:// —containerd=/run/containerd/containerd.sock
    2. 若是创建容器,containerd 拉起一个 container-shim 容器进程 , 并进行相应 的创建操作。
    3. container-shim 被拉起后,start/exec/create 拉起 runC 进程,通过 exit、control 文件和 containerd 通信,通过父子进程关系和 SIGCHLD(信号)监控容器中进程 状态。
    4. 在整个容器生命周期中,containerd 通过 epoll 监控容器文件,监控容器事件。

      1. - **docker镜像加速配置**
      2. - **获取加速地址**
      3. - **阿里云官网可以获得专属加速地址**
      4. - **生成配置文件**
      5. - **mkdir -p /etc/docker**
      6. - **cat /etc/docker/daemon.json**
      7. - **{"registry-mirrors": ["https://9916w1ow.mirror.aliyuncs.com"]}**
      8. - **重启docker服务**
      9. - **systemctl daemon-reload**
      10. - **sudo systemctl restart docker **
      11. - **docker镜像管理**
      12. - **一个典型的Linux文件系统由bootfsrootfs组成,docker中提供rootfs,直接调用宿主机的内核**
      13. - **搜索镜像**
      14. - **docker search centos #不带版本号默认latest**
      15. - **下载镜像**
      16. - **docker pull centos #默认下载latest**
      17. - **查看本地镜像**
      18. - **docker images**
      19. - **导出镜像**
      20. - **docker save centos -o centos.tar.gz #指定位置**
      21. - **docker save centos > centos.tar.gz **
      22. - **导入镜像**
      23. - **docker load < centos.tar.gz **
      24. - **删除镜像**
      25. - **docker rmi centos **
      26. - **删除容器**
      27. - **docker rm 容器ID/名称**
      28. - **强制删除容器**
      29. - **docker rm -f 容器ID/名称**
      30. - **运行容器,并进入终端**
      31. - **docker run -it centos **
      32. - **-i 交互 -t分配终端**
      33. - **显示所有的容器**
      34. - **docker ps -a**
      35. - **随机映射端口**
      36. - **docker run -P nginx #前台启动随机映射本地端口到容器的80**
      37. - **指定端口映射**
      38. - **docker run -p 81:80 nginx #映射本地81至容器80端口**
      39. - **docker run -p 82:80/tcp -p 443:443/tcp -p 53:53/udp nginx **
      40. - **查看容器的日志**
      41. - **docker logs (-f) nginx**
      42. - **查看容器已经映射的端口**
      43. - **docker port nginx **
      44. - **查看容器的信息**
      45. - **docker inspect 容器ID**
      46. - **自定义容器名称**
      47. - **docker run -it --name nginx-test nginx **
      48. - **后台启动容器**
      49. - **docker run -d -P -name nginx **
      50. - **单次启动容器**
      51. - **docker run -it --rm ngainx #退出容器后,自动删除**
      52. - **传递运行命令**
      53. - **docker run -d centos /usr/bin/tail -f '/etc/hosts'**
      54. - **容器的启动与关闭**
      55. - **docker stop nginx-test**
      56. - **docker start nginx-test**
      57. - **进入正在运行的容器**
      58. - **docker attach nginx-test **
      59. - **docker exec -it nginx /bin/bash **
      60. - **批量关闭正在运行的容器**
      61. - **docker stop $(docker ps -a -q )**
      62. - **批量强制关闭正在运行的容器**
      63. - **docker kill $(docker ps -a -q)**
      64. - **docker rm -f $(docker ps -a -q)**
      65. - **批量删除已退出的容器**
      66. - **docker rm $(docker ps -a -q)**
      67. - **docker rm -f `docker ps -aq -f status=exited`**
      68. - **提交镜像**
      69. - **docker commit -a "作者信息 " -m "提交信息" -c "改变信息"**
      70. - **docker commit -a "ahei" -m "nginx yum v1" 容器ID centos_nginx:v1**
      71. - **其他命令**
      72. - **docker update 容器 --cpus 2 #更新容器配置信息**
      73. - **docker wait f8ae0c #显示容器的退出状态码**
      74. - **nsenter**
      75. - **yum install util-linux**
      76. - **docker inspect -f "{{.NetworkSettings.IPAddress}}" 容器 #获取容器的地址**
      77. - **docker inspect -f "{{.State.Pid}}" 容器 #获取容器的进程号**
      78. - **通过nsenter -t 进程号 -m -u -i -n -p 进入容器**
      79. - **编写脚本**
      80. - ** **
      81. ```shell
      82. # /bin/bash
      83. docker_in(){
      84. NAME_ID=$1
      85. PID=$(docker inspect -f "{{.State.Pid}}" ${NAME_ID})
      86. nsenter -t $(PID) -m -u -i -n -p
      87. }
      88. docker_in $1
    • Docker镜像与制作

      • 制作镜像,通过Dockerfile来进行制作
        • from
          • 指定基础镜像,必须是第一条指令
          • from centos:v1
        • label
          • 指定镜像标签
        • ADD
          • 将文件复制到镜像中,就是将宿主机的文件复制到容器内部
          • 后接URL,表示wget下载命令
        • COPY
          • 只能复制本地命令
        • EXPOSE
          • 暴漏容器运行时的监听端口给外部
        • ENV
          • 设置环境变量
        • RUN
          • 运行指定的命令
        • CMD
          • 容器启动时默认命令或参数
        • ENTRYPOINT
          • 容器启动时运行得启动命令
          • 只能写一条,多写只有最后一条生效
        • VOLUME
          • 挂载功能,将宿主机目录挂载至容器中
          • 数据需要持久化存储时用到
        • USER
          • 设置启动容器的用户
        • WORKDIR
          • 设置工作目录,对RUN,CMD,ENTRYPOINT,COPY,ADD 生效,不存在则会创建
        • ARG
          • 设置变量命令
      • 编写Dokerfile


        1. From centos:v1
        2. MAINTAINER Ahei
        3. RUN rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
        4. RUN yum install -y vim wget tree lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop
        5. ADD nginx-1.16.1.tar.gz /usr/local/src/ #自动解压压缩包
        6. RUN cd /usr/local/src/nginx-1.16.1 && ./configure --prefix=/usr/local/nginx --with-http_sub_module && make && make install
        7. RUN cd /usr/local/nginx/ ADD nginx.conf /usr/local/nginx/conf/nginx.conf
        8. RUN useradd nginx -s /sbin/nologin
        9. RUN ln -sv /usr/local/nginx/sbin/nginx /usr/sbin/nginx
        10. RUN echo "test nginx page" > /usr/local/nginx/html/index.html
        11. EXPOSE 80 443 #向外开放的端口,多个端口用空格做间隔,启动容器时候-p 需要使用此端向外映射,如: -p 8081:80,则 80 就是这里的 80
        12. CMD ["nginx","-g","daemon off;"] #运行的命令,每个 Dockerfile 只能有一条, 如果有多条则只有最后一条被执行
      • 本地镜像上传仓库

        • 上传官方仓库
          • 准备账户
            • 登录到docker hub创建账户
          • 填写基本信息
          • 登录
            • docker login docker.io
          • 查看认证信息
            • cat /root/.docker/config.json
          • 标记
            • docker tag nginx:latest docker.io/ahei/nginx:v1
          • 上传
            • docker push docker.io/ahei/nginx:v1
        • 上传阿里云
          • 登录账户
            • docker login —username=root@aliyun.com
          • 标记镜像
            • docker tag nginx:latest registry.cn-hangzhou.aliyuncs.com/ahei/nginx:v1
          • 推送镜像
            • docker push regustry.cn-hangzhou.aliyuncs.com/ahei/nginx:v1
    • Docker数据管理
      • 数据类型
        • 数据卷
          1. - **类似于挂载的一块磁盘,数据容器是将数据保存至一个容器上**
          2. - **将宿主机目录映射到容器内部,使用-v 参数**
          3. - **删除容器不会删除容器卷内部数据**
          • 优缺点
            • 数据卷是宿主机的目录或文件,并且可以在多i个容器之间共同使用
            • 在宿主机对数据卷更改数据后会在所有容器里面立即更新
            • 数据卷的数据可以持久保持,及时删除容器也不受影响
            • 在容器里的数据不会影响镜像本身
        • 文件挂载
          • 用于很少改变配置文件的场景
          • 将配置文件以只读方式进行挂载,可一次挂着多个目录
          • 使用场景
            • 日志输出
            • 静态web页面
            • 应用配置文件
            • 多容器间目录或文件共享
        • 数据卷容器
          • 将宿主机的目录挂载至专门的数据卷容器,然后让其他容器通过数据卷容器读写宿主机的数据,即创建一个后台运行的容器作为server,用于卷提供,其他容器作为客户端访问
          • 启动容器server
            • docker run -d —name vol-server -v /data/a.sh:/apps/b.sh:ro
          • 启动客户端
            • docker run -d —name wb1 -p 88:80 -vloumes-from vol-server
            • docker run -d —name wb2 -p 99:80 -vloumes-from vol-server
          • 关闭卷容器server仍可以创建新容器
          • 删除卷容器server无法创建新容器
          • 已运行的容器不受任何影响
    • 网络部分
      • 容器互联
        • 通过容器名称互联
        • 通过自定义容器别名互联
          • docker run -d —name 新容器名称 —link 目标容器名称:自定义名称 镜像
      • 网络类型
        • Bridge
          • 默认为bridge模式,也就是桥接模式,使用自定义的IP
          • docker network list 查看当前docker的网卡信息
        • Host
          • 不获取IP,使用物理主机的IP,监听物理机IP监听端口
          • 此模式的网络性能最高,但是容器之间端口不能相同,适用于容器端口比较固定的业务
          • docker run -d —name nginx —net=host nginx:v1
        • none
          • 无网络,默认无法与外界通信,需要手动添加IP,极少使用
        • container模式
          • 使用此模式创建的容器需要和一个已存在的容器共享同一个网络
      • 更改网络
        • 更改服务器网络
          • vim /lib/systemd/system/docker.service
          • —bip=10.0.10.1/24
        • 重启网络
          • systemctl daemon-reload
          • systemctl restart docker
      • 创建自定义网络
        • docker network create -d bridge —subnet 10.0.100.0/24 —gateway 10.0.100.1 ahei-net
    • Docker仓库单机
      • 下载docker registry镜像
        • docker pull registry
      • 搭建单机仓库
        • 授权使用目录
          • mkdir /docker/auth
        • 创建用户
          • cd /docker
          • htpasswd -Bbn ahei 123123 > /docker/auth/registry
        • 验证用户名密码
          • cat auth/htpasswd
        • 启动docker registry
          • docker run -d -p 5000:5000 —restart=always —name registry -v /docker/auth:/auth -e “REGISTRY_AUTH=htpasswd” -e “REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm” -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/registry registry
        • 修改https报错
          • vim /etc/sysconfig/docker
          • OPTIONS=’—selinux-enabled —log-driver=journald’
          • ADD_REGISTRY=’—add-registry 192.168.10.205:5000’
          • INSECURE_REGISTRY=’—insecure-registry 192.168.10.205:5000’
          • systemctl restart docker
    • Harbor

    — 添加如下信息 [Unit] Description=Harbor After=docker.service systemd-networkd.service systemd-resolved.service Requires=docker.service Documentation=http://github.com/vmware/harbor [Service] Type=simple Restart=on-failure RestartSec=5 ExecStart=/usr/local/bin/docker-compose -f /opt/harbor/docker-compose.yml up ExecStop=/usr/local/bin/docker-compose -f /opt/harbor/docker-compose.yml down [Install] WantedBy=multi-user.target

    — 保存设置 systemctl enable harbor

    1. - **客户端连接**
    2. - **配置客户端**
    3. - ** **
    4. ```shell
    5. vim /etc/docker/daemon.json
    6. -- 添加如下
    7. {
    8. "registry-mirrors":["https://c05xby84.mirror.aliyuncs.com"],"insecure-registries":["192.168.91.132"]
    9. }
    1. - ** 重启docker**
    2. - **systemctl daemon-reload**
    3. - **systemctl restart docker **
    4. - **harbor https配置**
    5. - ** **
    1. # openssl genrsa -out /usr/local/src/harbor/certs/harbor-ca.key 2048
    2. # openssl req -x509 -new -nodes -key
    3. /usr/local/src/harbor/certs/harbor-ca.key -subj "/CN=harbor.magedu.net" -days 7120 -out /usr/local/src/harbor/certs/harbor-ca.crt
    4. # vim harbor.cfg
    5. hostname = harbor.magedu.net
    6. ui_url_protocol = https
    7. ssl_cert = /usr/local/src/harbor/certs/harbor-ca.crt
    8. ssl_cert_key = /usr/local/src/harbor/certs/harbor-ca.key
    9. harbor_admin_password = 123456
    10. # ./install.sh
    11. # yum install docker-ce-18.06.3.ce-3.el7.x86_64.rpm
    12. # yum install docker-compose
    13. # mkdir /etc/docker/certs.d/harbor.magedu.net -p
    14. # cp certs/harbor-ca.crt /etc/docker/certs.d/harbor.magedu.net/
    15. # docker login harbor.magedu.net
    1. - ** **
    • 单机编排

      • 基础环境准备
        • yum install epel-release python-pip —upgrade pip
        • 安装docker compose
          • yum install docker-compose
        • 命令选项
          • build: 通过docker-compose构建镜像
          • bundle:从当前docker compose 文件生成一个以当前目录为名称的从compose文件生成一个分布式应用程序捆绑包
          • create : 创建服务
          • down: 停止和删除所有容器,网络,镜像,卷
          • events : 从容器接受实时时间,可以指定json格式
            • docker-compose events —json
          • exec:进入容器
          • kill : 强制终止运行中的容器
          • pause:暂停服务
          • port :查看端口
          • scale:设置运行容器个数
          • unpause:取消暂定
      • 启动单个容器

        • 单个容器的docker compose 文件


          1. cat docker-compose.yml
          2. service-nginx-web:
          3. image:10.0.10.11/linux/ubuntu-nginx:1.16.1
          4. expose:
          5. - 80
          6. - 443
          7. ports:
          8. - "80:80"
          9. - "443:443"
          • 启动容器
          • docker-compose up -d
        • 启动多个容器
          ```shell cat docker-compose.yml service-nginx-web: image:10.0.10.3/linux/nginx:1.16.1 container_name:nginx-web1 expose:
          • 80
          • 443 ports:
          • “80:80”
          • “443:443”

    service-tomcat: image:10.0.10.12/linux/tomcat:1 container_name:tomcat:1 expose:

    1. - 8080
    2. ports:
    3. - "8080:8080"

    添加数据卷 volumes:

    1. - /data/nginx/linux:/apps/nginx/html

    重启容器 docker-compose stop docker-compose up -d ```

    1. - ** **