Docker 网络
启动了nginx容器,但却不知道从哪里进行访问nginx。
启动nginx容器,并附加网络映射
在启动nginx容器的时候,增加一个-P
大写的P的参数
表示随机映射一个端口
[root@node ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/centos latest 5182e96772bf 2 weeks ago 200 MB
docker.io/nginx latest c82521676580 4 weeks ago 109 MB
[root@node ~]# docker run -P -d --name mynginx1 nginx
b477b9acaae66b61adf60fe80e26e724b2894774b536925e5bfa0e40679edc5c
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b477b9acaae6 nginx "nginx -g 'daemon ..." 26 seconds ago Up 25 seconds 0.0.0.0:32768->80/tcp mynginx1
从ps查看的容器来看,随机映射了一个32768端口到内网的80端口
然后通过浏览器试一下:
我虚拟机的IP是:10.0.0.101,所以访问的地址是:10.0.0.101:32768
可以看到可以正常访问了;
因为-P
的参数,是随机映射一个端口,这样也不会使映射的端口重复,但也很麻烦
手动指定映射的端口
下面使用-p
小写的P的参数,来指定映射的端口
测试指定 91 端口来映射nginx容器的 80 端口
[root@node ~]# docker run -d -p 91:80 --name mynginx2 nginx
f5e8a227d18bff2ca0b253209cd3892991b1c29368e4087a4575e78a91bf3f25
[root@node ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f5e8a227d18b nginx "nginx -g 'daemon ..." 6 seconds ago Up 5 seconds 0.0.0.0:91->80/tcp mynginx2
可以看到,映射正常,下面测试访问
可以正常访问,映射没问题;
映射端口相关参数使用解释:
参数和使用 | 解释 |
---|---|
-P | 随机映射一个端口 |
-p hostPort:containerPort | 指定一个端口 |
-p ip:hostPort:containerPort | 指定IP上的一个端口;表示机器有多个IP的时候 |
-p ip::containerPort | 随机一个端口 |
-p hostPort:containerPort -p hostPort:containerPort | 可以一次性映射多个指定的端口,使用多个 -p 参数,以空格区分 |
Docker 数据管理
数据卷:
- -v /data
- -v src:dst
数据卷容器
- --volumes-from
命令:docker run -d -it --name volume-test1 -h nginx -v /data centos
-h 表示指定一个主机名
-v /data 表示在启动的容器中,挂在一个/data磁盘
[root@node ~]# docker run -d -it --name volume-test1 -h nginx -v /data centos
9bdd7385e218275c662b6e98dfc28f674101ba2cd1c7d75f8514eba1b5553c63
[root@node ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9bdd7385e218 centos "/bin/bash" 13 seconds ago Up 12 seconds volume-test1
[root@node ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9bdd7385e218 centos "/bin/bash" 19 seconds ago Up 18 seconds volume-test1
[root@node ~]# ./in.sh volume-test1
# 这里可以看到有data目录
[root@nginx /]# ls -ld /data/
drwxr-xr-x 2 root root 6 Aug 23 03:03 /data/
-v 把让容器直接把数据卸载对应的物理磁盘下,那数据到底卸载什么地方吗?
下面让来测试验证一下
[root@node ~]# docker inspect volume-test1 | grep Mounts -A 10
"Mounts": [
{
"Type": "volume",
"Name": "8cce49ca0e2cb266737376697ee19010c1b0565766ee6f5ab293ac011af36b7e",
"Source": "/var/lib/docker/volumes/8cce49ca0e2cb266737376697ee19010c1b0565766ee6f5ab293ac011af36b7e/_data",
"Destination": "/data",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
# 上面的命令可以看到data映射的宿主机的目录是:
# /var/lib/docker/volumes/8cce49ca0e2cb266737376697ee19010c1b0565766ee6f5ab293ac011af36b7e/_data
# 下面进入这个目录下,创建一个test文件,然后在容器中查看是否一致
在宿主机操作:
[root@node ~]# cd /var/lib/docker/volumes/8cce49ca0e2cb266737376697ee19010c1b0565766ee6f5ab293ac011af36b7e/_data
[root@node _data]# touch test
[root@node _data]# ls -l
total 0
-rw-r--r-- 1 root root 0 Aug 23 11:12 test
回到容器中查看:
[root@nginx /]# ls /data/
test
正常,这样就自然懂了。
上面的是随机映射容器上的目录到宿主机的一个很深程度的目录
下面来进行映射指定目录到容器中
使用/opt
来挂在,查看宿主机的/opt 下有什么文件
[root@node ~]# ls /opt/
scripts
创建容器:
[root@node ~]# docker run -it --name volume-test2 -h nginx -v /opt:/opt centos
[root@nginx /]# ls /opt/
scripts
可以看到,正产挂载。
注意:
-v
指定挂载目录/opt:/opt
两个目录后面不能有/
,否则会出错
挂在一个只读目录
就是在创建容器挂在目录的后增加:ro
命令:docker run -it --name volume-test2 -h nginx -v /opt:/opt:ro
centos
这里就不测试了;
数据卷容器使用
特意创建一个容器,该容器只是存储数据
然后在创建一个容器的时候指定
注意:存储的容器,无所谓是停止的状态还是运行的状态,都可以被新的容器来进行引入挂在
[root@node ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
da780039c311 centos "/bin/bash" 2 hours ago Exited (0) 20 seconds ago volume-test2
9bdd7385e218 centos "/bin/bash" 3 hours ago Up 3 hours volume-test1
[root@node ~]# docker run -d -it --name volume-test4 --volumes-from volume-test1 centos
5d1a237482dca43589973bdbd7e0456426cba0e7cfab4c5d92eed3549ff43d14
[root@node ~]# ./in.sh volume-test4
[root@5d1a237482dc /]# ls /data/
test
# 这里可以掩饰可以看到,/data 已经被挂在成功了