博文涉及内容一览表:
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
来修改名字才能完成上传, 其中端口是之前进行映射的 服务器端口4000HTTPS 和 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