Docker安全的顶尖开源工具:
Docker Bench for Security 对照安全基准审计Docker容器的脚本
Clair API驱动的静态容器安全分析工具,拥有庞大的CVE数据库
Cilium 内核层可感知API的网络和安全工具
Anchore 使用CVE数据和用户定义的策略检查容器安全的工具
OpenSCAP Workbench 用于为各种平台创建和维护安全策略的环境
Dagda 用于在Docker容器中扫描漏洞、特洛伊木马、病毒和恶意软件的工具
Notary 使用服务器加强容器安全的框架,用于以加密方式委派责任
Sysdig Falco 提供了行为活动监控,可深入了解容器
一、docker Machine
- Docker Machine是Docker官方编排项目之一,负责在多种平台上快速安装Docker 环境。
- Docker Machine支持在常規Linux操作系统、虚拟化平台、openstack、公有云等不同环境下安装配置docker host。
- Docker Machine项目基于Go语言实现
安装:
[root@server1 ~]# mv docker-machine-Linux-x86_64-0.16.2 /usr/local/bin/docker-machine
[root@server1 ~]# chmod +x /usr/local/bin/docker-machine
创建machine要求免密登陆远程主机:
[root@server1 ~]# ssh-keygen
[root@server1 ~]# ssh-copy-id server2
[root@server1 ~]# ssh-copy-id server3
创建主机:
[root@server1 ~]# docker-machine create --driver generic --generic-ip-address=172.25.70.2 server2
server2开启2376端口
server2切换到/etc/docker目录,可以看到如图证书文件
在server1中machines目录下有server2文件夹,里面有server2的证书文件
登陆到server2:
[root@server1 ~]# docker-machine config server2
[root@server1 ~]# docker-machine env server2
[root@server1 ~]# eval $(docker-machine env server2)
[root@server1 ~]# docker info
登陆之后没有符号显示,安装bash脚本
[root@localhost file_recv]# scp docker-machine*.bash root@172.25.70.1:/etc/bash_completion.d/
[root@server1 ~]# rpm -qa | grep bash
bash-4.2.46-31.el7.x86_64
bash-completion-2.1-6.el7.noarch
[root@server1 ~]# cd /etc/bash_completion.d/
[root@server1 bash_completion.d]# ls
docker-machine.bash iprutils rhn-migrate-classic-to-rhsm rhsm-icon
docker-machine-prompt.bash rct rhsmcertd subscription-manager
docker-machine-wrapper.bash redefine_filedir rhsm-debug
[root@server1 ~]# vim .bashrc
PS1='[\u@\h \W$(__docker_machine_ps1)]\$ '
[root@server1 ~]# logout
Connection to 172.25.70.1 closed.
[root@localhost Desktop]# ssh -l root 172.25.70.1
root@172.25.70.1's password:
Last login: Fri Mar 11 16:46:30 2022 from foundation0.ilt.example.com
[root@server1 ~]# eval $(docker-machine env server2)
[root@server1 ~ [server2]]#
docker的主机server3中创建:
物理机:
[root@localhost ~]# curl https://get.docker.com/ -o get-docker.sh [root@localhost Desktop]# cd /var/www/html/ [root@localhost html]# ls docker-ce.repo get-docker.sh rhel7.6 rhel8.2 westos [root@localhost html]# vim get-docker.sh [root@localhost html]# vim docker-ce.repo [docker-ce-stable] name=Docker CE Stable - $basearch baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/stable enabled=1 gpgcheck=0 [extras] name=CentOS-$releasever - Extras - mirrors.aliyun.com baseurl=http://mirrors.aliyun.com/centos/7/extras/$basearch/ gpgcheck=0
get-docker.sh
server1:
通过server1给server3部署docker:
docker-machine create --driver generic --generic-ip-address=172.25.70.3 --engine-install-url "http://172.25.70.250/get-docker.sh" server3
出错:虚拟机没联网,无法访问阿里云,下载失败
但server1上依然在server3上创建了,状态是unknow,需要删除
处理完网络问题,重新创建:
在server1创建时,可在server3进程中查看:
二、Docker Compose
1.Docker Compose简介
- 微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而知。
- Docker Compose是一种编排服务,基于pyhton语言实现,是一个用于在Docker上定义并运行复杂应用的工具,可以让用户在集群中部署分布式应用。
- 用户可以很容易地用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。
- 解决了容器与容器之间如何管理编排的问题。
Docker Compose中两个重要概念:
- 服务(service) :一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
- 项目(project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义。
2.Docker Compose实践
官网:Compose file version 3 reference | Docker Documentation
docker-compose.yml属性
Image: 指定为镜像名称或镜像ID,如果镜像在本地不存在,Compose将会尝试拉取这个镜像。
Build:指定Dockerfile所在文件夹的路径。Compose将会利用它自动构建这个镜像,然后使用这个镜像。
Command:覆盖容器启动后默认执行的命令。
Links:链接到其它服务中的容器。
Ports: 端口映射。
Expose:暴露端口信息
Volumes:卷挂载路径设置
[root@server1 ~]# mkdir compose
[root@server1 ~]# cd compose/
[root@server1 compose]# docker pull haproxy
[root@server1 compose]# docker network prune
[root@server1 compose]# docker network ls
[root@server1 compose]# vim docker-compose.yml
version: "3.9"
services:
web1:
image: nginx
networks:
- mynet
volumes:
- ./web1:/usr/share/nginx/html
web2:
image: nginx
networks:
- mynet
volumes:
- ./web2:/usr/share/nginx/html
haproxy:
image: haproxy
networks:
- mynet
volumes:
- ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
ports:
- "80:5000"
networks:
mynet:
[root@server1 compose]# mkdir web1 在compose目录下创建web1和web2两个文件夹,分别写入对应的页面
[root@server1 compose]# echo web1 > web1/index.html
[root@server1 compose]# mkdir web2
[root@server1 compose]# echo web2 > web2/index.html
[root@server1 compose]# mkdir haproxy 在compose目录下创建haproxy目录,在里面创建haproxy.cfg的配置文件
[root@server1 compose]# mkdir haproxy
[root@server1 compose]# ls
docker-compose.yml haproxy web1 web2
[root@server1 compose]# cd haproxy/
[root@server1 haproxy]# vim haproxy.cfg
global
maxconn 65535
#stats socket /var/run/haproxy.stat mode 600 level admin
log 127.0.0.1 local0
#uid 200
#gid 200
#chroot /var/empty
daemon
defaults
mode http
log global
option httplog
option dontlognull
monitor-uri /monitoruri
maxconn 8000
timeout client 30s
retries 2
option redispatch
timeout connect 5s
timeout server 5s
stats uri /admin/stats
# The public 'www' address in the DMZ
frontend public
bind *:5000 name clear
#bind 192.168.1.10:443 ssl crt /etc/haproxy/haproxy.pem
#use_backend static if { hdr_beg(host) -i img }
#use_backend static if { path_beg /img /css }
default_backend dynamic
# The static backend backend for 'Host: img', /img and /css.
backend dynamic
balance roundrobin
server a web1:80 check inter 1000
server b web2:80 check inter 1000
[root@server1 haproxy]# ls
haproxy.cfg
[root@server1 haproxy]# cd ..
[root@server1 compose]# ls
docker-compose.yml haproxy web1 web2
[root@server1 compose]# pwd
/root/compose
启动:必须要和docker-compose.yml文件在同一路径下
[root@server1 compose]# docker-compose up
[root@server1 compose]# docker-compose ps
[root@server1 compose]# docker-compose start
curl访问:负载均衡
网页访问:
三、Docker Swarm
Swarm在Docker 1.12 版本之前属于一个独立的项目,在Docker1.12版本发布之后,该项目合并到了Docker中,成为Docker的一个子命令。Swarm是Docker社区提供的唯一一个原生支持Docker集群管理的工具,可以把多个Docker主机组成的系统转换为单一的虚拟Docker主机,使得容器可以组成跨主机的子网网络。Docker Swarm是一个为IT运维团队提供集群和调度能力的编排工具。
docker swarm相关概念
- 节点分为管理(manager)节点和工作(worker)节点
- 任务(Task) 是Swarm中的最小的调度单位,目前来说就是一个单一的容器。
- 服务(Services) 是指一组任务的集合,服务定义了任务的属性。
将server2和server3加入集群
[root@server1 compose]# docker pull dockersamples/visualizer:stable [root@server1 compose]# docker swarm init docker swarm join --token SWMTKN-1-34qg06chym8uq7vpmdc0po2y1thls7r51vufkz0d7bt355q6dv-e5vdmvm58smgs1hu3zf9kvzgb 172.25.70.1:2377 [root@server2 ~]# cd /etc/sysctl.d/ [root@server2 sysctl.d]# scp docker.conf server3:/etc/sysctl.d/ ###复制docker.conf文件到server3 [root@server3 ~]# sysctl --system [root@server2 ~]# docker swarm join --token SWMTKN-1-34qg06chym8uq7vpmdc0po2y1thls7r51vufkz0d7bt355q6dv-e5vdmvm58smgs1hu3zf9kvzgb 172.25.70.1:2377 [root@server3 ~]# docker swarm join --token SWMTKN-1-34qg06chym8uq7vpmdc0po2y1thls7r51vufkz0d7bt355q6dv-e5vdmvm58smgs1hu3zf9kvzgb 172.25.70.1:2377 ###将server2和server3分别加入集群,server1为leader [root@server1 compose]# docker node ls
docker swarm init
复制文件
加入集群:
在server1部署私有仓库 :
[root@server1 ~]# docker node promote server2 ###将leader交给server2
[root@server1 ~]# docker node demote server1
[root@server1 ~]# docker swarm leave ###退出集群
[root@server2 ~]# docker node rm -f server1 ###server2上删除server1
[root@server2 ~]# docker node ls
[root@server1 ~]# cd harbor/
[root@server1 harbor]# docker-compose up -d
[root@server2 ~]# cd /etc/docker/
[root@server2 docker]# scp -r certs.d/ server3:/etc/docker/ ###拷贝docker配置文件和证书到server3
[root@server2 docker]# scp -r daemon.json server3:/etc/docker/
[root@server3 ~]# vim /etc/hosts ###添加reg.westos.org
172.25.70.1 server1 reg.westos.org
[root@server3 ~]# cd /etc/docker/
[root@server3 docker]# ls ###查看证书
ca.pem certs.d daemon.json key.json server-key.pem server.pem
[root@server3 docker]# systemctl daemon-reload
[root@server3 docker]# systemctl reload docker
[root@server3 docker]# docker info
添加新节点server4:
[root@server4 ~]# yum install -y docker-ce
[root@server3 docker]# cd /etc/yum.repos.d/
[root@server3 yum.repos.d]# ls
docker-ce.repo dvd.repo redhat.repo
[root@server3 yum.repos.d]# scp docker-ce.repo server4:/etc/yum.repos.d/
[root@server3 yum.repos.d]# cd /etc/sysctl.d/
[root@server3 sysctl.d]# ls
99-sysctl.conf docker.conf
[root@server3 sysctl.d]# scp docker.conf server4:/etc/sysctl.d/
[root@server4 ~]# systemctl start docker
[root@server4 ~]# systemctl enable docker
[root@server4 ~]# vim /etc/hosts
172.25.70.1 server1 reg.westos.org
[root@server3 sysctl.d]# cd /etc/docker/
[root@server3 docker]# ls
ca.pem certs.d daemon.json key.json server-key.pem server.pem
[root@server3 docker]# scp -r certs.d/ daemon.json server4:/etc/docker/
[root@server4 ~]# cd /etc/docker/
[root@server4 docker]# ls
certs.d daemon.json key.json
[root@server4 docker]# systemctl restart docker
[root@server4 docker]# docker pull busybox
server4上下载docker-ce并设置开机自启,添加地址解析
复制docker配置文件到server4
使用私有仓库拉取busybox
负载均衡:
[root@server2 docker]# docker service ls
[root@server2 docker]# docker service create --name webcluster -p 80:80 --replicas 3 nginx
[root@server2 docker]# docker service ls
[root@server2 docker]# docker service ps webcluster
将server4加入集群:
[root@server4 docker]# docker swarm join --token SWMTKN-1-34qg06chym8uq7vpmdc0po2y1thls7r51vufkz0d7bt355q6dv-e5vdmvm58smgs1hu3zf9kvzgb 172.25.70.2:2377
[root@server2 docker]# docker service scale webcluster=6 ###动态拉伸
[root@server2 docker]# docker service ps webcluster
[root@server2 docker]# docker service ls
[root@server2 docker]# docker node ls
[root@server2 docker]# docker service scale webcluster=12
[root@server2 docker]# docker service ps webcluster
部署swarm监控
官网地址:https://github.com/dockersamples/docker-swarm-visualizer
在server1中将镜像上传到私有仓库:
[root@server1 harbor]# docker tag dockersamples/visualizer:stable reg.westos.org/library/visualizer:latest
[root@server1 harbor]# docker push reg.westos.org/library/visualizer:latest
[root@server2 docker]# docker service scale webcluster=3
[root@server2 docker]# docker service create \
> --name=viz \
> --publish=8080:8080/tcp \
> --constraint=node.role==manager \
> --mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
> visualizer
nz823uqmx5md10f1jxddkz8z5
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
[root@server2 docker]# docker service ls
[root@server2 docker]# docker service ps viz
访问http://172.25.70.2:8080/
负载均衡测试:
[root@server3 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6a992f7a24a9 nginx:latest "/docker-entrypoint.…" 15 seconds ago Up 9 seconds 80/tcp webcluster.2.mlmja4iaug1vh1ihqsw6mm2u0
[root@server3 docker]# docker stop 6a992f7a24a9 ##停止后它会自动start
6a992f7a24a9
[root@server3 docker]# systemctl stop docker ##如果docker服务stop,会负载均衡到其他节点
[root@server3 docker]# systemctl start docker ##再次将server3中的docker服务开启之后,进程仍旧在另一个节点上
滚动更新:
[root@server2 docker]# docker service rm webcluster
[root@server1 harbor]# docker search ikubernetes
[root@server1 harbor]# docker pull ikubernetes/myapp:v1
[root@server1 harbor]# docker pull ikubernetes/myapp:v2
[root@server1 harbor]# docker tag ikubernetes/myapp:v1 reg.westos.org/library/myapp:v1
[root@server1 harbor]# docker tag ikubernetes/myapp:v2 reg.westos.org/library/myapp:v2
[root@server1 harbor]# docker push reg.westos.org/library/myapp:v1
[root@server1 harbor]# docker push reg.westos.org/library/myapp:v2
[root@server2 docker]# docker service create --name webcluser -p 80:80 --replicas 3 myapp:v1
[root@server2 docker]# docker service ls
[root@server2 docker]# docker service ps webcluser
在客户端,用curl访问测试负载均衡
[root@server2 docker]# docker service scale webcluser=10
[root@server2 ~]# docker service update --image myapp:v2 --update-parallelism 2 --update-delay 5s webcluser ##滚动更新为v2
[root@server2 ~]# docker service ls
[root@server2 ~]# docker service rm webcluser
用脚本更新:
[root@server2 docker]# docker service rm webcluser
[root@server2 ~]# vim webcluser.yml
version: "3.9"
services:
webcluster:
image: myapp:v1
ports:
- "80:80"
deploy:
replicas: 3
update_config:
parallelism: 2
delay: 5s
restart_policy:
condition: on-failure
[root@server2 ~]# docker stack deploy web -c webcluser.yml
版本仍旧为v1,进程个数改为6个
[root@server2 ~]# vim webcluser.yml
[root@server2 ~]# docker stack deploy web -c webcluser.yml
[root@server2 ~]# vim webcluser.yml ##修改版本为v2
[root@server2 ~]# docker stack deploy web -c webcluser.yml
node.role == manager指定这个service的实例均运行在swarm manager节点上,不会分到worker节点
[root@server2 ~]# docker service rm viz ##删除之前的监控
viz
[root@server2 ~]# vim webcluser.yml
visualizer:
image: visualizer
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints:
- "node.role==manager"
[root@server2 ~]# docker stack deploy web -c webcluser.yml
Updating service web_webcluster (id: srfnr5buaoxdkq4a4b38jbf2c)
Creating service web_visualizer
[root@server2 ~]# docker stack ls
[root@server2 ~]# docker stack ps web