Docker 使用总结

TerSnell 9年前

来自: http://blog.csdn.net/liukun321/article/details/50770356


从贴出Docker 资料汇总那篇水帖, 到现在已经完整的做过一个用Docker部署的小型website集群并且已经上线运行了。 对docker的使用也有了些许体会(不过现在对Docker的理解还停留在一个轻度使用者的角度去理解)。这个项目从负载均衡 、反向代理、及app server全都是跑在Docker容器上。为什么使用Docker? 也许是时候好好想想这个问题了。最开始用Docker只是为了快速部署,以及docker能对不同服务进行很好的隔离,还有更多的优秀特性并不了解。也许使用Docker更多驱动来自于对新事物的好奇。
  • 为什么用Docker?
下面的资料来自大神们的总结:
当然这里说的是Docker的优点,我来总结一下网友们以及我个人对这个问题的看法:
1、虚拟化容器的优势
</div>
随着公有云的普及,开发者越来越需要一个快速迁移和高速构建应用的环境。 现在开发者需要能方便地创建运行在云平台上的应用,也就是说应用必须能够脱离底层机器。 而且同时必须是方便获取的。因此,开发者们需要一种创建分布式应用程序的方式,这也是Docker所能够提供的。
举个例子: 我在项目中同一台服务器中同时运行了nginx,forum&wiki(node.js),meteor server(meteor.js)。每个服务又依赖大量的第三方库,如果用传统的方式进行部署。则需要安装大量的依赖模块,费时费力。假如我需要在国外的AWS及国内的阿里云上同时部署多台机器。或者从某个公有云服务商迁移到另外一个服务商。这中间的重复劳动是很让人抵触的。抛开让人生厌的重复劳动,服务之间也有可能因此互相“污染”导致性能下降甚至服务异常。而Docker提供了一种更为聪明的方式,通过容器来打包应用,意味着迁移只需要在新的服务器上启动需要的容器就可以了。这无疑将节约大量的宝贵时间,并降低部署过程出现问题的风险。

2、Docker在开发和运维中的优势

对开发和运维(DevOps)人员来说,可能最梦寐以求的就是一次性地创建或配置,可以在任意环境、任意时间让应用正常地运行。而Docker恰恰是可以实现这一终极目标的瑞士军刀。

具体说来,Docker在开发和运维过程中,具有如下几个方面的优势。

更快速的交付和部署。使用Docker,开发人员可以使用镜像来快速构建一套标准的开发环境;比如在项目开发过程中我会先用Docker将代码部署到本地进行测试验证。使用Docker在本地轻松搭建出的和服务器类似的架构,使开发环境中的测试更贴近于生产环境。开发完成之后,测试和运维人员可以直接使用相同环境来部署代码。Docker可以快速创建和删除容器,实现快速迭代,大量节约开发、测试、部署的时间。并且,各个步骤都有明确的配置和操作,整个过程全程可见,使团队更容易理解应用的创建和工作过程。

更高效的资源利用。Docker容器的运行不需要额外的虚拟化管理程序(Virtual Machine Manager,VMM,以及Hypervisor)支持,它是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低。

更轻松的迁移和扩展。Docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 利用这种兼容性让用户可以在不同平台之间轻松地迁移应用。

更简单的更新管理。使用Dockerfile,只需要小小的配置修改,就可以替代以往大量的更新工作。并且所有修改都以增量的方式进行分发和更新,从而实现自动化并且高效的容器管理。


3、Docker与虚拟机比较

作为一种轻量级的虚拟化方式,Docker在运行应用上跟传统的虚拟机方式相比具有显著优势:

Docker容器很快,启动和停止可以在秒级实现,这相比传统的虚拟机方式要快得多。

Docker容器对系统资源需求很少,一台主机上可以同时运行数千个Docker容器。

Docker通过类似Git的操作来方便用户获取、分发和更新应用镜像,指令简明,学习成本较低。

Docker通过Dockerfile配置文件来支持灵活的自动化创建和部署机制,提高工作效率。

Docker容器除了运行其中的应用之外,基本不消耗额外的系统资源,保证应用性能的同时,尽量减小系统开销。传统虚拟机方式运行N个不同的应用就要启动N个虚拟机(每个虚拟机需要单独分配独占的内存、磁盘等资源),而Docker只需要启动N个隔离的容器,并将应用放到容器内即可。

