Docker简介
官网 www.docker.com
github https://github.com/docker/docker.github.io
开源的容器引擎,可以让开发者打包应用以及依赖的库,然后发布到任何流行的 linux 发行版上,移植很方便
由 go 语言编写,基于 apache2.0 协议发布
基于 linux kernel ,要想在 win 下运行需要借助一个 vm (虚拟机)来实现
自 2013 年开始,近些年发展迅猛
docker 从 1.13x 开始,版本分为社区版 ce 和企业版 ee ,并且基于年月的时间线形式,当前最新稳定版为 17.09 参考
Docker和传统的虚拟化比较
Docker 的优势
启动非常快,秒级实现
资源利用率高,一台高配置服务器可以跑上千个 docker 容器
更快的交付和部署,一次创建和配置后,可以在任意地方运行
内核级别的虚拟化,不需要额外的 hypevisor 支持,会有更高的性能和效率
易迁移,平台依赖性不强
Docker核心概念
镜像, 是一个只读的模板,类似于安装系统用到的那个 iso 文件,我们通过镜像来完成各种应用的部署。
容器,镜像类似于操作系统,而容器类似于虚拟机本身。它可以被启动、开始、停止、删除等操作,每个容器都是相互隔离的。
仓库,存放镜像的一个场所,仓库分为公开仓库和私有仓库。 最大的公开仓库是 Docker hub ( hub . docker .com ),国内公开仓库( dockerpool.com )
Docker安装
curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo
yum install -y docker-ce
速度比较慢,大家也可以直接下载 rpm 包
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
下载完,上传到 linux 下
也需要用 yum 安装,可以自动解决依赖关系
yum install -y docker-ce-xxxx.rpm
systemctl start docker 启动docker
docker每次启动都会自动生成的iptables规则,删除后docker的网络会出问题
Docker镜像管理
docker pull centos//可以到官方下载centos镜像,速度很慢
配置 docker 加速器(参考 )
•创建加速器连接 vi /etc/docker/daemon.json//加入如下内容
{
"registry-mirrors": ["https://dhq9bx4f.mirror.aliyuncs.com"]
}
说明:这个url为加速器地址,需要同学们自行到阿里云申请
配置完 加速器,重启 docker服务,再次docker pull centos会快很多
docker images 查看本地的镜像
TAG 一般为版本标签
IMAGE ID 区分么个镜像的标识
docker search xxx //搜索公共仓库镜像,其中xxx是关键词
docker tag centos centos-1 //给镜像打标签
打完标签后会生产新的镜像
标示一个镜像
也可以标签一样TAG不一样
docker run - itd centos // 把镜像启动为容器, - i 表示让容器的标准输入打开,-t表示分配一个伪终端,-d表示后台启动,要把-i -t -d 放到镜像名字前面
报错启动失败
[root@localhost ~]# vi /usr/lib/sysctl.d/00-system.conf
添加如下代码:
net.ipv4.ip_forward=1
重启network服务
# systemctl restart network
docker ps //查看运行的容器,
加上-a选项后可以查看所有容器,包括未运行的
docker rmi centos // 用来删除指定镜像
其中后面的参数可以是 tag ,如果是tag时,实际上是删除该tag。当后面的参数为镜像ID时,则会彻底删除整个镜像,所有标签也会一同删除,类似linux的软连接
Docker通过容器创建镜像
docker run 启动容器后,可以通过下面命令进入容器
docker exec -it xxxxx bash// 其中 xxxxx 为容器 id ,这个 id 可以用 docker ps查看,最后面的bash为进入容器后我们要执行的命令,这样就可以打开一个终端
加bash 是因为给他增加bash进程,没有bash进程就不能进行交互
进入容器后可以使用命令查看内存大小 安装软件 等几乎与虚拟机一致,因为这是一个被严重删减的系统命令只有600多个
进入到该容器中,我们做一些变更,比如安装一些东西,然后针对这个容器进行创建新的镜像
在容器中执行 yum install -y net-tools,查看IP地址
ctrl d退出容器
docker自己找了个网段指定了IP ,每开启一个容器虚拟机就会添加一个网卡使用两者可以进行通信
docker commit -m "change somth " -a "somebody info" container_id new_image_name // container_id
通过 docker ps -a 获取,后面的new_image_name为新镜像名字
例如: docker commit -m "install net-tools" -a " linux02" 14957c27d477 centos_with_nettool
这个命令有点像 svn 的提交, -m 加一些改动信息,-a 指定作者相关信息 2c74d这一串为容器id,再后面为新镜像的名字
这样如果需要再新建一个镜像就不需要重复之前的操作
使用容器名字进入终端
查看ip
测试网络
linux又多了一个网卡
Docker使用模板创建镜像
首先去下载一个模板
http://openvz.org/Download/templates/precreated // 下载速度不快,阿铭下载了一个 centos6 的模板 centos-6-x86-minimal.tar.gz
导入该镜像的命令为:
cat centos-6-x86-minimal.tar.gz|docker import - centos6
docker images查看导入的镜像
启动
把现有镜像,导出为一个文件:
docker save -o aming-centos.tar aming
我们还可以用该文件恢复本地镜像:
docker load --input aming-centos.tar 或者
docker load < aming-centos.tar
docker push image_name // 可以把自己的镜像传到 dockerhub 官方网站上去,但前提是需要先注册一个用户,后续如果有需求再研究吧
Docker容器管理
• docker create -it centos6 bash //这样可以创建一个容器,但该容器并没有启动
• docker start container_id //启动容器后,可以使用 docker ps 查看到,有start 就有stop,和restart
• 之前我们使用的docker run 相当于先create再start
• docker run -it centos bash
• 这样进入了一个虚拟终端里面,我们可以运行一些命令,使用命令exit或者ctrl d 退出该bash,当退出后这个容器也会停止。
• docker run -d 可以让容器在后台运行
• 比如:docker run -d centos bash -c "while :; do echo "123"; sleep 2; done"
• docker run --name web -itd centos bash // --name 给容器自定义名字
• docker run --rm -it centos bash -c "sleep 30" //--rm 可以让容器退出后直接删除,在这里命令执行完容器就会退出
• docker logs 可以获取到容器的运行历史信息,用法如下
• docker logs container_id
• docker attach 可以进入一个后台运行的容器,比如
• docker attach container_id //但是attach命令不算好用,比如我们想要退出终端,就得exit了,这样容器也就退出了,还有一种方法
• docker exec -it container_id bash //可以临时打开一个虚拟终端,并且exit后,容器依然运行着
• docker rm container_id //container_id是ps的时候查看到的,这样就可以把container删除,如果是运行的容器,可以加-f
• docker export container_id > file.tar // 导出容器,可以迁移到其他机器上,需要导入
• cat file.tar |docker import - aming_test //这样会生成aming_test的镜像
Docker仓库管理
• docker pull registry //下载registry 镜像,registy为docker官方提供的一个镜像,我们可以用它来创建本地的docker私有仓库。
• docker run -d -p 5000:5000 registry //以registry镜像启动容器,-p会把容器的端口映射到宿主机上,:左边为宿主机监听端口,:右边为容器监听端口
• curl 127.0.0.1:5000/v2/_catalog //可以访问它
• 下面我们来把其中一个镜像上传到私有仓库
• docker tag aming_test 172.7.15.113:5000/centos //标记一下tag,必须要带有私有仓库的ip:port
• docker push 172.7.15.113:5000/centos //把标记的镜像给推送到私有仓库
• 此时并不会成功,Get https://172.7.15.113:5000/v2/: http: server gave HTTP response to HTTPS client
• 更改配置文件,vi /etc/docker/daemon.json//更改为
{ "insecure-registries":["192.168.96.135:5000"] }
• systemctl restart docker
• docker ps -a //查看容器已经关闭,还需要启动
• docker start id //这里的id为registry容器id
• 再次push
• docker push 172.7.15.113:5000/centos
• curl 127.0.0.1:5001/v2/_catalog //可以查看到推送上来的镜像
第二个容器
Docker数据管理
• 1. 挂载本地的目录到容器里
• docker run -tid -v /data/:/data centos bash //-v 用来指定挂载目录,:前面的/data/为宿主机本地目录,:后面的/data/为容器里的目录,会在容器中自动创建
• 2. 挂载数据卷
• 其实我们挂载目录的时候,可以指定容器name,如果不指定就随机定义了。比如上面我们没有指定,它就生成了一个名字为relaxed_franklin,这个名字可以使用命令 docker ps 看最右侧一列
• docker run -itd --volumes-from relaxed_franklin aming123 bash
• 这样,我们使用aming123镜像创建了新的容器,并且使用了 relaxed_franklin 容器的数据卷
• 3. 定义数据卷容器
• 有时候,我们需要多个容器之间相互共享数据,类似于linux里面的NFS,所以就可以搭建一个专门的数据卷容器,然后其他容器直接挂载该数据卷。
• 首先建立数据卷容器
• docker run -itd -v /data/ --name testvol centos bash //注意这里的/data/是容器的/data目录,并非本地的/data/目录。
• 然后让其他容器挂载该数据卷
• docker run -itd --volumes-from testvol aming123 bash
Docker数据卷的备份与恢复
• 备份
• mkdir /data/backup
• docker run --volumes-from testvol -v /data/backup/:/backup centos tar cvf /backup/data.tar /data/
• 说明:首先我们需要使用testvol数据卷新开一个容器,同时我们还需要把本地的/vol_data_backup/目录挂载到该容器的/backup下,这样在容器中/backup目录里面新建的文件,我们就可以直接在/data/backup/目录中看到了。 然后再把/data/目录下面的文件打包到成data.tar文件放到/backup目录下面。
• 恢复
• 思路: 先新建一个数据卷容器,再建一个新的容器并挂载该数据卷容器,然后再把tar包解包。
• 新建数据卷容器:docker run -itd -v /data/ --name testvol2 centos bash
• 挂载数据卷新建容器,并解包:docker run --volumes-from testvol2 -v /data/backup/:/backup centos tar xf /backup/data.tar