Docker学习03
commit镜像
-
docker commit 提交容器成为一个新的版本 docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
-
# 启动一个默认的tomcat docker run -it -p 8080:8080 tomcat docker ps # 发现这个默认的tomcat 是没有webapps应用的,官网的镜像默认webapps下是没有文件的 # 将webapps.dist 下的文件拷贝到webapss # 将操作过后的容器通过commit提交为一个镜像,之后使用 docker commit -m="add webapps" -a="yunhgu" asdfsadfsfd tomcat01:v1.0
-
REPOSITORY TAG IMAGE ID CREATED SIZE tomcat01 v1.0 9f4ef5658c7c 44 hours ago 672MB
容器数据卷
- docker的理念
将应用和环境打包成一个镜像
数据?加入数据都在容器中,数据就会丢失, 因此希望数据可以持久化
容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!这就是卷技术!
目录的挂载,将容器内的目录,挂载到Linux上面
**容器的持久化和同步操作!容器之间可以数据共享 **
-
使用数据卷(双向的,源和目的会保持一致)
方式一:使用命令来进行挂载 -v docker run -it -v 主机目录:容器目录 容器 /bin/bash # 启动后我们可以通过docker inspect 容器id 来查看是否绑定成功 "Mounts": [ { "Type": "bind", "Source": "/home/ceshi", "Destination": "/home", "Mode": "", "RW": true, "Propagation": "rprivate" } ],
好处:以后修改只需要在本地上修改,不需要进入到容器,数据可以持久保存
-
练习:Mysql数据持久化
root@K8S-APP-T02:/home#docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql latest 0627ec6901db 2 weeks ago 556MB # 启动mysql,设置挂载的文件,同时mysql需要配置密码 root@K8S-APP-T02:/home#docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:latest root@K8S-APP-T02:/home#ls config mysql sysadmin sys-config.txt test.txt viewer
将容器删除后,本地的数据依然在
具名和匿名挂载
# 匿名挂载
-v 容器内路径
docker run -d -p --name nginx01 -v /etc/nginx nginx
# 查看所有volume的情况
docker volume ls
DRIVER VOLUME NAME
local 2169dfd83e56afcb41cb6c332b3c65a228b5deca2cdf6c7cf16b624dcabd2c38
local 24400f15cd3d990ce8191502519d6b20bd354c22468366b621df365eacc394bb
local d8d5a0c33f2a4cd686cefcf6df5c08f0d6beaf51f456230b168c5f782fb2e164
这个就是匿名挂载,我们在-v 只写了容器内的地址,没有写容器外的
# 具名挂载
root@K8S-APP-T02:/home#docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
5d336b7d5c9abfd26432f36b4f6fa42ee147b63f843e4d5e41175c30d8151ad4
root@K8S-APP-T02:/home#docker volume ls
DRIVER VOLUME NAME
local 2169dfd83e56afcb41cb6c332b3c65a228b5deca2cdf6c7cf16b624dcabd2c38
local 24400f15cd3d990ce8191502519d6b20bd354c22468366b621df365eacc394bb
local d8d5a0c33f2a4cd686cefcf6df5c08f0d6beaf51f456230b168c5f782fb2e164
local juming-nginx
# 通过 -v 卷名:容器内路径
# 查看一下卷的路径
root@K8S-APP-T02:/home#docker volume inspect juming-nginx
[
{
"CreatedAt": "2021-05-10T10:36:46+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/gwmfc/app/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
所有的docker 容器内的卷,没有指定目录的情况下都是在/docker/volumes下
# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /宿主机路径:容器内路径 # 指定路径挂载
拓展:
# 通过 -v 容器内路径:ro rw 改变读写权限
ro readonly # 只读
rw readwrite # 可读可写
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
Dockerfile初识
Dockerfile 就是用来构建docker镜像的构建文件!命令脚本!先体验一下!
通过脚本可以生成镜像,镜像是一层一层的,脚本一个一个的命令,每个命令都是一层
vim dockerfile
root@K8S-APP-T02:/home/docker-test-volume#cat dockerfile
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "-----end--------"
CMD /bin/bash
root@K8S-APP-T02:/home/docker-test-volume#docker build -f dockerfile -t yunhgu/centos:1.0 .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 300e315adb2f
Step 2/4 : VOLUME ["volume01","volume02"]
---> Running in 26b54cc7965d
Removing intermediate container 26b54cc7965d
---> 2ac3a569f7fc
Step 3/4 : CMD echo "-----end--------"
---> Running in d1ab2773f28f
Removing intermediate container d1ab2773f28f
---> f324d56aedcd
Step 4/4 : CMD /bin/bash
---> Running in c78ae51d0024
Removing intermediate container c78ae51d0024
---> e1b499caf46c
Successfully built e1b499caf46c
Successfully tagged yunhgu/centos:1.0
root@K8S-APP-T02:/home/docker-test-volume#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
yunhgu/centos 1.0 e1b499caf46c About a minute ago 209MB
# 启动测试
root@K8S-APP-T02:/root#docker run -it e1b499caf46c /bin/bash
[root@b7cdc2fe6e75 /]# ls -l
total 0
lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x 5 root root 360 May 10 03:31 dev
drwxr-xr-x 1 root root 66 May 10 03:31 etc
drwxr-xr-x 2 root root 6 Nov 3 2020 home
lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
drwx------ 2 root root 6 Dec 4 17:37 lost+found
drwxr-xr-x 2 root root 6 Nov 3 2020 media
drwxr-xr-x 2 root root 6 Nov 3 2020 mnt
drwxr-xr-x 2 root root 6 Nov 3 2020 opt
dr-xr-xr-x 277 root root 0 May 10 03:31 proc
dr-xr-x--- 2 root root 162 Dec 4 17:37 root
drwxr-xr-x 11 root root 163 Dec 4 17:37 run
lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x 2 root root 6 Nov 3 2020 srv
dr-xr-xr-x 13 root root 0 Apr 1 02:33 sys
drwxrwxrwt 7 root root 145 Dec 4 17:37 tmp
drwxr-xr-x 12 root root 144 Dec 4 17:37 usr
drwxr-xr-x 20 root root 262 Dec 4 17:37 var
drwxr-xr-x 2 root root 6 May 10 03:31 volume01
drwxr-xr-x 2 root root 6 May 10 03:31 volume02
我们通过dockerfile 创建的image 已经写好了挂载的文件,减少了后期手动再去挂载
数据卷容器
多个容器同步数据
# 创建一个容器
root@K8S-APP-T02:/root#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
yunhgu/centos 1.0 e1b499caf46c 2 hours ago 209MB
root@K8S-APP-T02:/root#docker run -it --name docker01 e1b499caf46c
[root@2fb09d1b140e /]#
# 创建另一个容器
root@K8S-APP-T02:/root#docker run -it --name docker02 --volumes-from docker01 e1b499caf46c
# 在docker01 里的volume 中的数据会同步到docker02, 反之也会同步
# 删除docker01 ,docker02里的文件不会丢失
结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
但是一旦持久化到本地,这个时候, 本地的数据是不会删除的
不论你在什么时候开始,重要的是开始之后就不要停止。
不论你在什么时候结束,重要的是结束之后就不要悔恨。