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路径>

    如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
    

从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

时间: 2024-10-18 09:18:12

Docker 使用总结的相关文章

Docker学习笔记——Mongo Dockerfile及容器运行

1.创建项目目录mongo,在目录下上传下载的Mongodb安装文件及mongo.conf配置文件,创建Dockerfile文件,项目结构如下: mongo - Dockerfile - mongo.conf - mongodb-linux-x86_64-3.4.9.tgz - data - logs Dockerfile内容如下: # mongo # SOURCE_IMAGE FROM centos # MAINTAINER_INFO MAINTAINER bluemooder [email 

docker深入2-API示例

2017/9/18 一.目的 演示 http API 使用的方式 注1:本次实例是在 docker swarm mode 下使用的,目的是:更新指定服务的镜像. 注2:要在 swarm manager node 上执行. docker 的 API 文档是自动生成的,没有太多有用的示例可用. [版本] ~]# docker version Client:  Version:      17.06.0-ce  API version:  1.30  Go version:   go1.8.3  Gi

docker私有仓库删除image

docker仓库存放着公司内部的镜像.时间长了难免存在一些废弃的镜像在里面.如果不删除造成空间的浪费.下面就简单的看看仓库中的镜像是怎么删除的. 第一步:registry启动依赖config.yml配置文件:在默认文件的storage区域中添加delete_enable_ture配置项.也可以在启动时候指定-e添加.允许删除镜像: 配置文件: 第二步:下载registry镜像并启动容器. docker run  -d -v /conf/:/etc/docker/registry -v /opt/

docker run常用命令及 解决 ubuntu镜像无法识别 ifconfig ping 命令

docker run -it     docker 前端启动 container容器           -d             后端启动 container容器           -p             固定端口映射            -P             不固定端口映射           --name         给生成的容器起名字docker ps:默认显示正在运行的container       ps -a 显示所有的container容器docker r

原创:Docker在云家政的应用 谢绝复制粘贴内容

我们公司目前大规模使用了Docker,目前除了数据库应用,其他所有应用都在Docker容器内运行,下面我就Docker在公司的应用做一些分享.. 首先我介绍一下公司的背景,公司属于中小型创业公司,服务器数量不多,但是为了解决一些问题,我们引入了现在比较火的Docker技术. 看一下我们在没用Docker之前遇到的问题: 1.线上环境和测试环境不完全一致,导致测试好的功能上线后会出现一些BUG. 2.部署新项目步骤繁琐,批量部署运行环境后,需要根据每个项目不同的情况,手动修改配置参数. 3.新项目

win7 系统安装 docker

如果顺利的话,步骤如下: 1.下载DockerToolbox 2.安装DockerToolbox,默认配置,一路下一步即可完成安装 3.安装成功后,桌面会新增三个快捷方式,如下图 4.点击运行Docker Quickstart Terminal,会从github加载boot2docker.iso,加载完成后会自动在Oracle VM VirtualBox中创建一个Linux的虚拟环境 5.显示如下图表示安装成功 6.执行 docker run hello-world再次验证一下 如果遇到问题,可

【Docker常见问题1】&#8203;下载docker镜像,如何下载指定的应用版本?

举例:如何下载postgres版本9.2? 步骤1:访问官网 https://hub.docker.com/ 步骤2:搜索postgres镜像 搜索框,输入postgres进行搜索 步骤3:查看已发布的版本 点击进入postgres页面,并点击tags,可看到已发布的版本 步骤4:选择一个版本下载 下载版本9.2 sudo docker pull postgres:9.2 或下载最新版本 sudo docker pull postgres:latest

【Docker常见问题2】如何设置容器日志大小和保留个数

举例:当tomcat容器的运行,容器占用空间越来越大,约1个月就会超过2G,如何解决? 步骤1:查看容器日志大小:假设容器目录为/var/lib/docker/containers,那么执行如下命令 cd /var/lib/docker/containers  #进入默认容器空间目录 du -sh *            #统计文件大小2.4G  de92a5643f7ffb106f8abba21fc0f93996842917a52879153adc95a73312934a-json.log

Docker的概念及剖析原理和特点

一.docker的简介: 应用容器是个啥样子呢,一个做好的应用容器长的就像一个装好了一组特定应用的虚拟机一样,比如我现在想用mysql数据库,我直接找个装好了的MySQL的容器就可以了,想用的时候一运行容器,MySQL服务就起来了,就可以使用MySQL了 为什么不能直接安装一个MySQL?或者是SqlServer呢也可以啊? 答:因为有的时候根据每个人的电脑的不同,在物理机安装的时候会出现各种各样的错误,突然你的机器中病毒了或者是挂了,你所有的服务都需要重新安装. 注意:    但是有了dock

docker的存储结构,和以前有了很大不同

在网上学习这一块知识点时,有一个URL讲得很详细, docker 镜像与容器存储目录结构精讲 http://blog.csdn.net/wanglei_storage/article/details/50299491 但我在最新版的docker作验证时,发现早已物是人非,等以后用得着时,再仔细研究吧. 我作的截图如下: overlay里作image相关的存储, 而container目录里作run起来的docker容器的相关存储, 且两者之间,有uuid作对应. 在下图中已标明.