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:用户要获取并下载镜像。

docker 注册表加速 docker register cloud_数据

情景B:用户要推送镜像到registry中.

docker 注册表加速 docker register cloud_数据_02

情景C:用户要从index或registry中删除镜像。

docker 注册表加速 docker register cloud_docker 注册表加速_03

实现一个简单的registry仓库

步骤:

  1. docker pull registry 拉取registry镜像
  2. 通过registry运行一个容器
    docker run -d --name registry -p 5000:5000 -v /opt/docker/registry:/var/lib/registry registry
  3. 本机推送镜像的过程
    1). docker tag yakexi007/game2048:latest localhost:5000/game2048:latest 对指定的镜像贴标签
    2). docker push localhost:5000/game2048 推送
    3). curl -XGET http://localhost:5000/v2/_catalog 查看仓库中含有的镜像

docker 注册表加速 docker register cloud_数据_04


curl -XGET http://172.25.3.3:5000/v2/game2048/tags/list

获取私人仓库中指定镜像game2048的tags


docker 注册表加速 docker register cloud_docker 注册表加速_05

  1. 其他主机推送镜像以及拉取镜像,在这我开启了装有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目录时,执行该命令

docker 注册表加速 docker register cloud_docker 注册表加速_06


将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

docker 注册表加速 docker register cloud_docker_07


运行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 注册表加速 docker register cloud_数据_08


docker pull reg.westos.org/game2048 拉取私人仓库的镜像

docker 注册表加速 docker register cloud_数据_09

Docker网络

Docker自动创建的三种网络

  • bridge: 桥接模式
    docker安装时会创建一个名为 docker0 的Linux bridge,新建的容器会自动桥接到这个接口。
    bridge模式下容器没有一个公有ip,只有宿主机可以直接访问,外部主机是不可见的,但容器通过宿主机的NAT规则后可以访问外网。
  • docker 注册表加速 docker register cloud_docker 注册表加速_10

  • 对于系统自带的桥接模式,是不支持dns解析的,但是通过–link参数是可以使容器支持dns解析功能,并且会传入环境变量
  • docker 注册表加速 docker register cloud_Docker_11

  • 注: 传递过来的环境变量不会随着被link的容器demo1 ip 的变化而变化, dns 解析会。
  • host: 主机模式
    和宿主机主机共享一个网络栈,host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。
    host网络模式需要在容器创建时指定--network=host :
  • docker 注册表加速 docker register cloud_docker_12

  • none: 无网络模式
    none模式是指禁用网络功能,只有lo接口,在容器创建时使用--network=none指定。
  • docker 注册表加速 docker register cloud_docker_13

Container 网络模式

Container网络模式是 Docker 中一种较为特别的网络的模式。处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通信。

docker 注册表加速 docker register cloud_Docker_14

自定义网络模式

  • bridge
    bridge驱动类似默认的bridge网络模式,但增加了一些新的功能DNS解析
  • overlay
  • macvlan
    overlay和macvlan是用于创建跨主机网络。
创建自定义网桥
  • 系统自动生成IP
  1. 创建自定义网桥:
  1. 自动提供解析的功能
  • 指定IP
  1. 创建自定义网桥时,可以指定它的网络段和网关
  1. 生成容器的时候,也可以指定该容器的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
实现步骤:

  1. 开启两台主机上网卡的混杂功能ip link set eth0 promisc on
  2. docker 注册表加速 docker register cloud_Docker_15


  3. 在server2和server3上加入相同配置的docker networkdocker network create -d macvlan --subnet 172.25.0.0/24 --gateway 172.25.0.1 -o parent=eth0 macvlan1
  4. 分别在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 文件系统中的某个路径
  • 不同点:

卷插件

简单实现一个底层用nfs实现文件共享

实验环境: 两台都安装了docker的虚拟机server2和server3,并且都有nginx镜像
实验步骤:

  1. 两台主机上都安装下载nfs工具yum install nfs-utils.x86_64 -y 在server3上建立一个/webdata目录
  2. 在server3上修改配置文件,并且exportfs -rv 使之生效,systemctl start nfs-server.service启动服务
[root@server3 ~]# cat /etc/exports
/webdata 	*(rw,no_root_squash)
  1. 在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

  1. 在server3上创建一个voll1,server2上会自动生成


    其实就是数据卷的形式,可以直接在运行容器的时候使用

测试:

docker run -d -it --name demo1 -p 80:80 -v voll1:/usr/share/nginx/html nginx

docker 注册表加速 docker register cloud_docker 注册表加速_16