Docker 系统基础 (续) (二)

版权声明:博客追求原创,如果有借鉴尽量都在文后注明 https://blog.csdn.net/DefaultTest/article/details/88787143

博文涉及内容一览表:

1 Docker概览
2 Docker版本安装与介绍(略)
3

镜像

4 容器
5 镜像与容器
6 网络管理
7 数据卷
8 仓库
9 Dockerfile
10 Docker Compose

第六章 docker核心技术--网络管理

为什么需要docker网络管理

容器的网络默认与宿主机、与其他容器都是相互隔离。
容器中可以运行一些网络应用(如nginx、web应用、数据库等),如果要让外部也可以访问这些容器内运行的网络应用,那么就需要配置网络来实现。
有可能有的需求下,容器不想让它的网络与宿主机、与其他容器隔离。
有可能有的需求下,容器根本不需要网络。
有可能有的需求下,容器需要更高的定制化网络(如定制特殊的集群网络、定制容器间的局域网)。
有可能有的需求下, 容器数量特别多,体量很大的一系列容器的网络管理如何
……

因此容器的网络管理是非常重要的

------------------
容器网络管理:
-不设置隔离   => 性能最高
自带5种网络驱动模式
-可以手动安装别的模式

docker网络默认5种驱动模式

Docker有五种网络驱动模式
bridge network 模式(网桥):默认的网络模式。类似虚拟机的nat模式
host network 模式(主机):容器与宿主机之间的网络无隔离,即容器直接使用宿主机网络
None network 模式:容器禁用所有网络。
Overlay network 模式(覆盖网络): 利用VXLAN实现的bridge模式
Macvlan network 模式:容器具备Mac地址,使其显示为网络上的物理设备

查看网络 docker network ls

作用:
	查看已经建立的网络对象
命令格式:
	docker network ls [OPTIONS]
