分享

运维人员的解放----Docker快速部署

xioaxu790 发表于 2014-9-15 15:27:37 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 11239
本帖最后由 xioaxu790 于 2014-9-15 15:30 编辑
问题导读
1、Docker 应用容器相对于 VM 有哪些优势?
2、如何让 docker 容器的多程序开机自动运行?
3、如何学习Docker的命令?




Docker 是一个用了一种新颖方式实现的超轻量虚拟机 ,在实现的原理和应用上还是和VM 有巨大差别,专业的叫法是应用容器( Application Container )。 (我个人还是喜欢称虚拟机)


Docker 应用容器相对于 VM 有以下几个优点:
启动速度快,容器通常在一秒内可以启动,而 VM 通常要更久

资源利用率高,一台普通 PC 可以跑上千个容器,你跑上千个 VM 试试

性能开销小, VM 通常需要额外的 CPU 和内存来完成 OS 的功能,这一部分占据了额外的资源

因为 VM 的 Hypervisor 需要实现对硬件的虚拟化,并且还要搭载自己的操作系统,自然在启动速度和资源利用率以及性能上有比较大的开销。

个人体会较深的两处优点:
1、   快速部署,传统的部署模式是:安装 ( 包管理工具或者源码包编译 )-> 配置 -> 运行; Docker 的部署模式是:复制 -> 运行。

2、 可以保证线上与测试环境一致,计划以后上线就直接复制测试使用的 docker 容器)

什么是 docker?
八大问题让你快速了解Docker


为什么你应该关注 docker?
Docker是什么,有什么亮点


1 、 docker 安装
debian7 安装 docker
参考地址: http://www.webmaster.me/server/i ... -in-60-seconds.html
  1. echo deb http://get.docker.io/ubuntu docker main | sudo tee/etc/apt/sources.list.d/docker.list
  2. sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
  3. sudo apt-get update
  4. sudo apt-get install -y lxc-docker
复制代码


四行命令, Docker 就安装好了。下面创建一个 ubuntu 虚拟系统:
  1. docker pull ubuntu    # 此处是从官网拉取名为 ubuntu 的 image ,也可手动在 https://index.docker.io 上搜索想要的镜像。
  2. docker run -i -t ubuntu /bin/bash   # 创建一个容器, -t 是临时终端。
复制代码


ubuntu12.04 、 windows 、 macOS 安装 docke r
参考 docker 中文文档 http://www.widuu.com/docker/


2 、 docker 使用过程实践
2.1 在测试机启动容器,安装 ssh
  1. docker run -i -t ubuntu /bin/bash   # 此方式运行的容器,退出后容器就会关闭。
  2. apt-get install openssh-server   # 安装 ssh
  3. # 需要修改 /etc/sshd/sshd_config 文件中内容
  4. PermitRootLogin yes
  5. UsePAM no
复制代码



2.2    启动 ssh ,容器以后台方式运行
  1. docker run -d -p 50001:22 < 容器 id> /usr/sbin/sshd-D
  2. # 容器 id 可通过 docker ps-a 查看,最上面的为最新的。
复制代码



2.3 通过 ssh 连接到容器安装软件
  1. ssh root@127.0.0.1 -p 50001
  2. # 连上后想装什么就装什么,可使用 exit 退出容器,但后台还会运行。
复制代码


2.4 服务安装完成后,停止容器。
  1. docker stop  < 容器 id>     # 停止运行的容器
复制代码


2.5 把容器提交生成最新的镜像
  1. docker commit < 容器 id>  debian02 # 把这个容器提交生成新的 debian02 镜像 ( 该镜像是原始镜像与容器的整合 )
复制代码

2.6 打包镜像
  1. docker save debian02 >/root/debian02.tar   #debian02 镜像打包
复制代码

2.7 在另外的机器上导入镜像
  1. docker load < debian02.tar   # 导入镜像
  2. docker images   # 查看存在的镜像
复制代码

2.8 启动容器
  1. docker run -h="redis-test"  --name redis-test -d -p 51000:22 -p51001:3306 -p 51003:6379 -p 51004:6381 -p 51005:80 -p 51006:8000 -p 51007:8888  debian02 /etc/rc.local
  2. # 此处是我测试机器启动命令,指定主机名与端口映射。
  3. # 启动后,后面又装了程序,开机自启动命令可放在 /etc/rc.local 文件中。
  4. docker 容器迁移简单方便,可以任意的拷贝部署,以后再也不怕新部署环境了,一堆依赖装的想死有木有。
复制代码


