首页
About Me
推荐
weibo
github
Search
1
linuxea:gitlab-ci之docker镜像质量品质报告
49,197 阅读
2
linuxea:如何复现查看docker run参数命令
21,468 阅读
3
Graylog收集文件日志实例
18,257 阅读
4
git+jenkins发布和回滚示例
17,882 阅读
5
linuxea:jenkins+pipeline+gitlab+ansible快速安装配置(1)
17,778 阅读
ops
Openvpn
Sys Basics
rsync
Mail
NFS
Other
Network
HeartBeat
server 08
Code
Awk
Shell
Python
Golang
virtualization
KVM
Docker
openstack
Xen
kubernetes
kubernetes-cni
Service Mesh
Data
Mariadb
PostgreSQL
MongoDB
Redis
MQ
Ceph
TimescaleDB
kafka
surveillance system
zabbix
ELK Stack
Open-Falcon
Prometheus
victoriaMetrics
Web
apache
Tomcat
Nginx
自动化
Puppet
Ansible
saltstack
Proxy
HAproxy
Lvs
varnish
更多
互联咨询
最后的净土
软件交付
持续集成
gitops
devops
登录
Search
标签搜索
kubernetes
docker
zabbix
Golang
mariadb
持续集成工具
白话容器
linux基础
nginx
elk
dockerfile
Gitlab-ci/cd
最后的净土
基础命令
jenkins
docker-compose
gitops
haproxy
saltstack
Istio
marksugar
累计撰写
676
篇文章
累计收到
140
条评论
首页
栏目
ops
Openvpn
Sys Basics
rsync
Mail
NFS
Other
Network
HeartBeat
server 08
Code
Awk
Shell
Python
Golang
virtualization
KVM
Docker
openstack
Xen
kubernetes
kubernetes-cni
Service Mesh
Data
Mariadb
PostgreSQL
MongoDB
Redis
MQ
Ceph
TimescaleDB
kafka
surveillance system
zabbix
ELK Stack
Open-Falcon
Prometheus
victoriaMetrics
Web
apache
Tomcat
Nginx
自动化
Puppet
Ansible
saltstack
Proxy
HAproxy
Lvs
varnish
更多
互联咨询
最后的净土
软件交付
持续集成
gitops
devops
页面
About Me
推荐
weibo
github
搜索到
69
篇与
的结果
2019-05-27
linuxea: 三小时快速入门docker指南
在此之前,我记录了很多章关于docker使用的基础,从安装到编写,其中还有一些常见的使用技巧,这其中还包括一些docker-compsoe的简单操作案例,其中有一些由于编写的时间太久,bug很多,但用来学习绰绰有余,但也仅供参考。现在,我将所有的文章汇聚在一个页面中方便查看。假如你是一个docker新手,没有太多时间,你不妨从本章入手学习,假如你想详细了解docker,那我推荐你查看我记录的白话容器26章系列详细学习docker。如果你已经阅读了这所有的文章,你可以查看我的github上的dockerMops,在这个项目中,有我学习的从之前到现在私下编写的一些镜像原文件。请不要误会,这一些仅仅只是为了更好的理解docker,仅供参考。如果你在生产中使用,请妥善思考如何使用。如果文章中出现错误,请留言或者QQ讨论群:47355295 ,加群注明来意这是一篇似乎多余的文章,因为这里提到的都是些基础。这是因为考虑到很多新手朋友接触docker学习的困难,我花了一个下午断断续续写好,它不需要你付费,它仅仅只希望可以帮助到大家。正所谓,取自网络,回馈网络。请不要吝啬你的赞美安装docker和 compose脚本部署:[root@www.linuxea.com-Node99 ~]# curl -Lks https://raw.githubusercontent.com/marksugar/MySysOps/master/scripts/docker-init-Usage.sh|bash Please input one arguement: Usage: bash {centos_install|debian_install|ubuntu_install}当你执行这个脚本,他会提示你:Please input one arguement: Usage: bash docker-init-Usage.sh{centos_install|debian_install|ubuntu_install}只需要输入对应的系统安装即可,如centos[root@www.linuxea.com-Node99 ~]# curl -Lks https://raw.githubusercontent.com/marksugar/MySysOps/master/scripts/docker-init-Usage.sh|bash -s centos_install docker 已经安装 docker-compose 已经安装脚本细节可直接访问github链接查看即可快速入门如果你没基础,你可以从docker的基础命令看起,进行简单的操作,并且了解docker后台运行,以及在运行时候可以使用一些命令来提升学习兴趣,假如报错,可以使用日志来判断哪里有问题。当你简单了解后,可以进一步开始dockerfile的阅读。假如你觉得这些都很乱,你可以尝试学习我在上面提到过的白话容器26章系列详细学习docker。linuxea: docker后台运行模式linuxea:docker中运行bash或其他命令linuxea:docker命令如何过滤docker容器linuxea:如何从命令行删除docker容器linuxea:docker run的十个常用选项linuxea:十个初学Dcoker cli指令linuxea:有效使用docker logs查看日志linuxea:docker标签的简单介绍dockerfile编写指南如果你只是浅用户,并不需要自己编写dockfile,你可以直接跳到docker网络学习docekr的ip和网络配置linuxea:白话容器之简单制作镜像与hub使用(7)linuxea:白话容器之使用dockerfile创建简单镜像1(18)linuxea:白话容器之使用dockerfile指令使用2(19)linuxea:白话容器之dockerfile CMD/entrypoint详解3(20)linuxea:白话容器之dockerfile COPY与ADD的最佳实践(4)(21)linuxea:白话容器之dockerfile health check使用(5)(22) linuxea:白话容器之dockerfile ARG和ONBUILD使用(6)(23) dockerfile常见的使用技巧linuxea:docker run与exec的使用差异linuxea:docker不能忽视的.dockerignore用法linuxea:dockerfile中的RUN指令对镜像大小的影响linuxea:缩减docker镜像大小的5个步骤docker网络如果你也不用docker-compose对容器做简单的编排,仅仅就用一个容器尝试,你大可不必费时间看这么多,直接跳到端口暴露阅读使用即可。假如你有多个容器需要编排,你又只想简单的使用,除了docker网络里面的ip,你或许还要学习,我推荐你查看linuxea:如何使用docker-compose优雅的运行多个容器。相信你会喜欢的linuxea:docker-compose设置静态ip和link与depends_on的区别linuxea:白话容器之虚拟化网络与容器网络(8) linuxea:白话容器之docker网络(9)linuxea:白话容器之docker网络名称空间(10)linuxea:白话容器之自定义docker0网络(13)linuxea:白话容器之sock远程连接docker(14)linuxea:白话容器之docker创建自定义的网桥(15)Docker指定网桥和指定网桥IPdocker端口暴露如果对端口暴露对于你来说过于啰嗦,你直接查看linuxea:白话容器之联盟式容器与host网络模式(12),可以使用--net=host即可完成端口直接暴露,且不会隔离网络名称空间,倘若你是使用iptables,你会惊讶的发现,无论你怎么动防火墙,容器仍然可以使用。但我仍然建议你查看上述docker网络的几篇,了解docker网络的原理,这在有些时候是有必要的。linuxea:简单解释docker的端口和端口暴露(EXPOSE)linuxea:白话容器之docker的4种端口暴露方式(11)linuxea:白话容器之联盟式容器与host网络模式(12)docker仓库如果你已经在本地使用了docker有很多,想构建自己的docker仓库,你可以大致阅读这几章节的文章,选择一个。不过我推荐你使用harbor,因为这是harbor对china支持最好的中文版。相信你会喜欢的。忘了说,你已经使用了docker仓库,想必你会用上发布更新,在早期,我写过一篇jenkins+gitlab+docker快速部署发布回滚示例,这篇文章或许可以给你一些思路,尽管这看起来一点都不时髦。linuxea:白话容器之Registry与Harbor的构建和使用 (26)linuxea:docker仓库harbor-https的配置和使用docker-Portusv2.1镜像仓库快速部署使用docker-harbor0.5.0镜像仓库快速部署docker多阶段构建镜像多阶段构建可以加快构建速度,在某一些场景下,这必不可缺linuxea:Distroless与多阶段构建linuxea:docker多阶段构建Multi-Stage与Builder对比总结linuxea:Docker多阶段构建与- target和--cache-fromdocker数据卷linuxea:白话容器之docker存储卷概述(16)linuxea:白话容器之docker存储卷使用的几种方式(17)docker守护进程docker为什么要用守护进程?这似乎并不符合docker一贯的作风,我们知道,每个容器内ID为1的通常是启动容器的唯一一个进程,进程终止也就意味着容器终止。我们也知道,每个容器内进程ID为1的也是第一个启动的进程,支撑整个容器的框架的进程。我们提高过多次,容器内的进程必须是要在前台运行。为什么?这似乎要去了解更多的知识框架来支持这种操作的合理性。思考1:容器内ID为1的进程是容器内唯一一个在前台运行的进程,这样做的好处是什么? 当你从本章中的文章中了解到后你的思路将会跟明确那么为什么有需要守护进程?当你真的需要守护进程的时候你应该了解到它的必要性了。简单的说,就是在容器内需要被运行多个进程的时候,你可能需要守护进程来管理。linuxea:docker的supervisor与inotifywait的使用技巧docker-composelinuxea:如何使用docker-compose优雅的运行多个容器docker变量传递linuxea:compose中的变量传递与docker-createrepo构建linuxea:如何使用docker和docker-compose的Entrypointdocker安全linuxea:docker与gVisor沙箱linuxea:Distroless与多阶段构建linuxea:docker特权模式与--cap-add和--cap-droplinuxea:了解uid和gid如何在docker容器中工作linuxea:docker容器中程序不应该以root用户身份运行linuxea:docker卷和文件系统权限linuxea:尽可能不在docker镜像中嵌入配置或者密码linuxea:docker的安全实践初识dockerDocker简单安装和命令使用Docker网络和数据卷构建一个简单的docker镜像使用dockerfile构建一个简单的镜像Docker Hub简单使用Docker数据管理-备份和恢复Docker本地仓库简单使用docker构建示例linuxea:构建redis4.0.11-Docker镜像技巧和思路Docker alpine构建nginxDocker分离构建lnmp部署wordpressDocker部署Redis cluster3.2.5集群Docker构建二进制mariaDB环境docker构建subversion1.9.4Docker构建NTP服务器Docker一步步构建Tomcat思路docker常见问题linuxea:使用单个命令清理docker镜像,容器和卷linuxea:如何设置docker日志轮换linuxea:什么是docker \<none>\<none> image(镜像)?其他docker相关Centos7 Install rancherlinuxea:nginx容器优化方案(小米容器cpu检测)docker其他使用jenkins+gitlab+docker快速部署发布回滚示例docker工具linuxea:如何复现查看docker run参数命令swarmlinuxea:Docker swarm集群入门简单使用(1)linuxea:Docker swarm集群节点服务更新(2)linuxea:Docker swarm集群节点路由网络(3)linuxea:docker config的配置使用docker修改容器时间linuxea:如何单单修改docker容器的系统时间docker资源限制linuxea:白话容器之CPU与内存资源限制概述(24) linuxea:白话容器之CPU与内存资源限制测试(25)
2019年05月27日
6,043 阅读
0 评论
0 点赞
2019-03-29
linuxea:docker与gVisor沙箱
容器彻底改变了开发,打包和部署应用程序的方式。但是,暴露给容器的系统表面足够多,以至于很多安全人员并不建议使用。越来越希望运行更多应用担任更多的角色,同时也出现不同的安全问题,这引发了对沙盒容器 - 容器的新兴趣,这些容器有助于在主机操作系统和容器内运行的应用程序之间提供安全的隔离边界。为此,我们想介绍一种新型沙箱gVisor,它有助于为容器提供安全隔离,同时比虚拟机(VM)更轻量级。gVisor与Docker和Kubernetes集成,使得在生产环境中运行沙盒容器变得简单易行。传统的容器不是沙箱在传统Linux容器中运行的应用程序以与常规(非容器化)应用程序相同的方式访问系统资源:通过直接向主机内核进行系统调用。内核以特权模式运行,允许它与必要的硬件交互并将结果返回给应用程序对于传统容器,内核对应用程序可以访问的资源施加了一些限制。这些限制是通过使用Linux cgroup和命名空间来实现的,但并非所有资源都可以通过这些机制进行控制。此外,即使有这些限制,内核仍会暴露出恶意应用程序可以直接攻击的很大的表面区域。像seccomp过滤器这样的内核功能可以在应用程序和主机内核之间提供更好的隔离,但是它们需要用户创建预定义的系统调用白名单。实际上,通常很难知道应用程序预先需要哪些系统调用。在应用程序需要的系统调用中发现漏洞时,过滤器也几乎没有帮助。现有的基于VM的容器技术一种改进容器隔离的方法是在其自己的虚拟机(VM)中运行每个容器。这为每个容器提供了自己的“机器”,包括内核和虚拟化设备,完全独立于主机。即使guest虚拟机中存在漏洞,虚拟机管理程序仍会隔离主机以及主机上运行的其他应用程序/容器。在不同的VM中运行容器可提供出色的隔离,兼容性和性能,但可能还需要更大的资源占用空间。Kata容器是一个开源项目,它使用精简的VM来保持最小的资源占用空间并最大化容器隔离的性能。与gVisor一样,Kata包含一个与Docker和Kubernetes兼容的Open Container Initiative(OCI)运行时API。带有gVisor的沙盒容器gVisor比VM更轻量级,同时保持相似的隔离级别。gVisor的核心是一个内核,它作为一个普通的,无特权的进程运行,支持大多数Linux系统调用。这个内核是用Go编写的,它是根据内存和类型安全性选择的。就像在VM中一样,在gVisor沙箱中运行的应用程序获得自己的内核和一组虚拟化设备,与主机和其他沙箱不同。gVisor通过拦截应用程序系统调用并充当客户内核提供强大的隔离边界,同时在用户空间中运行。与创建时需要一组固定资源的VM不同,gVisor可以随着时间的推移适应不断变化的资源,就像大多数普通的Linux进程一样。gVisor可以被认为是一个极其半虚拟化的操作系统,具有灵活的资源占用空间和比完整VM更低的固定成本。但是,这种灵活性的代价是更高的每系统调用开销和应用程序兼容性 - 更多内容如下。与Docker和Kubernetes集成gVisor在运行时通过runsc(“运行沙盒容器”的缩写)与Docker和Kubernetes无缝集成,符合OCI运行时API。docker的默认运行容器时候,runsc运行时是可以互换runc。安装简单;,一旦安装,它只需要一个额外的标志来在Docker中运行沙盒容器:目前支持产品的页面:https://gvisor.dev/docs/user_guide/compatibility/安装[root@linuxea.com ~]# wget https://storage.googleapis.com/gvisor/releases/nightly/latest/runsc [root@linuxea.com ~]# wget https://storage.googleapis.com/gvisor/releases/nightly/latest/runsc.sha512 [root@linuxea.com ~]# sha512sum -c runsc.sha512 [root@linuxea.com ~]# chmod a+x runsc如果此刻无法安装请尝试如下:githubwget https://raw.githubusercontent.com/marksugar/dockerMops/master/runsc/runsc -O /usr/local/bin/runsc wget https://raw.githubusercontent.com/marksugar/dockerMops/master/runsc/runsc.sha512 -O /usr/local/bin/runsc.sha512 cd /usr/local/bin/ sha512sum -c runsc.sha512 chmod a+x runsc.sha512添加到daemon.json文件中[root@linuxea.com ~]# cat /etc/docker/daemon.json { "bip": "172.31.0.1/16", "insecure-registries": ["registry.linuxea.com"], "runtimes": { "runsc": { "path": "/usr/local/bin/runsc" } } }重启[root@linuxea.com ~]# systemctl restart docker使用--runtime=runsc[root@linuxea.com ~]# docker run --name redis -d --runtime=runsc -p 6379:6379 marksugar/redis:5.0.0 c59fcbc99d295a9b0a3fda760dbc88c078c7dfa24d25842f2db9f3c1b1f0ee1c[root@linuxea.com ~]# docker logs redis [i] Start configuration /etc/redis [ok] /etc/redis/redis.conf config ready [i] If you want to use variables, please turn on REDIS_CONF=on [i] No variable substitution /etc/redis/redis.conf [i] Start up /usr/local/bin/redis-server /etc/redis/redis.conf [root@linuxea.com ~]# docker exec -i redis ps aux PID USER TIME COMMAND 1 root 0:00 {Initialization.} /bin/sh /Initialization.sh 2 root 0:00 /usr/local/bin/redis-server /etc/redis/redis.conf 6 root 0:00 ps aux为了方便期间,使用ubuntu验证[root@LinuxEA /etc/docker]# docker run -it --rm --runtime=runsc ubuntu dmesg [ 0.000000] Starting gVisor... [ 0.174239] Forking spaghetti code... [ 0.611425] Preparing for the zombie uprising... [ 0.631965] Waiting for children... [ 0.968107] Granting licence to kill(2)... [ 1.057559] Letting the watchdogs out... [ 1.267850] Creating cloned children... [ 1.536684] Creating process schedule... [ 2.013456] Reading process obituaries... [ 2.202789] Generating random numbers by fair dice roll... [ 2.205842] Digging up root... [ 2.644056] Ready!这样并不然是方便的,我们在加一个默认参数来配合使用 "default-runtime": "runsc"[root@LinuxEA ~]# cat /etc/docker/daemon.json { "bip": "10.10.10.1/24", "default-runtime": "runsc", "runtimes": { "runsc": { "path": "/usr/local/bin/runsc" } } }而后重启不需要添加--runtime=runsc参数也可[root@LinuxEA ~]# systemctl restart docker [root@LinuxEA ~]# docker run -it --rm ubuntu dmesg [ 0.000000] Starting gVisor... [ 0.218754] Creating cloned children... [ 0.635654] Creating bureaucratic processes... [ 0.765353] Generating random numbers by fair dice roll... [ 0.778448] Gathering forks... [ 1.029718] Searching for needles in stacks... [ 1.140639] Digging up root... [ 1.425273] Granting licence to kill(2)... [ 1.708911] Forking spaghetti code... [ 2.032427] Segmenting fault lines... [ 2.209941] Rewriting operating system in Javascript... [ 2.665411] Ready!倘若你使用的是--network=host,你可能还需要修改如下[root@Linuxea.com /data/linuxea/build]# cat /etc/docker/daemon.json { "bip": "10.10.10.1/24", "default-runtime": "runsc", "runtimes": { "runsc": { "path": "/usr/local/bin/runsc", "runtimeArgs": [ "--network=host" ] } } }而后重启即可[root@linuxea.com /data/linuxea/build]# docker exec -it mariadb dmesg [ 0.000000] Starting gVisor... [ 0.176162] Gathering forks... [ 0.337078] Consulting tar man page... [ 0.366665] Forking spaghetti code... [ 0.619321] Feeding the init monster... [ 0.796898] Letting the watchdogs out... [ 0.846904] Segmenting fault lines... [ 0.874947] Generating random numbers by fair dice roll... [ 1.122600] Mounting deweydecimalfs... [ 1.598290] Reading process obituaries... [ 1.650848] Searching for socket adapter... [ 1.761147] Ready!在Kubernetes中,大多数资源隔离发生在pod级别,使pod自然适合gVisor沙箱边界。Kubernetes社区目前正在正式化沙盒pod API,但现在可以获得实验性支持。在runsc运行时可以通过使用任一的运行沙盒在KubernetesCRI-O或CRI-containerd项目,其中转换消息从Kubelet成OCI运行命令。gVisor实现了Linux系统API的大部分(200个系统调用和计数),但不是全部。目前不支持某些系统调用和参数,/proc和/sys文件系统的某些部分也是如此。因此,并非所有应用程序都将在gVisor中运行,但许多应用程序运行得很好,包括Node.js,Java 8,MySQL,Jenkins,Apache,Redis,MongoDB等等。更多的使用参考https://github.com/google/gvisor,https://gvisor.dev/docs/user_guide/docker/更多阅读有关如何将密码信息传递到容器的更多信息的一些建议是:linuxea:kubernetes secret简单用法(25)linuxea:kubernetes 介绍ConfigMap与Secret(23)linuxea:docker的安全实践学习更多学习如何使用Docker CLI命令,Dockerfile命令,使用这些命令可以帮助你更有效地使用Docker应用程序。查看Docker文档和我的其他帖子以了解更多信息。docker目录白话容器docker-compose
2019年03月29日
4,767 阅读
1 评论
0 点赞
2019-03-21
linuxea:docker仓库harbor-https的配置和使用
在此前的文章中有安装配置harbor,但是没有配置https,后来我发现在某一些时候,https还是挺有用的,于是就按照github上的参考,安装配置完成。阅读此章,你将快速了解中文文档harbor的自签https的使用方式由于Harbor未附带任何证书,因此默认情况下使用HTTP来对外提供请求。但是,强烈建议为任何生产环境启用安全性。Harbor有一个Nginx实例作为所有服务的反向代理,可以使用prepare脚本配置Nginx以启用https。在测试或开发环境中,可以选择使用自签名证书,而不是来自受信任的第三方CA的证书。以下内容将向你展示如何创建自己的CA,并使用你的CA签署服务器证书和客户端证书。我的内网仓库域名是:registry.linuxea.com创建ssl获得证书授权我们要创建ca文件,大致如下openssl genrsa -out ca.key 4096openssl req -x509 -new -nodes -sha512 -days 3650 \ -subj "/C=TW/ST=Taipei/L=Taipei/O=example/OU=Personal/CN=registry.linuxea.com" \ -key ca.key \ -out ca.crt开始创建[root@linuxea.com10_0_1_61 ~/harbor/ssl]# openssl genrsa -out ca.key 4096 Generating RSA private key, 4096 bit long modulus ........++ ...........++ e is 65537 (0x10001)[root@linuxea.com10_0_1_61 ~/harbor/ssl]# openssl req -x509 -new -nodes -sha512 -days 3650 \ > -subj "/C=TW/ST=Taipei/L=Taipei/O=example/OU=Personal/CN=registry.linuxea.com" \ > -key ca.key \ > -out ca.crt将会产生两个文件[root@linuxea.com10_0_1_61 ~/harbor/ssl]# ll -sh 总用量 8.0K 4.0K -rw-r--r-- 1 root root 2.0K 3月 20 10:31 ca.crt 4.0K -rw-r--r-- 1 root root 3.2K 3月 20 10:29 ca.key获取服务器证书假设您的注册表的主机名是registry.linuxea.com,并且其DNS记录指向您正在运行Harbor的主机。在生产环境中,您首先应该从CA获得证书。在测试或开发环境中,您可以使用自己的CA. 证书通常包含.crt文件和.key文件,例如registry.linuxea.com.crt和registry.linuxea.com.key,我们现在进行创建。 openssl req -x509 -new -nodes -sha512 -days 3650 \ -subj "/C=TW/ST=Taipei/L=Taipei/O=example/OU=Personal/CN=registry.linuxea.com" \ -key ca.key \ -out ca.crt开始创建[root@linuxea.com10_0_1_61 ~/harbor/ssl]# openssl req -sha512 -new \ > -subj "/C=TW/ST=Taipei/L=Taipei/O=example/OU=Personal/CN=registry.linuxea.com" \ > -key registry.linuxea.com.key \ > -out registry.linuxea.com.csr 如下[root@linuxea.com10_0_1_61 ~/harbor/ssl]# ll -sh 总用量 16K 4.0K -rw-r--r-- 1 root root 2.0K 3月 20 10:31 ca.crt 4.0K -rw-r--r-- 1 root root 3.2K 3月 20 10:29 ca.key 4.0K -rw-r--r-- 1 root root 1.7K 3月 20 10:32 registry.linuxea.com.csr 4.0K -rw-r--r-- 1 root root 3.2K 3月 20 10:31 registry.linuxea.com.key生成registry 主机的证书无论您是使用类似yourdomain.com的 FQDN 还是IP来连接注册表主机,请运行此命令以生成符合主题备用名称(SAN)和x509 v3扩展要求的注册表主机证书:cat > v3.ext <<-EOF authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] DNS.1=registry.linuxea.com DNS.2=registry.ops.com DNS.3=registry.ds.com DNS.3=xx DNS.4=xx DNS.5=xx EOFopenssl x509 -req -sha512 -days 13650 \ -extfile v3.ext \ -CA ca.crt -CAkey ca.key -CAcreateserial \ -in registry.linuxea.com.csr \ -out registry.linuxea.com.crt开始创建[root@linuxea.com10_0_1_61 ~/harbor/ssl]# cat > v3.ext <<-EOF > authorityKeyIdentifier=keyid,issuer > basicConstraints=CA:FALSE > keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment > extendedKeyUsage = serverAuth > subjectAltName = @alt_names > > [alt_names] > DNS.1=registry.linuxea.com > DNS.2=registry.ops.com > DNS.3=registry.ds.com > DNS.3=10.10.100.100 > DNS.4=10.10.100.101 > DNS.5=10.10.100.102 > EOF[root@linuxea.com10_0_1_61 ~/harbor/ssl]# openssl x509 -req -sha512 -days 13650 \ > -extfile v3.ext \ > -CA ca.crt -CAkey ca.key -CAcreateserial \ > -in registry.linuxea.com.csr \ > -out registry.linuxea.com.crt Signature ok subject=/C=TW/ST=Taipei/L=Taipei/O=example/OU=Personal/CN=registry.linuxea.com Getting CA Private Key如下:[root@linuxea.com10_0_1_61 ~/harbor/ssl]# ll -sh 总用量 28K 4.0K -rw-r--r-- 1 root root 2.0K 3月 20 10:31 ca.crt 4.0K -rw-r--r-- 1 root root 3.2K 3月 20 10:29 ca.key 4.0K -rw-r--r-- 1 root root 17 3月 20 10:37 ca.srl 4.0K -rw-r--r-- 1 root root 2.2K 3月 20 10:37 registry.linuxea.com.crt 4.0K -rw-r--r-- 1 root root 1.7K 3月 20 10:32 registry.linuxea.com.csr 4.0K -rw-r--r-- 1 root root 3.2K 3月 20 10:31 registry.linuxea.com.key 4.0K -rw-r--r-- 1 root root 352 3月 20 10:36 v3.ext配置harbor ssl将ssl的文件复制到安装harbor的目录中,而后修改配置文件将crt,key的文件路径修改成如下:harbor.cfg #The protocol for accessing the UI and token/notification service, by default it is http. #It can be set to https if ssl is enabled on nginx. ui_url_protocol = https #The path of cert and key files for nginx, they are applied only the protocol is set to https ssl_cert = /data/harborcert/ssl/registry.linuxea.com.crt ssl_cert_key = /data/harborcert/ssl/registry.linuxea.com.keyui_url_protocol = httpsssl_cert = /data/harborcert/ssl/registry.linuxea.com.crtssl_cert_key = /data/harborcert/ssl/registry.linuxea.com.key如上所示,我这里修改的是这三个位置的信息。而后./prepare[root@linuxea.com10_0_1_61 /data/harbor]# ./prepare loaded secret from file: /data/secretkey Generated configuration file: ./common/config/nginx/nginx.conf Generated configuration file: ./common/config/adminserver/env Generated configuration file: ./common/config/ui/env Generated configuration file: ./common/config/registry/config.yml Generated configuration file: ./common/config/db/env Generated configuration file: ./common/config/jobservice/env Generated configuration file: ./common/config/jobservice/config.yml Generated configuration file: ./common/config/log/logrotate.conf Generated configuration file: ./common/config/registryctl/env Generated configuration file: ./common/config/ui/app.conf Generated certificate, key file: ./common/config/ui/private_key.pem, cert file: ./common/config/registry/root.crt The configuration files are ready, please use docker-compose to start the service.此时需要重启生效[root@linuxea.com10_0_1_61 /data/harbor]# docker-compose down Stopping nginx ... done Stopping harbor-jobservice ... done Stopping harbor-ui ... done Stopping registry ... done Stopping harbor-adminserver ... done Stopping redis ... done Stopping harbor-db ... done Stopping harbor-log ... done Removing nginx ... done Removing harbor-jobservice ... done Removing harbor-ui ... done Removing registry ... done Removing harbor-adminserver ... done Removing redis ... done Removing harbor-db ... done Removing harbor-log ... done Removing network harbor_harbor[root@linuxea.com10_0_1_61 /data/harbor]# docker-compose up -d Creating network "harbor_harbor" with the default driver Creating harbor-log ... done Creating harbor-adminserver ... done Creating harbor-db ... done Creating registry ... done Creating redis ... done Creating harbor-ui ... done Creating harbor-jobservice ... done Creating nginx ... done通过浏览器访问harbor自签证书配置完成。为docker客户端配置证书为Docker配置服务器证书,密钥和CA.Docker守护程序将.crt文件解释为CA证书,将.cert文件解释为客户端证书。将registry.linuxea.com.crt转换为registry.linuxea.com.cert:$ openssl x509 -inform PEM -in registry.linuxea.com.crt -out registry.linuxea.com.cert $ls 总用量 12 -rw-r--r-- 1 root root 2183 3月 21 10:39 registry.linuxea.com.cert -rw-r--r-- 1 root root 2183 3月 21 10:35 registry.linuxea.com.crt -rw-r--r-- 1 root root 3243 3月 21 10:35 registry.linuxea.com.key创建一个certs.d目录,在/etc/docker目录下如果有必要,这里的目录可能也会是/etc/docker/certs.d/registry.linuxea.com:443/[root@linuxea.com_10_10_240_145 ~]$ mkdir /etc/docker/certs.d/registry.linuxea.com/ -p而后将ca.crt和registry.linuxea.com.key以及registry.linuxea.com.cert复制到目录中[root@linuxea.com_10_10_240_145 ~]$ cp registry.linuxea.com.cert /etc/docker/certs.d/registry.linuxea.com/ [root@linuxea.com_10_10_240_145 ~]$ cp registry.linuxea.com.key /etc/docker/certs.d/registry.linuxea.com/ [root@linuxea.com_10_10_240_145 ~]$ cp ca.crt /etc/docker/certs.d/registry.linuxea.com/除此之外,还需要添加一个配置文件在/etc/docker/daemon.json [root@linuxea.com_10_10_240_145 /etc/docker]$ cat /etc/docker/daemon.json { "insecure-registries": ["registry.linuxea.com"] }尝试登陆[root@linuxea.com_10_10_240_145 /etc/docker/certs.d]$ echo "123.linuxea.coM" | docker login --username linuxea registry.linuxea.com:443 --password-stdin WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeededpush[root@linuxea.com_10_10_240_145 /etc/docker]$ docker push registry.linuxea.com/dev/linuxeabbs:76dfc The push refers to repository [registry.linuxea.com/dev/linuxeabbs] 40b26f14ac05: Pushed 0d9ac8e69ea5: Pushed 9d3306a6ac16: Pushed 5d71ec9b2c6e: Pushed 503e53e365f3: Pushed 76dfc: digest: sha256:b8c5b1d2da1ec88ceaf6f0d80fbd93299f600a02a2750c9089d06f6a9f0af8c3 size: 1362延伸阅读linuxea:白话容器之Registry与Harbor的构建和使用 (26)学习更多学习如何使用Docker CLI命令,Dockerfile命令,使用这些命令可以帮助你更有效地使用Docker应用程序。查看Docker文档和我的其他帖子以了解更多信息。docker目录白话容器docker-compose
2019年03月21日
4,114 阅读
0 评论
1 点赞
2019-03-11
linuxea:docker的安全实践
Docker可以加速部署周期,可以更快速度推出代码。但它也带来了一系列意想不到的安全隐患,你应该知道。下面是五种常见的场景,其中部署Docker镜像会打开以前可能没有考虑过的新类型的安全问题,以及一些好的工具和建议,你可以使用它们来确保在部署时尽可能的减少安全隐患。1.镜像的真实性让我们从一个Docker本质上固有的问题开始:镜像真实性。如果你已经使用Docker一段时间,你将熟悉很多镜像和容器的基础;这些镜像来自官方的,如NGINX,Redis,Ubuntu或Alpine Linux ; 或者来自一个完全陌生的人构建。因此,我们有很多选择。如果你不喜欢一个容器,因为它不太适合您的需求,那么你可以将其替换为另一个容器。但是,这是最安全的方法吗?如果你不确定我的意思,让我们从代码的角度考虑这个问题。在开发应用程序时,直接使用别人的代码上线,你会这样做吗?或者,你是否应该将所有未经分析的代码视保持怀疑态度?我建议,如果安全性对你有很大重要性,那么在将代码集成到应用程序的代码库之前,你始终会对代码进行尽职审查。是否这样?好吧,应该对Docker容器给予同样程度的怀疑。如果你不了解这些开发人员或组织,是否可以确信你选择的容器不包含其他恶意代码的受损二进制文件?这似乎很难确定。鉴于此,我建议你做三件事。使用私有或受信任的存储库首先,你可以使用私有和受信任的存储库,例如Docker Hub的官方存储库。官方存储库有基本镜像:操作系统,如Ubuntu。编程语言,如PHP和Ruby。MySQL,PostgreSQL和Redis等服务器。除了其他方面,使Docker Hub与众不同的是,Docker的安全扫描服务始终会扫描和审查这些镜像。如果你没有听说过该服务。引用文档:Docker Cloud和Docker Hub可以扫描私有存储库中的镜像,以验证它们是否没有已知的安全漏洞或暴露的已有的漏洞,并报告每个镜像:tag的扫描结果。因此,通过使用官方存储库,你可以知道你的容器可以安全使用,并且不包含恶意代码。该功能可在限定时间内免费使用,并可用于所有付费用户。如果你已经有付费,请使用扫描服务以确保你的自定义容器镜像也是安全可靠的,它应该不包含任何你不知道的漏洞。这样,你就可以创建一个私有存储库,供你的组织使用。如果你并不清楚镜像存储库,你可以参考我之前的博客:https://www.linuxea.com/search/harbor/使用信任的Docker内容你应该使用的另一个工具是Docker Content Trust。这是Docker Engine 1.8中引入的新功能,允许你验证Docker镜像发布者。引用Docko安全负责人DiogoMónica 发布的文章:在发布者将镜像推送到远程存储库之前,Docker Engine会使用发布者的私钥在本地对镜像进行签名。当你稍后提取此镜像时,Docker Engine会使用发布者的公钥来验证你要运行的镜像是否与发布者创建的镜像完全相同,未被篡改并且是最新的。总而言之,该服务可防止镜像伪造,重放攻击和Compromised-key attack。我建议你查看该文章以及官方文档。Docker Bench Security我最近使用的另一个工具是Docker Bench Security,它包括:检查有关在生产中部署Docker容器的许多常见最佳实践。该工具基于CIS Docker 1.13基准测试中的建议,并针对以下六个方面进行检查:主机配置Docker守护程序配置Docker守护程序配置文件容器镜像和构建文件容器运行时Docker安全操作我们直接使用制作好的docker镜像root@linuxea.com ~ 2019-03-11 15:49:11 $ docker run -it --net host --pid host --userns host --cap-add audit_control \ -e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST \ -v /var/lib:/var/lib \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /usr/lib/systemd:/usr/lib/systemd \ -v /etc:/etc --label docker_bench_security \ docker/docker-bench-security或者你也可以克隆代码仓库: git clone git@github.com:docker/docker-bench-security.git这样构建的容器启动,会对主机上的镜像以及其运行的容器进行检查。下面是它产生的输出样本。你可以看到它提供了非常清晰的颜色编码输出,详细说明了它运行的检查及其结果。就当前而言,这效果相当不错,但是也需要一些改进。这个最妙的地方在于,它可以作为CI过程的一部分包含在内,有助于确保容器尽可能安全地运行。2.特权“特权的问题一直是个问题。如:root权限等,这些包括操作系统root,数据库root和一系列拥有超级管理员权限的权限“而关于Docker,我特别关注两点:容器以特权模式运行容器使用的超额权限从第一点开始,你可以使用--privileged运行Docker容器。这样做是为这个容器提供扩展权限。引用文档:为容器提供所有功能,它还解除了设备cgroup控制器强制执行的所有限制。换句话说,容器几乎可以完成主机可以执行的所有操作。此标志存在以允许特殊用例,例如在Docker中运行Docker。如果在这种情况下,让你继续使用的想法不会停下来,那么这应该使你感到担心。老实说,除非你有一个非常特殊的用例,否则我不知道你为什么要使用这个开关,这个用法应该得到谨慎对待。鉴于此,请在此之前谨慎行事。引用此前的linuxea:docker特权模式与--cap-add和--cap-drop一文中的特权模式,可以得出以下结论:不要使用特权容器,除非你对待它们的方式与处理以root身份运行的任何其他进程的方式相同。但即使你没有使用--privileged运行容器,你的一个或多个容器也可能具有多余功能。默认情况下,Docker使用一组相当有限的功能启动容器。但是,可以通过非默认配置文件覆盖它。如果你是构建Docker容器组织,如:DigitalOcean,sloppy.io,dotCloud和Quay.io等供应商,这些默认值可能不是你所拥有的。你也可能是自托管的,在这种情况下,验证容器的权限同样重要。另外,我们需要关注另外一个谷歌的产品gvisor,我会在后面的文章中介绍,请关注我的博客。删除不必要的权限和功能无论是谁主持一场容器的会议中,Docker安全指南都会谈论:用户的最佳做法是删除除进程明确要求之外的所有功能。考虑以下问题:你的应用程序需要什么样的网络连接?是否需要原始套接字访问?是否需要发送和接收UDP请求?如果没有,那就否认这些能力。但是,它是否需要默认情况下大多数应用程序不具备的功能?如果是,那就提供那些功能。通过这样做,你将有助于限制恶意用户滥用你系统的能力,因为他们无法执行此操作。为此,请使用--cap-drop和--cap-add开关。假设你的应用程序不需要能够修改进程功能或绑定特权端口,但需要能够加载和卸载内核模块。以下是删除和添加相应功能的方法:docker run \ --cap-drop SETPCAP \ --cap-drop NET_BIND_SERVICE \ --cap-add SYS_MODULE \ -ti /bin/sh有关这些选项的深入介绍,请参阅文档的“运行时权限和Linux功能”和本站docker特权模式与--cap-add和--cap-drop的章节。3.系统安全我们应该减小(或删除)多余的容器权限同时,我们应该确定容器的安全,我们先考虑两个点:如果流氓代理访问你的容器,他们可以访问哪种权限?如果攻击者可以破坏你的容器,那么他们是否很容易做其他事情?如果是这样,有必要强化你的容器了。虽然默认情况下Docker越来越安全,但由于以命名空间和cgroup为基础,你不需要仅依赖这些功能。但可以进一步使用其他Linux安全选项,例如AppArmor,SELinux,grsecurity和Seccomp。这些都是一个成熟且经过良好测试的工具,能够进一步扩展容器主机安全性。但是鉴于我只是再次提到这些,而更深入的介绍这些技术并不在本章的范畴内。但我强烈建议你了解有关它们的更多信息,如果有可能,将它们用作基础架构的一部分。4.限制可用资源消耗你的应用需要什么?它是一个非常轻的应用程序,需要不超过500MB的内存?那为什么要让它访问更多?它是否执行更密集的处理,需要4个以上的CPU?然后允许它访问它 - 但不能再访问它。CPU配额和指定在有些时候是常见的假设分析,分析和基准测试是持续开发过程的一部分,那么这些信息将随时可用。但必须合理。比如:一个java程序,设定为2G内存,而pod只给了1G。这就会出现问题因此,在部署容器时,请确保它们只拥有所需的资源。为此,请使用适用的docker run开关,例如:-m/--memory:设置内存限制--memory-reservation:设置软内存限制--kernel-memory:设置内核内存限制--cpus:限制CPU数量--device-read-bps:限制设备的读取速率下面是一个如何在Docker compose配置文件中执行其中一些操作的示例,取自官方文档:version: '3' services: redis: image: redis:alpine deploy: resources: limits: cpus: '0.001' memory: 50M reservations: memory: 20M可以通过运行docker help run或参考Docker运行文档中的“资源的运行时约束”部分找到更多信息。5.大型攻击面更多时候,体积更大的镜像,也就意味着更大的攻击面。为此,缩减镜像势在必行.另外,我们还应该考虑的安全性的最后一个方面是Docker如何工作的结果 - 一个可能非常大的攻击面。这可能发生在任何IT组织中,但由于基于容器的基础架构的短暂性质而加剧。由于Docker允许你如此快速地创建和部署应用程序 - 以及同样轻松地销毁它们 - 因此很难准确了解你的组织已部署的应用程序。鉴于此,大型攻击面的潜力增大。你如果不确定部署统计信息?为此,请了解以下问题:当前部署了哪些应用程序?谁部署了他们?他们何时部署?他们为什么要部署?他们需要多长时间部署?谁对他们负责?上次运行安全扫描的时间是什么时候?其实你也不必紧这些问题,这些信息仅仅需要跟安全的规范和手册便可以做到。但是现在,我要说的不仅仅是这些。使用适当的日志记录实现审计跟踪与应用程序中的审计跟踪一样,例如用户在激活帐户时创建帐户,以及用户上次更新密码时,以及组织内更广泛的密码,请考虑围绕组织创建和部署的每个容器实施审计跟踪。这不一定复杂但它也不简单。但它应该实现记录如下细节的东西:部署应用程序时谁部署了它为何部署它的意图是什么什么时候应该弃用大多数连续开发工具应支持记录此信息,无论是直接在工具中还是以你选择的首选编程语言提供自定义脚本。除此之外,请考虑添加通知,无论是通过电子邮件还是其他通知,如:微信,QQ,email.此额外层应确保部署对每个人都可见且透明。这样,如果不应该发生某些事情,就不能隐藏它。我并不是说你不应该信任你组织内的员工,但要及时了解正在发生的事情是很好的。但是,有必要至少仔细思考这些问题,能够定期进行审核,并且能够始终从知情的角度进行工作,这有助于降低针对组织创建未知攻击面的可能性。延伸阅读linuxea:Distroless与多阶段构建linuxea:缩减docker镜像大小的5个步骤linuxea:dockerfile中的RUN指令对镜像大小的影响linuxea:docker容器中程序不应该以root用户身份运行linuxea:docker特权模式与--cap-add和--cap-drop学习更多学习如何使用Docker CLI命令,Dockerfile命令,使用这些命令可以帮助你更有效地使用Docker应用程序。查看Docker文档和我的其他帖子以了解更多信息。docker目录白话容器docker-compose
2019年03月11日
3,716 阅读
0 评论
0 点赞
2019-03-08
linuxea:如何单单修改docker容器的系统时间
一般情况下,我们仅仅需要修改容器的时间与我们宿主机的实际实际一致即可,我们知道,默认情况下docker容器是不允许访问系统时钟,但是有一款开源的软件使这样的需求变成了可能。此lib拦截用于检索当前时间和日期的所有系统调用,完成了容器内时间的修改。阅读此篇文章,你将了解在容器内修改时间的方法。使用以alpine为例,我们进行编译安装,并挑选几个简单的使用方法来进行演示这个时间调整git clone https://github.com/wolfcw/libfaketime.git cd libfaketime/src make install他的使用非常简单,只需要设置环境变量即可,如下bash-4.4$ date Fri Mar 8 15:17:52 CST 2019修改天数bash-4.4$ LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 FAKETIME="-2d"bash-4.4$ date Wed Mar 6 15:28:03 CST 2019修改分钟bash-4.4$ LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 FAKETIME="-70m"bash-4.4$ date Fri Mar 8 14:18:45 CST 2019虚拟时间的默认规范是缓存的,时间为10秒钟FAKETIME_NO_CACHE =1是禁用缓存,但这可能带来性能影响嵌入docker基础镜像中使用此前的基础镜像。在启动脚本中添加TIME_OFFSET变量,顺便修改启动容器进程的id和用户名#!/bin/bash ######################################################################### # File Name: entrypoint.sh # Author: www.linuxea.com # Created Time: Tue 05 Mar 2019 03:59:05 PM CST ######################################################################### USER_ID=${USER_ID:-1101} USER_NAME=${USER_NAME:-www} TIME_OFFSET=${TIME_OFFSET:-FAKETIME_NO_CACHE=1 FAKETIME=""} echo "Starting with UID : $USER_ID And user $USER_NAME" addgroup --gid $USER_ID $USER_NAME adduser -u $USER_ID -S -H -s /bin/bash -g $USER_NAME -G $USER_NAME $USER_NAME -D # useradd --shell /bin/bash -u $USER_ID -o -c "" -m user export HOME=/home/$USER_NAME export LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 $TIME_OFFSET exec /usr/local/bin/gosu $USER_NAME "$@"这样以来,在下次启动的时候,传递环境变量就达到了修改容器时间的办法我将次镜像构建为marksugar/alpine:3.9-time-gosu,你可以下载进行使用[root@linuxea.com /opt/2019/djd/jj]# docker build -t marksugar/alpine:3.9-time-gosu .现在我们进行测试这个时间修改挂载/etc/localtime让容器时间与机器时间一致,而后在进行传递$TIME_OFFSET修改时间的偏移量docker run \ --rm \ -v /etc/localtime:/etc/localtime \ -e TIME_OFFSET=FAKETIME="-10m" \ -e USER_ID=1101 \ -e USER_NAME=linuxea.com \ -it marksugar/alpine:3.9-time-gosu \ date +%F" "%T我们先取出时间[root@linuxea.com ~]# date +%F" "%T 2019-03-08 15:54:11而后修改分钟,减去10分钟,-10m[root@linuxea.com ~]# docker run \ > --rm \ > -v /etc/localtime:/etc/localtime \ > -e TIME_OFFSET=FAKETIME="-10m" \ > -e USER_ID=1101 \ > -e USER_NAME=linuxea.com \ > -it marksugar/alpine:3.9-time-gosu \ > date +%F" "%T Starting with UID : 1101 And user linuxea.com 2019-03-08 15:44:16时间从2019-03-08 15:54:11变成2019-03-08 15:44:16修改天数,减去3天,-3d[root@linuxea.com ~]# docker run \ > --rm \ > -v /etc/localtime:/etc/localtime \ > -e TIME_OFFSET=FAKETIME="-3d" \ > -e USER_ID=1101 \ > -e USER_NAME=linuxea.com \ > -it marksugar/alpine:3.9-time-gosu \ > date +%F" "%T Starting with UID : 1101 And user linuxea.com 2019-03-05 15:57:43或者这样docker run \ --rm \ -v /etc/localtime:/etc/localtime \ -e TIME_OFFSET=FAKETIME="-10m" \ -e USER_ID=1101 \ -e USER_NAME=linuxea.com \ -it marksugar/alpine:3.9-time-gosu \ date +%F" "%TFAKETIME_NO_CACHE=1[root@DT_Node-172_17_0_1 ~]# date +%F" "%T 2019-03-08 16:03:18[root@DT_Node-172_17_0_1 ~]# docker run \ > --rm \ > -v /etc/localtime:/etc/localtime \ > -e TIME_OFFSET="FAKETIME_NO_CACHE=1 FAKETIME="-10m"" \ > -e USER_ID=1101 \ > -e USER_NAME=linuxea.com \ > -it marksugar/alpine:3.9-time-gosu \ > date +%F" "%T Starting with UID : 1101 And user linuxea.com 2019-03-08 15:53:18更多阅读linuxea:docker卷和文件系统权限linuxea:docker容器中程序不应该以root用户身份运行linuxea:变量实值与文件变量替换学习更多学习如何使用Docker CLI命令,Dockerfile命令,使用这些命令可以帮助你更有效地使用Docker应用程序。查看Docker文档和我的其他帖子以了解更多信息。docker目录白话容器docker-compose
2019年03月08日
5,817 阅读
0 评论
0 点赞
1
2
...
14