【Docker学习笔记 五】深入理解Docker容器数据卷机制

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
云数据库 Tair(兼容Redis),内存型 2GB
简介: 【Docker学习笔记 五】深入理解Docker容器数据卷机制

前几篇Blog是对Docker的一个入门和初识,本篇Blog开始就详细学习下一个新的理论基础概念:Volume,也就是容器数据卷,听起来名字高大上,实际上就是一个宿主机的目录而已,为什么需要容器数据卷呢,可以类比Redis来理解,Redis运行在内存中,一旦停了数据都丢了怎么办?只能通过持久化的手段,Redis的持久化方案是RDB+AOF,感兴趣的可以看看我这篇Blog【Redis核心知识 二】Redis持久化策略,容器虽然没有那么脆弱,停了数据还是在的,但是容器删起来也很容易啊,删了数据就没有了,问题来了,如果容器运行着一个mysql服务,不小心一删,那不直接删库跑路了么,所以容器也需要持久化,把数据持久化到宿主机磁盘,实现方式就是通过容器数据卷机制

数据卷基本概念

Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume)。数据卷可以用来存储Docker应用的数据,也可以用来在Docker容器间进行数据共享。数据卷呈现给Docker容器的形式就是一个目录,支持多个容器间共享,修改也不会影响镜像。使用Docker的数据卷,类似在系统中使用mount 挂载一个文件系统

容器数据卷的特性

Docker Volume数据卷说白了就是从容器到宿主机直接创建一个文件目录映射,宿主机创建的容器卷可以挂载到任何一个容器上,它有以下特点:

  • 绕过UFS系统,以达到本地磁盘IO的性能,比如运行一个容器,在容器中对数据卷修改内容,会直接改变宿主机上的数据卷中的内容,所以是本地磁盘IO的性能,而不是先在容器中写一份,最后还要将容器中的修改的内容拷贝出来进行同步
  • 绕过UFS系统,有些文件例如容器运行产生的数据文件不需要再通过docker commit打包进镜像文件
  • 数据卷可以在容器间共享和重用数据
  • 数据卷可以在宿主和容器间共享数据
  • 数据卷数据改变是直接修改且实时同步
  • 数据卷是持续性的,直到没有容器使用它们。即便是初始的数据卷容器或中间层的数据卷容器删除了,只要还有其他的容器使用数据卷,那么里面的数据都不会丢失

可以理解这么理解,宿主机的数据卷目录和容器里映射的目录在宿主机磁盘上是一个地址,容器里的目录类似快捷方式

数据卷基本命令

数据卷的常用命令如下,还是老方法,通过--help去获取volume可进行的操作:

[root@192 _data]# docker volume --help
Usage:  docker volume COMMAND
Manage volumes
Commands:
  create      Create a volume
  inspect     Display detailed information on one or more volumes
  ls          List volumes
  prune       Remove all unused local volumes
  rm          Remove one or more volumes
Run 'docker volume COMMAND --help' for more information on a command.
[root@192 _data]#

1 创建数据卷

在宿主机创建一个数据卷:

[root@192 /]# docker volume create tml-volume
tml-volume
[root@192 /]#

2 查看所有数据卷

可以通过如下命令查看现在所有存在的数据卷:

[root@192 /]# docker volume ls
DRIVER    VOLUME NAME
local     0cd478e2d6a6c8cecbeaf2e07cc411323960ece5ad6b938ccd8ce3845108fe70
local     4a572909e8b5e931db5c7906fff0d92f042f73ff73ddb34be7cee8c3c2fda1f6
local     521f65180d63919ff0edad9eb2fdb05e97870f2a5d1782d0c5bbe680b86cb774
local     819f5ee5d9fa1eea5721b5e94d64897709c81e64c0c86b63cc8340d3b93115db
local     852e2d79d67e1869d8e8805c9fcb93a27bdefdf72a4e5d94b7d8cce3c8f2497e
local     d2f0f70687937d2346909cb5a3582cd17a414e69d7b39a14d2d0d792b70d9b75
local     tml-volume

3 查看指定数据卷的信息