3 、关于 docker 容器的端口映射
由于 docker 容器的 IP 地址每次启动都会变,所以不适用于手动添加端口映射 ( 难道每次重启都来查看容器的 IP 么? ) ,所以需要每次启动容器时由 docker 程序自动添加 NAT 规则,前期尽可能的把需要映射的端口在创建容器时配置好,如下:
  1. docker run -h="activemq"  --name activemq -d -p 51000:22 -p 51001:3306-p 51003:6379 -p 51004:6381  -p 51005:80-p 51006:8000 -p 51007:8888   debian/base/etc/rc.local
  2. # 此处我把 mysql,redis,nginx,ssh 都进行了映射。
  3. 后续对于 docker 容器的管理,记住容器的名称,如上述名称是 activemq ,则使用 docker stop,start 来控制容器进程。
  4. docker stop  activemq
  5. docker  start  activemq
复制代码


当然,也可以不让 docker 每次启动容器修改容器的 IP 地址,参考如下:
docker 网络配置: http://www.open-open.com/lib/view/open1404896485747.html


4 、关于 docker 容器的多程序开机自动运行
docker 容器每次启动时,开机自启动的命令都要在启动容器前指定。如 docker run -I -t debian /bin/bash 命令,只会运行 /bin/bash 程序,其它的程序都不会运行,对于要跑多个程序的容器特别纠结。

多程序开机自动运行方法 :

可把前面所说的启动命令换成 dockerrun -I -t debian /etc/rc.local ,在容器中把所有需要开机自的启动命令放在 /etc/rc.local 中,就可以达到多程序开机自启动了。

后台运行则是: docker run -d -p 50001:22 debian /etc/rc.local 。注意: run 命令是创建一个新的容器,如果要启动一个曾经运行过的容器,则用命令 docker ps -a 中找对应的容器 ID ,然后使用 docker start < 容器 ID> 即可。


5 、关于 docker 容器和镜像的关系
无论容器里做什么操作,写文件,删文件。该容器的基本镜像都不会有任何改变。

这是因为 Docker 从父镜像建立增量镜像,只存储每个容器的更改。因此,如果你有一个 300MB 的父镜像,如果你在容器中安装了 50MB 的额外应用或服务,你的容器只有 50MB ,父镜像还是 300MB 。

但是可以使用 Dockfile 或 commit 命令来,把增量镜像和父镜像一起生成一个新的镜像。
  1. commit 使用:
  2. docker commit  < 容器 id>  < 新镜像名称 >
  3. Dockfile 使用:
  4. root@yangrong:/data# cat Dockerfile
  5. FROMubuntu/testa    # 这是基础镜像
  6. CMD["/root/start.sh"]   # 这是启动命令
  7. root@yangrong:/data# docker build -t < 新镜像名 > ./
复制代码


6 、 docker 参数详解
  1. docker
  2. useage of docker
  3. -D 默认 false 允许调试模式 (debugmode)
  4. -H 默认是 unix:///var/run/docker.sock tcp://[host[:port]] 来绑定 或者 unix://[/path/to/socket] 来使用 ( 二进制文件的时候 ) ,当主机 ip host=[0.0.0.0],( 端口 )port=[4243] 或者 path=[/var/run/docker.sock] 是缺省值,做为默认值来使用
  5. -api-enable-cors 默认 flase 允许 CORS header 远程 api
  6. -b 默认是空,附加在已存在的网桥上,如果是用 'none' 参数,就禁用了容器的网络
  7. -bip 默认是空,使用提供的 CIDR ( ClasslessInter-Domain Routing- 无类型域间选路)标记地址动态创建网桥 (dcoker0), 和 -b 参数冲突
  8. -d 默认 false 允许进程模式 (daemonmode)
  9. -dns 默认是空,使 docker 使用指定的 DNS 服务器
  10. -g 默认是 "/var/lib/docker": 作为 docker 使用的根路径
  11. -icc 默认 true ,允许 inter-container 来通信
  12. -ip 默认 "0.0.0.0" :绑定容器端口的默认 Ip 地址
  13. -iptables 默认 true 禁用 docker 添加 iptables 规则
  14. -mtu 默认 1500 : 设置容器网络传输的最大单元 (mtu)
  15. -p 默认是 /var/run/docker.pid 进程 pid 使用的文件路径
  16. -r 默认是 true 重启之前运行的容器
  17. -s 默认是空 ,这个是 docker 运行是使用一个指定的存储驱动器
  18. -v 默认 false 打印版本信息和退出
复制代码


