25.1 docker简介
25.2 安装docker
25.3 镜像管理
25.4 通过容器创建镜像
25.5 通过模板创建镜像
25.6 容器管理
25.7 仓库管理
25.8 数据管理
25.9 数据卷备份恢复
25.10 docker网络模式
25.11 opration not permitted
25.12 配置桥接网络
Docker 教程 https://www.runoob.com/docker/docker-tutorial.html
一、Docker简介
官网 www.docker.com
docker 容器虚拟化
github https://github.com/docker/docker.github.io
开源的容器引擎,可以让开发者打包应用以及依赖的库,然后发布到任何流行的linux发行版上,移植很方便,交付很快
由go语言编写,基于apache2.0协议发布
基于linux kernel,要想在win下运行需要借助一个vm(虚拟机)来实现
自2013年开始,近些年发展迅猛
docker从1.13x开始,版本分为社区版ce和企业版ee,并且基于年月的时间线形式,当前最新稳定版为17.09 参考http://blog.csdn.net/chenhaifeng2016/article/details/68062414
Docker和传统的虚拟化比较
Docker的优势
启动非常快,秒级实现 资源利用率高,一台高配置服务器可以跑上千个docker容器 更快的交付和部署,一次创建和配置后,可以在任意地方运行 内核级别的虚拟化,不需要额外的hypevisor支持,会有更高的性能和效率 易迁移,平台依赖性不强
Docker核心概念
镜像,是一个只读的模板,类似于安装系统用到的那个iso文件,我们通过镜像来完成各种应用的部署。 容器,镜像类似于操作系统,而容器类似于虚拟机本身。它可以被启动、开始、停止、删除等操作,每个容器都是相互隔离的。 仓库,存放镜像的一个场所,仓库分为公开仓库和私有仓库。 最大的公开仓库是Docker hub(hub.docker.com),国内公开仓库(dockerpool.com)
二、Docker安装
下载repo的yum源: curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo
yum install -y docker-ce
systemctl start docker 启动docker
速度比较慢,也可以直接下载rpm包
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
下载完,上传到linux下,也需要用yum安装,可以自动解决依赖关系
yum install -y docker-ce-xxxx.rpm
每次启动docker都会自动生成iptables规则
如果要保存规则,执行:docker启动时就会生成规则,此步骤可有可无
service iptables save
三、Docker镜像管理
docker pull centos //可以下载centos镜像,速度很慢
配置docker加速气(参考 http://blog.csdn.net/xlemonok/article/details/71403534)
vim /etc/docker/daemon.json//加入如下内容 { "registry-mirrors": ["https://dhq9bx4f.mirror.aliyuncs.com"] }
说明:这个url为加速气地址,需要同学们自行到阿里云申请
配置完加速气,重启docker服务,再次docker pull centos会快很多
systemctl restart docker
docker images 查看本地的镜像,IMAGE ID 区分镜像的唯一标识 docker search xxx //搜索镜像,其中xxx是关键词 docker tag centos tobe //给镜像打标签,即更改了REPOSITORY docker tag centos ttt:12345 即更改了REPOSITORY也更改了TAG,但是IMAGE ID相同
docker run -itd centos //把镜像启动为容器,-i表示让容器的标准输入打开,-t表示分配一个伪终端,-d表示后台启动,要把-i -t -d 放到镜像名字前面
docker ps //查看运行的容器,加上-a选项后可以查看所有容器,包括未运行的
docker run -itd centos //把镜像启动为容器,-i表示让容器的标准输入打开,-t表示分配一个伪终端,-d表示后台启动,要把-i -t -d 放到镜像名字前面 docker ps //查看运行中的容器,加上-a选项后可以查看所有容器,包括未运行的 docker rmi abc:333 //用来删除指定镜像,rm删除,i是image 其中后面的参数可以是tag,如果是tag时,实际上是删除该tag。当后面的参数为镜像ID时,则会彻底删除整个镜像,所有标签也会一同删除
四、Docker通过容器创建镜像
docker run启动容器后,可以通过下面命令进入容器 docker exec -it xxxxx bash//其中xxxxx为容器id,这个id可以用docker ps查看,最后面的bash为进入容器后我们要执行的命令,这样就可以打开一个终端 进入到该容器中,我们做一些变更,比如安装一些东西,然后针对这个容器进行创建新的镜像
打开后主机名为容器id
在容器中执行 yum install -y net-tools,然后ctrl d退出容器,退出后,就可以把容器中的变更保存到新的镜像中去 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" -a ttobe 7cfcee29052f centos_with_nettool 这个命令有点像svn的提交,-m 加一些改动信息,-a 指定作者相关信息 7cfc这一串为容器id,再后面为新镜像的名字
docker run -itd centos_with_nettool 启动容器 docker exec -it da577154efb0 bash 进入容器
在centos镜像中安装好的net-tools,ifconfig可以直接在centos_with_nettool镜像中使用
五、Docker使用模板创建镜像
首先去下载一个模板
http://openvz.org/Download/templates/precreated //下载速度不快,下载了一个centos6的模板centos-6-x86-minimal.tar.gz 或者wget https://download.openvz.org/template/precreated/centos-6-x86-minimal.tar.gz
导入该镜像的命令为:
cat centos-6-x86-minimal.tar.gz|docker import - centos6
docker run -itd centos6 bash 启动该容器 docker exec -it 128e1fb bash 进入该容器
把现有镜像,导出为一个文件:
docker save -o centos7_with_nettool.tar centos_with_nettool centos7_with_nettool.tar 导出的文件名 centos_with_nettool 镜像名
此处删除报错是因为镜像在启动中,需要结束掉在删除,接下来进行恢复
docker rm -f da577154efb0 停止、关闭镜像 docker rmi -f 6cd1ccf53106 删除镜像
用该文件恢复本地镜像:
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 -a查看到,有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 可以让容器退出后直接删除,在这里命令(sleep 30)执行完容器就会退出
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 - tobe_test //这样会生成tobe_test的镜像
七、Docker仓库管理
创建本地的docker私有仓库:
docker pull registry //下载registry 镜像,registy为docker官方提供的一个镜像,我们可以用registry来创建本地的docker私有仓库。 docker run -d -p 5000:5000 registry //以registry镜像启动容器,-p会把容器的端口映射到宿主机上,:左边为宿主机监听端口,:右边为容器监听端口
curl 127.0.0.1:5000/v2/_catalog //可以访问它,此时里面没有数据
下面我们来把其中一个镜像上传到私有仓库:
1、需要先打标签
docker tag tobe_test 192.168.183.3:5000/centos //标记一下tag,必须要带有私有仓库的ip(宿主机的ip):port
2、推送到私有仓库
docker push 192.168.183.3:5000/centos //把标记的镜像给推送到私有仓库时报错,需要使用https地址
更改配置文件,指定私有仓库的地址
vim /etc/docker/daemon.json //更改为
{ "insecure-registries":["192.168.183.3:5000"] } #指定私有仓库的地址 systemctl restart docker 重启后,所有启动的镜像都会停止 docker ps -a //查看容器已经关闭,还需要启动 docker start container_id //这里的id为registry容器id,docker ps -a即可查看
再次push
docker push 192.168.183.3:5000/centos 此时开始上传
curl 127.0.0.1:5000/v2/_catalog //可以查看到推送上来的镜像
{"repositories":["centos"]} 此处的centos为推送上来后面的centos
把镜像push到私有仓库中,下载到私有仓库中:
在002机器上操作:需要安装docker
编辑配置文件:
vim /etc/docker/daemon.json
{ "insecure-registries":["192.168.183.3:5000"] } 指定私有仓库的地址 systemctl restart docker docker pull 192.168.183.3:5000/centos
八、Docker数据管理
容器由镜像启动,容器中会产生新的数据,关闭或删除容器,存储的数据也会删除,可以把宿主机的目录挂载到容器中去,会把数据存到宿主机的目录中去
1. 挂载本地的目录到容器里
docker run -tid -v /data/:/data centos_with_nettool bash //-v 用来指定挂载目录,:前面的/data/为宿主机本地目录,:后面的/data/为容器里的目录,会在容器中自动创建,目录可以不同
此时容器中的目录和宿主机的目录相同,在容器中创建一个123目录,在容器上产生的新数据就会存到宿主机上
2. 挂载数据卷
其实我们挂载目录的时候,可以指定容器name,如果不指定就随机定义了。比如上面我们没有指定,它就生成了一个名字为epic_mclean,这个名字可以使用命令 docker ps 看最右侧一列NAMES
docker run -itd --volumes-from epic_mclean centos bash 启动容器 docker exec -it 98a76f bash 进入容器
这样,我们使用centos镜像创建了新的容器,并且使用了 epic_mclean 容器的数据卷,此时新开启的容器数据和之前的容器数据是一致的
3. 定义数据卷容器
有时候,我们需要多个容器之间相互共享数据,类似于linux里面的NFS,所以就可以搭建一个专门的数据卷容器,然后其他容器直接挂载该数据卷。
首先建立数据卷容器
docker run -itd -v /data/ --name testvol tobe bash //-v选项的另一个写法,后面不加冒号,不需要把宿主机的目录做映射,注意这里的/data/是容器的/data目录,并非本地的/data/目录。-v /data/做成公共的目录
然后让其他容器挂载该数据卷
docker run -itd --volumes-from testvol tttt bash
如果要一个容器是data一个是home,可以做软连接:
home.1 是原来的home
九、Docker数据卷的备份与恢复
备份
mkdir /data/backup 宿主机上创建 docker run --volumes-from testvol -v /data/backup/:/backup centos tar cvf /backup/data.tar /data/(最后面的data是要备份的目标目录) 创建容器
说明:首先我们需要使用testvol数据卷新开一个容器,同时我们还需要把本地的/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
十、Docker网络模式
1、host模式,使用docker run时使用--net=host指定 docker使用的网络实际上和宿主机一样,在容器内看到的网卡ip是宿主机ip 2、container模式,使用--net=container:container_id/container_name 多个容器使用共同的网络,看到的ip是一样的 3、none模式,使用--net=none指定 这种模式下,不会配置任何网络 4、bridge模式,使用--net=bridge指定默认模式,不用指定默认就是这种网络模式。这种模式会为每个容器分配一个独立的Network Namespace。类似于vmware的nat网络模式。同一个宿主机上的所有容器会在同一个网段下,相互之间是可以通信的。
Docker网络管理-外部访问容器
首先使用centos_with_nettool镜像新建一个容器,然后在该容器中安装nginx服务,并启动
再把该容器导成一个新的镜像(centos_th_nginx),然后再使用新镜像创建容器,并指定端口映射:
启动centos_with_nettool容器 docker exec -it 3997cc6a1f11 bash 进入容器 yum install -y epel-release 安装nginx的扩展包 yum install -y nginx
在容器中安装一个服务(nginx),导成一个镜像,然后再使用新镜像创建容器,并指定端口映射
-p后面也支持IP:port:ip:port 的格式,比如 -p 127.0.0.1:8080:80 也可以不写本地的端口,只写ip,这样会随意分配一个端口 -p 127.0.0.1::80 //注意这里是两个冒号
导成一个镜像:
docker commit -m "install nginx" -a "tobelinux" 3997cc6a1f11 centos_th_nginx
docker run -itd -p 8088:80 centos_th_nginx bash //-p 可以指定端口映射,本例中将容器中的80端口映射为本地的8088端口
十一、opration not permitted
启动nginx,报错:
原因:
新建的容器,启动nginx或者httpd服务的时候会报错: Failed to get D-Bus connection: Operation not permitted 这是因为dbus-daemon没有启动,解决该问题可以这样做: 启动容器时,要加上--privileged -e "container=docker" ,并且最后面的命令改为/usr/sbin/init 如果之前启动过容器需要删除:docker rm -f CONTAINER ID docker run -itd --privileged -e "container=docker" -p 8088:80 centos_th_nginx /usr/sbin/init
curl localhost 在容器中进行测试
在宿主机上测试,需要使用8088端口
十二、Docker网络管理-配置桥接网络
使用第三方pipework实现
为了使本地网络中的机器和Docker容器更方便的通信,我们经常会有将Docker容器配置到和主机同一网段的需求。这个需求其实很容易实现,我们只要将Docker容器和宿主机的网卡桥接起来,再给docker容器配上IP就可以了。
为了让外面的用户访问
和ens33网卡做桥接:
cd /etc/sysconfig/network-scripts/ cp ifcfg-ens33 ifcfg-br0 vim ifcfg-ens33 //增加BRIDGE=br0,删除IPADDR,NETMASK,GATEWAY,DNS1,UUID vim ifcfg-br0 //修改DEVICE为br0,Type为Bridge,把ens33的网络设置设置到了br0上 systemctl restart network
此时br0有ip,ens33是没有ip的,如果需要在添加一个桥接网卡,可以添加一个br1,可以配置多个
安装pipwork
cd 到根目录 git clone https://github.com/jpetazzo/pipework cd pipework/ cp pipework /usr/local/bin/
开启一个容器
docker run -itd --net=none centos_th_nginx bash --net=none 不设置网络 docker exec -it d414127f43c8 bash
给容器增加ip
pipework br0 d414127f43c8 192.168.183.135/24@192.168.183.2 #192.168.183.135为容器的ip,@后面的ip为网关ip
此时到002机器上是可以ping通的,并且也可以连外网