目录
在docker之网络访问中,通过启动了nginx服务进行了访问,只展示了nginx的首页信息,如果想访问我们自己的代码如何操作呢,这就需要使用到数据卷的知识了。在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束),需要将数据从宿主机挂载到容器中。数据卷的管理可以参考:Docker数据卷管理
1.docker使用
这里通过一个小程序来看看,通过xiaoniaoniaofeifei来看看如何实现数据卷的使用。如果是本地的压缩文件使用xshell可以直接拖动到xshell中进行上传,上传完成之后进行解压。
xiaoniaofeifei软件包下载链接,提取码: jyqy
[root@localhost srv]# ls
xiaoniaofeifei.zip
[root@localhost srv]# unzip xiaoniaofeifei.zip
Archive: xiaoniaofeifei.zip
inflating: sound1.mp3
creating: img/
inflating: img/bg1.jpg
inflating: img/bg2.jpg
inflating: img/number1.png
inflating: img/number2.png
inflating: img/s1.png
inflating: img/s2.png
inflating: 21.js
inflating: 2000.png
inflating: icon.png
inflating: index.html
[root@localhost srv]# ls
2000.png 21.js icon.png img index.html sound1.mp3 xiaoniaofeifei.zip
将整个目录下的所有信息拷贝至容器中去。先查看一下容器的id
[root@localhost srv]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
738b4313c4f7 nginx:latest "/docker-entrypoint.…" About an hour ago Up About an hour 192.168.0.101:49154->80/tcp pensive_chaplygin
3a885ede5267 nginx:latest "/docker-entrypoint.…" About an hour ago Up About an hour 192.168.0.101:49153->80/tcp distracted_antonelli
c2c9273e9484 nginx:latest "/docker-entrypoint.…" 2 hours ago Up 2 hours 0.0.0.0:81->80/tcp, :::81->80/tcp mystifying_feistel
6ee5b735e752 nginx:latest "/docker-entrypoint.…" 2 hours ago Up 2 hours 192.168.0.101:80->80/tcp frosty_beaver
e2e1a5cbc833 nginx:latest "/docker-entrypoint.…" 2 hours ago Up 2 hours 192.168.0.100:80->80/tcp jovial_raman
[root@localhost srv]# docker rm -f `docker ps -a -q` 容器太多了删除一下
738b4313c4f7
3a885ede5267
c2c9273e9484
6ee5b735e752
e2e1a5cbc833
接着重新创建一个新的容器
[root@localhost srv]# docker run -d -p 80:80 nginx:latest
e7d08547b7f70eeb16239c73dd5ac572d92a05b6273b13d55f1f5ffe55ec9a81
[root@localhost srv]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e7d08547b7f7 nginx:latest "/docker-entrypoint.…" 21 seconds ago Up 8 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp kind_haslett
将解压的文件拷贝至如下目录,使用cp命令进行拷贝拷贝至容器的目录下,这里的e7d085**f7为容器的id,接着进入该容器,使用exec
[root@localhost srv]# docker container cp . e7d08547b7f7:/usr/share/nginx/html
[root@localhost srv]# docker exec -it e7d08547b7f7 /bin/bash
root@e7d08547b7f7:/# cd /usr/share/nginx/html/
root@e7d08547b7f7:/usr/share/nginx/html# ls
2000.png 21.js 50x.html icon.png img index.html sound1.mp3 xiaoniaofeifei.zip
root@e7d08547b7f7:/usr/share/nginx/html#
接着访问一下192.168.0.101,这里的ip是宿主机的ip
2.优化
使用过程中发现有一个bug需要修复下,需要修改下index.html
root@e7d08547b7f7:/usr/share/nginx/html# ls
2000.png 21.js 50x.html icon.png img index.html sound1.mp3 xiaoniaofeifei.zip
root@e7d08547b7f7:/usr/share/nginx/html# vi index.html
bash: vi: command not found
发现没有vi命令,这时可以现场装一个vi,但是太麻烦了。因此这里代码尽量不要使用cp命令放进去,退出到src目录,使用exit退出当前容器。调试的时候尽量放置在宿主机上,这样一边修改一边调试。
[root@localhost srv]# docker run -d -p 81:80 -v /srv:/usr/share/nginx/html nginx:latest
-v --volumn
/srv 宿主机目录
/usr/share/nginx/html 容器目录
再次进入到Ip:port中进行访问,注意这里需要刷新一下,f5普通刷新,shift+f5强制刷新。
使用者这种-v的好处就是,如果遇到bug就可以直接在宿主机上直接修改。比如现在有个标题
[root@localhost srv]# ls
2000.png 21.js icon.png img index.html sound1.mp3 xiaoniaofeifei.zip
[root@localhost srv]# vi index.html
在刷新,发现标题已经修改。使用docker volume 查询volume命令,使用ls查询当前有无卷
[root@localhost srv]# docker volume ls
DRIVER VOLUME NAME
[root@localhost srv]#
[root@localhost _data]# docker run -d -p 82:80 -v teset:/usr/share/nginx/html nginx:latest
5d5d541f2394ff2a6975e31333f99014db8cf7f6c6c0a257d8bfd048d3b192e9
使用test,发现没有会自动创建一个卷
[root@localhost srv]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2f069022da24 nginx:latest "/docker-entrypoint.…" 52 seconds ago Up 6 seconds 80/tcp, 0.0.0.0:49153->82/tcp, :::49153->82/tcp pedantic_yalow
ea037ed65357 nginx:latest "/docker-entrypoint.…" 11 minutes ago Up 11 minutes 0.0.0.0:81->80/tcp, :::81->80/tcp beautiful_haibt
e7d08547b7f7 nginx:latest "/docker-entrypoint.…" 6 hours ago Up 6 hours 0.0.0.0:80->80/tcp, :::80->80/tcp kind_haslett
[root@localhost srv]# docker volume ls
DRIVER VOLUME NAME
local teset
那这个卷有什么好处呢?
[root@localhost srv]# docker volume inspect teset
[
{
"CreatedAt": "2021-05-05T14:50:10+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/teset/_data",
"Name": "teset",
"Options": null,
"Scope": "local"
}
]
切换对应的挂载目录
[root@localhost _data]# ls
50x.html index.html
访问一下首页
[root@localhost _data]# rm -fr *
[root@localhost _data]# cp /srv/* .
再次刷新,就可以访问。
[root@localhost _data]# docker run -d -p 83:80 -v teset:/usr/share/nginx/html nginx:latest
1e98cb4a3c77a7f5201bfe10fd20a36ced68225e7608121bbbfbbabffb13a1e9
再次启动一个83的容器,这样就实现了数据共享。