Docker简介、安装,镜像管理,通过容器创建镜像,通过模板创建镜像,容器管理,仓库管理,数据管理,数据卷备份恢复,docker网络模式,opration not permitted,配置桥接网络...

 

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和传统的虚拟化比较

6cc7e78fe54ca0d0767782924c5671c49e0.jpg

4b6854acd02ebb76dcba1adf931d77361cb.jpg

Docker的优势

启动非常快,秒级实现
 资源利用率高,一台高配置服务器可以跑上千个docker容器
 更快的交付和部署,一次创建和配置后,可以在任意地方运行
 内核级别的虚拟化,不需要额外的hypevisor支持,会有更高的性能和效率
 易迁移,平台依赖性不强

dd0699ebd8396bb4624640c1494f951742c.jpg

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

5dc3eb60bf4174885c8445e996eb6ed5896.jpg

三、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

22009771b02c19e6f2717ae0e5f0762a9d1.jpg

docker images 查看本地的镜像,IMAGE ID 区分镜像的唯一标识
docker search xxx //搜索镜像,其中xxx是关键词
docker tag centos tobe //给镜像打标签,即更改了REPOSITORY
docker tag centos ttt:12345   即更改了REPOSITORY也更改了TAG,但是IMAGE ID相同

0cd46378101fe29d56f4a64e7c6ee618c4c.jpg

docker run -itd centos //把镜像启动为容器,-i表示让容器的标准输入打开,-t表示分配一个伪终端,-d表示后台启动,要把-i -t -d 放到镜像名字前面

bd17ae4f9696cd17ea0428c30a301413ad0.jpg

docker ps //查看运行的容器,加上-a选项后可以查看所有容器,包括未运行的

d68e1df8b0d0c879911400a4c69111db57b.jpg

docker run -itd centos //把镜像启动为容器,-i表示让容器的标准输入打开,-t表示分配一个伪终端,-d表示后台启动,要把-i -t -d 放到镜像名字前面
docker ps //查看运行中的容器,加上-a选项后可以查看所有容器,包括未运行的
docker rmi abc:333  //用来删除指定镜像,rm删除,i是image 其中后面的参数可以是tag,如果是tag时,实际上是删除该tag。当后面的参数为镜像ID时,则会彻底删除整个镜像,所有标签也会一同删除

efa1e7c42a0e34c922611bcdad80ffa0a18.jpg

四、Docker通过容器创建镜像

 

docker run启动容器后,可以通过下面命令进入容器
docker exec -it xxxxx  bash//其中xxxxx为容器id,这个id可以用docker ps查看,最后面的bash为进入容器后我们要执行的命令,这样就可以打开一个终端
进入到该容器中,我们做一些变更,比如安装一些东西,然后针对这个容器进行创建新的镜像

打开后主机名为容器id

12d3e75599082b69509061e6dab0c397724.jpg

在容器中执行 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,再后面为新镜像的名字

d0661eaeef7c2bbadcf59ef512981b076dd.jpg

docker run -itd centos_with_nettool        启动容器

docker exec -it da577154efb0 bash         进入容器

在centos镜像中安装好的net-tools,ifconfig可以直接在centos_with_nettool镜像中使用

3d6059f6a0180d1ccbc3f5cc08b7cf3ab37.jpg

五、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

99031e11259c9f1a47113837610e73c8dd9.jpg

docker run -itd centos6 bash   启动该容器

docker exec -it 128e1fb bash  进入该容器

5831b58e335eae570b6d2982f89e978a791.jpg

把现有镜像,导出为一个文件:

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       删除镜像

fd086514d972c6153a930bfa2eb4180e8df.jpg

用该文件恢复本地镜像:

docker load --input aming-centos.tar  或者
docker load < aming-centos.tar
docker push image_name  //可以把自己的镜像传到dockerhub官方网站上去,但前提是需要先注册一个用户,后续如果有需求再研究吧

87c25110ed46111db640593c9e3e34d2ed1.jpg

六、Docker容器管理

docker create -it centos6 bash     //这样可以创建一个容器,但该容器并没有启动

docker start  container_id      //启动容器,可以使用 docker ps -a查看到,有start 就有stop,和restart

8ed6a778ca595c3180c44d6143bf63f8ac7.jpg

326f864c1d466d0782a8b7f847bc91f4b50.jpg

之前我们使用的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会把容器的端口映射到宿主机上,:左边为宿主机监听端口,:右边为容器监听端口

