美文网首页
Docker 资源限制和私有仓库

Docker 资源限制和私有仓库

作者: 强出头 | 来源:发表于2019-09-28 15:24 被阅读0次

    Docker 资源限制

    • 默认情况下,容器没有资源约束,可以使用与主机内核调度器允许的给定资源一样多的资源。
    • DOCKER提供了一种方法来控制容器可以使用多少内存、CPU或块IO,设置DOCKER运行命令的运行时配置标志。
    • 许多这些特性都需要内核支持Linux功能。l检查支持,可以使用DOCKER信息命令。
    • 在linux主机上,如果内核检测到没有足够的内存来执行重要的系统功能,它会抛出oome或内存不足异常,并开始终止进程以释放内存。
    • 一旦发生OOME,任何进程都有可能被杀死,包括docker daemon在内
    • 为此,Docker特地调整了docker daemon的OOM优选级,以免它被内核“正法”,但容器 的优选级并未被调整

    docker中CPU是可压缩资源,内存是不可压缩资源

    • CFS scheduler完全公平调度器,内部会有算法动态调动
    • CPU密集型,调低优先级
    • IO密集型

    # 可以用几个CPU核心
    --cpus=<value>
    # 比如有4个核心,0-3编号,可以指定只用哪个或者哪几个核心
    --cpuset-cpus
    # 按比例分配,例如2:1  2:1:3 。如果有不用的进程随时调整给最需要的
    --cpu-shares
    # 查看nginx容器的使用情况
    docker top nginx
    
    # 限制内存
    -m OR --memory=   4m or 4g
    # 限制交换内存,必须要先设置-m
    --memory-swap
    # --memory-swap is a modifier flag that only has meaning if --memory is also set.
    # 设置使用交换分区倾向性0到100的值,0表示尽量不用交换分区就不用
    --memory-swappiness
    # 预留的内存空间,必须小于-m的值
    --memory-reservation
    # 禁止被oom杀死
    --oom-kill-disable
    

    --memory-swap

    • 使用swap允许容器在耗尽其可用的所有ram时将多余的内存需求写入磁盘。
    • --memory swap是一个修饰符标志,它只在--memory也被设置时才有意义。

    image.png

    • 默认情况下,Docker为每个容器创建一个唯一的IPC命名空间
    • --ipc

    • 在这些情况下,当您需要在容器内运行系统管理任务时,可以授予容器特权访问您的计算机。
    • 特权容器保持其文件系统和网络隔离,但可以完全访问共享内存和设备,并具有完整的系统功能
    • --privileged

    资源限制测试

    • 运行容器进行压力测试: • lorel/docker-stress-ng
    • 获取帮助: docker run --name stress -it --rm lorel/docker-stress-ng:latest stress --help • 测试内存资源,限制容器最大可用内存为256m
    • docker run --name stress -it --rm -m 256m lorel/docker-stress-ng:latest stress --vm 2 • 测试CPU资源,限制最多使用两核心
    • docker run --name stress -it --rm --cpus 2 lorel/docker-stress-ng:latest stress --cpu 4 • 测试CPU资源,限制只能使用指定的核心
    • docker run --name stress -it --cpuset-cpus 0,2 --rm lorel/docker-stress-ng:latest stress --cpu 4
    • 测试按比例分配CPU资源
    • docker run --name stress -it --cpus-shares 1024 --rm lorel/docker-stress-ng:latest stress --
    cpu 4
    • docker run --name stress2 -it --cpus-shares 512 --rm lorel/docker-stress-ng:latest stress -- cpu 4
    • 动态观察容器的资源占用状态 • docker stats

    私有仓库

    Docker Registry 分类

    •Registry用于保存docker镜像,包括镜像的层次结构和元数据
    •用户可自建Registry,也可使用官方的Docker Hub
    •分类
    • Sponsor Registry:第三方的registry,供客户和Docker社区使用
    • Mirror Registry:第三方的registry,只让客户使用
    • Vendor Registry:由发布Docker镜像的供应商提供的registry
    • Private Registry:通过设有防火墙和额外的安全层的私有实体提供的registry

    Repository 仓库

    • 由某特定的docker镜像的所有迭代版本组成的镜像仓库
    • 一个 Registry中可以存在多个Repository • Repository可分为“顶层仓库”和“用户仓库” • 用户仓库名称格式为“用户名/仓库名”
    • 每个仓库可以包含多个Tag(标签) ,每个标签对应一个镜像
    •Index
    • 维护用户帐户、镜像的校验以及公共命名空间的信息
    • 相当于为Registry提供了一个完成用户认证等功能的检索接口

    # 安装
    [root@localhost ~]# yum install -y docker-distribution
    [root@localhost ~]# rpm -ql docker-distribution
    /etc/docker-distribution/registry/config.yml
    /usr/bin/registry
    /usr/lib/systemd/system/docker-distribution.service
    /usr/share/doc/docker-distribution-2.6.2
    /usr/share/doc/docker-distribution-2.6.2/AUTHORS
    /usr/share/doc/docker-distribution-2.6.2/CONTRIBUTING.md
    /usr/share/doc/docker-distribution-2.6.2/LICENSE
    /usr/share/doc/docker-distribution-2.6.2/MAINTAINERS
    /usr/share/doc/docker-distribution-2.6.2/README.md
    /var/lib/registry
    # 查看配置文件
    [root@localhost ~]# cat /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
    # pull镜像
    [root@localhost system]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    mynginx             test                2c69f2815bcc        12 days ago         126MB
    centos              latest              67fa590cfc1c        3 weeks ago         202MB
    nginx               latest              5a3221f0137b        4 weeks ago         126MB
    [root@localhost system]# docker tag nginx:latest 10.8.250.19:5000/nginx
    [root@localhost system]# docker images
    REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
    mynginx                  test                2c69f2815bcc        12 days ago         126MB
    centos                   latest              67fa590cfc1c        3 weeks ago         202MB
    10.8.250.19:5000/nginx   latest              5a3221f0137b        4 weeks ago         126MB
    nginx                    latest              5a3221f0137b        4 weeks ago         126MB
    [root@localhost system]# docker push 10.8.250.19:5000/nginx
    The push refers to repository [10.8.250.19:5000/nginx]
    Get https://10.8.250.19:5000/v2/: http: server gave HTTP response to HTTPS client
    [root@localhost system]# cat /etc/docker/daemon.json 
    {
      "registry-mirrors": ["https://iw3lcsa3.mirror.aliyuncs.com"],
      "insecure-registries": ["10.8.250.19:5000"]
    }
    [root@localhost system]# systemctl restart docker
    [root@localhost system]# docker push 10.8.250.19:5000/nginx
    The push refers to repository [10.8.250.19:5000/nginx]
    12fdf55172df: Pushed 
    002a63507c1c: Pushed 
    1c95c77433e8: Pushed 
    latest: digest: sha256:099019968725f0fc12c4b69b289a347ae74cc56da0f0ef56e8eb8e0134fc7911 size: 948
    [root@localhost system]# ls /var/lib/registry/docker/registry/v2/repositories/nginx/_manifests/tags/latest/
    current  index
    

    Docker 仓库之分布式 Harbor

    • Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,由vmware开源,其通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中, 确保数据和知识产权在公司内部网络中管控,另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等,官网地址:<u>https://vmware.github.io/harbor/cn/</u>,官方github地址:<u>https://github.com/vmware/harbor</u>

    Harbor功能官方介绍:

    • 基于角色的访问控制:用户与Docker镜像仓库通过“项目”进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。
      镜像复制:镜像可以在多个Registry实例中复制(同步)。尤其适合于负载均衡,高可用,混合云和多云的场景。

    • 图形化用户界面:用户可以通过浏览器来浏览,检索当前Docker镜像仓库,管理项目和命名空间。
      AD/LDAP 支:Harbor可以集成企业内部已有的AD/LDAP,用于鉴权认证管理。
      审计管理:所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
      国际化:已拥有英文、中文、德文、日文和俄文的本地化版本。更多的语言将会添加进来。
      RESTful API - RESTful API :提供给管理员对于Harbor更多的操控, 使得与其它管理软件集成变得更容易。
      部署简单:提供在线和离线两种安装工具, 也可以安装到vSphere平台(OVA方式)虚拟设备。

    • 下载地址:https://github.com/vmware/harbor/releases

    • 安装文档:https://github.com/vmware/harbor/blob/master/docs/installation_guide.md

    # 下载离线完整安装包:
    # 推荐使用离线完整安装包
    [root@docker-server2 ~]# cd /usr/local/src/
    [root@docker-server2 src]# wget https://github.com/vmware/harbor/releases/download/v1.2.2/harbor-offline-installer-v1.2.2.tgz
    
    #下载在线安装包
    #不是很推荐此方式
    [root@docker-server2 src]# wget https://github.com/vmware/harbor/releases/download/v1.2.2/harbor-online-installer-v1.2.2.tgz
    
    
    # 解压并编辑harbor.cfg:
    [root@docker-server1 src]# tar xvf harbor-offline-installer-v1.2.2.tgz
    [root@docker-server1 src]# ln -sv /usr/local/src/harbor /usr/local/
    ‘/usr/local/harbor’ -> ‘/usr/local/src/harbor’
    [root@docker-server1 harbor]# cd /usr/local/harbor/
    
    [root@docker-server1 harbor]#  yum install python-pip –y
    [root@docker-server1 harbor]#  docker-compose start
    [root@docker-server1 harbor]# vim harbor.cfg
    
    [root@docker-server1 harbor]# cat harbor.cfg 
    ## Configuration file of Harbor
    # hostname设置访问地址,可以使用ip、域名,不可以设置为127.0.0.1或localhost
    hostname = 172.16
    .77
    .71
    # 访问协议,默认是http,也可以设置https,如果设置https,则nginx ssl需要设置on
    ui_url_protocol = http
    # mysql数据库root用户默认密码root123,实际使用时修改下
    db_password = root123
    max_job_workers = 3
    customize_crt = on
    ssl_cert = / data / cert / server.crt
    ssl_cert_key = / data / cert / server.key
    secretkey_path = / data
    admiral_url = NA
    # 邮件设置,发送重置密码邮件时使用
    email_identity =
    email_server = smtp.mydomain.com
    email_server_port = 25
    email_username = sample_admin @ mydomain.com
    email_password = abc
    email_from = admin < sample_admin @ mydomain.com >
    email_ssl = false
    # 启动Harbor后,管理员UI登录的密码,默认是Harbor12345
    harbor_admin_password = Harbor12345
    # 认证方式,这里支持多种认证方式,如LADP、本次存储、数据库认证。默认是db_auth,mysql数据库认证
    auth_mode = db_auth
    # LDAP认证时配置项
    # ldap_url = ldaps://ldap.mydomain.com
    # ldap_searchdn = uid=searchuser,ou=people,dc=mydomain,dc=com
    # ldap_search_pwd = password
    # ldap_basedn = ou=people,dc=mydomain,dc=com
    # ldap_filter = (objectClass=person)
    # ldap_uid = uid 
    # ldap_scope = 3 
    # ldap_timeout = 5
    # 是否开启自注册
    self_registration = on
    # Token有效时间,默认30分钟
    token_expiration = 30
    # 用户创建项目权限控制,默认是everyone(所有人),也可以设置为adminonly(只能管理员)
    project_creation_restriction = everyone
    verify_remote_cert = on
    [root@docker-server1 harbor]# pwd 
    /usr/local/harbor  #在harbor当前目录执行
    [root@docker-server1 harbor]# ./prepare #更新配置
    
    image.png
    #执行完毕后会在当前目录生成一个docker-compose.yml文件,用于配置数据目录等配置信息
    #后期修改配置:
    如果harbor运行一段时间之后需要更改配置,则步骤如下
    停止harbor:
    [root@docker-server1 harbor]# pwd
    /usr/local/harbor  #harbor的当前目录
    [root@docker-server1 harbor]# docker-compose   stop
    #编辑harbor.cfg进行相关配置:
    [root@docker-server1 harbor]# vim harbor.cfg
    #更新配置:
    [root@docker-server1 harbor]# ./prepare
    
    image.png
    # 官方方式安装并启动harbor:
    [root@docker-server1 harbor]# yum install python-pip
    [root@docker-server1 harbor]# pip install --upgrade pip
    [root@docker-server1 harbor]#  pip install docker-compose
    [root@docker-server1 harbor]# ./install.sh  #官方构建harbor和启动方式,推荐此方法,会下载官方的docker 镜像:
    # 非官方方式启动harbor:
    [root@docker-server2 harbor]# ./prepare
    [root@docker-server2 harbor]# yum install python-pip -y
    [root@docker-server2 harbor]# pip install --upgrade pip #升级pip为最新版本
    [root@docker-server2 harbor]# pip install  docker-compose #安装docker-compose命令
    

    配置docker 使用harbor仓库上传下载镜像:

    # 编辑docker配置文件:
    #注意:如果我们配置的是https的话,本地docker就不需要有任何操作就可以访问harbor了
    [root@docker-server1 ~]# vim /etc/sysconfig/docker
    4 OPTIONS='--selinux-enabled --log-driver=journald --insecure-registry 192.168.10.205'
    #其中192.168.10.205是我们部署Harbor的地址,即hostname配置项值。配置完后需要重启docker服务。
    # 重启docker服务:
    [root@docker-server1 ~]# systemctl  stop docker
    [root@docker-server1 ~]# systemctl  start  docker
    # 验证能否登录harbor:
    [root@docker-server1 harbor]# docker login 192.168.10.205
    #导入镜像:
    [root@docker-server1 harbor]# docker load < /opt/nginx-1.10.3_docker.tar.gz
    # 镜像打tag:
    # 修改images的名称,不修改成指定格式无法将镜像上传到harbor仓库,格式为: HarborIP/项目名/image名字:版本号:
    [root@docker-server1 harbor]# docker tag 192.168.10.205:5000/jack/nginx-1.10.3:v1  192.168.10.205/nginx/nginx_1.10.3:v1
    # 验证从harbor服务器下载镜像并启动容器:
    # 更改docker配置文件:
    #目前凡是需要从harbor镜像服务器下载image的docker服务都要更改,不更改的话无法下载:
    [root@docker-server2 ~]# vim /etc/sysconfig/docker
    4 OPTIONS='--selinux-enabled --log-driver=journald --insecure-registry 192.168.10.205'
    # 重启docker:
    [root@docker-server2 ~]# systemctl  stop docker
    [root@docker-server2 ~]# systemctl  start docker
    
    # 验证从harbor下载镜像:
    # 查看下载命令:
    #harbor上的每个镜像里面自带pull 命令
    [root@docker-server2 ~]# docker pull 192.168.10.205/nginx/nginx_1.10.3:v1
    # 从镜像启动容器并验证:
    # 启动容器:
    [root@docker-server2 ~]# docker run -d -p 80:80 -p 443:443 192.168.10.205/nginx/nginx_1.10.3:v1 nginx
    89901f9badf74809f6abccc352fc7479f1490f0ebe6d6e3b36d689e73c3f9027
    

    Harbor上传镜像需要在Harbor上创建相应的镜像名称,上传的镜像也需要和Harbor仓库中的一样。

    实现harbor高可用:

    • Harbor支持基于策略的Docker镜像复制功能,这类似于MySQL的主从同步,其可以实现不同的数据中心、不同的运行环境之间同步镜像,并提供友好的管理界面,大大简化了实际运维中的镜像管理工作,已经有用很多互联网公司使用harbor搭建内网docker仓库的案例,并且还有实现了双向复制的案列,本文将实现单向复制的部署:
    # 新部署一台harbor服务器:
    [root@docker-server2 ~]# cd /usr/local/src/
    [root@docker-server2 src]# tar xf harbor-offline-installer-v1.2.2.tgz
    [root@docker-server2 src]# ln -sv /usr/local/src/harbor /usr/local/
    ‘/usr/local/harbor’ -> ‘/usr/local/src/harbor’
    [root@docker-server2 src]# cd /usr/local/harbor/
    [root@docker-server2 harbor]# grep "^[a-Z]" harbor.cfg 
    hostname = 192.168.10.206 
    ui_url_protocol = http
    db_password = root123
    max_job_workers = 3 
    customize_crt = on
    ssl_cert = /data/cert/server.crt
    ssl_cert_key = /data/cert/server.key
    secretkey_path = /data
    admiral_url = NA
    clair_db_password = password
    email_identity = harbor-1.2.2
    email_server = smtp.163.com
    email_server_port = 25
    email_username = rooroot@163.com
    email_password = zhang@123
    email_from = admin <rooroot@163.com>
    email_ssl = false
    harbor_admin_password = zhang@123
    auth_mode = db_auth
    ldap_url = ldaps://ldap.mydomain.com
    ldap_basedn = ou=people,dc=mydomain,dc=com
    ldap_uid = uid 
    ldap_scope = 3 
    ldap_timeout = 5
    self_registration = on
    token_expiration = 30
    project_creation_restriction = everyone
    verify_remote_cert = on
    
    [root@docker-server2 harbor]# yum install python-pip -y
    [root@docker-server2 harbor]# pip install --upgrade pip
    [root@docker-server2 harbor]# pip install  docker-compose
    [root@docker-server2 harbor]# ./install.sh
    
    # 创建一个nginx项目:
    
    image.png
    # 与主harbor 项目名称保持一致:
    # 在主harbor服务器配置同步测试:
    
    image.png

    点击复制规则


    image.png

    主harbor编辑同步策略:


    image.png
    主harbor编辑同步策略:
    image.png
    从harbor查看镜像:
    image.png

    测试从harbor镜像下载和容器启动:
    docker客户端配置使用harbor:
    本次新部署了一台docker 客户端,IP地址为192.168.10.207

    [root@docker-server3 ~]# vim /etc/sysconfig/docker
    
    4 OPTIONS='--selinux-enabled --log-driver=journald --insecure-registry 192.168.10.206'
    
    # 重启docker服务:
    
    [root@docker-server3 ~]# systemctl  restart docker
    

    从harbor项目设置为公开:


    image.png

    设置项目为公开访问:


    image.png

    实现harbor 双向同步:

    # 在docker客户端导入centos基础镜像:
    [root@docker-server3 ~]# docker load -i /opt/centos.tar.gz
    [root@docker-server3 ~]# vim /etc/sysconfig/docker
    4 OPTIONS='--selinux-enabled --log-driver=journald --insecure-registry 192.168.10.206'
    
    # 镜像打tag:
    [root@docker-server3 ~]# docker tag docker.io/centos 192.168.10.206/nginx/centos_base
    实现harbor 双向同步:
    # 在docker客户端导入centos基础镜像:
    [root@docker-server3 ~]# docker load -i /opt/centos.tar.gz
    [root@docker-server3 ~]# vim /etc/sysconfig/docker
    4 OPTIONS='--selinux-enabled --log-driver=journald --insecure-registry 192.168.10.206'
    
    # 镜像打tag:
    [root@docker-server3 ~]# docker tag docker.io/centos 192.168.10.206/nginx/centos_base
    

    从harbor界面验证:


    image.png

    从harbor创建同步规则:
    规则方式与主harbor相同,写对方的IP+用户名密码,然后点测试连接,确认可以测试连接通过。


    image.png
    到主harbor验证镜像:
    image.png
    # docker镜像端测试:
    # 下载centos 基础镜像:
    [root@docker-server1 harbor]# docker pull 192.168.10.205/nginx/centos_base
    Using default tag: latest
    Trying to pull repository 192.168.10.205/nginx/centos_base ... 
    sha256:822de5245dc5b659df56dd32795b08ae42db4cc901f3462fc509e91e97132dc0: Pulling from 192.168.10.205/nginx/centos_base
    
    Digest: sha256:822de5245dc5b659df56dd32795b08ae42db4cc901f3462fc509e91e97132dc0
    # 从镜像启动容器:
    [root@docker-server1 ~]# docker run -it --name centos_base  192.168.10.205/nginx/centos_base bash
    

    相关文章

      网友评论

          本文标题:Docker 资源限制和私有仓库

          本文链接:https://www.haomeiwen.com/subject/tsejuctx.html