数据卷
数据卷是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount行为。

数据卷的特性:

数据卷可以在容器之间共享和重用,容器间传递数据将变得高效与方便;
对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作;
对数据卷的共享不会影响镜像,解耦开应用和数据;
卷会一直存在,直到没有容器使用,可以安全地卸载它。


(1)创建数据卷

Docker提供了volume子命令来管理数据卷,如下命令可以快速在本地创建一个数据卷:

[root@openEuler-1 ~]# docker volume create -d local test
test
 
# 查看/var/lib/docker/volumes 路径下,会发现所创建的数据卷的位置
[root@openEuler-1 ~]# ll /var/lib/docker/volumes/
drwx-----x 3 root root   4096 Mar  8 20:16 test


出来create子命令外,docker volume还支持inspect(查看详细信息)、ls(列出已有数据卷)、prune(清理无用数据卷)、rm(删除数据卷)等。

(2)绑定数据卷

除了使用volume子命令来管理数据卷外,还可以在创建容器时将主机本地的任意路径挂载到容器内作为数据卷,这种形式创建的数据卷称为绑定数据卷。

在使用docker [container] run命令的时候,可以使用-mount选项来使用数据卷。-mount选项支持三种类型的数据卷,包括:

volume:普通数据卷,映射到主机/var/lib/docker/volumes路径下;
bind:绑定数据卷,映射到主机指定路径下;
tmpfs:临时数据卷,只存在内存中。


示例:使用nginx镜像创建一个web容器,并创建一个数据卷挂载到容器的/opt/webapp目录:

[root@openEuler-1 ~]# docker run -d -P --name web -v /webapp:/opt/webapp nginx
0a5630ef7b350d9a418ffa41472378e78aedf8a317cf6df5a45282c4cbfa076c
# -P 随机端口映射
 
[root@openEuler-1 ~]# docker port web
80/tcp -> 0.0.0.0:32768
80/tcp -> [::]:32768


2、数据卷容器
如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其它容器挂载。

首先,创建一个数据卷容器dbdata,并在其中创建一个数据卷挂载到/dbdata:

[root@openEuler-1 ~]# docker run -it -v /dbdata --name dbdata ubuntu
root@20815dabc4c0:/#


然后,可以在其它容器中使用--volume-from来挂载dbdata容器中的数据卷,例如创建db1和db2两个容器,并从dbdata容器挂载数据卷。

[root@openEuler-1 ~]# docker run -it --volumes-from dbdata --name db1 ubuntu
root@d4e4d052642a:/#
[root@openEuler-1 ~]# docker run -it --volumes-from dbdata --name db2 ubuntu
root@d4e4d052642a:/#


此时容器db1和db2都挂载同一个数据卷到相同的/dbdata目录,三个容器任何一方在该目录下写入,其它容器都可以可见。

测试:

# 容器dbdata:
root@20815dabc4c0:/# touch dbdata/test.txt
 
# 容器db1:
root@d4e4d052642a:/# ls /dbdata
test.txt


如果删除了挂载的容器(包括dbdata、db1和db2),数据卷并不会自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时,显式使用docker rm -v命令来指定同时删除关联的容器。

3、使用数据卷容器来迁移数据
(1)备份

[root@openEuler-1 ~]# docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup.tar /dbdata
# 该命令利用ubuntu镜像创建了一个容器worker。
# 使用--volumes-from dbdata参数来让worker容器挂载dbdata容器的数据卷(即dbdata数据卷);
# 使用-v $(pwd):/backup 参数来挂载本地的当前目录到worker容器的/backup目录。
# worker容器启动后,使用tar cvf /backup/backup.tar /dbdata命令将/dbdata下内容备份为容器内的/backup/backu.tar,即宿主主机当前目录下的backup.tar


(2)恢复

如果要恢复数据到一个容器,首先创建一个带有数据卷的容器dbdata2:

[root@openEuler-1 ~]# docker run -v /dbdata --name dbdata2 ubuntu /bin/bash


任何创建一个新的容器,挂载dbdata2的容器,并使用untar解压备份文件到所挂载的容器据卷中:

[root@openEuler-1 ~]# docker run --volumes-from dbdata2 -v $(pwd):/backup ubuntu tar xvf /backup/backup.tar


端口映射与容器互联
使用-P参数时,Docker会随机映射一个端口号到内部容器开放的网络端口

使用-p则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有:

IP:HostPort:ContainerPort
IP::ContainerPort
HostPort:ContainerPort


1、端口映射实现容器访问

