Docker 使用总结
来自: http://blog.csdn.net/liukun321/article/details/50770356
从贴出Docker 资料汇总那篇水帖, 到现在已经完整的做过一个用Docker部署的小型website集群并且已经上线运行了。 对docker的使用也有了些许体会(不过现在对Docker的理解还停留在一个轻度使用者的角度去理解)。这个项目从负载均衡 、反向代理、及app server全都是跑在Docker容器上。为什么使用Docker? 也许是时候好好想想这个问题了。最开始用Docker只是为了快速部署,以及docker能对不同服务进行很好的隔离,还有更多的优秀特性并不了解。也许使用Docker更多驱动来自于对新事物的好奇。
- 为什么用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的安全性。
- 基本操作常用命令
查看容器的root用户密码
docker logs <容器名orID> 2>&1 | grep '^User: ' | tail -n1
因为docker容器启动时的root用户的密码是随机分配的。所以,通过这种方式就可以得到对应容器名的容器的root用户的密码了。
查看容器日志
docker logs -f <容器名orID>
查看正在运行的容器
docker ps docker ps -a为查看所有的容器,包括已经停止的。
删除所有容器
docker rm $(docker ps -a -q)
删除单个容器
docker rm <容器名orID>
停止、启动、杀死一个容器
docker stop <容器名orID> docker start <容器名orID> docker kill <容器名orID>
查看所有镜像
docker images
- 删除所有镜像
docker rmi $(docker images | grep none | awk '{print $3}' | sort -r)
运行一个新容器,同时为它命名、端口映射、文件夹映射。以
tengine
镜像为例docker run -d -v /opt/nginx/tengine.conf:/usr/local/nginx/conf/nginx.conf -p 80:80 --name=nginx liukunmcu/tengine
一个容器连接到另一个容器(父子链接)
docker run -i -t --name <容器名> -d -link mongodb:db <镜像名> sonar
这里列举的是将当前容器连接到mongodb的过程,名为mongodb的容器已提前在本地启动,并将mongodb容器映射为db。这样,当前启动的容器就可以使用db的相关的环境变量了。
拉取镜像
docker pull <镜像名:tag>
如
docker pull liukunmcu/tengine
当需要把一台机器上的镜像迁移到另一台机器的时候,需要保存镜像与加载镜像。
机器adocker save busybox-1 > /home/save.tar
使用scp将save.tar拷到机器b上,然后:
docker load < /home/save.tar
构建自己的镜像
docker build -t <镜像名> <Dockerfile路径>
如Dockerfile在当前路径:
docker build -t xx/gitlab .
- 重新查看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
后台运行(-d)、并暴露端口(-p)
docker run -d -p 127.0.0.1:33301:22 centos6-ssh
- </div> </li> </ol>
从container中拷贝文件出来
sudo docker cp 7bb0e258aefe:/etc/debian_version .
拷贝7bb0e258aefe中的/etc/debian_version到当前目录下。
注意
:只要7bb0e258aefe没有被删除,文件命名空间就还在,可以放心的把exit状态的container的文件拷贝出来
- 网络部分常用命令:
- 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