通过如下命令查看指定数据卷的元信息:

[root@192 /]# docker volume inspect tml-volume
[
    {
        "CreatedAt": "2022-02-26T21:08:43+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/tml-volume/_data",
        "Name": "tml-volume",
        "Options": {},
        "Scope": "local"
    }
]

4 删除指定的数据卷

可以使用如下命令删除指定数据卷:

[root@192 /]# docker volume rm  tml-volume    
tml-volume
[root@192 /]# docker volume ls
DRIVER    VOLUME NAME
local     0cd478e2d6a6c8cecbeaf2e07cc411323960ece5ad6b938ccd8ce3845108fe70
local     4a572909e8b5e931db5c7906fff0d92f042f73ff73ddb34be7cee8c3c2fda1f6
local     521f65180d63919ff0edad9eb2fdb05e97870f2a5d1782d0c5bbe680b86cb774
local     819f5ee5d9fa1eea5721b5e94d64897709c81e64c0c86b63cc8340d3b93115db
local     852e2d79d67e1869d8e8805c9fcb93a27bdefdf72a4e5d94b7d8cce3c8f2497e
local     d2f0f70687937d2346909cb5a3582cd17a414e69d7b39a14d2d0d792b70d9b75
[root@192 /]#

5 删除所有未被使用的数据卷

相当于做系统的垃圾清理,如果没有容器使用相关卷,那么使用这个命令减少磁盘占用:

[root@192 /]# docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
d2f0f70687937d2346909cb5a3582cd17a414e69d7b39a14d2d0d792b70d9b75
0cd478e2d6a6c8cecbeaf2e07cc411323960ece5ad6b938ccd8ce3845108fe70
521f65180d63919ff0edad9eb2fdb05e97870f2a5d1782d0c5bbe680b86cb774
Total reclaimed space: 205.1MB
[root@192 /]# docker volume ls
DRIVER    VOLUME NAME
local     4a572909e8b5e931db5c7906fff0d92f042f73ff73ddb34be7cee8c3c2fda1f6
local     819f5ee5d9fa1eea5721b5e94d64897709c81e64c0c86b63cc8340d3b93115db
local     852e2d79d67e1869d8e8805c9fcb93a27bdefdf72a4e5d94b7d8cce3c8f2497e
[root@192 /]#

容器数据卷挂载方式

数据卷有三种挂载方式:指定路径挂载、匿名挂载以及具名挂载

1 容器数据卷指定路径挂载

指定路径挂载指的是指定容器内的数据路径和宿主机本机路径的映射关系,举个例子,我们为centos下的文件目录有宿主机进行映射:

运行容器时交互式运行,并指定容器卷挂载

容器内数据变化

[root@192 ~]# cd /home
[root@192 home]# ls
test.java  tml-1
[root@192 home]# docker run -it -v /home/volume_centos:/home centos /bin/bash
[root@ed2f3e1f3787 /]# cd /home
[root@ed2f3e1f3787 home]# ls
[root@ed2f3e1f3787 home]# touch test-tml.java
[root@ed2f3e1f3787 home]# ls
test-tml.java

宿主机数据变化

[root@192 ~]# cd /home
[root@192 home]# ls
test.java  tml-1  volume_centos
[root@192 home]# cd volume_centos/
[root@192 volume_centos]# ls
[root@192 volume_centos]# ls
test-tml.java

当然这种挂载映射是双向的,我们在本地主机的操作:新增一个文件test-add.java

[root@192 volume_centos]# touch test-add.java
[root@192 volume_centos]# cd ..
[root@192 home]# ls
test.java  tml-1  volume_centos
[root@192 home]# touch tml-not-add.java
[root@192 home]#

在容器内也能在映射目录下找到对应新增的目录

[root@192 home]# docker start ed2f3e1f3787
ed2f3e1f3787
[root@192 home]# docker attach ed2f3e1f3787
[root@ed2f3e1f3787 /]# ls
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
[root@ed2f3e1f3787 /]# cd /home
[root@ed2f3e1f3787 home]# ls
test-add.java  test-tml.java
[root@ed2f3e1f3787 home]# ls
test-add.java  test-tml.java
[root@ed2f3e1f3787 home]#

