关于Docker的一点总结
Docker简介
Docker是一个开源的应用容器引擎,可以把应用以及依赖包放到一个可移植的容器中,然后发布到任何流行的 Linux 系统上,通过这种方式实现虚拟化。
可以看出,Docker和VM比较,用Docker引擎替代了Hyper-v,没有Guest OS,应用是放到容器里,直接运行在宿主机的OS上。
这样做的好处是,各容器间虽然隔离,但共享系统资源和公用库,剥离了Gest OS这层,系统资源利用率更高,更轻量级。
Docker安装
yum方式:
docker容器最早受到RHEL完善的支持是从最近的CentOS 7.0开始的,官方说明是只能运行于64位架构平台,内核版本为2.6.32-431及以上(即>=CentOS 6.5)
需要注意的是CentOS 6.5与7.0的安装是有一点点不同的,CentOS-6上docker的安装包叫docker-io,并且来源于Fedora epel库,先要安装EPEL,而CentOS-7的docker直接包含在官方镜像源的 Extras仓库(CentOS-Base.repo下的[extras]节enable=1启用)
CentOS7中:
添加docker repo源
tee /etc/yum.repos.d/docker.repo << EOF
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
yum install docker-engine
Docker架构
Docker的基础用法
1.容器和镜像(/var/lib/docker/devicemapper/mnt)
查看版本
docker version
创建nginx的容器
在Docker Hub上查找nginx的镜像
docker search nginx
抓取镜像
docker pull nginx
查看当前镜像列表
docker images
创建容器并启动
docker run -d -p 80:80 --name cn1 nginx
解释一下各参数:
-d 放在后台执行
-p 主机端口:容器端口 将容器的端口映射到主机上,目的是可以直接对外提供访问
--name 指定容器名
查看正在运行的容器
docker ps
打开在浏览器访问http://IP,可以打开nginx的默认页面
这样一个nginx的容器创建完毕
结束容器
docker kill cn1
启动容器
docker start cn1
删除容器
docker rm cn1删除前需结束容器
2.数据管理
2.1数据卷
默认挂载点/var/lib/docker/volumes/
docker run -d --name=myos -v /opt/os:/tmp:ro -it centos /bin/bash
本地目录/opt/os挂载到容器中/tmp作为数据卷,默认读写权限,也可以指定只读ro。
2.2数据卷容器
docker run -d --name=myos1 centos --volumes-from myos -it /bin/bash
容器myos1中的挂载点为/tmp,容器myos1,myos都能看到双方在/tmp
中的内容。
2.3备份,恢复,迁移数据卷
备份:
docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
这样就将数据卷dbdata备份到本地的/backup/backup.tar.gz
恢复:
首选创建一个带有数据卷的容器dbdata2,将数据恢复到此容器
docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
然后创建另一个容器,挂载dbdata2的容器,解压备份文件到挂载的容器卷中
docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
3.镜像构建
3.1手动构建
在已有镜像基础上更新,创建新镜像
docker run -it ubuntu:15.10 /bin/bash
在该容器中进行更新操作后,提交为新镜像
docker commit -m="updated" -a="William" 容器id ubuntu:v2
这时使用docker images查看到生成的新镜像ubuntu:v2
3.2Dockerfile
eg:
FROM python
MAINTAINER WilliamWan
RUN mkdir /scripts
WORKDIR /scripts
ADD test.py test.py
RUN chmod +x test.py
EXPOSE 80
ENTRYPOINT ["test.py"]
在Dockerfile文件的同级目录下,也可以在.处指定Dockerfile的绝对路径,-t指定要创建的镜像名
docker build -t mypython .
4.网络管理
4.1网络模式
docker支持四种网络模式,使用--net选项指定:
1.host,--net=host,如果指定此模式,容器将不会获得一个独立的network namespace,而是和宿主机共用一个。容器将不会虚拟出自己的网卡,IP等,而是使用宿主机的IP和端口,也就是说如果容器是个web,那直接访问宿主机:端口,不需要做NAT转换,跟在宿主机跑web一样。容器中除了网络,其他都还是隔离的。
2.container,--net=container:NAME_or_ID,与指定的容器共同使用网络,也没有网卡,IP等,两个容器除了网络,其他都还是隔离的。
3.none ,--net=none,获得独立的network namespace,但是,并不为容器进行任何网络配置,需要我们自己手动配置。
4.bridge,--net=bridge,默认docker与容器使用nat网络,一般分配IP是172.17.0.0/16网段,要想改为其他网段,可以直接修改网桥IP地址,例如:
ifconfig docker0 192.168.10.1 netmask 255.255.255.0
4.2自定义网桥
自定义网桥:
停止服务,删除旧网桥
service docker stop
ip link set dev docker0 down
brctl delbr docker0
创建新网桥
brctl addbr bridge0
ip addr add 192.168.5.1/24 dev bridge0
ip link set dev bridge0 up
确认网桥创建并启动
ip addr show bridge0
配置docker配置文件
echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker
service docker start
4.3容器互联
容器的连接(linking)系统是除了端口映射外,另一种跟容器中应用交互的方式。
该系统会在源和接收容器之间创建一个隧道,接收容器可以看到源容器指定的信息。
使用 --link 参数可以让容器之间安全的进行交互。
先创建一个新的数据库容器
docker run -d -it --name db training/postgres /bin/bash
然后创建一个新的web容器,并将它连接到db容器
docker run -d -P -it --name web --link db:db training/webapp /bin/bash
此时,db 容器和 web 容器建立互联关系。
--link 参数的格式为 --link name:alias。
可以在父容器中通过env,/etc/hosts查看容器连接信息
4.4容器的跨主机连接
4.4.1使用网桥实现跨主机容器连接
网络拓扑
缺点很多,一般不用
优点:
- 配置简单,不依赖第三方软件
缺点:
- 与主机在同网段,需要小心划分IP地址
- 需要有网段控制权,在生产环境中不易实现
- 不易管理
- 兼容性不佳
4.4.2使用Open vSwitch实现跨主机容器连接
1.建立ovs网桥
查看ovs版本
ovs-vsctl show
建立一个名为obr0的网桥
ovs-vsctl add-br obr0
2.添加gre连接,接口名为gre0
ovs-vsctl add-port obr0 gre0
为接口设置类型和远程另一台主机的地址10.80.2.150
ovs-vsctl set interface gre0 type=gre options:remote_ip=10.80.2.150
3.为虚拟网桥添加ovs接口
brctl addif docker0 obr0
重启服务sudo service docker restart
另一台主机,只需更改remote_ip
4.4.3使用weave实现跨主机容器连接
1.安装weave
wget -O /usr/bin/weave https://raw.githubusercontent.com/zettio/weave/master/weave
chmod a+x /usr/bin/weave
2.启动weave路由器
weave launch
3.启动应用容器
直接weave run启动
weave run 容器ip -itd centos bash
或者
docker run -itd centos bash
weave attach 容器ip 容器id
此时还需在两台weave路由器之间建立连接
weave connect 对方宿主机ip
此时位于两台不同主机上的容器之间可以相互ping通了。但是处于不同子网的两个容器是不能互联的,这样我们就可以使用不同子网进行容器间的网络隔离了。
如果不使用Docker的原生网络,在容器内部是不能访问宿主机以及外部网络的。此时我们可以使用weave expose 192.168.0.1/24来给weave网桥添加IP,以实现容器与宿主机网络连通。但是,此时在容器内部依然不能访问外部网络。
我们可以同时使用Docker的原生网络和weave网络来实现容器互联及容器访问外网和端口映射。使用外部网络及端口映射的时候就使用docker0网桥,需要容器互联的时候就使用weave网桥。每个容器分配两个网卡。
5.Web界面管理平台shipyard
shipyard是一个集成管理docker容器、镜像、Registries的系统
官方在线部署脚本
curl -s https://shipyard-project.com/deploy | bash -s
访问: http://ip:8080
默认账号密码: admin/shipyard