持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情
docker镜像
commit镜像
用commit命令提交自己的镜像,可以方便以后的使用,或将镜像打包给其他人
#命令
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
测试
#启动之前的tomcat
[root@VM-16-10-centos ~]# docker start tomcat01
tomcat01
[root@VM-16-10-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77485b64c75f tomcat:9-jdk8-temurin-focal "catalina.sh run" 17 hours ago Up 3 seconds 0.0.0.0:7777->8080/tcp, :::7777->8080/tcp tomcat01
#commit 将修改好的tomcat打包
[root@VM-16-10-centos ~]# docker commit -m="Add Java Ctf" -a="Sentiment" 77485b64c75f tomcat1:1.0
sha256:8b280f81c6b1f788111844d60e6d21ae95b1fcaed2d4757a98a90b0eb18df497
#此时刚刚定义的tomcat1 成为了新的镜像
[root@VM-16-10-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat1 1.0 8b280f81c6b1 4 seconds ago 345MB
tomcat 9-jdk8-temurin-focal 05c35a4e6b74 4 days ago 342MB
容器数据卷
使用数据卷
方法一
命令挂载 -v
docker run it -v 主机目录:容器目录
#可以发现通过挂载后主机的home和docker容器中的home目录内容共享了
[root@VM-16-10-centos ~]# docker run -it -v /home:/home centos /bin/bash
[root@f6c0993fd2e5 /]# cd home
[root@f6c0993fd2e5 home]# ls
Sentiment.java WarmJava_war_exploded lighthouse www
[root@f6c0993fd2e5 home]# exit
exit
[root@VM-16-10-centos ~]# ls /home
lighthouse Sentiment.java WarmJava_war_exploded www
Mysql同步数据
docker run -d -p 7777:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
挂载后此时在数据库中添加个test数据库,本地data中也就多了一个test目录
之后将数据库容器删除,但文件仍在本地保留
[root@VM-16-10-centos data]# docker rm -f mysql01
mysql01
[root@VM-16-10-centos data]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f6c0993fd2e5 centos "/bin/bash" 18 hours ago Exited (0) 18 hours ago ecstatic_vaughan
[root@VM-16-10-centos data]# ls
auto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 mysql performance_schema public_key.pem server-key.pem test
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 ibtmp1 mysql.sock private_key.pem server-cert.pem sys
具名挂载和匿名挂载
[root@VM-16-10-centos ~]# docker run -d -P --name nginx01 -v /etc/nginx nginx
[root@VM-16-10-centos ~]# docker volume ls
DRIVER VOLUME NAME
local 674500de4c3a5a344fbac4b4e097b8c49c48c67a4787faf0aa9afc59c7c8d640
[root@VM-16-10-centos ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
b6ec76db6e9b5a5bb05ce4cb94ffc9ead91305680313d362817e71f38318cecc
[root@VM-16-10-centos ~]# docker volume ls
DRIVER VOLUME NAME
local juming-nginx
[root@VM-16-10-centos ~]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2022-09-10T16:09:42+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxx/_data下
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况使用具名挂载
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /宿主机路径::容器内路径 #指定路径挂载
扩展:
# 通过 -v 容器内路径:ro rw改变读写权限
ro #只读
rw #可读可写
#一旦设置了容器权限,容器对我们挂载出来的内容就有限定了
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
#ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内无法操作