docker容器, 再启动之后 我们可以对其进行 修改删除等等。
如果是一个数据库的容器, 里面的数据 不想随着这个容器的消失, 而消失。 就需要持久化数据存储。
Data Volume
这是 docker hub 上面 mysql 的Dockerfile 这里的 VOLUME 意思就是, 将产生的数据 写入到当前主机的 /var/lib/mysql 里面。
[miller@docker4 ~]$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE daocloud.io/library/mysql latest 9228ee8bac7a 11 days ago 547MB
[miller@docker4 ~]$ docker run -d --name=mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true daocloud.io/library/mysql e7945f20bc456038a110a9798299356c8e7912a22eceaaf4e2bd29880460ab6f
-e MYSQL_ALLOW_EMPTY_PASSWORD=true 告诉mysql 没有密码也可以用。
https://hub.docker.com/_/mysql 这里有一些参数的详解。 也可以设置密码。
[miller@docker4 ~]$ docker volume ls # 会在主机上找个地方存 数据
DRIVER VOLUME NAME
local 283f5d6584642ae6d32d5e02fd1330855b501dd891ddf38c5b40428183c652c8 # 这个是redis的
local 330b65bda64c22b0929443d9eaa2db28c3a2468f76876b706c8efdbcbf6e4919 # 这个是mysql的
[miller@docker4 docker]$ docker volume inspect 330b65bda64c22b0929443d9eaa2db28c3a2468f76876b706c8efdbcbf6e4919 [ { "CreatedAt": "2020-04-11T20:26:36+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/330b65bda64c22b0929443d9eaa2db28c3a2468f76876b706c8efdbcbf6e4919/_data", "Name": "330b65bda64c22b0929443d9eaa2db28c3a2468f76876b706c8efdbcbf6e4919", "Options": null, "Scope": "local" } ]
"Mountpoint": "/var/lib/docker/volumes/330b65bda64c22b0929443d9eaa2db28c3a2468f76876b706c8efdbcbf6e4919/_data" 这个路径就是安装docker这台主机
上的文件路径。 数据库产生的数据 都会存储到这里。 volume 是不会因为容器的删除 而消失。
由于volume的名字不友好, 可以自己定义:起别名:
[miller@docker4 ~]$ docker run -d --name=mysql1 -v mysql:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true daocloud.io/library/mysql 7b006082d7d9c1cc8f17dfaefda26afea6d2adb0c89b216eafe193fa9420c917
-v mysql:/var/lib/mysql 就这一段参数。 本机上的 /var/lib/docker/volumes/mysql的 就和 容器中 /var/lib/mysql 这两个目录是同步的了。
[miller@docker4 ~]$ docker volume ls
DRIVER VOLUME NAME
local 330b65bda64c22b0929443d9eaa2db28c3a2468f76876b706c8efdbcbf6e4919 # redis的
local mysql # 刚刚创建的 mysql 容器的 volume
可以进到 MySQL 容器中,登录客户端。
[miller@docker4 ~]$ docker exec -it mysql1 /bin/bash
root@c057b8fbb3ad:/# mysql -u root Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.0.19 MySQL Community Server - GPL Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
在这个数据库里面, 创建一个库 然后, 停止mysql容器, 再删除容器。
[miller@docker4 ~]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c057b8fbb3ad daocloud.io/library/mysql "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 3306/tcp, 33060/tcp mysql1 [miller@docker4 ~]$ docker rm -f mysql1 # 停止这个容器 并且删除 mysql1
[miller@docker4 ~]$ docker volume ls
DRIVER VOLUME NAME
local 330b65bda64c22b0929443d9eaa2db28c3a2468f76876b706c8efdbcbf6e4919
local mysql # volume 是还在的。 后面再创建一个 容器 然后依然使用这个 volume
# 可以看到, 再次重新创建一个 容器。 依然使用同一个 volume 的话。 还能继续使用原来的数据。 是没有丢的。
[miller@docker4 ~]$ docker run -d --name=mysql2 -v mysql:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true daocloud.io/library/mysql f9cfe55e7e6d85a6c44bc177fb324051e5735e80dbf30c5224cbfd0c7f844181
[miller@docker4 ~]$ docker exec -it mysql2 mysql -u root Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.0.19 MySQL Community Server - GPL Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | docker | | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.01 sec)
Bind Mounting: 的方式, 进行数据持久化。(这个其实就是将docker宿主机的一个 目录。映射到容器当中。)
不仅仅是数据库:
如果启用一个 nginx 服务, 在这个容器的 /usr/share/nginx/html 这个目录下, 都是这个web服务的静态文件。
docker run -v 这个指令 可以将这个容器中的 /usr/share/nginx/html 路径, 映射到 本机的某个目录中。 这样我们在修改本机的文件的时候, 同步的容器中的这个目录
也会跟着修改。 因为他们是同步的。
[miller@ static_html_file] docker run -d -v $(pwd):/usr/share/nginx/html -p 80:80 # 这样当前目录就映射到了 容器中。两边是同步的。
这样做的好处就是, 对于开发者是一个极大的方便。
因为将本机的目录 , 映射到容器当中。我们在本机的这个目录中做任何事情。 都会马上体现到 容器中。
方便调试 开发。
非常方便, 因为一般宿主机的环境, 和测试 运维等等 都不相同。 但是如果大家都是用docker的话。 都可以使用相同的环境进行开发测试。