Docker仓库
- Docker 仓库是用来包含镜像的位置,Docker提供一个注册服务器(Register)来保存多个仓库,每个仓库又可以包含多个具备不同tag的镜像。
- Docker运行中使用的默认仓库是 Docker Hub 公共仓库。
搭建Docker私人仓库
通过Docker公司提供的开源镜像,可以快速的搭建企业级别的私有仓库。
Registry工作原理
Docker Registry有三个角色,分别是index、registry和registry
client。
- index: 负责并维护有关用户帐户、镜像的校验以及公共命名空间的信息。
- registry: 是镜像和图表的仓库,它不具有本地数据库以及不提供用户认证,
通过Index Auth service的Token的方式进行认证。 - registry client: Docker充当registry客户端来维护推送和拉取,以及客户端的授权
情景A:用户要获取并下载镜像。情景B:用户要推送镜像到registry中.情景C:用户要从index或registry中删除镜像。
实现一个简单的registry仓库
步骤:
docker pull registry
拉取registry镜像- 通过registry运行一个容器
docker run -d --name registry -p 5000:5000 -v /opt/docker/registry:/var/lib/registry registry
- 本机推送镜像的过程
1).docker tag yakexi007/game2048:latest localhost:5000/game2048:latest
对指定的镜像贴标签
2).docker push localhost:5000/game2048
推送
3).curl -XGET http://localhost:5000/v2/_catalog
查看仓库中含有的镜像curl -XGET http://172.25.3.3:5000/v2/game2048/tags/list
获取私人仓库中指定镜像game2048的tags
- 其他主机推送镜像以及拉取镜像,在这我开启了装有docker的server2主机
需要在server2主机上的/etc/docker目录下创建一个daemon.json文件
{
“insecure-registries” : [“172.25.3.3:5000”]
}
重启服务,用docke info 查看
这样就可以实现push镜像
实现一个加密的并且需要认证的registry
使用自签名证书:
openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/westos.org.key -x509 -days 365 -out certs/westos.org.crt
需要在当前路径下有certs目录时,执行该命令
将westos.org.crt文件复制到/etc/docker/certs.d/reg.westos.org/ca.crt
, 每个Docker主机上。无需重启Docker。访问认证:
mkdir /opt/auth
建立个认证文件目录
yum install httpd-tools
下载工具生成认证密码文件
生成密码认证文件:htpasswd -cBb auth/htpasswd snji westos
运行registry容器
[root@server3 opt]# docker run -d --restart=always --name registry \
> -v /opt/certs:/certs \
> -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
> -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/westos.org.crt \
> -e REGISTRY_HTTP_TLS_KEY=/certs/westos.org.key \
> -v /opt/auth:/auth \
> -v /opt/registry:/var/lib/registry \
> -e "REGISTRY_AUTH=htpasswd" \
> -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
> -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
> -p 443:443 \
> registry
需要修改/etc/docker/daemon.json文件,需要重新加载docker
[root@server3 ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://reg.westos.org"]
}
在/etc/hosts文件中做好对reg.westos.org的解析,实现上传和拉取
docker login reg.westos.org
登陆私人仓库
docker tag yakexi007/game2048:latest reg.westos.org/game2048:latest
修改标签
docker push reg.westos.org/game2048
推送镜像
curl -XGET https://reg.westos.org/v2/_catalog -k -u snji
查看私人镜像仓库里含有的镜像
docker pull reg.westos.org/game2048
拉取私人仓库的镜像
Docker网络
Docker自动创建的三种网络
- bridge: 桥接模式
docker安装时会创建一个名为 docker0 的Linux bridge,新建的容器会自动桥接到这个接口。
bridge模式下容器没有一个公有ip,只有宿主机可以直接访问,外部主机是不可见的,但容器通过宿主机的NAT规则后可以访问外网。 - 对于系统自带的桥接模式,是不支持dns解析的,但是通过–link参数是可以使容器支持dns解析功能,并且会传入环境变量
- 注: 传递过来的环境变量不会随着被link的容器demo1 ip 的变化而变化, dns 解析会。
- host: 主机模式
和宿主机主机共享一个网络栈,host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。
host网络模式需要在容器创建时指定--network=host : - none: 无网络模式
none模式是指禁用网络功能,只有lo接口,在容器创建时使用--network=none指定。
Container 网络模式
Container网络模式是 Docker 中一种较为特别的网络的模式。处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通信。
自定义网络模式
- bridge
bridge驱动类似默认的bridge网络模式,但增加了一些新的功能DNS解析 - overlay
- macvlan
overlay和macvlan是用于创建跨主机网络。
创建自定义网桥
- 系统自动生成IP
- 创建自定义网桥:
- 自动提供解析的功能
- 指定IP
- 创建自定义网桥时,可以指定它的网络段和网关
- 生成容器的时候,也可以指定该容器的ip,此时demo1和demo2 获得的ip不再同一个网段下,可以通过
docker network connect my_net1 demo2
命令给demo2添加一块my_net1 的网卡,就可以使得两个容器之间可以互相通信
容器访问外网
- 通过iptables的SNAT实现的
外网访问容器
端口映射 -p 选项指定映射端口
外网访问容器用到了docker-proxy和iptables DNAT
- 宿主机访问本机容器使用的是iptables DNAT
- 外部主机访问容器或容器之间的访问是docker-proxy实现
跨主机网络解决方案
- docker原生的overlay和macvlan
- 第三方的flannel、weave、calico
macvlan网络实现
- LInux kernel提供的一种网卡虚拟化技术。
- 无需Linux bridge,直接使用物理接口,性能极好。
实验环境: 两台装有docker-ce 的虚拟机server2和server3
实现步骤:
- 开启两台主机上网卡的混杂功能
ip link set eth0 promisc on
- 在server2和server3上加入相同配置的docker network
docker network create -d macvlan --subnet 172.25.0.0/24 --gateway 172.25.0.1 -o parent=eth0 macvlan1
- 分别在server2和server3主机启动同一vlan下不同ip的容器,测试是否互通。
容器的接口直接与主机网卡连接,无需NAT或端口映射。
- macvlan会独占主机网卡,但可以使用vlan子接口实现多macvlan网络
- vlan可以将物理二层网络划分为4094个逻辑网络,彼此隔离, vlan id取值为1~4094
Docker 数据卷
Docker 原生的两种数据卷
docker数据卷
- 数据卷是目录或文件,不是块设备。
- 容器可以读写volume中的数据。
- volume数据可以持久化保存。
docker提供了两种卷:
- bind mount
- docker managed volume
bind mount:
- 是将主机上的目录或文件mount到容器里。
- 使用直观高效,易于理解。
- 使用 -v 选项指定路径,
- bind mount 默认权限是读写rw,可以在挂载时指定只读ro(通过
:ro
实现)
docker managed volume:
- bind mount必须指定host文件系统路径,限制了移植性。
- docker managed volume 不需要指定mount源。会自动生成在
/var/lib/docker/volumes/
目录下
bind mount与docker managed volume对比
- 相同点: 两者都是 host 文件系统中的某个路径
- 不同点:
卷插件
- docker 卷默认使用的是local类型的驱动,只能存在宿主机, 跨主机的volume就需要使用第三方的驱动,可以查看一链接:
https://docs.docker.com/engine/extend/legacy_plugins/#volume-plugins - docker官方只提供了卷插件的api,开发者可以根据实际需求定制卷插件驱动
https://docs.docker.com/engine/extend/plugins_volume/#volume-plugin-protocol
简单实现一个底层用nfs实现文件共享
实验环境: 两台都安装了docker的虚拟机server2和server3,并且都有nginx镜像
实验步骤:
- 两台主机上都安装下载nfs工具
yum install nfs-utils.x86_64 -y
在server3上建立一个/webdata目录- 在server3上修改配置文件,并且
exportfs -rv
使之生效,systemctl start nfs-server.service
启动服务
[root@server3 ~]# cat /etc/exports
/webdata *(rw,no_root_squash)
- 在server2主机上
systemctl start rpcbind
启动服务,并且挂载
链接: convy.tar.gz 提取码: fv6y
4.在server2和server3主机上进行下面相同的操作
tar zxf convoy.tar.gz
进入到解压后的目录,并执行mv convoy* /usr/local/bin/
再执行convoy daemon --drivers vfs --driver-opts vfs.path=/webdata &
并且建立一个 /etc/docker/plugins目录,echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
- 在server3上创建一个voll1,server2上会自动生成
其实就是数据卷的形式,可以直接在运行容器的时候使用
测试:
docker run -d -it --name demo1 -p 80:80 -v voll1:/usr/share/nginx/html nginx