Docker 资源限制和私有仓库

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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容