栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Docker 学习笔记 - 基础二

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Docker 学习笔记 - 基础二

Docker 学习笔记 - 基础二
  • 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

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://editor.csdn.net/md/?articleId=124286266

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/845664.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号