docker

回复 收藏
本帖最后由 hazhuer 于 2016-6-20 16:33 编辑

docker是一个开源项目, 诞生于2013年初, 最初是dotCloud公司内部的一个业余项目。 它基于Google公司推出的Go语言实现。 项目后来加入了Linux基金会, 遵从了Apache 2.0协议, 项目代码在GitHub上进行维护.
在LXC的基础上Docker进行了进一步的封装, 让用户不需要去关心容器的管理, 使得操作更为简便。 用户操作Docker的容器就像操作一个快速轻量级的虚拟机一样简单。
Docker容器的启动可以在秒级实现, 这相比传统的虚拟机方式要快得多, 其次, Docker对系统资源的利用率很高, 一台主机上可以同时运行数千个Docker容器。
容器除了运行其中应用外, 基本不消耗额外的系统资源, 使得应用的性能很高, 同时系统的开销尽量小。 传统虚拟机方式运行10个不同的应用就要起10个虚拟机, 而Docker只需启动10个隔离的应用即可。

docker的特点:
1、更快速的交付和部署
2、更高效的虚拟化
3、更轻松的迁移和扩展
4、更简单的管理
5、启动秒级分钟级

docker的安装
centos6
# yum install -y epel-release
# yum install -y docker-io
# /etc/init.d/docker start

centos7
# yum install -y docker
# systemctl start docker

docker的镜像管理
docker images 查看本地有哪些镜像
例:# docker images
1、docker search 镜像名字 搜索docker仓库里面的docker镜像
例:docker search centos
2、docker tag 修改镜像名 (显示在REPOSITORY 这一列)
docker tag 原镜像名 自定义名
例:docker tag centos aming
其实是复制了一份镜像文件,除了名称和tag不同,IMAGE ID是相同的
3、docker tag 修改镜像名+tag
docker tag IMAGE_ID 自义定名:自定义TAG名
docker tag 原镜像名 自定义镜像名:自定义tag
例:docker tag centos:latest xp:aming
4、docker rmi 镜像名
docker rmi 镜像名:tag 删除一个镜像
例:docker rmi xp:aming
如果要删除修改过镜像名字或者tag的镜像,需要加上这个镜像的tag
当参数是MAGE ID时,需要注意是否存在相同的MAGE ID的镜像。
5、docker commit -m “自定义commit内容” -a “作者信息” CONNTATINER_ID 自定义名字 将一个修改过内容的容器保存为一个自定义镜像
例:docker commit -m “centos_with_httpd” -a "aming" 098cc5f075b3 centos_httpd
6、docker save 把一个现有的镜像导出到本地, Save命令用于持久化镜像(不是容器)
docker save -o 自定义镜像名字.tar 镜像名
docker save -o 自定义镜像名字.tar IMAGE_ID
例:docker save -o centos_httpd.tar centos_with_httpd
7、docker load --input 镜像名字.tar 将文件恢复到本地镜像(新建一个镜像文件)
例:docker load --input centos_httpd.tar
或者docker load < centos_httpd.tar
8、docker push IMAGE_NAME 把一个镜像上传到dockerhub.com
例:docker push centos_with_httpd
9、 docker version查看docker的版本号,包括客户端、服务端、依赖的Go等
例: docker version

docker容器管理
1、docker -ti 镜像名 /bin/bash 把下载下来的镜像开启容器
例:docker -ti centos /bin/bash
/bin/bash 表示在这个容器里面运行的一个命令 也可以直接写为 bash -i标示让容器的标准输入打开,-t标示分配一个伪终端,要把-i-t放到镜像名字前面。
-d 选项直接放到后台运行 如不加 -d ,exit后,这个容器会关闭
--name 自定义NAMES列显示的名字
-p 可以指定容器的映射端口 格式为 -p 宿主机端口:容器端口
2、docker create -it 镜像名 创建新的容器,但并不启动该容器
例:docker create -ti centos
3、docker start CONTAINER_ID/NAME 启动一个容器
docker stop CONTAINER_ID/NAME 关闭一个容器
例:docker start centos
docker stop centos
docker run 实际是先create容器后在start
4、docker exec -ti bash进入一个容器
例:docker exec -ti bash
5、docker ps 查看正在运行的容器
docker ps -a 查看全部容器
6、docker rm CONTAINER_ID/NAME 删除一个容器
例:docker rm centos_with_httpd
7、docker logs CONTAINER_ID 查看容器的日志
例:docker logs centos
8、docker export CONTAINER_ID > file.tar 导出容器
cat file.tar |docker import - 自定义镜像名字 导入容器
例:docker export 88d >aming_centos.tar 导出
cat file.tar | docker import - aming_centos 导入
Export命令用于持久化容器(不是镜像)
9、docker run -ti --rm 镜像名 bash 新建一个容器,退出时自动删除
例:docker run -ti --rm centos_httpd bash

