Docker 技术简介
主讲人:孔飞
日 期:
部 门:运维部
内 容
• Docker 介绍
• Docker 安装&部署
• Docker 实例项目部署
Docker介绍
• 启动速度快,容器通常在一秒内可以启动,而 VM 通常要更久
• 资源利用率高,一台普通 PC 可以跑上千个容器,你跑上千个 VM 试试
• 性能开销小, VM 通常需要额外的 CPU 和内存来完成 OS 的功能,这一部
分占据了额外的资源
VM DOCKER
Docker介绍
• 隔离应用依赖
• 创建应用镜像并进行复制
• 创建容易分发的即启即用的应用
• 允许实例简单、快速地扩展
• 测试应用并随后销毁它们
Docker介绍
• Docker两个最重要的概念是镜像和容器。除此之外,链接和数据
卷也很重要。我们先从镜像入手。
• 镜像:
• Docker的镜像类似虚拟机的快照,但更轻量,非常非常轻量。
• 创建Docker镜像有几种方式,多数是在一个现有镜像基础上创建
新镜像,因为几乎你需要的任何东西都有了公共镜像,包括所有
主流Linux发行版
• 镜像拥有唯一ID
Docker介绍
• 容器
• 你可以从镜像中创建容器,这等同于从快照中创建虚拟机,不过
更轻量。应用是由容器运行的。
Image #0
Centos 6.7 + Http app
Container #1
Centos 6.7 + Http app
Container #2
Centos 6.7 + Http app
Container #3
Centos 6.7 + Http app
Docker介绍
Image name:http:0.9
Imageid:e72ac664f4f0
Centos 6.7 + Http app
Container name:http1
container id:44a87fdaf870
Container name:http_DB
container 35005d456d268
Container name:http2
container id:9433b2b904de
Image name:mysql:9.2
Imageid:bc840bd687e3
Centos 6.7 + Mysql 5.6.12
HOST
容器与虚拟机一样,是隔离的它们也拥有一个唯一ID和唯一的名字。容器对外公开服务是必要的,因此
Docker允许公开容器的特定端口。
Docker介绍
• 数据卷
• 数据卷让你可以不受容器生命周期影响进行数据持久化。它们表现为容器内的空间,但实际保存在容
器之外,从而允许你在不影响数据的情况下销毁、重建、修改、丢弃容器。Docker允许你定义应用
部分和数据部分,并提供工具让你可以将它们分开。
• 使用Docker时必须做出的最大思维变化之一就是:容器应该是短暂和一次性的。
Image name:http:0.9
Centos 6.7 + Http app
http1
http_DB
http-dev
Image name:mysql:9.2
Centos 6.7 + Mysql 5.6.12
HOST
80
8080
443
4430
/data
/var/log
/home/www/html
/home/www/log
/httpdata
/var/log
/home/http/dbdata
/home/http-dev/log/http
/db /home/mysql/log/http
80
8000
Docker介绍
• 链接
• 链接是Docker的另一个重要部分。容器启动时,将被分配一个随机的私有IP,其它容器可以使用这
个IP地址与其进行通讯。这点非常重要,原因有二:一是它提供了容器间相互通信的渠道,二是容器
将共享一个本地网络。
Image name:http:0.9
Centos 6.7 + Http app
http1
http_DB
http-dev
Image name:mysql:9.2
Centos 6.7 + Mysql 5.6.12
HOST
Dbapp:3306
3306
80
8080
443
4430
/data
/var/log
/home/www/html
/home/www/log
/httpdata
/var/log
/home/http/dbdata
/home/http-dev/log/http
/db /home/mysql/log/http
80
8000
Docker介绍
• 缺点:
1.资源隔离方面不如虚拟机,docker是利用cgroup实现资源限制的,只能限制资源消耗的最大值,
而不能隔绝其他程序占用自己的资源。
2.安全性问题。docker目前并不能分辨具体执行指令的用户,只要一个用户拥有执行docker的权限,
那么他就可以对docker的容器进行所有操作,不管该容器是否是由该用户创建。比如A和B都拥有执
行docker的权限,由于docker的server端并不会具体判断docker cline是由哪个用户发起的,A可以
删除B创建的容器,存在一定的安全风险。
3.docker目前还在版本的快速更新中,细节功能调整比较大。一些核心模块依赖于高版本内核,存在
版本兼容问题
内 容
• Docker 介绍
• Docker 安装&部署
• Docker 实例项目部署
Docker 安装
• 升级Kernel
• cd /etc/yum.repos.d
• wget http://www.hop5.in/yum/el6/hop5.repo
• yum install kernel-ml-aufs kernel-ml-aufs-devel
• 安装Docker主程序:
• rpm -ivh http://mirrors.sohu.com/fedora-epel/6/x86_64/epel-release-6-8.noarch.rpm
• sed -i 's/^mirrorlist=https/mirrorlist=http/' /etc/yum.repos.d/epel.repo
• yum -y install docker-io
• yum –y upgrade device-mapper-libs
• 配置支持容器上网
• setenforce 0
• sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
• sed -i 's/ net.ipv4.ip_forward = 0/ net.ipv4.ip_forward = 1/g' /etc/sysctl.conf
• sysctl –p
• /etc/init.d/docker start
• Reboot
升级kernel. CentOS 7以下都需要升级3.10
环境配置
Docker安装
Docker 部署
• 下载需要的镜像:docker pull centos:centos6
• 创建容器:docker run -i -t centos:centos6 /bin/bash
• Ctrl + d 来退出容器的命令行
Docker 部署
• 创建容器
• docker run -ti --name test -h test -p 80:80 -v /home/www/html/:/var/www/html centos:centos6 /bin/bash
• Run (运行)
• --rm (告诉Docker一旦运行的进程退出就删除容器。这在进行测试时非常有用)
• -t –i (告诉Docker分配一个伪终端并进入交互模式)
• -h test (容器的hostname)
• --name test (容器的名称)
• --cap-add=NET_ADMIN (修改网络接口数据。例:VIP)
• -p 80:80 (80 端口的映射)
• -v /vagrant/htdocs:/var/www/html (定义在宿主机文件存储位置:容器文件的存储位置)
Docker 部署
Docker ps -a (查看已创建的容器)
创建的信息
容器名称:test
主机名:test
对外映射端口:80
系统:centos:centos6
按 Ctrl + d 来退出容器的命令行
Docker 部署
Docker attach [container ID] (进入容器)
Docker exec it [container ID] bash
安装一个HTTP服务和日常linux系统中一样使用yum安装&编译安装
启动http服务
安装完成后ctrl+d退出容器
Docker 部署
• docker inspect 65d0c72cf114 (在宿主机中 查看单个容器详细信息)
Docker 部署
Docker对外映射端口就是使用Iptables进行的Nat映射
Iptables –nvL –t nat 查看映射信息
访问Web测试是否显示正常
Docker 部署
• 容器打包
Ps:由于默认的系统属于精简版只有常用的内部命令,甚至gcc 等一些常用套件都没有,所以我们需要定制一个基础版的系统
Dockerfile(属于Docker自己的脚本)
• # 选择一个已有的os镜像作为基础
• FROM centos:centos6
• # 镜像的作者
• MAINTAINER Fanbin Kong "kongxx@hotmail.com"
• # 安装openssh-server和sudo软件包,并且将sshd的UsePAM参数设置成no
• RUN yum install -y openssh-server sudo
• RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
• # 添加测试用户admin,密码admin,并且将此用户添加到sudoers里
• RUN useradd admin
• RUN echo "admin:admin" | chpasswd
• RUN echo "admin ALL=(ALL) ALL" >> /etc/sudoers
• # 下面这两句比较特殊,在centos6上必须要有,否则创建出来的容器sshd不能登录
• RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
• RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
• # 启动sshd服务并且暴露22端口
• RUN mkdir /var/run/sshd
• EXPOSE 22
• CMD ["/usr/sbin/sshd", "-D"]
docker build -t yongboy/java7 .
-t: 为构建的镜像制定一个标签,
便于记忆/索引等
. : 指定Dockerfile文件在当前目
录
内 容
• Docker 介绍
• Docker 安装&部署
• Docker 实例项目部署

Docker一期培训