命令参数(OPTIONS):
	-f, --filter filter   		过滤条件(如 'driver=bridge’)
	    --format string   	格式化打印结果
	    --no-trunc        	不缩略显示
	-q, --quiet          	 	只显示网络对象的ID
注意:
	默认情况下,docker安装完成后,会自动创建bridge、host、none三种网络驱动
[root@izuf6csxy0jrgs3azvia67z ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
6d052b504ac7        bridge              bridge              local
a468c0a23faf        host                host                local
47d7fe0d3f46        none                null                local
[root@izuf6csxy0jrgs3azvia67z ~]# docker network ls -f 'driver=host'
NETWORK ID          NAME                DRIVER              SCOPE
a468c0a23faf        host                host                local

创建网络 docker network

作用:
	创建新的网络对象
命令格式:
	docker network create [OPTIONS] NETWORK
命令参数(OPTIONS):
	-d, --driver string        		指定网络的驱动(默认 "bridge")
	    --subnet strings       		指定子网网段(如192.168.0.0/16、172.88.0.0/24)
	    --ip-range strings     		执行容器的IP范围,格式同subnet参数
	    --gateway strings      		子网的IPv4 or IPv6网关,如(192.168.0.1)
注意:
	host和none模式网络只能存在一个
	docker自带的overlay 网络创建依赖于docker swarm(集群负载均衡)服务
	192.168.0.0/16 等于 192.168.0.0~192.168.255.255    192.168.8.0/24
	172.88.0.0/24 等于 172.88.0.0~172.88.0.255
Create a network

Options:
      --attachable           Enable manual container attachment
      --aux-address map      Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[])
      --config-from string   The network from which copying the configuration
      --config-only          Create a configuration only network
  -d, --driver string        Driver to manage the Network (default "bridge")
      --gateway strings      IPv4 or IPv6 Gateway for the master subnet
      --ingress              Create swarm routing-mesh network
      --internal             Restrict external access to the network
      --ip-range strings     Allocate container ip from a sub-range
      --ipam-driver string   IP Address Management Driver (default "default")
      --ipam-opt map         Set IPAM driver specific options (default map[])
      --ipv6                 Enable IPv6 networking
      --label list           Set metadata on a network
  -o, --opt map              Set driver specific options (default map[])
      --scope string         Control the network's scope
      --subnet strings       Subnet in CIDR format that represents a network segment
[root@izuf6csxy0jrgs3azvia67z ~]# docker network create -d bridge my-bridge
204abef6d8250b2e3d264ff00ca7844a34fb525c9f4bc0d6b609cd5658eb32b0
[root@izuf6csxy0jrgs3azvia67z ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
6d052b504ac7        bridge              bridge              local
a468c0a23faf        host                host                local
204abef6d825        my-bridge           bridge              local
47d7fe0d3f46        none                null                local

# docker默认的是 bridge
[root@izuf6csxy0jrgs3azvia67z ~]# docker network create -d host my-bridge
Error response from daemon: network with name my-bridge already exists
[root@izuf6csxy0jrgs3azvia67z ~]# docker network create -d host my-bridge2
Error response from daemon: only one instance of "host" network is allowed

#依赖集群,需要先启动 swarm
[root@izuf6csxy0jrgs3azvia67z ~]# docker network create -d overlay my-bridge2
Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.

# host 和 null 只能存在一个
[root@izuf6csxy0jrgs3azvia67z ~]# docker network create -d null my-bridge2
Error response from daemon: only one instance of "null" network is allowe

网络删除 docker network rm

作用:
	删除一个或多个网络
命令格式:
	docker network rm NETWORK [NETWORK...]
命令参数(OPTIONS):
	无
[root@izuf6csxy0jrgs3azvia67z ~]# docker network rm 204a
204a
[root@izuf6csxy0jrgs3azvia67z ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
6d052b504ac7        bridge              bridge              local
a468c0a23faf        host                host                local
47d7fe0d3f46        none                null                local

查看网络详细信息 docker network inspect

作用:
	查看一个或多个网络的详细信息
命令格式:
	docker network inspect [OPTIONS] NETWORK [NETWORK...]
      或者 docker inspect [OPTIONS] NETWORK [NETWORK...]
命令参数(OPTIONS):
	-f, --format string   	根据format输出结果
 [root@izuf6csxy0jrgs3azvia67z ~]# docker network inspect -h
 Flag shorthand -h has been deprecated, please use --help
 ​
 Usage:  docker network inspect [OPTIONS] NETWORK [NETWORK...]
 ​
 Display detailed information on one or more networks
 ​
 Options:
   -f, --format string   Format the output using the given Go template
   -v, --verbose         Verbose output for diagnostics
 [root@izuf6csxy0jrgs3azvia67z ~]# docker inspect 6d05
 [
     {
         "Name": "bridge",
         "Id": "6d052b504ac75a7f072529b0439f8f3b3d685a68334955bea3929515df71f639",
         "Created": "2019-03-16T17:01:50.101348476+08:00",
         "Scope": "local",
         "Driver": "bridge",
         "EnableIPv6": false,
         "IPAM": {
             "Driver": "default",
             "Options": null,
             "Config": [
                 {
                     "Subnet": "172.17.0.0/16",
                     "Gateway": "172.17.0.1"
                 }
             ]
         },
         "Internal": false,
         "Attachable": false,
         "Ingress": false,
         "ConfigFrom": {
             "Network": ""
         },
         "ConfigOnly": false,
         "Containers": {},
         "Options": {
             "com.docker.network.bridge.default_bridge": "true",
             "com.docker.network.bridge.enable_icc": "true",
             "com.docker.network.bridge.enable_ip_masquerade": "true",
             "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
             "com.docker.network.bridge.name": "docker0",
             "com.docker.network.driver.mtu": "1500"
         },
         "Labels": {}
     }
 ]
 [root@izuf6csxy0jrgs3azvia67z ~]# docker inspect -f "{{json IPAM.Config.Gateway}}" 6d05
 Template parsing error: template: :1: function "IPAM" not defined
 # 下面的Gateway不是一个对象    ---> 存疑
 [root@izuf6csxy0jrgs3azvia67z ~]# docker inspect -f "{{json .IPAM.Config.Gateway}}" 6d05
 Template parsing error: template: :1:12: executing "" at <.IPAM.Config.Gateway>: can't evaluate field Gateway in type interface {}
 [root@izuf6csxy0jrgs3azvia67z ~]# docker inspect -f "{{json .IPAM.Config}}" 6d05
 [{"Subnet":"172.17.0.0/16","Gateway":"172.17.0.1"}]

使用网络 docker run --network

docker 的网络使用是基于 容器 的 , 所以使用的是 docker run 加 --network 选项的方式

 作用:
     为启动的容器指定网络模式
 命令格式:
     docker run/create --network NETWORK
 命令参数(OPTIONS):
     无
 注意:
     默认情况下,docker创建或启动容器时,会默认使用名称为bridge的网络
 [root@izuf6csxy0jrgs3azvia67z ~]# docker network create -d bridge my-bridge
 fb089483b6b4f554580487bdcbf645e0f09272fb1b7313879f910302f1fcf96b
 [root@izuf6csxy0jrgs3azvia67z ~]# docker network ls
 NETWORK ID          NAME                DRIVER              SCOPE
 6d052b504ac7        bridge              bridge              local
 a468c0a23faf        host                host                local
 fb089483b6b4        my-bridge           bridge              local
 47d7fe0d3f46        none                null                local
 [root@izuf6csxy0jrgs3azvia67z ~]# docker run --network my-bridge -dti centos bash
 a0a310e8849e94147d508513af3ebaaee14c4d1d09639ca4186dac4d11ca6b2e
 [root@izuf6csxy0jrgs3azvia67z ~]# docker exec a0a3 ping baidu.com
 PING baidu.com (123.125.115.110) 56(84) bytes of data.
 64 bytes from 123.125.115.110 (123.125.115.110): icmp_seq=1 ttl=50 time=25.1 ms
 64 bytes from 123.125.115.110 (123.125.115.110): icmp_seq=2 ttl=50 time=25.1 ms
 64 bytes from 123.125.115.110 (123.125.115.110): icmp_seq=3 ttl=50 time=25.2 ms
 ​
 # 默认的网络是 bridge
 --network string                 Connect a container to a network (default "default")

网络连接和断开 docker network connect / disconnect

作用:
	将指定容器与指定网络进行连接或者断开连接
命令格式:
	docker network connect [OPTIONS] NETWORK CONTAINER
	docker network disconnect [OPTIONS] NETWORK CONTAINER
命令参数(OPTIONS):
	-f, --force   		强制断开连接(用于disconnect)
[root@izuf6csxy0jrgs3azvia67z ~]# docker inspect a0a3
[
    {
...
            "Networks": {
                "bridge": {
                    "IPAMConfig": {},
                    "Links": null,
                    "Aliases": [],
                    "NetworkID": "6d052b504ac75a7f072529b0439f8f3b3d685a68334955bea3929515df71f639",
                    "EndpointID": "c0baa058cc0efa0097abe7cbaf43b33d0e96faa1e27302d573447fc2613bf5fb",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                },
                "my-bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": [
                        "a0a310e8849e"
                    ],
                    "NetworkID": "fb089483b6b4f554580487bdcbf645e0f09272fb1b7313879f910302f1fcf96b",
                    "EndpointID": "69d79b6fdf55e689f71e0d4750a17d97d8a46b935a981359bb0f10319e148642",
                    "Gateway": "172.20.0.1",
                    "IPAddress": "172.20.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:14:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]
[root@izuf6csxy0jrgs3azvia67z ~]# docker network disconnect my-bridge a0a3
[root@izuf6csxy0jrgs3azvia67z ~]# docker inspect a0a3
[
    {
...
"Networks": {
                "bridge": {
                    "IPAMConfig": {},
                    "Links": null,
                    "Aliases": [],
                    "NetworkID": "6d052b504ac75a7f072529b0439f8f3b3d685a68334955bea3929515df71f639",
                    "EndpointID": "c0baa058cc0efa0097abe7cbaf43b33d0e96faa1e27302d573447fc2613bf5fb",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]
[root@izuf6csxy0jrgs3azvia67z ~]# docker network disconnect bridge a0a3
[root@izuf6csxy0jrgs3azvia67z ~]# docker inspect a0a3
[
    {
...
            "Networks": {}
        }
    }
]
# 存在问题: connect|disconnect 不能用于 host 网络的驱动
[root@izuf6csxy0jrgs3azvia67z ~]# docker network connect bridge a0a3
[root@izuf6csxy0jrgs3azvia67z ~]# docker network connect host a0a3
Error response from daemon: container cannot be disconnected from host network or connected to host network
#docker 容器和网路连接不能同时存在 none 和 bridge
[root@izuf6csxy0jrgs3azvia67z ~]# docker network connect none a0a3
Error response from daemon: container cannot be connected to multiple networks with one of the networks in private (none) mode
# 可以存在多个 bridge 桥接网络
#其他还有 overlay  macvlan  

docker 网络模式简介

此部分内容, 留待深入研究

bridge 网络模式

特点:
宿主机上需要单独的bridge网卡,如默认docker默认创建的docker0。
容器之间、容器与主机之间的网络通信,是借助为每一个容器生成的一对veth pair虚拟网络设备对,进行通信的。一个在容器上,另一个在宿主机上。
每创建一个基于bridge网络的容器,都会自动在宿主机上创建一个veth**虚拟网络设备。
外部无法直接访问容器。需要建立端口映射才能访问。
容器借由veth虚拟设备通过如docker0这种bridge网络设备进行通信。
每一容器具有单独的IP

bridge 网络模式 - 端口映射

作用:
	启动的容器时,为容器进行端口映射
命令格式:
	docker run/create -P …
      或者 docker run/create –p …
命令参数(OPTIONS):
	-P, --publish-all		将容器内部所有暴露端口进行随机映射
	-p, --publish list 	手动指定端口映射
注意:
	-p [HOST_IP]:[HOST_PORT]:CONTAINER_PORT
	如:-p ::80		将容器的80端口随机(端口)映射到宿主机任意IP
	       -p :8000:6379 	将容器的6379端口映射到宿主机任意IP的8000端口
	       -p 192.168.5.1::3306	将容器的3306端口随机(端口)映射到宿主机的192.168.5.1IP上

host 网络模式

特点:
容器完全共享宿主机的网络。网络没有隔离。宿主机的网络就是容器的网络。
容器、主机上的应用所使用的端口不能重复。例如:如果宿主机已经占用了8090端口,那么任何一个host模式的容器都不可以使用8090端口了;反之同理。
外部可以直接访问容器,不需要端口映射。
容器的IP就是宿主机的IP

特殊的 host 网络模式 (Container 网络模式)

Container网络模式,其实就是容器共享其他容器的网络。
相当于该容器,,在网络层面上,将其他容器作为“主机”。它们之间的网络没有隔离。
这些容器之间的特性同host模式。
使用方法:
	Docker run/create --network container:CONTAINER …

none 网络模式

特点:
容器上没有网络,也无任何网络设备。
如果需要使用网络,需要用户自行安装与配置。
应用场景
该模式适合需要高度定制网络的用户使用。

overlay 网络模式

Overlay 网络,也称为覆盖网络。
Overlay 网络的实现方式和方案有多种。Docker自身集成了一种,基于VXLAN隧道技术实现。
Overlay 网络主要用于实现跨主机容器之间的通信。
应用场景:需要管理成百上千个跨主机的容器集群的网络时

overlay 网络实现原理

IP隧道网络原理

macvlan 网络模式

macvlan网络模式,最主要的特征就是他们的通信会直接基于mac地址进行转发。
这时宿主机其实充当一个二层交换机。Docker会维护着一个MAC地址表,当宿主机网络收到一个数据包后,直接根据mac地址找到对应的容器,再把数据交给对应的容器。
容器之间可以直接通过IP互通,通过宿主机上内建的虚拟网络设备(创建macvlan网络时自动创建),但与主机无法直接利用IP互通。
应用场景:由于每个外来的数据包的目的mac地址就是容器的mac地址,这时每个容器对于外面网络来说就相当于一个真实的物理网络设备。因此当需要让容器来的网络看起来是一个真实的物理机时,使用macvlan模式

第七章 Dokcer 核心技术 --数据卷

为什么使用数据卷

宿主机无法直接访问容器中的文件
容器中的文件没有持久化,导致容器删除后,文件数据也随之消失
容器之间也无法直接访问互相的文件
为解决这些问题,docker加入了数据卷(volumes)机制,能很好解决上面问题,以实现:
容器与主机之间、容器与容器之间共享文件
容器中数据的持久化
将容器中的数据备份、迁移、恢复等

数据卷的特点

数据卷存在于宿主机的文件系统中,独立于容器,和容器的生命周期是分离的。
数据卷可以目录也可以是文件,容器可以利用数据卷与宿主机进行数据共享,实现了容器间的数据共享和交换。
容器启动初始化时,如果容器使用的镜像包含了数据,这些数据会拷贝到数据卷中。
容器对数据卷的修改是实时进行的。
数据卷的变化不会影响镜像的更新。数据卷是独立于联合文件系统,镜像是基于联合文件系统。镜像与数据卷之间不会有相互影响。

docker 数据卷管理

docker 挂载容器数据卷的三种方式

-bind mounts:将宿主机上的一个文件或目录被挂载到容器上。
-volumes:由Docker创建和管理。使用docker volume命令管理
-tmpfs mounts:tmpfs 是一种基于内存的临时文件系统。tmpfs mounts 数据不会存储在磁盘上。

bind mounts 方式挂载数据卷

利用docker run/create的参数为容器挂载数据卷
用法:
	方式一: -v, --volume参数
	    	-v 宿主机文件或文件夹路径:容器中的文件或者文件夹路径
	方式二:--mount参数
	   	--mount type=bind, src=宿主机文件或文件夹路径, dst=容器中的文件或者文件夹路径
	   	注意:src指定的文件和路径必须提前创建或存在
[root@izuf6csxy0jrgs3azvia67z ~]# docker run -dti -v /root/home/d_dir:/root/c_dir centos
949cd46f665a4bdeb404dd6d7e28350d91c019cbd702131ed5f1f913ec17899f
[root@izuf6csxy0jrgs3azvia67z ~]# pwd
/root
[root@izuf6csxy0jrgs3azvia67z ~]# cd home/d_dir/
[root@izuf6csxy0jrgs3azvia67z d_dir]# ls -a
.  
..
[root@izuf6csxy0jrgs3azvia67z d_dir]# docker exec 949c touch /root/c_dir/test.txt
[root@izuf6csxy0jrgs3azvia67z d_dir]# ll
total 0
-rw-r--r--1 root root 0 Mar 22 14:44 test.txt

-v 和 --mount 方式的区别: 前者在src目录不存在的时候自动创建对应的目录而不会报错. 而 --mount 的src指定的目录必须存在; 同时前者是通过:来分隔, 后者是通过k=v, 来分割.

[root@izuf6csxy0jrgs3azvia67z d_dir]# docker run -dti --mount type=bind,src=/root/home/mount_dir,dst=/root/c2_dir centos
docker: Error response from daemon: invalid mount config for type "bind": bind source path does not exist: /root/home/mount_dir.
See 'docker run --help'.
[root@izuf6csxy0jrgs3azvia67z d_dir]# cd ~
[root@izuf6csxy0jrgs3azvia67z ~]# pwd
/root
[root@izuf6csxy0jrgs3azvia67z ~]# cd home/
[root@izuf6csxy0jrgs3azvia67z home]# mkdir mount_dir
[root@izuf6csxy0jrgs3azvia67z home]# docker run -dti --mount type=bind,src=/root/home/mount_dir,dst=/root/c2_dir centos
fae6aa9af6149691fce728817810c5da133975d1ec192477352a92fe5468afea
[root@izuf6csxy0jrgs3azvia67z home]# docker exec fae6 touch /root/c2_dir/test2.txt
[root@izuf6csxy0jrgs3azvia67z home]# ll
total 8
drwxr-xr-x 2 root root 4096 Mar 22 14:44 d_dir
drwxr-xr-x 2 root root 4096 Mar 22 14:50 mount_dir
[root@izuf6csxy0jrgs3azvia67z home]# cd mount_dir/
[root@izuf6csxy0jrgs3azvia67z mount_dir]# ll
total 0
-rw-r--r--1 root root 0 Mar 22 14:50 test2.txt

volumes方式挂载数据卷

volumes方式挂载数据卷 相当于 对 bind方式的 进一步封装, 默认src=/var/lib/docker/volumes/volume_name,

利用docker run/create为容器挂载数据卷
用法:
	方式一: -v, --volume参数
	    	-v VOLUME-NAME:容器中的文件或者文件夹路径
	方式二:--mount 参数
		--mount type=volume, src=VOLUME-NAME, dst=容器中的文件或者文件夹路径
volume对象管理:
	docker volume 命令管理volume数据卷对象
	docker volume create		创建数据卷对象
	docker volume inspect		查看数据卷详细信息
	docker volume ls			查看已创建的数据卷对象
	docker volume prune		删除未被使用的数据卷对象
	docker volume rm		删除一个或多个数据卷对象
 [root@izuf6csxy0jrgs3azvia67z volumes]# docker volume -h
 Flag shorthand -h has been deprecated, please use --help
 ​
 Usage:  docker volume COMMAND
 ​
 Manage volumes
 ​
 Commands:
   create      Create a volume
   inspect     Display detailed information on one or more volumes
   ls          List volumes
   prune       Remove all unused local volumes
   rm          Remove one or more volumes
 ​
 Run 'docker volume COMMAND --help' for more information on a command.
 [root@izuf6csxy0jrgs3azvia67z volumes]# docker volume create -h
 Flag shorthand -h has been deprecated, please use --help
 ​
 Usage:  docker volume create [OPTIONS] [VOLUME]
 ​
 Create a volume
 ​
 Options:
   -d, --driver string   Specify volume driver name (default "local")
       --label list      Set metadata for a volume
   -o, --opt map         Set driver specific options (default map[])
 [root@izuf6csxy0jrgs3azvia67z volumes]# docker volume create volume-1
 volume-1
 [root@izuf6csxy0jrgs3azvia67z volumes]# docker volume ls
 DRIVER              VOLUME NAME
 local               e0a05aa123e7b787769af6cee9cb9f0b26bc0b4299d4045eacd2251f855e07d5
 local               volume-1
 [root@izuf6csxy0jrgs3azvia67z volumes]# docker volume inspect -h
 Flag shorthand -h has been deprecated, please use --help
 ​
 Usage:  docker volume inspect [OPTIONS] VOLUME [VOLUME...]
 ​
 Display detailed information on one or more volumes
 ​
 Options:
   -f, --format string   Format the output using the given Go template
 [root@izuf6csxy0jrgs3azvia67z volumes]# docker volume inspect volume-1
 [
     {
         "CreatedAt": "2019-03-22T15:58:29+08:00",
         "Driver": "local",
         "Labels": {},
         "Mountpoint": "/var/lib/docker/volumes/volume-1/_data",
         "Name": "volume-1",
         "Options": {},
         "Scope": "local"
     }
 ]
 [root@izuf6csxy0jrgs3azvia67z volumes]# ll /var/lib/docker/volumes/volume-1/_data
 total 0
 [root@izuf6csxy0jrgs3azvia67z volumes]# docker run -dti -v volume-2:/root/c3_dir centos
 70e105ea449fc28edc2d44eb8922882938fa4138f952717aa462acedbe8627c6
 [root@izuf6csxy0jrgs3azvia67z volumes]# docker volume ls
 DRIVER              VOLUME NAME
 local               e0a05aa123e7b787769af6cee9cb9f0b26bc0b4299d4045eacd2251f855e07d5
 local               volume-1
 local               volume-2
 ​
 # docker voluem对象 的管理命令: create ls inspect prune rm 等.
 [root@izuf6csxy0jrgs3azvia67z volumes]# docker volume prune -h
 Flag shorthand -h has been deprecated, please use --help
 ​
 Usage:  docker volume prune [OPTIONS]
 ​
 Remove all unused local volumes
 ​
 Options:
       --filter filter   Provide filter values (e.g. 'label=<label>')
   -f, --force           Do not prompt for confirmation
 [root@izuf6csxy0jrgs3azvia67z volumes]# docker volume ls
 DRIVER              VOLUME NAME
 local               e0a05aa123e7b787769af6cee9cb9f0b26bc0b4299d4045eacd2251f855e07d5
 local               volume-1
 local               volume-2
 [root@izuf6csxy0jrgs3azvia67z volumes]# docker volume ls
 DRIVER              VOLUME NAME
 local               e0a05aa123e7b787769af6cee9cb9f0b26bc0b4299d4045eacd2251f855e07d5
 local               volume-1
 local               volume-2
 [root@izuf6csxy0jrgs3azvia67z volumes]# docker ps -a
 CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
 70e105ea449f        centos              "/bin/bash"         7 minutes ago       Up 7 minutes                            pedantic_easley
 fae6aa9af614        centos              "/bin/bash"         About an hour ago   Up About an hour                        awesome_cartwright
 949cd46f665a        centos              "/bin/bash"         About an hour ago   Up About an hour                        xenodochial_bhaskara
 [root@izuf6csxy0jrgs3azvia67z volumes]# docker stop -t 0 70e1
 70e1
 [root@izuf6csxy0jrgs3azvia67z volumes]# docker ps -a
 CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
 70e105ea449f        centos              "/bin/bash"         7 minutes ago       Exited (137) 2 seconds ago                       pedantic_easley
 fae6aa9af614        centos              "/bin/bash"         About an hour ago   Up About an hour                                 awesome_cartwright
 949cd46f665a        centos              "/bin/bash"         About an hour ago   Up About an hour                                 xenodochial_bhaskara
 [root@izuf6csxy0jrgs3azvia67z volumes]# docker volume prune -h
 Flag shorthand -h has been deprecated, please use --help
 ​
 Usage:  docker volume prune [OPTIONS]
 ​
 Remove all unused local volumes
 ​
 Options:
       --filter filter   Provide filter values (e.g. 'label=<label>')
   -f, --force           Do not prompt for confirmation
 [root@izuf6csxy0jrgs3azvia67z volumes]# docker volume prune
 WARNING! This will remove all local volumes not used by at least one container.
 Are you sure you want to continue? [y/N] y
 Deleted Volumes:
 e0a05aa123e7b787769af6cee9cb9f0b26bc0b4299d4045eacd2251f855e07d5
 volume-1
 ​
 Total reclaimed space: 0B
 [root@izuf6csxy0jrgs3azvia67z volumes]# docker volume ls
 DRIVER              VOLUME NAME
 local               volume-2

tmpfs mount 方式挂载数据卷

基于内存的临时文件系统

利用docker run/create为容器挂载数据卷
用法:
	--mount type=tmpfs, dst=PATH
[root@izuf6csxy0jrgs3azvia67z volumes]# docker run -dti --mount type=tmpfs,dst=/root/c_dir centos
7b05fc9bef6ddf97e3484309ce2f76d1b3c9ec457cc55f9030f3fedba618a5af
# 相比之前区别:只是存在内存中, 所以不会有 src 参数, 不再能使用 -v 的方式挂载
# 但是仍然可以算作一种持久化的存储

共享其他容器的数据卷 –-数据卷容器

利用docker run/create 的--volumes-from参数指定数据卷容器
用法:
	docker run/create --volumes-from CONTAINER
[root@izuf6csxy0jrgs3azvia67z volumes]# docker run -dti --mount type=volume,src=volume-test,dst=/root/c_dir centos
6203958a862d42ea86baaca3767f104300347947110811b69efe27e939468619
[root@izuf6csxy0jrgs3azvia67z volumes]# docker inspect volume-test
[
    {
        "CreatedAt": "2019-03-22T16:24:04+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/volume-test/_data",
        "Name": "volume-test",
        "Options": null,
        "Scope": "local"
    }
]
[root@izuf6csxy0jrgs3azvia67z volumes]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
redis               latest              4161e91dcc29        2 days ago          95MB
centos-net2         v1.0                c0ff4aa58656        8 days ago          257MB
centos-net          v1.0                cf3acaf1acc4        9 days ago          280MB
ubuntu              latest              47b19964fb50        6 weeks ago         88.1MB
centos              latest              1e1148e4cc2c        3 months ago        202MB
[root@izuf6csxy0jrgs3azvia67z volumes]# cd /var/lib/docker/volumes/volume-test/_data/
[root@izuf6csxy0jrgs3azvia67z _data]# ll
total 0
[root@izuf6csxy0jrgs3azvia67z _data]# docker exec 6203958a touch /root/c_dir/test_txt
[root@izuf6csxy0jrgs3azvia67z _data]# ll
total 0
-rw-r--r--1 root root 0 Mar 22 16:29 test_txt

Docker 数据卷的注意事项

Docker的数据卷更多会是使用volumes方式来进行使用。使用时需注意:
如果挂载一个空的数据卷到容器中的一个非空目录中,那么这个目录下的文件会被复制到数据卷中。
如果挂载一个非空的数据卷到容器中的一个目录中,那么容器中的目录中会显示数据卷中的数据。如果原来容器中的目录中有数据,那么这些原始数据会被隐藏掉。
这两个规则都非常重要,灵活利用第一个规则可以帮助我们初始化数据卷中的内容。掌握第二个规则可以保证挂载数据卷后的数据总是你期望的结果。

注意: 规则二中容器的数据只是被隐藏, 并不是被删除...

规则一

[root@izuf6csxy0jrgs3azvia67z _data]# docker run -dti centos bash
5be45e8327f5515e8684e02c06ef41dc3171e77e9273a25efa8b9e527250f570
[root@izuf6csxy0jrgs3azvia67z _data]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
5be45e8327f5        centos              "bash"              4 seconds ago       Up 4 seconds                            hardcore_agnesi
[root@izuf6csxy0jrgs3azvia67z _data]# docker exec 5be4 ls /run
console
cryptsetup
faillock
lock
log
sepermit
setrans
systemd
user
utmp
[root@izuf6csxy0jrgs3azvia67z _data]# docker run -dti --mount type=volume,src=test-name,dst=/run centos
07582733077ce81feeb32ac095cf2fd9dca9def23431bdb212ec882d9ceb1b17
[root@izuf6csxy0jrgs3azvia67z _data]# docker volume ls
DRIVER              VOLUME NAME
local               test-name
[root@izuf6csxy0jrgs3azvia67z _data]# docker inspect test-name
[
    {
        "CreatedAt": "2019-03-22T17:13:55+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/test-name/_data",
        "Name": "test-name",
        "Options": null,
        "Scope": "local"
    }
]
[root@izuf6csxy0jrgs3azvia67z _data]# ls /var/lib/docker/volumes/test-name/_data
console  cryptsetup  faillock  lock  log  sepermit  setrans  systemd  user  utmp
[root@izuf6csxy0jrgs3azvia67z _data]# docker exec 5be4 ls /run
console
cryptsetup
faillock
lock
log
sepermit
setrans
systemd
user
utmp

规则二

 [root@izuf6csxy0jrgs3azvia67z _data]# docker volume ls
 DRIVER              VOLUME NAME
 local               test-name
 [root@izuf6csxy0jrgs3azvia67z _data]# docker run -dti --mount type=volume,src=test-name,dst=/root/test_dir centos
 532743b2ee6e399c29cd12b11d7946994ba965a75e0bffe36f9b2e4f8c7fc1fe
 [root@izuf6csxy0jrgs3azvia67z _data]# docker exec 5327 ls /root/test_dir 
 console
 cryptsetup
 faillock
 lock
 log
 sepermit
 setrans
 systemd
 user
 utmp
 [root@izuf6csxy0jrgs3azvia67z _data]# docker run -dti --mount type=volume,src=test-name,dst=/root/ centos
 bc5e66b44e1c9f8c3f2bf6826f9117a7cfad55e538a6908c5890772bceb91ec6
 # 这里 /root 目录已经不是之前展示的样子了. 进行了 "隐藏和覆盖"
 [root@izuf6csxy0jrgs3azvia67z _data]# docker exec bc5e ls /root
 console
 cryptsetup
 faillock
 lock
 log
 sepermit
 setrans
 systemd
 user
 utmp

第八章 Docker核心技术 --仓库

docker 私有仓库搭建

  • registry 本质上是一个镜像, 所以我们会使用 pull 方法

  • --restart always 用于在我们重启docker 服务的时候, 容器不会退出.

  • -p ​:port:​5000 registry 服务一般默认是 5000

 第一步:在需要搭建仓库的服务器上安装docker。
 第二步:在服务器上,从docker hub下载registry仓库
     docker pull registry
 第三步:在服务器上,启动仓库
     docker run -d -ti --restart always\
             --name my-registry\
             -p 8000:5000\
             -v /my-registry/registry:/var/lib/registry\
     registry
     注意:registry内部对外开放端口是5000。默认情况下,会镜像存放于容器内的/var/lib/registry(官网Dockerfile中查看)目录下,这样如果容器被删除,则存放于容器中的镜像也会丢失。
 ​
 本地利用curl 服务器IP:8000/v2/_catalog  查看当前仓库中的存放的镜像列表。(注意打开8000端口访问)
 [root@izuf6csxy0jrgs3azvia67z ~]# docker version
 Client:
  Version:           18.09.3
  API version:       1.39
  Go version:        go1.10.8
  Git commit:        774a1f4
  Built:             Thu Feb 28 06:33:21 2019
  OS/Arch:           linux/amd64
  Experimental:      false
 ​
 Server: Docker Engine -Community
  Engine:
   Version:          18.09.3
   API version:      1.39 (minimum version 1.12)
   Go version:       go1.10.8
   Git commit:       774a1f4
   Built:            Thu Feb 28 06:02:24 2019
   OS/Arch:          linux/amd64
   Experimental:     false
 [root@izuf6csxy0jrgs3azvia67z ~]# docker pull registry
 Using default tag: latest
 latest: Pulling from library/registry
 c87736221ed0: Pull complete 
 1cc8e0bb44df: Pull complete 
 54d33bcb37f5: Pull complete 
 e8afc091c171: Pull complete 
 b4541f6d3db6: Pull complete 
 Digest: sha256:3b00e5438ebd8835bcfa7bf5246445a6b57b9a50473e89c02ecc8e575be3ebb5
 Status: Downloaded newer image for registry:latest
 [root@izuf6csxy0jrgs3azvia67z ~]# docker run -dti --restart always --name my-registry -p :4000:5000 -v /root/home/docker_demo/registry:/var/lib/registry registry
 9158ebfce55ceba53a886d995eb574899b354a0fed1a023b1947958f2450299e
 [root@izuf6csxy0jrgs3azvia67z ~]# docker ps -a
 CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
 9158ebfce55c        registry            "/entrypoint.sh /etc…"   7 seconds ago       Up 7 seconds        0.0.0.0:4000->5000/tcp   my-registry
 [root@izuf6csxy0jrgs3azvia67z ~]# curl 127.0.0.1:4000/v2/_catalog
 {"repositories":[]}
 #还可以通过浏览器访问

私有仓库 --上传、下载镜像

  • 必须按照规范docker tag IMAGE ip:port/image_name 来修改名字才能完成上传, 其中端口是之前进行映射的 服务器端口4000

  • HTTPS 和 HTTP

 第一步:利用docker tag重命名需要上传的镜像
     docker tag IMAGE 服务器IP:端口/IMAGE_NAME
 第二步:利用docker push上传刚刚重命名的镜像
     docker push 服务器IP:端口/centos
 ​
 注意:
     必须重命名为服务器IP:端口/IMAGE_NAME
     如果push出现了类似https的错误那么需要往配置文件/etc/docker/daemon.json里添加:”insecure-registries”:[“服务器IP:端口”]  
     然后重启docker。
 ​
 [root@izuf6csxy0jrgs3azvia67z ~]# docker tag centos 47.101.212.36:4000/centos-latest
 [root@izuf6csxy0jrgs3azvia67z ~]# docker  images
 REPOSITORY                         TAG                 IMAGE ID            CREATED             SIZE
 redis                              latest              4161e91dcc29        3 days ago          95MB
 centos-net                         v1.0                cf3acaf1acc4        10 days ago         280MB
 registry                           latest              f32a97de94e1        2 weeks ago         25.8MB
 ubuntu                             latest              47b19964fb50        6 weeks ago         88.1MB
 47.101.212.36:4000/centos-latest   latest              1e1148e4cc2c        3 months ago        202MB
 centos                             latest              1e1148e4cc2c        3 months ago        202MB
 [root@izuf6csxy0jrgs3azvia67z ~]# docker push 47.101.212.36:4000/centos-latest
 The push refers to repository [47.101.212.36:9092/centos-latest]
 Get https://47.101.212.36:9092/v2/: http: server gave HTTP response to HTTPS client
 [root@izuf6csxy0jrgs3azvia67z ~]# vim /etc/docker/daemon.json 
 [root@izuf6csxy0jrgs3azvia67z ~]# service docker restart
 Redirecting to /bin/systemctl restart docker.service
 [root@izuf6csxy0jrgs3azvia67z ~]# docker push 47.101.212.36:4000/centos-latest
 The push refers to repository [47.101.212.36:9092/centos-latest]
 071d8bd76517: Pushed 
 latest: digest: sha256:365fc7f33107869dfcf2b3ba220ce0aa42e16d3f8e8b3c21d72af1ee622f0cf0 size: 529
 [root@izuf6csxy0jrgs3azvia67z ~]# curl 127.0.0.1:9092/v2/_catalog
 {"repositories":["centos-latest"]}
 [root@izuf6csxy0jrgs3azvia67z ~]# docker pull 47.101.212.36:4000/centos-latest
 ​
 [root@izuf6csxy0jrgs3azvia67z ~]# docker images
 REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
 redis               latest              4161e91dcc29        3 days ago          95MB
 centos-net          v1.0                cf3acaf1acc4        10 days ago         280MB
 registry            latest              f32a97de94e1        2 weeks ago         25.8MB
 ubuntu              latest              47b19964fb50        6 weeks ago         88.1MB
 centos              latest              1e1148e4cc2c        3 months ago        202MB
 [root@izuf6csxy0jrgs3azvia67z ~]# docker pull 47.101.212.36:9092/centos-latest
 Using default tag: latest
 latest: Pulling from centos-latest
 Digest: sha256:365fc7f33107869dfcf2b3ba220ce0aa42e16d3f8e8b3c21d72af1ee622f0cf0
 Status: Downloaded newer image for 47.101.212.36:9092/centos-latest:latest
 [root@izuf6csxy0jrgs3azvia67z ~]# docker images
 REPOSITORY                         TAG                 IMAGE ID            CREATED             SIZE
 redis                              latest              4161e91dcc29        3 days ago          95MB
 centos-net                         v1.0                cf3acaf1acc4        10 days ago         280MB
 registry                           latest              f32a97de94e1        2 weeks ago         25.8MB
 ubuntu                             latest              47b19964fb50        6 weeks ago         88.1MB
 47.101.212.36:9092/centos-latest   latest              1e1148e4cc2c        3 months ago        202MB
 centos                             latest              1e1148e4cc2c        3 months ago        202MB

搭建带认证私有仓库(一)

 在服务器上:
     第一步:删除先前创建的无认证的仓库容器
         docker rm -f my-registry
     第二步:创建存放认证用户名和密码的文件:
         mkdir /my-registry/auth -p
     第三步:创建密码验证文件。注意将将USERNAME和PASSWORD替换为设置的用户名和密码
         docker run --entrypoint htpasswd registry -Bbn USERNAME PASSWORD > /my-registry/auth/htpasswd
     第四步:重新启动仓库镜像
 docker run -d -p 8000:5000 --restart=always --name docker-registry \
 -v /my-registry/registry:/var/lib/registry \
 -v /my-registry/auth:/auth \
 -e "REGISTRY_AUTH=htpasswd" \
 -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
 -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" \
 registry
 [root@izuf6csxy0jrgs3azvia67z docker_demo]# mkdri /root/home/auth -p
 -bash: mkdri: command not found
 [root@izuf6csxy0jrgs3azvia67z docker_demo]# mkdir /root/home/auth -p
 [root@izuf6csxy0jrgs3azvia67z docker_demo]# ls /root/home/
 auth  d_dir  docker_demo  mount_dir
 [root@izuf6csxy0jrgs3azvia67z docker_demo]# docker run --entrypoint htpasswd registry -Bbn testun testpw > /root/home/auth/htpasswd[root@izuf6csxy0jrgs3azvia67z docker_demo]# ls /root/home/auth/
 htpasswd
 [root@izuf6csxy0jrgs3azvia67z docker_demo]# vim /root/home/auth/htpasswd 
 [root@izuf6csxy0jrgs3azvia67z docker_demo]# docker run -d -p 9092:5000 --restart always --name docker-register -v /root/home/docker_demo/registry:/var/lib/registry -v /root/home/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" registry
 069dfeded84ce8bd09ac976cff68a18bd932952b436897248bcd7cdd70e516d5
 [root@izuf6csxy0jrgs3azvia67z docker_demo]# docker ps -a
 CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                    NAMES
 069dfeded84c        registry            "/entrypoint.sh /etc…"   7 seconds ago       Up 6 seconds               0.0.0.0:9092->5000/tcp   docker-register
 25bb71d41e9d        registry            "htpasswd -Bbn testu…"   3 minutes ago       Exited (0) 3 minutes ago                            peaceful_einstein
 [root@izuf6csxy0jrgs3azvia67z docker_demo]# docker ps -a
 CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                    NAMES
 069dfeded84c        registry            "/entrypoint.sh /etc…"   12 seconds ago      Up 11 seconds              0.0.0.0:9092->5000/tcp   docker-register
 25bb71d41e9d        registry            "htpasswd -Bbn testu…"   3 minutes ago       Exited (0) 3 minutes ago                            peaceful_einstein
 ​

带认证的私有仓库 --上传 下载镜像

在本地机器上:
	第一步:首先登录到服务器
		docker login -u username -p password 47.94.153.230:8000
	第二步:然后执行pull或者push命令	第三步:操作完毕后,可以退出登录
		docker logout 47.94.153.230:8000
这是如果想查看仓库中已有的镜像,那么需要进行http验证才可以。可以直接借助浏览器访问47.94.153.230:8000/v2/_catalog就可以访问了

注意这里:47.94.153.230指服务器IP
[root@izuf6csxy0jrgs3azvia67z docker_demo]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               
069dfeded84c        registry            "/entrypoint.sh /etc…"   12 seconds ago      Up 11 seconds              0.0.0.0:9092->5000/t
25bb71d41e9d        registry            "htpasswd -Bbn testu…"   3 minutes ago       Exited (0) 3 minutes ago                       
[root@izuf6csxy0jrgs3azvia67z docker_demo]# docker login -u testun -p testpw 47.101.212.36:9092
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
[root@izuf6csxy0jrgs3azvia67z docker_demo]# docker images
REPOSITORY                         TAG                 IMAGE ID            CREATED             SIZE
redis                              latest              4161e91dcc29        3 days ago          95MB
centos-net                         v1.0                cf3acaf1acc4        10 days ago         280MB
registry                           latest              f32a97de94e1        2 weeks ago         25.8MB
ubuntu                             latest              47b19964fb50        6 weeks ago         88.1MB
47.101.212.36:9092/centos-latest   latest              1e1148e4cc2c        3 months ago        202MB
centos                             latest              1e1148e4cc2c        3 months ago        202MB
[root@izuf6csxy0jrgs3azvia67z docker_demo]# docker pull 47.101.212.36:9092/centos-latest
Using default tag: latest
latest: Pulling from centos-latest
Digest: sha256:365fc7f33107869dfcf2b3ba220ce0aa42e16d3f8e8b3c21d72af1ee622f0cf0
Status: Image is up to date for 47.101.212.36:9092/centos-latest:latest
[root@izuf6csxy0jrgs3azvia67z docker_demo]# curl 127.0.0.1:9092/v2/_catalog
{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":[{"Type":"registry","Class":"","Name":"catalog","Action":"*"}]}]}
[root@izuf6csxy0jrgs3azvia67z docker_demo]# docker images
REPOSITORY                         TAG                 IMAGE ID            CREATED             SIZE
redis                              latest              4161e91dcc29        3 days ago          95MB
centos-net                         v1.0                cf3acaf1acc4        10 days ago         280MB
registry                           latest              f32a97de94e1        2 weeks ago         25.8MB
ubuntu                             latest              47b19964fb50        6 weeks ago         88.1MB
47.101.212.36:9092/centos-latest   latest              1e1148e4cc2c        3 months ago        202MB
centos                             latest              1e1148e4cc2c        3 months ago        202MB
[root@izuf6csxy0jrgs3azvia67z docker_demo]# docker rmi 47.101.212.36:9092/centos-latest
Untagged: 47.101.212.36:9092/centos-latest:latest
Untagged: 47.101.212.36:9092/centos-latest@sha256:365fc7f33107869dfcf2b3ba220ce0aa42e16d3f8e8b3c21d72af1ee622f0cf0
[root@izuf6csxy0jrgs3azvia67z docker_demo]# docker pull 47.101.212.36:9092/centos-latest
Using default tag: latest
latest: Pulling from centos-latest
Digest: sha256:365fc7f33107869dfcf2b3ba220ce0aa42e16d3f8e8b3c21d72af1ee622f0cf0
Status: Downloaded newer image for 47.101.212.36:9092/centos-latest:latest
[root@izuf6csxy0jrgs3azvia67z docker_demo]# docker images
REPOSITORY                         TAG                 IMAGE ID            CREATED             SIZE
redis                              latest              4161e91dcc29        3 days ago          95MB
centos-net                         v1.0                cf3acaf1acc4        10 days ago         280MB
registry                           latest              f32a97de94e1        2 weeks ago         25.8MB
ubuntu                             latest              47b19964fb50        6 weeks ago         88.1MB
47.101.212.36:9092/centos-latest   latest              1e1148e4cc2c        3 months ago        202MB
centos                             latest              1e1148e4cc2c        3 months ago        202M

浏览器展示如下:

注: 还会出现 弹窗 来提示输入用户名和密码

总结:

  • 小型的项目 和 不愿意接收三方服务的 项目适合搭建私有仓库

  • 通常情况下, 更多的时候是使用 cloud 技术, 即后面学的 dockerfile

猜你喜欢

转载自blog.csdn.net/DefaultTest/article/details/88787143