0%

每天5分钟玩转docker

​ 以前使用 Typora(markdown 编辑器) 在本地记了很多笔记,很多笔记内容比较适合自己查看,还不至于分享阶段,所以还没有必要分享到公众号或者知乎,但是本地笔记的一个问题是不好回顾时间线;最近发现使用 github pages + hexo + next + Typora 可以非常方便地同步本地笔记到个人博客上,同时也支持笔记标签,分类,归档的功能。所以后面打算把之前记的笔记慢慢迁移过来,同时也开始记录自己新的技术,思维成长以及分享自己的一些生活日常、观点和想法。

​ 这次记录的是之前阅读《每天5分钟玩转docker》时记的笔记。

第三章 docker 镜像

docker info: 查看 docker 服务器的信息
docker images / docker image ls

镜像的内部结构

base 镜像

  • rootfs
  • 不同 linux 发型版的区别主要就是 rootfs
  • 容器只能使用 host 的 kernel,并且不能修改

镜像的分层结构

  • 容器层记录对镜像的修改,所有镜像层都是只读的,不会被容器修改,所以镜像可以被多个容器共享

构建镜像

docker commit
Dockerfile: docker build -t ubuntu-with-vim-dockerfile .

查看镜像分层结构

Docker history

Dockerfile 常用指令

FROM
MAINTAINER
COPY
ADD:会自动解压
ENV
EXPOSE
VOLUME
RUN
CMD
ENTRYPOINT

最佳实践 P45

更多 docker 命令

images
history
commit
build
tag
pull
push
rmi
Search

第四章 docker 容器

运行容器

docker create 基于镜像创建容器
docker start

docker run -it (=create+start)
-d 参数在后台启动容器
docker attach && docker exec(推荐 exec)
docker logs

stop/start/restart/kill 容器

--restart=always
--restart=on-failure:3

pause/unpause 容器

rm 容器

  • docker rm 是删除容器,docker rmi 是删除镜像

资源限制

内存限制

docker run -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M

cpu 限额

docker run --name container_A -it -c 1024 progrium/stress --cpu 1
docker run --name container_B -it -c 512 progrium/stress --cpu 1
docker-machine ssh default

block IO 带宽限额 P68

  • block IO 权重
  • 限制 bps (byte per second)和 iops(io per second)

实现容器的底层技术

  • cgroup 实现资源限额
ls /sys/fs/cgroup/cpu
ls /sys/fs/cgroup/memory
ls /sys/fs/cgroup/blkio
  • namespace 实现6种资源隔离

    • Mount:让容器看上去拥有整个文件系统
    • UTS:让容器有自己的 hostname
    • IPC:让容器拥有自己的共享内存和信号量来实现进程间通信,而不会与 host 和启动容器的 IPC 混在一起
    • PID:容器拥有自己独立的一套 PID
    • Network:容器拥有自己独立的网卡/IP/路由等资源
    • User:容器能够管理自己的用户

第五章 网络

docker network ls
docker run -it --network=none centos-with-net-tools

host 网络

docker run -it --network=host centos-with-net-tools
  • 共享 docker host 的网络栈,存在端口冲突问题

Bridge 网络

brctl show
docker network inspect bridge

user-defined 网络

docker network create --driver bridge my_net
docker network create --driver bridge --subnet 172.22.16.0/24 --gateway 172.22.16.1 my_net2
docker run  -it --network=my_net2 --ip 172.22.16.18 centos-with-net-tools /bin/bash
docker connect my_net2 xxxxxx

容器间通信

  • Host 网络: 容器对外网的访问(NAT)
  • 外部世界访问容器: 端口映射( ps aux | grep docker-proxy)

第六章 存储

storage driver

  • 分层结构: Copy-on-Write 技术
  • Docker info
  • 无状态应用的容器 && 有状态应用的容器

data volume

  • bind mount
    • -v hostpath:hostpath:containerpath:ro
    • 应用: 将源码目录 mount 到容器,在 host 修改代码就可以看到应用的实时效果
  • docker managed volume
docker volume ls
docker volume inspect xxxxxx
docker run  -it -p 80:80 -v /testbylinyouquan centos-with-net-tools /bin/bash

数据共享

容器与 host 共享数据

docker cp

容器之间共享数据

  • 共享数据放在 bind mount 中,然后将其 mount 到多个容器

volume container P101

--volumes-from

data-packed volume container P102

data volume 生命周期管理

  • 备份/恢复/迁移/销毁 data volume
  • 孤儿 volume,使用 docker volume rm 删除

第七章 多主机管理

创建 machine

docker-machine create --driver virtualbox lyq-host1

docker-machine ls
docker-machine ssh default
docker-machine ssh lyq-host1
docker-machine env lyq-host1
eval $(docker-machine env)

第八章 容器网络

P118-P172

  • 跨主机网络方案
    • Docker 原生的 overlay 和 macvlan
    • 第三方方案:flannel/weave/calico
  • libnetwork & CNM(Container Network Model)(P118)
    • Sandbox
    • Endpoint
    • Network

overlay 网络

启动 consul 服务

docker run -d -p 8500:8500 --name consul  progrium/consul -server -bootstrap
http://192.168.99.101:8500/ui/#/dc1/services
/etc/init.d/docker status

创建 overlay 节点

docker-machine create --driver virtualbox --engine-opt="cluster-store=consul://$(docker-machine ip default):8500" --engine-opt="cluster-advertise=eth1:2376"  consul-test-host1
docker-machine create --driver virtualbox --engine-opt="cluster-store=consul://$(docker-machine ip default):8500" --engine-opt="cluster-advertise=eth1:2376"  consul-test-host2
cat /var/lib/boot2docker/profile

docker network ls
docker network create --driver overlay ov_net1
docker network inspect ov_net1
docker run -itd --name bbox1 --network ov_net1 busybox
docker exec bbox1 ip r
docker network inspect docker_gwbridge
docker exec -it bbox1 ping -c 2 www.baidu.com
docker run -itd --name bbox2 --network ov_net1 busybox
docker exec -it bbox1 ping -c 2 bbox2

Overlay 网络中的容器可以直接通信,同时 docker 也实现了 DNS 服务

ip netns exec 1-defedcd6bf brctl show

ip netns exec 1-defedcd6bf ip -d l show vxlan0

boot2docker 安装包

tce-load -wi vim
tce-load -wi bridge-utils(安装 brutal)

第九章 容器监控

  • docker container stats
  • sysdig
  • Weave scope(了解)
  • cAdvisor:google 开发的容器监控工具
  • Prometheus:非常优秀的监控工具
    • Grafana

第十章 日志管理

  • docker logs

  • filebeat + ELK,利用了 docker 默认的 logging driver json-file

    • Elasticsearch
    • Logstash
    • Kibana
  • fluentd

  • Graylog:与 ELK 想提并论的一款集中式日志管理方案(了解)

第十一章 数据管理

  • 跨主机的 volume