[root@openEuler-1 ~]# docker run --name web -d -P -v /web:/usr/share/nginx/html nginx
d90f6282e6483bba0f2b2b4c2361f215cbb76881f084700aac8e802379bf2ba5
 
[root@openEuler-1 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                     NAMES
d90f6282e648   nginx     "/docker-entrypoint.…"   21 seconds ago   Up 21 seconds   0.0.0.0:32771->80/tcp, :::32771->80/tcp   web
 
[root@openEuler-1 ~]# echo "web test page" > /web/index.html
[root@openEuler-1 ~]# curl localhost:32771
web test page

(2)映射所有接口地址

使用 HostPort:ContainerPort 格式本地的80端口映射到容器的80端口:

[root@openEuler-1 ~]# docker run --name web1 -d -p 80:80 -v /web:/usr/share/nginx/html nginx
2815a5b303ffd327207987d143d1379a3164958c7fa95e1ed1cc152872634cc0
[root@openEuler-1 ~]# curl localhost
web test page


(3)映射到指定地址的指定端口

使用 IP:HostPort:ContainerPort 格式本地ip127.0.0.1的80端口映射到容器的80端口:

[root@openEuler-1 ~]# docker run --name web1 -d -p 127.0.0.1:80:80 -v /web:/usr/share/nginx/html nginx
b7609be970dacd7038c658de556bab69d584798f5905f15253de8fb318e8c75b
[root@openEuler-1 ~]# curl 127.0.0.1
web test page


(4)映射到指定地址的任意端口

使用 IP::ContainerPort 格式本地ip127.0.0.1的任意端口映射到容器的80端口:

[root@openEuler-1 ~]# docker run --name web1 -d -p 127.0.0.1::80 -v /web:/usr/share/nginx/html nginx
285615fedc0742e3a6598b06872133923fa66fd95c6f7dfe072a344a1a73899f
 
[root@openEuler-1 ~]# docker port web1
80/tcp -> 127.0.0.1:32768
 
[root@openEuler-1 ~]# curl 127.0.0.1:32768
web test page


(5)查看映射端口配置

命令:

docker port


2、互联机制实现便捷互访
容器的互联是一种让多个容器中的应用进行快速交互的方式。它会在源和接受容器之间创建连接关系,接收容器可以通过容器名快速访问到源容器,而不用指定具体IP地址。

(1)自定义容器命名

使用 --name 标记可以为容器自定义命名:

[root@openEuler-1 ~]# docker run -d -P --name web nginx
4b2a273ef4ae777ada5b29c00d86ec2156c041876d6234f3072f38af4a6b9414
[root@openEuler-1 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                     NAMES
4b2a273ef4ae   nginx     "/docker-entrypoint.…"   5 seconds ago   Up 4 seconds   0.0.0.0:32773->80/tcp, :::32773->80/tcp   web


(2)容器互联

使用 --link 参数可以让容器之间安全地进行交互:

# 首先创建一个新的数据库容器
[root@openEuler-1 ~]# docker run -d --name db -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
4363b2b8bc6613c418df1bf15dbf5da7143785d62c966b48d963be909cf73610
 
# 任何创建一个新的web容器,将其连接到db容器
[root@openEuler-1 ~]# docker run -d -P --name web --link db:web_db nginx
c3dd58e28c90377e87eb0327f6a5f3cab95d06eae34a07e160a38ce3b7244849
 
# 进入web容器查看
[root@openEuler-1 ~]# docker exec -it web bash
root@c3dd58e28c90:/# cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2      web_db 4363b2b8bc66 db
172.17.0.3      c3dd58e28c90

Docker通过两种方式为容器公开连接信息:

更新环境变量
更新/etc/hosts文件


使用env命令来查看web容器的环境变量:

root@c3dd58e28c90:/# env
WEB_DB_PORT_33060_TCP_PROTO=tcp
HOSTNAME=c3dd58e28c90
WEB_DB_PORT_33060_TCP_ADDR=172.17.0.2
PWD=/
PKG_RELEASE=1~bookworm
HOME=/root
WEB_DB_PORT_3306_TCP_ADDR=172.17.0.2
DYNPKG_RELEASE=1~bookworm
WEB_DB_PORT=tcp://172.17.0.2:3306
NJS_VERSION=0.8.9
WEB_DB_PORT_3306_TCP=tcp://172.17.0.2:3306
TERM=xterm
WEB_DB_ENV_MYSQL_ROOT_PASSWORD=123456
SHLVL=1
...

其中WEB_DB_开头的环境变量是供web容器连接db容器使用,前缀采用大写的连接别名。

除了环境变量,Docker还添加host信息到父容器的/etc/hosts的文件下,在上面演示过。

更多推荐