手记

Docker入门-二

Docker

  • docker commit container repository:tag
  • docker history
  • docker inspect
  • 大部分情况,COPY优于ADD!
  • ADD除了COPY还有额外功能(解压)
  • CMD
    • 容器启动时默认执行的命令
    • 如果docker run指定了其它命令,CMD命令被忽略
    • 如果定义了多个CMD,只有最后一个会执行
  • ENTRYPOINT
    • 让容器以应用程序或者服务的形式运行
    • 不会被忽略,一定会执行
    • 最佳实践:写一个shell脚本作为entrypoint
  • stress
WORKDIR/test #如果没有会自动创建test目录 
WORKDIR demo 
RUN pwd# 输出结果应该是/test/demo

  • 私有库
    • /etc/docker/daemon.json添加insecure-registries
    • /lib/systemd/system/docker.service添加EnvironmentFile
    • docker registry api 查看私有库

网络


  • ping ip可达性
  • telnet 服务可达性
  • namespace
    • ip netns add test
    • ip netns list
    • ip netns exec test ip a
    • ip link
    • ip netns exec test ip link set dev lo up
    • ip link add veth-test1 type veth peer name veth-test2
    • ip link set veth-test1 netns test
    • ip link set veth-test2 netns test2
    • ip netns exec test1 ip addr add 192.168.1.1/24 dev veth-test1
    • ip netns exec test2 ip addr add 192.168.1.2/24 dev veth-test2
    • ip netns exec test1 ip link set dev veth-test1 up
    • ip netns exec test1 ip link set dev veth-test2 up
    • ip netns exec test1 ping 192.168.1.2

  • docker network ls
  • yum install bridge-utils
  • brctl

  • 容器之间的link,但是link命令是单向的
  • docker network create -d bridge my-bridge
  • docker network connect my-bridge 容器名
  • 端口映射
  • container none host(端口冲突)

  • VXLAN
    • 虚拟局域网扩展(Virtual Extensible LAN, VXLAN)是一种网络虚拟化技术,它试图改善大云计算部署相关的可扩展性问题。它采用类似VLAN封装技术封装基于MAC含括第 4 层的UDP数据包的 OSI 第2层 以太网帧 ,使用 4789 作为默认分配的 IANA 目的地 UDP 端口号。
nohup ./etcd --name docker-node1 --initial-advertise-peer-urls http://192.168.205.10:2380 \
--listen-peer-urls http://192.168.205.10:2380 \
--listen-client-urls http://192.168.205.10:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://192.168.205.10:2379 \
--initial-cluster-token etcd-cluster \
--initial-cluster docker-node1=http://192.168.205.10:2380,docker-node2=http://192.168.205.11:2380 \
--initial-cluster-state new&
nohup ./etcd --name docker-node2 --initial-advertise-peer-urls http://192.168.205.11:2380 \
--listen-peer-urls http://192.168.205.11:2380 \
--listen-client-urls http://192.168.205.11:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://192.168.205.11:2379 \
--initial-cluster-token etcd-cluster \
--initial-cluster docker-node1=http://192.168.205.10:2380,docker-node2=http://192.168.205.11:2380 \
--initial-cluster-state new&
./etcdctl cluster-health

在docker-node1上

$ sudo service docker stop
$ sudo /usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=etcd://192.168.205.10:2379 --cluster-advertise=192.168.205.10:2375&

在docker-node2上

$ sudo service docker stop
$ sudo /usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=etcd://192.168.205.11:2379 --cluster-advertise=192.168.205.11:2375&

Data volume

  • Volume类型
    • 受管理的data Volume,由docker后台自动创建。
      • -v mysql:/var/lib/mysql
    • 绑定挂载的Volume,具体挂载位置可以由用户指定。

compose

  • 一个service代表一个container,这个container可以从 dockerhub的image来创建,或者从本地的Dockerfile build出来的image来创建
  • Service的启动类似docker run,我们可以给其指定 network和volume,所以可以给service指定network和 Volume的引用
  • docker-compose up --scale servicename = n 启动多个
    • 结合haproxy转发可以形成端口转发

Swarm

  • docker swarm init --advertise-addr=192.168.205.10
    • --advertise-addr (ip could be found through "docker-machine Is")
  • swarm join --token ********** 192.168.205.10:2377
  • docker service
  • docker service scale service=replics
  • swarm保证横向扩展与有效数量,随机分配主机,同步overlay网络,创建虚拟网络IP映射真实IP
