Docker是一个开源的应用容器引擎,容器化是未来应用趋势。

介绍

  • 使用Go语言编写
  • 轻量级的虚拟化解决方案
  • 让工作环境变得整洁、干净

Docker有两个非常重要的概念: 镜像和容器。

镜像是呈载容器的实体,所有容器都是运行在镜像之上。 用版本管理的角度来看,镜像就像是某一个节点,它可以派生出不同的分支,你可以在不同分支上做不同的事情。 可以想象成一棵树,最基本的镜像是主树干,主树干可以分出旁支树干,而旁支树干可以分出更细的旁支,而树干上可以生长树枝。

常用命令

  • 拉取镜像

    • docker pull 仓库/镜像
  • 查看image

    • docker images
  • 查看container

    • docker ps -a
  • 删除image

    • docker rmi -f image
  • 删除容器

    • docker rm -f container
  • 拉取镜像

    • docker pull 仓库/镜像:tag
  • 容器运行、启动

    • docker start/stop/restart containerID
  • 创建自己的镜像(在Dokerfile所在目录下)

    • docker build -t myImageName .
  • 运行镜像

    $ docker run -i -t --name my_container_name -p 28080:8080 -d my_image
    
  • 打标签

    • docker tag imageID 仓库/镜像:latest
  • 将容器生成镜像

    • docker commit
  • 登陆当前运行中的容器

    • docker attach

常见功能

打包自己的docker image

  • docker commit命令

    $ docker attach imageID
    	回车
    	修改操作
    $ exit
    $ docker commit imageID imageName
    
  • Dockerfile

    $ vi Dockerfile
    $ docker build -t=my_docker_image .
    

事实上,我们并没有创建新的 镜像,我们只是从以前的镜像生成新镜像

上传自己的docker image

  1. 配置用户,密码,邮箱
  2. 打tag
  3. docker push

杀掉所有docker进程

docker rm `docker ps -a -q`
docker ps -a -q
-a : 查询所有运行+非运行的container
-q : 只查询containerID

删除未下载完成的镜像

docker rmi $(docker images  -f 'dangling=true' -q)

修改默认仓库

centos系统

$ vi /usr/lib/systemd/system/docker.service

	修改配置
	--insecure-registry=hub.address.com \

$ systemctl daemon-reload

$ systemctl restart docker

压缩包

$ docker save busybox-1 > /home/save.tar
$ docker load < /home/save.tar

删除无效的镜像

$ docker rmi `docker images | grep none | awk '{print $3}' | tr "\n" " "`

编排工具

k8s

swarm

创建swarm集群开始之前,服务发现关联每个节点

后端的服务发现如:etcd, consul, zookeeper都是可用的

  • init

  • $docker swarm init

Swarm initialized: current node (9x0i1jvx4r05ymaczpqev831v) is now a manager.

To add a worker to this swarm, run the following command:

     docker swarm join \
     --token SWMTKN-1-2955wa0sqx5bee0w0e6c41r39bknyh0o86eie7s190ulk40kt8-8h2g03vweh31s9hwjt61fqk4t \
     192.168.65.2:2377

To add a manager to this swarm, run ‘docker swarm join-token manager’ and follow the instructions.

  • 查看swarm信息

    • docker info
  • 节点信息

    • docker node ls

监控

确保线上系统的高可用性,一套可靠的监控系统是必不可少的

随着Docker被大规模的部署应用,如何通过可视化的方式了解Docker环境的状态以及健康变得越来越重要。

本文介绍下监控docker容器的常用工具。

优秀的监控工具应具有如下特征

  • 易于部署
  • 信息呈现详细
  • 整个部署过程中日志的聚集程度
  • 数据报警能力
  • 成本

Docker Stats命令

docker stats [CONTAINER_NAME]命令几乎可以在任何Docker容器中运行。

  1. 易于部署程度:※※※※※
  2. 信息详细程度:※※※※※
  3. 集成度:无
  4. 生成警报的能力:无
  5. 监测非Docker的资源的能力:无
  6. 成本:免费

CAdvisor

可以使用docker stats命令和远程API来获取容器的状态信息

但是,如果你想要在图形界面中直接查看这些信息,那你就需要诸如 CAdvisor这类的工具。

资源隔离

cpu的隔离

cpu的限制包括两个方面:cpu的占比、绑定cpu。

-c可以指定CPU的占比,–cpuset可以绑定CPU

这里用试验来验证下:

docker run -it --name test01 -c 1024 --cpuset-cpus=0,1  05c259583efe /bin/bash
docker run -it --name test02 -c 512  --cpuset-cpus=0,1  05c259583efe /bin/bash

这里对test01 和 test02 进行设置cpu占比 1024:512 都是绑定cpu0,1 然后进行试验

内存的隔离

Docker提供参数-m, –memory=“” 限制容器的内存使用量。如:

docker run -it  -m 128m  --name test03 05c259583efe /bin/bash

磁盘限制

磁盘的IO限制:

将IO带宽限制为10M/s:

\# echo "253:1 10485760" > /cgroup/blkio/docker/$CONTAINER_ID/ blkio.throttle.write_bps_device

可以通过dd文件验证: time $(dd if=/dev/zero of=f1.txt bs=100M count=2)

磁盘大小的限制: docker容器默认的空间是10G,如果想指定默认容器的大小(在启动容器的时候指定),可以在docker配置文件里通过dm.basesize参数指定,比如

docker -d --storage-opt dm.basesize=20G

是指定默认的大小为20G

网络

默认网络

  • docker network ls

    NETWORK ID NAME DRIVER e92c8a003c92 none null 98d380152a78 host host fd5e770736c1 bridge bridge

docker安装时创建三种网络。

运行容器时,默认使用桥接网络

查看桥接网络信息

$ docker network inspect bridge

创建容器时, docker engine 自动创建子网和网关到桥接网络上。

$ docker run -itd --name=container1 busybox

3386a527aa08b37ea9232cbcace2d2458d49f44bb05a6b775fba7ddd40d8f92c

$ docker run -itd --name=container2 busybox

94447ca479852d29aeddca75c28f7104df3c3196d7b6d83061879e339946805c

查看桥接网络信息

$ docker network inspect bridge

容器创建在默认桥接网络下,彼此可以使用ip地址进行通信, docker支持“–link”实现docker0 network的通信。

docker 默认的桥接网络 不支持 服务发现。

用户自定义网络

docker提供网络驱动去实现自定义网络,如桥接网络,overlay网络或MACVlan网络。

你也可以创建网络插件或远程网络实现自定义配置。

桥接网络

桥接网络适用于单机应用。

overlay网络

overlay网络 的实现需要满足下面两个基础条件之一

  • docker engine 运行在swarm模式
  • 集群主机使用额外的键值存储