Docker 学习笔记 - 基础二 数据卷和容器安装

笔记记录尚硅谷周阳老师的 docker 教程
链接地址: https://www.bilibili.com/video/BV1gr4y1U7CY?p=1
续上章: https://blog.csdn.net/BogerPeng/article/details/124286266

7. 容器数据卷

7.1 注意

坑:容器卷记得加入

–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 registry

7.3 容器数据卷能干吗

将运用与运行的环境打包镜像,run后形成容器实例运行 ,但是我们对数据的要求希望是持久化的

Docker容器产生的数据,如果不备份,那么当容器实例删除后,容器内的数据自然也就没有了。

为了能保存数据在docker中我们使用卷。

特点:
1:数据卷可在容器之间共享或重用数据
2:卷中的更改可以直接实时生效,爽
3:数据卷中的更改不会包含在镜像的更新中
4:数据卷的生命周期一直持续到没有容器使用它为止

7.4 数据卷案例

7.4.1 宿主vs容器之间映射添加容器卷

 # 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/bash

在这里插入图片描述

7.4.2 查看数据卷是否挂载成功

docker inspect 容器ID

在这里插入图片描述

7.4.3 容器和宿主机之间数据共享

  1. docker修改,主机同步获得
  2. 主机修改,docker同步获得
  3. docker容器stop,主机修改,docker容器重启看数据是否同步。–仍然同步
    在这里插入图片描述

7.4.4 读写规则映射添加说明

7.4.4.1 读写(默认)
# 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 registry

7.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 文件
在这里插入图片描述

7.4.5.2 容器2继承容器1的卷规则
# u1 是上面容器1 的名字
# -v 就是 -volumes 的缩写
docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu

在这里插入图片描述
这样一来,容器1和容器2就实现了容器的共享和数据的互相传递
容器u1: /tmp
容器u2: /tmp
外部: /mydocker/u

7.4.5.3 停掉容器1,结果如何?

即使停掉u1, u2 和外部地址数据卷仍然能够正常映射。

8. docker 常规安装简介

总体思路,就是把各种工具都打成镜像,标准化安装
在这里插入图片描述

8.1 总体步骤

搜索镜像
拉取镜像
查看镜像
启动镜像	-- 服务端口映射
停止容器
移除容器

8.2 安装tomcat (实例)

8.2.1 docker hub上面查找tomcat镜像

找到自己合适的版本
https://hub.docker.com/_/tomcat?tab=tags
一般不需要太高版本,如tomcat10 要 spring6及以上才行

8.2.2 从docker hub上拉取tomcat镜像到本地

# 拉取镜像
# 拉取指定版本
# [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:latest

8.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 随机分配端口
在这里插入图片描述

8.2.5 访问 tomcat 首页

8.2.5.1 问题:

在这里插入图片描述

8.2.5.2 解决:
  • 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 webapps
8.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-jdk8

在这里插入图片描述

8.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 mysql

8.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

8.4 安装 redis

8.4.1 一般安装

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/redis
8.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.conf
8.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://blog.csdn.net/BogerPeng/article/details/124286266

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值