docker network create -d overlay demo
docker service create --name mysql --env MYSQL_ROOT_PASSWORD=root --env MYSQL_DATABASE=wordpree --mount type=volume,source=mysql-data,destination=/var/lib/mysql mysql
docker service create --name wordpress -p 80:80 --env WORDPRESS_DB_PASSWORD=root --env WORDPRESS_DB_HOST=mysql --network demo wordpress 
docker network create -d overlay demo
docker service create --name whoami -p 8080:8080 --network demo -d jwilder/whoami
docker service create --name client -d --network demo busydbox sh -c "while true;do sleep 3600; done"
  • Routing Mesh的两种体现
  • Internal——Container和Container之间的访问通过overlay网络(通过VIP虚拟IP
  • Ingress——如果服务有绑定接口,则此服务可以通过任意swarm节点的相应接口访问

  • 容器和容器通信通过overlay
  • Service和Service通过vip
iptables -nL -t nat 查看本地ip转发规则
iptables -nL -t mangle # mangle表主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等应用
brctl show 查询网桥信息
nsenter --net=/var/run/docker/netns/ingress_sbox 进入 ingress_sbox
ipvsadm -l  ipvsadm是LVS在应用层的管理命令,可以看到负载均衡到的两个ip
  • Ingress Network
    • 外部访问的负载均衡
    • 服务端口被暴露到各个swarm节点
    • 内部通过IPVS进行负载均衡

  • 自动化部署-ansible
  • 应用与配置分离,一次构建,多处运行-Spring Cloud Config
  • 提供应用健康监测的接口-Spring Cloud Actuator

  • 蓝绿发布
    • 在这种部署软件的方法中,维护了两个相同的主机环境一个“蓝色"和一个“绿色"。(颜色并不重要,仅作为标识。)对应来说,其中一个是“生产环境”,另一个是“预发布环境”。
    • 在这些实例的前面是调度系统,它们充当产品或应用程序的客户“网关"。通过将调度系统指向蓝色或绿色实例,可以将客户流量引流到期望的部署环境。通过这种方式,切换指向哪个部署实例(蓝色或绿色)对用户来说是快速,简单和透明的。

  • 金丝雀部署
  • 一部分客户流量被重新引流到新的版本部署中。例如,新版本的搜索服务可以与当前服务的生产版本一起部署。然后,可以将10%的搜索查询引流到新版本,以在生产环境中对其进行测试。
  • 如果服务那些流量的新版本没问题,那么可能会有更多的流量会被逐渐引流过去。如果仍然没有问题出现,那么随着时间的推移,可以对新版本增量部署,直到100%的流量都调度到新版本。

  • 功能开关
  • 对于可能需要轻松关掉的新功能(如果发现问题),开发人员可以添加功能开关(feature toggles)。这是代码中的if-then软件功能开关,仅在设置数据值时才激活新代码。
  • 此数据值可以是全局可访问的位置,部署的应用程序将检查该位置是否应执行新代码。如果设置了数据值,则执行代码;如果没有,则不执行。
  • 这为开发人员提供了一个远程“终止开关",以便在部署到生产环境后发现问题时关闭新功能。

  • Release(发布,单位为月)
    • Sprint(冲刺,单位为周)
      - Sprint 需要关联带开发的任务
      - Sprint 需要被关联到某一个Release
      • Issue(问题)类型
      • Epic(史诗)
      • Story(用户故事)
        • 定义用户故事的类型
        • 定义用户故事的内容描述
        • 分配给某个开发者
        • 用1,2,3到10个点数来评估任务的故事点,工作量复杂度,风险和不确定性
      • Task(任务)
        • 定义任务内容描述
        • 设定任务期望完成的时间
      • Bug(故障)

  • 每日站会
    • Scrum Master 主持
    • 建议每日早上举行
    • 每人回答3个问题
      • 昨天做了什么
      • 今天要做什么
      • 有什么Blocker问题,需要什么帮助

  • Gitflow是一种分支开发模型,来源于Vincent Driessen的 文章"A successful Git branching model"
    • 软件本身对稳定性要求高
    • 团队少量资深研发,多数初,中级研发
    • 开源项目
  • 主干开发分支模型
    • 同一个产品开发的所有人员共享一个Repository,所有修改最后都会回到主干
    • 只有在Release时才会有官方的分支,只有Release Engineer可以更动Release Branch,当Release Branch完成它的任务,就会被砍掉
    • Bug先在trunk修复,之后把Commit合并到Release Branch,而不是在Release Branch修好再整合到trunk,这样可以把修改Release Branch的人限制在最小程度。
    • 软件本身迭代较快
    • 团队中级,资深研发较多,初级研发较少
    • 互联网产品

  • 创建Spring cloud服务注册中心
    • 创建服务注册中心服务Discovery-service
    • 在application.yaml 文件中配置Eureka
    • 在代码中声明Eureka 服务
    • 访问Spring Cloud 服务注册中心-Eureka
    • mvn package,java -jar target/discovery-service.jar
  • 网关

Mesos


  • Marathon特征
    • 高可用
    • 健康检查
    • Constraints
    • 事件订阅
    • 服务发现&负载均衡
    • 完善的RESTAPI
  • Mesos特征
    • 强大的资源管理
    • Kernel和Framework分离
    • 门槛较低,易于使用
    • 大厂使用

K8s

  • Pod运行多个容器,Service中多个Pod

  • Deployment中可以运行多个容器或者Pod

  • Node 是 Pod 真正运行的主机,可以是物理机,也可以是虚拟机。

  • ControllerManager 维护集群状态,扩缩容,故障检测,Scheduler 资源调度,ETCD 一致性存储

  • Kubernetes scheduler-preselect

    • NodiskConflict
    • FitResource
    • CheckNodeMemoryPressure
    • Affinity
    • NodeSelector
  • Kubernetes scheduler-optimize-select

    • SelectorSpreadPriority
    • LeastRequestedPriority
    • AffinityPriority
  • Kubernetes服务发现

    • Kube-proxy(ClusterIP)
    • Kube-proxy(NodePort)
    • Kube-DNS

  • 认证方式

    • 客户端证书,TLS双向认证
    • Bearer Token
    • ServiceAccount (namespace ,token,ca)
  • 鉴权

    • ABAC , Webhook,
    • 依赖 RoleBinding ClusterRoleBinding
    • 准入控制 Admission Control 授权后对请求进一步验证
  • 集群方案

    • Binary
    • Kubeadm
    • 社区方案

cicd

  • docker-compose 文件格式转换成 deployment
0人推荐
随时随地看视频
慕课网APP