欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

Docker 使用总结

程序员文章站 2022-09-17 21:25:00
从贴出Docker 资料汇总那篇水帖, 到现在已经完整的做过一个用Docker部署的小型website集群并且已经上线运行了。 对docker的使用也有了些许体会(不过现在对Docker的理解...
从贴出Docker 资料汇总那篇水帖, 到现在已经完整的做过一个用Docker部署的小型website集群并且已经上线运行了。 对docker的使用也有了些许体会(不过现在对Docker的理解还停留在一个轻度使用者的角度去理解)。这个项目从负载均衡 、反向代理、及app server全都是跑在Docker容器上。为什么使用Docker? 也许是时候好好想想这个问题了。最开始用Docker只是为了快速部署,以及docker能对不同服务进行很好的隔离,还有更多的优秀特性并不了解。也许使用Docker更多驱动来自于对新事物的好奇。为什么用Docker?下面的资料来自大神们的总结:当然这里说的是Docker的优点,我来总结一下网友们以及我个人对这个问题的看法:
1、虚拟化容器的优势随着公有云的普及,开发者越来越需要一个快速迁移和高速构建应用的环境。现在开发者需要能方便地创建运行在云平台上的应用,也就是说应用必须能够脱离底层机器。 而且同时必须是方便获取的。因此,开发者们需要一种创建分布式应用程序的方式,这也是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在当前路径:

    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. 从container中拷贝文件出来

    sudo docker cp 7bb0e258aefe:/etc/debian_version .
    

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

    网络部分常用命令:

  16. 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:  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