b0940fc495523f8a00375da09769f0fc319.jpg

curl 127.0.0.1:5000/v2/_catalog //可以访问它,此时里面没有数据

9509c35056220d388f4d738cdb96bb212bb.jpg

下面我们来把其中一个镜像上传到私有仓库:

1、需要先打标签

docker tag tobe_test  192.168.183.3:5000/centos //标记一下tag,必须要带有私有仓库的ip(宿主机的ip):port

9a9b874a9fa13699932469047b07e90659b.jpg

2、推送到私有仓库

docker push 192.168.183.3:5000/centos     //把标记的镜像给推送到私有仓库时报错,需要使用https地址

3b8125536e9f651f0abe0260c856db154fd.jpg

更改配置文件,指定私有仓库的地址

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即可查看

f6f4c91a1665010d023dc0a88a2956eeacb.jpg

再次push 

docker push 192.168.183.3:5000/centos    此时开始上传

f09e5a70c59b1afc6589195f32a7c58b22b.jpg

curl 127.0.0.1:5000/v2/_catalog     //可以查看到推送上来的镜像

{"repositories":["centos"]} 此处的centos为推送上来后面的centos

f85fe8cf3479c92d3235ff55c47d54da98d.jpg

把镜像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

b32eb929638f5c45545a699f59b076fb3ff.jpg

八、Docker数据管理

容器由镜像启动,容器中会产生新的数据,关闭或删除容器,存储的数据也会删除,可以把宿主机的目录挂载到容器中去,会把数据存到宿主机的目录中去

1. 挂载本地的目录到容器里

docker run -tid -v /data/:/data centos_with_nettool bash     //-v 用来指定挂载目录,:前面的/data/为宿主机本地目录,:后面的/data/为容器里的目录,会在容器中自动创建,目录可以不同

此时容器中的目录和宿主机的目录相同,在容器中创建一个123目录,在容器上产生的新数据就会存到宿主机上

e3e21e1f7ae9b624dfdf94f90936a6c86de.jpg

2. 挂载数据卷
其实我们挂载目录的时候,可以指定容器name,如果不指定就随机定义了。比如上面我们没有指定,它就生成了一个名字为epic_mclean,这个名字可以使用命令 docker ps  看最右侧一列NAMES

docker run -itd --volumes-from epic_mclean centos bash  启动容器
docker exec -it 98a76f bash  进入容器

这样,我们使用centos镜像创建了新的容器,并且使用了 epic_mclean  容器的数据卷,此时新开启的容器数据和之前的容器数据是一致的
b108d78d96b5463cd5e16c80c1bf43ef3df.jpg

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

dc844d780e980c8326e4bebe2dd1348e10d.jpg

九、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

ebbc286b5526ea50c256340a8307861e562.jpg

十、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

6badbbf00ad01d09383c74b5a9809649e22.jpg

docker run -itd -p 8088:80 centos_th_nginx bash        //-p 可以指定端口映射,本例中将容器中的80端口映射为本地的8088端口

a91b998f3f8c8a757aa023b1a9cdceb48e1.jpg

十一、opration not permitted

启动nginx,报错:

26389f1d2430119745b4706de38478be3c4.jpg

原因:

新建的容器,启动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     在容器中进行测试

b93ca1cb9cff10e7efec78191c786957723.jpg

在宿主机上测试,需要使用8088端口

4b0725670e4ee0042d8f311117521e7959c.jpg

十二、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,可以配置多个

6fab458f1bc4d3e466e7e1c7681b9b3dee5.jpg

安装pipwork

cd 到根目录
git clone https://github.com/jpetazzo/pipework
cd pipework/
cp pipework /usr/local/bin/

87ce478d136984aca7a73b2192a97ba6dcd.jpg

开启一个容器 

docker run -itd --net=none centos_th_nginx bash        --net=none 不设置网络

docker exec -it d414127f43c8 bash

a3a80434ddd08665297862dc7ca8aff3af0.jpg

给容器增加ip

pipework br0 d414127f43c8 192.168.183.135/24@192.168.183.2        #192.168.183.135为容器的ip,@后面的ip为网关ip

92725adee89b48df77d312500a48925f723.jpg

此时到002机器上是可以ping通的,并且也可以连外网

5feeeaa01a07341c0d6ffe7c5220b72bbf2.jpg

e94b2b7161c44cf921babf7d6e97fdb31b2.jpg

转载于:https://my.oschina.net/u/4093217/blog/3080782

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值