当然,在隔离性方面,传统的虚拟机方式多了一层额外的隔离。但这并不意味着Docker就不安全。Docker利用Linux系统上的多种防护机制实现了严格可靠的隔离。从1.3版本开始,Docker引入了安全选项和镜像签名机制,极大地提高了使用Docker的安全性。


  • 基本操作常用命令
  1. 查看容器的root用户密码

    docker logs <容器名orID> 2>&1 | grep '^User: ' | tail -n1

    因为docker容器启动时的root用户的密码是随机分配的。所以,通过这种方式就可以得到对应容器名的容器的root用户的密码了。

  2. 查看容器日志

    docker logs -f <容器名orID>
  3. 查看正在运行的容器

    docker ps  docker ps -a为查看所有的容器,包括已经停止的。
  4. 删除所有容器

    docker rm $(docker ps -a -q)

    删除单个容器

    docker rm <容器名orID>
  5. 停止、启动、杀死一个容器

    docker stop <容器名orID>  docker start <容器名orID>  docker kill <容器名orID>
  6. 查看所有镜像

    docker images
  7. 删除所有镜像
    docker rmi $(docker images | grep none | awk '{print $3}' | sort -r)
  8. 运行一个新容器,同时为它命名、端口映射、文件夹映射。以tengine镜像为例

    docker run -d -v /opt/nginx/tengine.conf:/usr/local/nginx/conf/nginx.conf -p 80:80 --name=nginx liukunmcu/tengine 
  9. 一个容器连接到另一个容器(父子链接)

    docker run -i -t --name <容器名> -d -link mongodb:db   <镜像名>  sonar

    这里列举的是将当前容器连接到mongodb的过程,名为mongodb的容器已提前在本地启动,并将mongodb容器映射为db。这样,当前启动的容器就可以使用db的相关的环境变量了。

  10. 拉取镜像

    docker pull <镜像名:tag>

    docker pull liukunmcu/tengine
  11. 当需要把一台机器上的镜像迁移到另一台机器的时候,需要保存镜像与加载镜像。
    机器a

    docker save busybox-1 > /home/save.tar

    使用scp将save.tar拷到机器b上,然后:

    docker load < /home/save.tar
  12. 构建自己的镜像

    docker build -t <镜像名> <Dockerfile路径>

    如Dockerfile在当前路径:

    docker build -t xx/gitlab .
  13. 重新查看container的stdout
    # 启动top命令,后台运行  $ ID=$(sudo docker run -d ubuntu /usr/bin/top -b)  # 获取正在running的container的输出  $ sudo docker attach $ID  top - 02:05:52 up  3:05,  0 users,  load average: 0.01, 0.02, 0.05  Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie  Cpu(s):  0.1%us,  0.2%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st  Mem:    373572k total,   355560k used,    18012k free,    27872k buffers  Swap:   786428k total,        0k used,   786428k free,   221740k cached  ^C$  $ sudo docker stop $ID
  14. 后台运行(-d)、并暴露端口(-p)

    docker run -d -p 127.0.0.1:33301:22 centos6-ssh
  15. </div> </li> </ol>

    从container中拷贝文件出来

    sudo docker cp 7bb0e258aefe:/etc/debian_version .

    拷贝7bb0e258aefe中的/etc/debian_version到当前目录下。
    注意:只要7bb0e258aefe没有被删除,文件命名空间就还在,可以放心的把exit状态的container的文件拷贝出来


    • 网络部分常用命令:

    1. docker0网桥配置

    Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。

    Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信,它还给出了 MTU(接口允许接收的最大传输单元),通常是 1500 Bytes,或宿主主机网络路由上支持的默认值。这些值都可以在服务启动的时候进行配置。

    • --bip=CIDR -- IP 地址加掩码格式,例如 192.168.1.5/24
    • --mtu=BYTES -- 覆盖默认的 Docker mtu 配置

    也可以在配置文件中配置 DOCKER_OPTS,然后重启服务。 由于目前 Docker 网桥是 Linux 网桥,用户可以使用brctl show 来查看网桥和端口连接信息。

    $ sudo brctl show bridge name bridge id STP enabled interfaces docker0 8000.3a1d7362b4ee no veth65f9 vethdda6

    注:brctl 命令在 Debian、Ubuntu 中可以使用 sudo apt-get install bridge-utils 来安装。

    每次创建一个新容器的时候,Docker 从可用的地址段中选择一个空闲的 IP 地址分配给容器的 eth0 端口。使用本地主机上 docker0 接口的 IP 作为所有容器的默认网关。

    $ sudo docker run -i -t --rm base /bin/bash $ ip addr show eth0 24: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 32:6f:e0:35:57:91 brd ff:ff:ff:ff:ff:ff inet 172.17.0.3/16 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::306f:e0ff:fe35:5791/64 scope link valid_lft forever preferred_lft forever $ ip route default via 172.17.42.1 dev eth0 172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.3 $ exit

    </div>