docker仓库管理
registry是docker官方提供的镜像,可以用来创建本地的docker私有仓库
1、下载registry
docker pull registry
2、以registry来创建容器
docker run -d -p 5000:5000 registry -p后面跟映射的端口号(前面是宿主机的端口,后面是容器内部的端口),访问宿主机5000端口,就相当于访问该容器 ,通过docker ps查看PORTS列会显示0.0.0.0:5000->5000/tcp
-d 放到后台运行
3、把镜像上传到私有仓库
先标记一下tag,必须带有私有仓库的ip:port
docker tag 镜像名 私有库ip:port/镜像名
例:docker tag busybox 119.29.110.209:5000/busybox
修改vi /etc/init.d/docker
找到$exec -d,在后面添加--insecure-registry 本机IP:5000
然后重启docker
上传docker push 私有库ip:port的镜像名
例:docker push 119.29.110.209:5000/busybox
curl http://ip:port/v1/search 查看仓库中的镜像
例:http://119.29.110.209:5000/v1/search

dockerd的数据管理
1、把本地目录挂载到容器的目录
docker run -tid --name=centos_httpd -v /data/:/data1 镜像名字/IMAGE_ID bash
例:docker run -tid --name=centos_httpd -v /data/:/data1 xp:aming bash
-v 选项用来指定挂载(创建映射关系)的目录
/data/:/data/ 宿主机目录:容器目录 名字不一定要相同 只要自己指定好对应的目录就可以 宿主机要手动去创建这个目录 容器会自动生成这个目录
可以用其它容器在挂载到这个容器的目录上来,实现多个容器容器和本地目录同步、共享。如下例2
2、docker run -tid --volumes-from [name] bash
--volumes-from--volumes-from 后面跟容器名字(容器名字可以通过docker ps可以获取,最后一列)
在挂在目录时,我们可以指定数据来源容器的名字,让产生的新的容器共用一个目录。
例:docker run -tid --name=aming --volumes-from centos_httpd centos bash
3、数据卷容器:类似于nfs 创建一个容器挂载宿主机目录,其它容器都映射这个容器的该目录
docker run -tid -v /data/ --name 自定义容器名 镜像名/IMAGE_ID bash
例:docker run -tid -v /data/ --name centos_v centos_httpd bash
-v /data 此处的/data为容器的目录,不是本地的目录,意思是把这个容器的目录共享出去让其他容器挂载
在本列中没有映射到本地目录当中,怎么实现备份还原数据呢?
思路:如果数据卷1开启时未映射本地目录,创建容器2挂载 数据卷容器1 目录的同时,再去映射一个本地目录到自己的目录,用这个目录来作为桥梁。在 容器2 里面实现 数据卷容器1 的备份和还原。
docker run -itd --name 容器2 --volumes-from 容器1 -v /vol_data_backup/:/backup/ centos bash

docker的四中网络模式
host模式,docker使用的网络实际上和宿主机一样,在使用docker run 时使用--net=host指定
container模式,使用--net=container:container_id/container_name多个容器使用共同的网络,看到的ip是一样的
none模式,使用--net=none指定,这种模式下不会配置任何网络
bridge模式,使用--net=bridge指定,默认模式,会为每个容器分配一个独立的network namespase,类似vmware的nat模式,同一个宿主机下的所有容器会在同一个网段下,相互之间可以互相通信。
1、docker配置桥接网络(centos6)
cd /etc/sysconfig/network-scripts/ ; cp ifcfg-eth0 ifcfg-br0
vi ifcfg-eth0 增加BRIDGE=br0 TYPE=Ethernet BOOTPROTO=none
,删除IPADDR
ETMASK GATEWAY DNS
vi ifcfg-br0 修改DEVICE为br0, TYPE=Bridge BOOTPROTO=static
重启网卡 service network restart
安装git yum install -y git
git clone https://github.com/jpetazzo/pipework
cp pipework/pipework /usr/local/bin/
开启一个容器docker run -tid --net=none --name aming centos_http:http bash
更新包rpm -Uvhhttp://repos.fedorapeople.org/openstack/EOL/openstack-grizzly/epel-6/iproute-2.6.32-130.el6ost.netns.2.x86_64.rpm不然会报错Object“netns”is unknown,try“in help”
pipework br0 容器名 IP(跟br0在同一个网段)/24


pipwork工作原理
1、pipework检查是否存在br0网桥,如不存在,就自己创建。
2、创建veth pair设备,用于给容器提供网卡并连接到br0网桥
3、使用docker inspect找到容器在主机中的pid,通过pid将容器的网络命令链接到/var/run/netns/目录下。目的是方便在主机上使用ip netns命令配置容器的网络,docker中我们没有权限配置网络环境。
4、将之前创建的veth pair设备加入容器和网桥中,在容器中默认为eth1.可以通过命令pipework的参数-i修改名称。
5、然后配置新网卡的ip,如在ip地址后面加上网关地址,那么pipework会重新配置默认路由,这样容器通往外网的流量会经过新配置的eth1出去,而不是通过eth0和docker0.
部分来自:http://www.infoq.com/cn/articles/docker-network-and-pipework-open-source-explanation-practice

http://www.apelearn.com/bbs/forum.php?mod=viewthread&tid=11589&extra=&highlight=docker&page=1
2016-05-21 20:49 举报
已邀请:
0

hazhuer

赞同来自:

本帖最后由 hazhuer 于 2016-6-19 20:30 编辑

{:4_111:}

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: