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里的文件不会丢失	

结论:

容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。

但是一旦持久化到本地,这个时候, 本地的数据是不会删除的

不论你在什么时候开始,重要的是开始之后就不要停止。 不论你在什么时候结束,重要的是结束之后就不要悔恨。
原文地址:https://www.cnblogs.com/yunhgu/p/14753744.html