- 7. 容器数据卷
- 7.1 注意
- 7.2 容器数据卷是什么
- 7.3 容器数据卷能干吗
- 7.4 数据卷案例
- 7.4.1 宿主vs容器之间映射添加容器卷
- 7.4.2 查看数据卷是否挂载成功
- 7.4.3 容器和宿主机之间数据共享
- 7.4.4 读写规则映射添加说明
- 7.4.4.1 读写(默认)
- 7.4.4.2 只读
- 7.4.5 卷的继承和共享
- 7.4.5.1 容器1完成和宿主机的映射
- 7.4.5.2 容器2继承容器1的卷规则
- 7.4.5.3 停掉容器1,结果如何?
- 8. docker 常规安装简介
- 8.1 总体步骤
- 8.2 安装tomcat (实例)
- 8.2.1 docker hub上面查找tomcat镜像
- 8.2.2 从docker hub上拉取tomcat镜像到本地
- 8.2.3 docker images查看是否有拉取到的tomcat
- 8.2.4 使用tomcat镜像创建容器实例(也叫运行镜像)
- 8.2.5 访问 tomcat 首页
- 8.2.5.1 问题:
- 8.2.5.2 解决:
- 8.2.5.3 重启 tomcat 并访问
- 8.2.6 安装 tomcat 免修改版
- 8.3 安装 mysql
- 8.3.1 参考文档
- 8.3.2 操作示例
- 8.3.3 linux 脚本操作sql 数据库
- 8.3.4 插入数据
- 8.3.5 docker上安装mysql实战版
- 8.4 安装 redis
- 8.4.1 一般安装
- 8.4.2 挂载容器数据卷启动
- 8.4.2.1 在CentOS宿主机下新建目录/app/redis
- 8.4.2.2 将一个redis.conf文件模板拷贝进/app/redis目录下
- 8.4.2.3 启动后验证
课程来自于尚硅谷周阳老师的 docker 教程
链接地址: https://www.bilibili.com/video/BV1gr4y1U7CY?p=1
续上章: https://blog.csdn.net/BogerPeng/article/details/124286266
坑:容器卷记得加入
–privileged=true
why?
Docker挂载主机目录访问如果出现cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个–privileged=true参数即可
如果是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为, 在SELinux里面挂载目录被禁止掉了,如果要开启,我们一般使用--privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,也即 使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限。7.2 容器数据卷是什么
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
一句话:有点类似我们Redis里面的rdb和aof文件, 将docker容器内的数据保存进宿主机的磁盘中
运行一个带有容器卷存储功能的容器实例:
# docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名 docker run -d -p 5000:5000 -v /pyh/myregistry/:/tmp/registry --privileged=true registry7.3 容器数据卷能干吗
将运用与运行的环境打包镜像,run后形成容器实例运行 ,但是我们对数据的要求希望是持久化的
Docker容器产生的数据,如果不备份,那么当容器实例删除后,容器内的数据自然也就没有了。
为了能保存数据在docker中我们使用卷。
特点:
1:数据卷可在容器之间共享或重用数据
2:卷中的更改可以直接实时生效,爽
3:数据卷中的更改不会包含在镜像的更新中
4:数据卷的生命周期一直持续到没有容器使用它为止
# docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名 docker run -d -p 5000:5000 -v /pyh/myregistry/:/tmp/registry --privileged=true registry
公式:docker run -it -v /宿主机目录:/容器内目录 ubuntu /bin/bash
docker run -it --name myu3 --privileged=true -v /tmp/myHostData:/tmp/myDockerData ubuntu /bin/bash7.4.2 查看数据卷是否挂载成功
docker inspect 容器ID7.4.3 容器和宿主机之间数据共享
- docker修改,主机同步获得
- 主机修改,docker同步获得
- docker容器stop,主机修改,docker容器重启看数据是否同步。–仍然同步
# rw: read and write docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名 docker run -d -p 5000:5000 -v /pyh/myregistry/:/tmp/registry:rw --privileged=true registry
默认同上案例,默认就是rw
7.4.4.2 只读容器实例内部被限制,只能读取不能写
/容器目录:ro 镜像名 就能完成功能,此时容器自己只能读取不能写
ro = read only
此时如果宿主机写入内容,可以同步给容器内,容器可以读取到。
# ro: read only # docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 docker run -d -p 5000:5000 -v /pyh/myregistry/:/tmp/registry:ro --privileged=true registry7.4.5 卷的继承和共享 7.4.5.1 容器1完成和宿主机的映射
docker run -it --privileged=true -v /mydocker/u:/tmp --name u1 ubuntu
docker 内部添加文件
docker外部(linux) 打开容器卷映射目录,可看到上面添加的 u1_data.txt 文件
# u1 是上面容器1 的名字 # -v 就是 -volumes 的缩写 docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu
这样一来,容器1和容器2就实现了容器的共享和数据的互相传递
容器u1: /tmp
容器u2: /tmp
外部: /mydocker/u
即使停掉u1, u2 和外部地址数据卷仍然能够正常映射。
8. docker 常规安装简介总体思路,就是把各种工具都打成镜像,标准化安装
搜索镜像 拉取镜像 查看镜像 启动镜像 -- 服务端口映射 停止容器 移除容器8.2 安装tomcat (实例) 8.2.1 docker hub上面查找tomcat镜像
找到自己合适的版本
https://hub.docker.com/_/tomcat?tab=tags
一般不需要太高版本,如tomcat10 要 spring6及以上才行
# 拉取镜像 # 拉取指定版本 # [root@vm001 admin]# docker pull tomcat:9.0-jre8-temurin # 或者 docker pull tomcat 拉取最新版本 [root@vm001 admin]# docker pull tomcat Using default tag: latest latest: Pulling from library/tomcat 0e29546d541c: Pull complete 9b829c73b52b: Pull complete cb5b7ae36172: Pull complete 6494e4811622: Pull complete 668f6fcc5fa5: Pull complete dc120c3e0290: Pull complete 8f7c0eebb7b1: Pull complete 77b694f83996: Pull complete 0f611256ec3a: Pull complete 4f25def12f23: Pull complete Digest: sha256:9dee185c3b161cdfede1f5e35e8b56ebc9de88ed3a79526939701f3537a52324 Status: Downloaded newer image for tomcat:latest docker.io/library/tomcat:latest8.2.3 docker images查看是否有拉取到的tomcat
# 查看镜像 [root@vm001 admin]# docker images tomcat REPOSITORY TAG IMAGE ID CREATED SIZE tomcat latest fb5657adc892 4 months ago 680MB [root@vm001 admin]#8.2.4 使用tomcat镜像创建容器实例(也叫运行镜像)
docker run -it -p 8080:8080 tomcat docker run -d -p 8080:8080 tomcat # -p 小写,主机端口:docker容器端口 # -P 大写,随机分配端口 # i:交互 # t:终端 # d:后台
-P 随机分配端口
-
1). 可能没有映射端口或者没有关闭防火墙
-
2). 把webapps.dist目录换成webapps
先成功启动tomcat
查看webapps 文件夹 – 结果为空文件夹
# 进入 tomcat [root@vm001 admin]# docker exec -it f41f8101cb81 /bin/bash root@f41f8101cb81:/usr/local/tomcat# ls -l total 132 -rw-r--r--. 1 root root 18994 Dec 2 22:01 BUILDING.txt -rw-r--r--. 1 root root 6210 Dec 2 22:01 CONTRIBUTING.md -rw-r--r--. 1 root root 60269 Dec 2 22:01 LICENSE -rw-r--r--. 1 root root 2333 Dec 2 22:01 NOTICE -rw-r--r--. 1 root root 3378 Dec 2 22:01 README.md -rw-r--r--. 1 root root 6905 Dec 2 22:01 RELEASE-NOTES -rw-r--r--. 1 root root 16517 Dec 2 22:01 RUNNING.txt drwxr-xr-x. 2 root root 4096 Dec 22 17:07 bin drwxr-xr-x. 1 root root 22 Apr 25 16:16 conf drwxr-xr-x. 2 root root 4096 Dec 22 17:06 lib drwxrwxrwx. 1 root root 80 Apr 25 16:16 logs drwxr-xr-x. 2 root root 159 Dec 22 17:07 native-jni-lib drwxrwxrwx. 2 root root 30 Dec 22 17:06 temp drwxr-xr-x. 2 root root 6 Dec 22 17:06 webapps drwxr-xr-x. 7 root root 81 Dec 2 22:01 webapps.dist drwxrwxrwx. 2 root root 6 Dec 2 22:01 work # 删除原来 webapps,把 webapps.dist 重命名为 webapps root@f41f8101cb81:/usr/local/tomcat# rm -r webapps root@f41f8101cb81:/usr/local/tomcat# mv webapps.dist webapps8.2.5.3 重启 tomcat 并访问 8.2.6 安装 tomcat 免修改版
# tomcat8 jdk8 docker pull billygoo/tomcat8-jdk8 docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk88.3 安装 mysql 8.3.1 参考文档
参考其他文档: https://blog.csdn.net/BogerPeng/article/details/123666778
其中的 2.1.1 使用Docker搭建MySQL服务
docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.27
注意:
有时候linux也安装了mysql,映射端口的时候,先看看linux有没有安装mysql
ps -ef | grep mysql8.3.2 操作示例
切记: 每个sql 指令后面需要添加分号 “;”
[root@vm001 admin]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES eb3a89f094cf mysql:8.0.27 "docker-entrypoint.s…" 4 weeks ago Up 44 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql [root@vm001 admin]# docker exec -it eb3a89f094cf /bin/bash root@eb3a89f094cf:/# root@eb3a89f094cf:/# mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 14 Server version: 8.0.27 MySQL Community Server - GPL Copyright (c) 2000, 2021, Oracle and/or its affiliates. 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>8.3.3 linux 脚本操作sql 数据库
[root@vm001 admin]# docker exec -it eb3a89f094cf /bin/bash # 进入数据库 root@eb3a89f094cf:/# mysql -uroot -p Enter password: # 显示 DB mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | nacos_config | | performance_schema | +--------------------+ 9 rows in set (0.00 sec) # 使用指定的库 mysql> use nacos_config; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed # 显示表 mysql> show tables; +------------------------+ | Tables_in_nacos_config | +------------------------+ | config_info | | config_info_aggr | | roles | | tenant_capacity | | tenant_info | | users | +------------------------+ 12 rows in set (0.00 sec) mysql>8.3.4 插入数据
mysql5.7 版本,插入中文数据会报错,8.0以上版本正常:
原因:docker上默认字符集编码隐患
docker里面的mysql容器实例查看,内容如下:
SHOW VARIABLES LIKE ‘character%’;
# 服务器上全是拉丁字符串 mysql> SHOW VARIABLES LIKE 'character%'; +--------------------------+--------------------------------+ | Variable_name | Value | +--------------------------+--------------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | utf8mb4 | | character_set_system | utf8mb3 | | character_sets_dir | /usr/share/mysql-8.0/charsets/ | +--------------------------+--------------------------------+ 8 rows in set (0.00 sec)8.3.5 docker上安装mysql实战版
- 1). 删除容器后,里面的mysql数据如何办?-- 挂载容器数据卷
# 端口使用3308,因3306被初始的数据库使用了 docker run -d -p 3308:3308 --privileged=true -v /pyh/mysql/log:/var/log/mysql -v /pyh/mysql/data:/var/lib/mysql -v /pyh/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql_volumns mysql:8.0.27
新建my.cnf
# 通过容器卷同步给mysql容器实例 [client] default_character_set=utf8 [mysqld] collation_server = utf8_general_ci character_set_server = utf8
[root@vm001 conf]# cd /pyh/mysql/conf [root@vm001 conf]# vim my.cnf [root@vm001 conf]# cat my.cnf [client] default_character_set=utf8 [mysqld] collation_server = utf8_general_ci character_set_server = utf8 [root@vm001 conf]#
- 2). 重新启动mysql容器实例再重新进入并查看字符编码
参照8.3.3
SHOW VARIABLES LIKE ‘character%’;
mysql> SHOW VARIABLES LIKE 'character%'; +--------------------------+--------------------------------+ | Variable_name | Value | +--------------------------+--------------------------------+ | character_set_client | utf8mb3 | | character_set_connection | utf8mb3 | | character_set_database | utf8mb3 | | character_set_filesystem | binary | | character_set_results | utf8mb3 | | character_set_server | utf8mb3 | | character_set_system | utf8mb3 | | character_sets_dir | /usr/share/mysql-8.0/charsets/ | +--------------------------+--------------------------------+ 8 rows in set (0.01 sec) mysql>
- 3). 此时再次新建表,插入中文测试,没有问题(如下)
- 4). **结论:**docker安装完MySQL并run出容器后,建议请先修改完字符集编码后再新建mysql库-表-插数据
因为已经挂载了容器数据卷,数据会同步到宿主机上,
假如将当前容器实例删除,再重新来一次,之前建的数据库实例仍然会存在
查看挂载容器数据卷: docker inspect 容器ID
docker inspect redis
# 结果:
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"GOSU_VERSION=1.12",
"REDIS_VERSION=6.2.6",
"REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.2.6.tar.gz",
"REDIS_DOWNLOAD_SHA=5b2b8b7a50111ef395bf1c1d5be11e6e167ac018125055daa8b5c2317ae131ab"
],
启动:
[root@vm001 admin]# docker run -d -p 6379:6379 --name myredis redis 0fe988309131739df8d182aa6704b58cbd6114f0e916fc1fc041fd322a67375a [root@vm001 admin]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0fe988309131 redis "docker-entrypoint.s…" 13 seconds ago Up 12 seconds 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp myredis
使用:
[root@vm001 admin]# docker exec -it myredis /bin/bash root@0fe988309131:/data# redis-cli 127.0.0.1:6379> set k1 v1 OK 127.0.0.1:6379> get k1 "v1"8.4.2 挂载容器数据卷启动
使用 128 机器
命令提醒:容器卷记得加入 –privileged=true
步骤:
8.4.2.1 在CentOS宿主机下新建目录/app/redis# 宿主机目录 [root@vm001 admin]# mkdir -p /app/redis/ [root@vm001 admin]# cd /app/redis/ [root@vm001 redis]# pwd /app/redis8.4.2.2 将一个redis.conf文件模板拷贝进/app/redis目录下
- 1). 默认出厂redis.conf内容, 放在另外一个文章中
# 参考文章: https://blog.csdn.net/BogerPeng/article/details/124464212 cd /app/redis
- 2). 修改 redis.conf 的内容 (4个位置)
# A. 修改密码 requirepass ****** # B. 允许redis 外地连接,必须注释掉 bind 127.0.0.1 # IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES # JUST COMMENT THE FOLLOWING LINE. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #bind 127.0.0.1 # C. daemonize no # 将daemonize yes注释起来或者 daemonize no设置,因为该配置和docker run中-d参数冲突,会导致容器一直启动失败 # By default Redis does not run as a daemon. Use 'yes' if you need it. # Note that Redis will write a pid file in /var/run/redis.pid when daemonized. daemonize no # D. 开启redis数据持久化 appendonly yes 可选 # 默认使用rdb做持久化,如果为yes就是使用aof持久化,反正都能持久化 # AOF and RDB persistence can be enabled at the same time without problems. # If the AOF is enabled on startup Redis will load the AOF, that is the file # with the better durability guarantees. # # Please check http://redis.io/topics/persistence for more information. appendonly yes # The name of the append only file (default: "appendonly.aof") appendfilename "appendonly.aof"
- 3). 启动脚本
docker run -p 6379:6379 --name myr3 --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis redis-server /etc/redis/redis.conf8.4.2.3 启动后验证
docker exec -it myr3 /bin/bash 和 redis-cli
[root@vm001 redis]# docker exec -it myr3 /bin/bash root@84d6aff82ca2:/data# redis-cli # 密码自己设 127.0.0.1:6379> auth ****** OK 127.0.0.1:6379> set k1 v1 OK 127.0.0.1:6379> get k1 "v1" # 这里默认配置了16 个库,0-15 有效,超出则无效 127.0.0.1:6379> select 16 (error) ERR DB index is out of range 127.0.0.1:6379> select 15 OK 127.0.0.1:6379[15]> get k1 (nil) 127.0.0.1:6379[15]> select 0 OK 127.0.0.1:6379> get k1 "v1" # 此时如果修改宿主机配置文件 redis.conf 中的配置如下 # 库数量修改为10个 databases 10 # 那么上面select 的值大于等于10 ,就会出错
此时,还可以参照第 5、6 章,把新的redis的容器发布到阿里云或者私有库。
https://editor.csdn.net/md/?articleId=124286266