但是非映射目录的数据变更不会互相影响,例如:主机tml-not-add.java文件的添加容器内目录就没有做相应改变。挂载完数据卷后我们可以通过查看容器元数据来查看容器卷相关信息:

[root@ed2f3e1f3787 home]# exit
exit
[root@192 home]# docker ps -a
CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS                       PORTS                                                                                  NAMES
ed2f3e1f3787   centos                "/bin/bash"              5 minutes ago   Exited (130) 6 seconds ago                                                                                          thirsty_spence
78664208a245   portainer/portainer   "/portainer"             7 days ago      Up 6 days                    0.0.0.0:8088->9000/tcp, :::8088->9000/tcp                                              thirsty_gauss
b7842800b1cb   mysql                 "docker-entrypoint.s…"   7 days ago      Exited (255) 6 days ago      33060/tcp, 0.0.0.0:3366->3306/tcp, :::3366->3306/tcp                                   mysql-tml
3b66fa35905f   elasticsearch:7.6.2   "/usr/local/bin/dock…"   7 days ago      Exited (255) 6 days ago      0.0.0.0:3396->9200/tcp, :::3396->9200/tcp, 0.0.0.0:3397->9300/tcp, :::3397->9300/tcp   elasticsearch-tml-7.6.2
bd6877cd46ce   elasticsearch         "/docker-entrypoint.…"   7 days ago      Exited (255) 6 days ago      0.0.0.0:3392->9200/tcp, :::3392->9200/tcp, 0.0.0.0:3393->9300/tcp, :::3393->9300/tcp   elasticsearch-tml
2f59536a92da   tomcat                "catalina.sh run"        7 days ago      Up 6 days                    0.0.0.0:3335->8080/tcp, :::3335->8080/tcp                                              tomcat-tml
b8ae778bad8c   nginx                 "/docker-entrypoint.…"   7 days ago      Exited (255) 6 days ago      0.0.0.0:3334->80/tcp, :::3334->80/tcp                                                  nginx-tml
e36cf9dc0c2d   centos                "/bin/bash"              3 weeks ago     Exited (0) 3 weeks ago                                                                                              sharp_turing
4ed9be7f96c8   centos                "/bin/bash"              3 weeks ago     Exited (255) 6 days ago                                                                                             inspiring_rhodes
a5b62e74ac6b   centos                "/bin/bash"              3 weeks ago     Exited (130) 3 weeks ago                                                                                            keen_mccarthy
de82be8ae261   centos                "/bin/bash"              3 weeks ago     Exited (127) 3 weeks ago                                                                                            silly_tu
a066e195a535   hello-world           "/hello"                 3 weeks ago     Exited (0) 3 weeks ago                                                                                              sharp_wescoff
220887d9f138   centos                "/bin/bash"              3 weeks ago     Exited (0) 3 weeks ago                                                                                              kind_noyce
cc886973b2cb   centos                "/bin/sh -c 'while t…"   3 weeks ago     Exited (255) 6 days ago                                                                                             suspicious_borg
1dadd4b80c2c   centos                "/bin/bash"              3 weeks ago     Exited (0) 3 weeks ago                                                                                              intelligent_hopper
efa634e8f92c   tomcat                "catalina.sh run"        3 weeks ago     Exited (130) 3 weeks ago                                                                                            unruffled_pascal
565553077e93   centos                "/bin/bash"              3 weeks ago     Exited (0) 3 weeks ago                                                                                              busy_hoover
22728b1cc9da   centos                "/bin/bash"              3 weeks ago     Exited (0) 3 weeks ago                                                                                              loving_mahavira
[root@192 home]# docker inspect ed2f3e1f3787
[
   {
     ...............
   "Mounts": [
            {
                "Type": "bind",
                "Source": "/home/volume_centos",
                "Destination": "/home",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ]
    }
     ...............
]

其中Source为宿主机目录,Destination为容器内目录,模式为RW,也就是读写模式,这种读写模式或只读模式约束的是容器对数据卷的操作,主机在对应目录可以随意更改,就好像你在随意改数据库,而限制了程序对数据库的读写模式一样。我们可以再看一个数据库Mysql的例子,使用如下命令创建一个数据卷:

docker run -d -p 6603:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql-5.7-tml mysql:5.7

容器内数据变化

[root@192 home]# docker run -d -p 6603:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql-5.7-tml mysql:5.7
Unable to find image 'mysql:5.7' locally
5.7: Pulling from library/mysql
72a69066d2fe: Already exists 
93619dbc5b36: Already exists 
99da31dd6142: Already exists 
626033c43d70: Already exists 
37d5d7efb64e: Already exists 
ac563158d721: Already exists 
d2ba16033dad: Already exists 
0ceb82207cd7: Pull complete 
37f2405cae96: Pull complete 
e2482e017e53: Pull complete 
70deed891d42: Pull complete 
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Status: Downloaded newer image for mysql:5.7
33fe5e65f7697538045046c122622cbcdb6981492a50f46d9033e4a049c280e2

宿主机数据变化

[root@192 /]# cd home
[root@192 home]# ls
mysql  test.java  tml-1  tml-not-add.java  volume_centos
[root@192 home]# cd mysql
[root@192 mysql]# ls
conf  data
[root@192 mysql]# cd data
[root@192 data]# ls
auto.cnf    client-cert.pem  ibdata1      ibtmp1              private_key.pem  server-key.pem
ca-key.pem  client-key.pem   ib_logfile0  mysql               public_key.pem   sys
ca.pem      ib_buffer_pool   ib_logfile1  performance_schema  server-cert.pem
[root@192 data]#

当我们通过navicat连接数据库写数据时:

可以看到,navicat创建的数据库docker_database:

在数据卷上也写了一份:

[root@192 data]# ls
auto.cnf    client-cert.pem  ib_buffer_pool  ib_logfile1  performance_schema  server-cert.pem
ca-key.pem  client-key.pem   ibdata1         ibtmp1       private_key.pem     server-key.pem
ca.pem      docker_database  ib_logfile0     mysql        public_key.pem      sys
[root@192 data]#

2 容器数据卷匿名挂载

匿名挂载就是在指定数据卷的时候,不指定容器路径对应的主机路径,这样对应映射的主机路径就是默认的路径/var/lib/docker/volumes/中自动生成一个随机命名的文件夹

[root@192 /]# docker volume ls
DRIVER    VOLUME NAME
local     4a572909e8b5e931db5c7906fff0d92f042f73ff73ddb34be7cee8c3c2fda1f6
local     819f5ee5d9fa1eea5721b5e94d64897709c81e64c0c86b63cc8340d3b93115db
local     852e2d79d67e1869d8e8805c9fcb93a27bdefdf72a4e5d94b7d8cce3c8f2497e
[root@192 /]# clear
[root@192 /]# docker run -d -P --name nginx-tml-volume -v /etc/nginx nginx  
a872a0802014abe94b72615bc09788b6741f762867e5c112d3338c2f142b7787
[root@192 /]# docker volume ls
DRIVER    VOLUME NAME
local     4a572909e8b5e931db5c7906fff0d92f042f73ff73ddb34be7cee8c3c2fda1f6
local     819f5ee5d9fa1eea5721b5e94d64897709c81e64c0c86b63cc8340d3b93115db
local     852e2d79d67e1869d8e8805c9fcb93a27bdefdf72a4e5d94b7d8cce3c8f2497e
local     c648402f4573092f76dfd2b89ca16b774bdada37290937d361bf9e6e3b321d11
[root@192 /]#

可以看出来c648402f4573092f76dfd2b89ca16b774bdada37290937d361bf9e6e3b321d11就是新运行的nginx容器阐释的数据卷,查看元数据并进入目录,可以清晰的看到nginx的配置文件:

[root@192 /]# docker volume inspect  c648402f4573092f76dfd2b89ca16b774bdada37290937d361bf9e6e3b321d11
[
    {
        "CreatedAt": "2022-02-26T21:34:38+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/c648402f4573092f76dfd2b89ca16b774bdada37290937d361bf9e6e3b321d11/_data",
        "Name": "c648402f4573092f76dfd2b89ca16b774bdada37290937d361bf9e6e3b321d11",
        "Options": null,
        "Scope": "local"
    }
]
[root@192 /]# cd /var/lib/docker/volumes/c648402f4573092f76dfd2b89ca16b774bdada37290937d361bf9e6e3b321d11/_data
[root@192 _data]# ls
conf.d  fastcgi_params  mime.types  modules  nginx.conf  scgi_params  uwsgi_params
[root@192 _data]#

3 容器数据卷具名挂载

具名挂载,就是指定文件夹名称,区别于指定路径挂载,这里的指定文件夹名称是在Docker指定的默认数据卷路径下的。同样通过docker volume ls命令可以查看当前数据卷的目录情况

[root@192 _data]# docker run -d -P --name nginx-tml-juming -v tml-juming-mount-nginx:/etc/nginx nginx
0b24ae53e7fc60fd2ba6ee4d989903b3fb1a25cdd597d9d95a988674fd884fbb
[root@192 _data]# docker volume ls
DRIVER    VOLUME NAME
local     4a572909e8b5e931db5c7906fff0d92f042f73ff73ddb34be7cee8c3c2fda1f6
local     819f5ee5d9fa1eea5721b5e94d64897709c81e64c0c86b63cc8340d3b93115db
local     852e2d79d67e1869d8e8805c9fcb93a27bdefdf72a4e5d94b7d8cce3c8f2497e
local     c648402f4573092f76dfd2b89ca16b774bdada37290937d361bf9e6e3b321d11
local     tml-juming-mount-nginx
[root@192 _data]# docker volume inspect tml-juming-mount-nginx
[
    {
        "CreatedAt": "2022-02-26T21:38:06+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/tml-juming-mount-nginx/_data",
        "Name": "tml-juming-mount-nginx",
        "Options": null,
        "Scope": "local"
    }
]
[root@192 _data]# cd /var/lib/docker/volumes/tml-juming-mount-nginx/_data
[root@192 _data]# ls
conf.d  fastcgi_params  mime.types  modules  nginx.conf  scgi_params  uwsgi_params
[root@192 _data]#

当然在挂载时我们可以指定读写和只读模式,默认是读写模式,我们来看看设置只读模式效果:

[root@192 _data]#  docker run -d -P --name nginx-ro -v juming-nginx:/etc/nginx:ro nginx  
b4c122ea9c7eb33aeaec56a9784d8e66f410245f06911699335a679f6d0b7265
[root@192 /]# docker inspect b4c122ea9c7eb33aeaec56a9784d8e66f410245f06911699335a679f6d0b7265

打印出来的容器元数据如下,可以看到RW属性值为false。

"Mounts": [
            {
                "Type": "volume",
                "Name": "juming-nginx",
                "Source": "/var/lib/docker/volumes/juming-nginx/_data",
                "Destination": "/etc/nginx",
                "Driver": "local",
                "Mode": "ro",
                "RW": false,
                "Propagation": ""
            }
        ],

容器数据卷依赖挂载

不光是容器与宿主机之间,容器与容器之间也可以相互依赖进行数据卷挂载,实质上这个示例只是容器间数据同步。首先我们新开一个容器,在里面新增两个目录:

container-tml-01容器,创建一个容器数据卷

[root@192 ~]# docker run -it -v /var/volume1 -v /var/volume2 --name container-tml-01 centos:latest /bin/bash
[root@df3a751e89b2 /]# cd /var
[root@df3a751e89b2 var]# ls
adm    crash  empty  games   kerberos  local  log   nis  preserve  spool  volume1  yp
cache  db     ftp    gopher  lib       lock   mail  opt  run       tmp    volume2
[root@df3a751e89b2 var]# ls
adm    crash  empty  games   kerberos  local  log   nis  preserve  spool  volume1  yp
cache  db     ftp    gopher  lib       lock   mail  opt  run       tmp    volume2
[root@df3a751e89b2 var]# cd volume1
[root@df3a751e89b2 volume1]# ls
tml.java
[root@df3a751e89b2 volume1]# touch tml2.java
[root@df3a751e89b2 volume1]# ls
tml.java  tml2.java
[root@df3a751e89b2 volume1]#

container-tml-02容器,挂载到container-tml-01下

[root@192 ~]# docker run -it  --name container-tml-02 --volumes-from container-tml-01 centos:latest /bin/bash
[root@763ce484f7f4 /]# ls
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
[root@763ce484f7f4 /]# cd var
[root@763ce484f7f4 var]# ls
adm    crash  empty  games   kerberos  local  log   nis  preserve  spool  volume1  yp
cache  db     ftp    gopher  lib       lock   mail  opt  run       tmp    volume2
[root@763ce484f7f4 var]# cd volume1
[root@763ce484f7f4 volume1]# touch tml.java
[root@763ce484f7f4 volume1]# ls
tml.java
[root@763ce484f7f4 volume1]# ls
tml.java  tml2.java
[root@763ce484f7f4 volume1]#

从以上两个命令窗口变化可以看出,容器1和2在挂载目录处已经实现了数据互通。

总结一下

容器数据卷还是一个比较重要的机制,类似于redis的持久化机制。因为容器感觉太轻量级了,似乎很轻松就能被干掉,所以容器也需要在宿主机的一个目录上持久化自己的重要数据,防止容器被删除时数据也被误删,尤其是容器如果是基于一个Mysql镜像构建的,那就太危险了!当然其实除了数据保护容器数据卷机制还有一些别的功能,例如将多个容器配置映射到宿主机同一目录,通过配置一次性修改达到多个容器同时生效。它的数据在容器间互通,容器宿主机互通的特性感觉在之后会有很多场景可以使用到,学到的时候拭目以待。

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
8天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
130 77
|
16天前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序
|
22小时前
|
关系型数据库 应用服务中间件 PHP
实战~如何组织一个多容器项目docker-compose
本文介绍了如何使用Docker搭建Nginx、PHP和MySQL的环境。首先启动Nginx容器并查看IP地址,接着启动Alpine容器并安装curl测试连通性。通过`--link`方式或`docker-compose`配置文件实现服务间的通信。最后展示了Nginx配置文件和PHP代码示例,验证了各服务的正常运行。
10 2
实战~如何组织一个多容器项目docker-compose
|
10天前
|
数据建模 应用服务中间件 nginx
docker替换宿主与容器的映射端口和文件路径
通过正确配置 Docker 的端口和文件路径映射,可以有效地管理容器化应用程序,确保其高效运行和数据持久性。在生产环境中,动态替换映射配置有助于灵活应对各种需求变化。以上方法和步骤提供了一种可靠且易于操作的方案,帮助您轻松管理 Docker 容器的端口和路径映射。
44 3
|
17天前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
50 7
|
17天前
|
存储 Prometheus 监控
Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行
本文深入探讨了在Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行。
27 5
|
17天前
|
开发框架 安全 开发者
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。本文探讨了 Docker 在多平台应用构建与部署中的作用,包括环境一致性、依赖管理、快速构建等优势,以及部署流程和注意事项,展示了 Docker 如何简化开发与部署过程,提高效率和可移植性。
40 4
|
17天前
|
负载均衡 网络协议 算法
Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式
本文探讨了Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式,以及软件负载均衡器、云服务负载均衡、容器编排工具等实现手段,强调两者结合的重要性及面临挑战的应对措施。
44 3
|
17天前
|
存储 安全 数据中心
Docker 容器凭借轻量级和高效的特性,成为应用部署的重要工具
Docker 容器凭借轻量级和高效的特性,成为应用部署的重要工具。本文探讨了 Docker 如何通过 Namespace 和 Cgroups 实现 CPU、内存、网络和存储资源的隔离,提高系统安全性和资源利用率,以及面临的挑战和应对策略。
32 1
|
21天前
|
Kubernetes Linux 开发者
深入探索容器化技术——Docker 的实战应用
深入探索容器化技术——Docker 的实战应用
51 5