7 、 docker run 命令详解
  1. Usage: docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]
  2. Run a command in a new container
  3. -a=map[]: 附加标准输入、输出或者错误输出
  4. -c=0: 共享 CPU 格式(相对重要)
  5. -cidfile="": 将容器的 ID 标识写入文件
  6. -d=false: 分离模式,在后台运行容器,并且打印出容器 ID
  7. -e=[]: 设置环境变量
  8. -h="": 容器的主机名称
  9. -i=false: 保持输入流开放即使没有附加输入流
  10. -privileged=false: 给容器扩展的权限
  11. -m="": 内存限制 ( 格式 :<number><optional unit>, unit 单位 = b, k, m or g)
  12. -n=true: 允许镜像使用网络
  13. -p=[]: 匹配镜像内的网络端口号
  14. -rm=false: 当容器退出时自动删除容器 ( 不能跟 -d 一起使用 )
  15. -t=false: 分配一个伪造的终端输入
  16. -u="": 用户名或者 ID
  17. -dns=[]: 自定义容器的 DNS 服务器
  18. -v=[]: 创建一个挂载绑定: [host-dir]:[container-dir]:[rw|ro]. 如果容器目录丢失, docker 会创建一个新的卷
  19. -volumes-from="": 挂载容器所有的卷
  20. -entrypoint="": 覆盖镜像设置默认的入口点
  21. -w="": 工作目录内的容器
  22. -lxc-conf=[]: 添加自定义 -lxc-conf="lxc.cgroup.cpuset.cpus = 0,1"
  23. -sig-proxy=true: 代理接收所有进程信号 (even in non-tty mode)
  24. -expose=[]: 让你主机没有开放的端口
  25. -link="": 连接到另一个容器 (name:alias)
  26. -name="": 分配容器的名称,如果没有指定就会随机生成一个
  27. -P=false: Publish all exposed ports to thehost interfaces 公布所有显示的端口主机接口
复制代码



8 、 docker 常用命令总结
  1. docker pull  < 镜像名 :tag>  # 从官网拉取镜像
  2. docker search < 镜像名 >  # 搜索在线可用镜像名
复制代码


8.1 查询容器、镜像、日志
  1. docker top <container> # 显示容器内运行的进程
  2. docker images  # 查询所有的镜像,默认是最近创建的排在最上。
  3. docker ps # 查看正在运行的容器
  4. docker ps -l # 查看最后退出的容器的 ID
  5. docker ps -a # 查看所有的容器,包括退出的。
  6. docker logs  { 容器 ID| 容器名称 }  # 查询某个容器的所有操作记录。
  7. docker logs -f  { 容器 ID| 容器名称 }  # 实时查看容易的操作记录。
复制代码


8.2 删除容器与镜像
  1. docker rm$(docker ps -a -q) # 删除所有容器
  2. docker rm < 容器名 or ID>    # 删除单个容器
  3. docker rmi  <ID>  # 删除单个镜像
  4. docker rmi$(docker images | grep none | awk '{print $3}' | sort -r) # 删除所有镜像
复制代码


8.3 启动停止容器
  1. docker stop  < 容器名 or ID>   # 停止某个容器
  2. docker start  < 容器名 or ID>  # 启动某个容器
  3. docker kill    < 容器名 or ID>  # 杀掉某个容器
复制代码

8.4 容器迁器
  1. docker export <CONTAINER ID> > /home/export.tar  # 导出
  2. cat /home/export.tar | sudo docker import  -  busybox-1-export:latest  # 导入 export.tar 文件
  3. docker save debian> /home/save.tar # 将 debian 容器打包
  4. docker load< /home/save.tar # 在另一台服务器上加载打包文件
复制代码


save 和 export 的对比参考地址:
http://www.fanli7.net/a/bianchengyuyan/C__/20140423/452256.html

8.5 运行一个新容器
  1. # 运行一个新容器,同时为它命名、端口映射。以 debian02 镜像为例
  2. docker run -h="redis-test"  --name redis-test -d -p 51000:22 -p51001:3306 -p 51003:6379 -p 51004:6381 -p 51005:80 -p 51006:8000 -p 51007:8888  debian02 /etc/rc.local
  3. # 从 container 中拷贝文件,当 container 已经关闭后,在里面的文件还可以拷贝出来。
  4. sudo docker cp 7bb0e258aefe:/etc/debian_version . # 把容器中的 /etc/debian_version 拷贝到当前目录下。
复制代码

8.6 docker Dockfile 镜像制作
  1. root@yangrong:/data# cat Dockerfile
  2. FROM ubuntu/testa     # 这是基础镜像
  3. CMD ["/root/start.sh"]  # 这是启动命令
  4. root@yangrong:/data# docker build -t < 新镜像名 > ./    # 生成新的镜像
复制代码


Dockfile 更多资料参考:
1、http://www.aboutyun.com/forum.ph ... 36&highlight=docker
2、http://www.aboutyun.com/forum.ph ... 20&highlight=docker


没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条