4. Docker数据管理

Docker 数据管理

数据卷

创建数据卷

docker volume create my-vol

查看所有的数据卷

docker volume ls
[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
local               my-vol

查看数据卷的详细信息

docker volume inspect my-vol
[root@localhost ~]# docker volume inspect my-vol
[
    {
        "CreatedAt": "2018-08-17T08:15:42+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
        "Name": "my-vol",
        "Options": {},
        "Scope": "local"
    }
]

挂载主机目录

挂载主机目录到容器

docker run -p 8080:8080 -d --mount type=bind,source=/root/first,target=/webapp centos-nodejs:1.0
[root@localhost ~]# docker run -p 8080:8080 -d --mount type=bind,source=/root/first,target=/webapp centos-nodejs:1.0         
ecc09d5c7ecc5fd532bddcba6bdf1bca3db46f0554351e1a52e3c957c6759c0f

查看容器挂载信息

docker inspect ecc09d5c7ecc
"Mounts": [
                {
                    "Type": "bind",
                    "Source": "/root/first",
                    "Target": "/webapp"
                }
            ],

Docker 网络配置

Docker 基础网络配置

外部访问容器

启动容器时,使用 -P 或 -p 参数来指定端口映射,-P 随机生成本地端口绑定容器指定端口,-
p手动指定主机端口映射容器端口

docker run -p 8080:8080 -d  centos-nodejs:1.0

查看端口映射信息

docker ps
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                    NAMES
ecc09d5c7ecc        centos-nodejs:1.0   "node /app/index.js"   About an hour ago   Up About an hour    0.0.0.0:8080->8080/tcp   xenodochial_mestorf

端口映射说明

默认映射所有地址所有端口

-p 8080:8080
效果同外部访问容器

映射到本机指定地址的指定端口

-p 127.0.0.1:8080:8080
docker run -p 127.0.0.1:8080:8080 -d centos-nodejs:1.0
[root@localhost ~]# docker run -p 127.0.0.1:8080:8080 -d centos-nodejs:1.0                                                    
6bb9a458519cc02ad3803e18d799f798a0c64cf36764a99f4b04f9a5a84f86cc
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                      NAMES
6bb9a458519c        centos-nodejs:1.0   "node /app/index.js"   3 seconds ago       Up 2 seconds        127.0.0.1:8080->8080/tcp   dreamy_panini

映射到主机地址的任意端口

-p 127.0.0.1::8080
docker run -p 127.0.0.1::8080 -d centos-nodejs:1.0 
[root@localhost ~]# docker run -p 127.0.0.1::8080 -d centos-nodejs:1.0    
be23197aef2a41efd029c63fb266088cc1ad90dffe486107288fb77849778329
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                       NAMES
be23197aef2a        centos-nodejs:1.0   "node /app/index.js"   57 seconds ago      Up 56 seconds       127.0.0.1:32768->8080/tcp   inspiring_lamarr

查看容器端口对应绑定的主机端口

docker port be23197aef2a(容器id) 8080  
[root@localhost ~]# docker port be23197aef2a 8080   
127.0.0.1:32768

容器互联

容器互联网络原理

Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。

同时,Docker 随机分配一个本地未占用的私有网段(在 RFC1918 中定义)中的一个地址给 docker0 接口。比如典型的 172.17.42.1,掩码为 255.255.0.0。此后启动的容器内的网口也会自动分配一个同一网段(172.17.0.0/16)的地址。

当创建一个 Docker 容器的时候,同时会创建了一对 veth pair 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 eth0;另一端在本地并被挂载到 docker0 网桥,名称以 veth 开头(例如 vethAQI2QT)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。

image

创建一个自己的虚拟网桥

docker network create -d bridge my-bridge

创建两个链接到新网桥的两个容器

docker run -it --name test5 --network my-bridge  centos 

docker run -it --name test6 --network my-bridge  centos 

相互能够ping通,每台能够获取自己的本网段IP。

在test6 ping test5

[root@9ce1b27d2ec8 /]# ping test5
PING test5 (172.18.0.2) 56(84) bytes of data.
64 bytes from test5.my-bridge (172.18.0.2): icmp_seq=1 ttl=64 time=0.120 ms
64 bytes from test5.my-bridge (172.18.0.2): icmp_seq=2 ttl=64 time=0.094 ms
64 bytes from test5.my-bridge (172.18.0.2): icmp_seq=3 ttl=64 time=0.086 ms
--- test5 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 0.086/0.100/0.120/0.014 ms

在test 6查看其IP地址
test6 IP地址:172.18.0.3

[root@9ce1b27d2ec8 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
26: eth0@if27: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.18.0.3/16 brd 172.18.255.255 scope global eth0
       valid_lft forever preferred_lft forever

在test5 ping test6

[root@4abf9907b82c /]# ping test6
PING test6 (172.18.0.3) 56(84) bytes of data.
64 bytes from test6.my-bridge (172.18.0.3): icmp_seq=1 ttl=64 time=0.060 ms
64 bytes from test6.my-bridge (172.18.0.3): icmp_seq=2 ttl=64 time=0.075 ms
64 bytes from test6.my-bridge (172.18.0.3): icmp_seq=3 ttl=64 time=0.123 ms
--- test6 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 0.060/0.086/0.123/0.026 ms

在test5 查看其ip 地址

[root@4abf9907b82c /]# ip a

test5:172.18.0.2
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
24: eth0@if25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
       valid_lft forever preferred_lft forever

4. Docker数据管理

全文结束