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也被设置时才有意义。
• 默认情况下,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/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 #更新配置
#执行完毕后会在当前目录生成一个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
# 官方方式安装并启动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项目:
# 与主harbor 项目名称保持一致:
# 在主harbor服务器配置同步测试:
点击复制规则
主harbor编辑同步策略:
主harbor编辑同步策略:
从harbor查看镜像:
测试从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项目设置为公开:
设置项目为公开访问:
实现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界面验证:
从harbor创建同步规则:
规则方式与主harbor相同,写对方的IP+用户名密码,然后点测试连接,确认可以测试连接通过。
到主harbor验证镜像:
# 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