一起学docker(四)| 数据卷 + 简单应用部署(MySQL,Tomcat,Nginx,Redis)

Docker 容器数据卷

Docker容器产生的数据,如果不备份,那么当容器实例删除后,容器内的数据也就消失了。需要对数据进行持久化

为了保存docker中的数据,可以使用数据卷。

是什么

卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性。

卷的设计目的就是数据的持久化,完全独立于容器的生命周期,因此Docker不会在容器删除时删除其挂载的数据卷。

通俗来说,就是将docker容器内的数据保存进宿主机的磁盘中。

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名

–privileged=true???

  • Docker挂载主机目录访问如果出现cannot open directory .: Permission denied

    解决办法:在挂载目录后多加一个–privileged=true参数即可

如果是CentOS7,安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为,在SELinux里面挂载目录被禁止掉了,如果要开启,我们一般使用–privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,也就是使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限。

特点:

  • 数据卷可在容器间共享或重用数据
  • 数据卷更改实时生效
  • 数据卷的更改不会包含在镜像的更新中
  • 数据卷的生命周期一直持续到没有容器使用它为止
添加数据卷

docker run -it --privileged=true -v /宿主机目录:/容器内目录 镜像名

  • 添加数据卷docker run -it --name="ubuntu-j" --privileged=true -v /dockerbackup/ubuntu:/tmp/ubuntu f706429da9df /bin/bash

    [root@VM-4-9-centos /]# docker images
    REPOSITORY                    TAG       IMAGE ID       CREATED         SIZE
    121.4.126.115:5000/ubuntu-j   1.0       f706429da9df   5 hours ago     186MB
    mysql                         latest    f6360852d654   4 days ago      565MB
    redis                         latest    7e89539dd8bd   2 weeks ago     130MB
    [root@VM-4-9-centos /]# docker run -it --name="ubuntu-j" --privileged=true -v /dockerbackup/ubuntu:/tmp/ubuntu f706429da9df /bin/bash
    root@74221444a50b:/# 
    
  • 查看数据卷是否挂载成功docker inspect 容器id

    [root@VM-4-9-centos ubuntu]# docker ps
    CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                                                           NAMES
    74221444a50b   f706429da9df          "/bin/bash"              13 minutes ago   Up 13 minutes                                                                   ubuntu-j
    f5346aab9063   registry              "/entrypoint.sh /etc…"   6 hours ago      Up 3 hours      0.0.0.0:5000->5000/tcp, :::5000->5000/tcp                       ecstatic_goldwasser
    3bb8baf477a0   portainer/portainer   "/portainer"             2 days ago       Up 3 hours      8000/tcp, 9443/tcp, 0.0.0.0:8088->9000/tcp, :::8088->9000/tcp   mystifying_knuth
    [root@VM-4-9-centos ubuntu]# docker inspect 74221444a50b
    ......
            "Mounts": [
                {
                    "Type": "bind",
                    "Source": "/dockerbackup/ubuntu",
                    "Destination": "/tmp/ubuntu",
                    "Mode": "",
                    "RW": true,
                    "Propagation": "rprivate"
                }
    ......
    [root@VM-4-9-centos ubuntu]# 
    
  • 测试1:

    • 在容器相应目录新建a.txt文件

      root@74221444a50b:/tmp/ubuntu# pwd
      /tmp/ubuntu
      root@74221444a50b:/tmp/ubuntu# touch a.txt
      root@74221444a50b:/tmp/ubuntu# ls
      a.txt
      
    • 查看宿主机相应目录

      [root@VM-4-9-centos ~]# ls /dockerbackup/ubuntu/
      a.txt
      
  • 测试2:

    • 在宿主机相应目录新建b.txt

      [root@VM-4-9-centos ubuntu]# pwd
      /dockerbackup/ubuntu
      [root@VM-4-9-centos ubuntu]# touch b.txt
      [root@VM-4-9-centos ubuntu]# ls
      a.txt  b.txt
      
    • 查看容器相应目录

      root@74221444a50b:/tmp/ubuntu# pwd
      /tmp/ubuntu
      root@74221444a50b:/tmp/ubuntu# ls
      a.txt  b.txt
      
读写规则映射添加说明
读写(默认)

docker run -it --privileged=true -v /宿主机目录:/容器内目录:rw 镜像名

  • rw:read+write
  • 默认(不写rw)就是具备读写的
只读

docker run -it --privileged=true -v /宿主机目录:/容器内目录:ro 镜像名

  • ro:read only
  • 此时如果宿主机写,可以同步到容器,容器可以读取到,但是容器不支持写
  1. 添加数据卷

    [root@VM-4-9-centos /]# docker run -it --name="ubuntu-j2" --privileged=true -v /dockerbackup/ubuntu:/tmp/ubuntu:ro f706429da9df /bin/bash 
    root@99c6b59ff576:/# cd tmp/ubuntu/
    root@99c6b59ff576:/tmp/ubuntu# ls
    a.txt  b.txt
    root@99c6b59ff576:/tmp/ubuntu# 
    
  2. 测试1:

    • 宿主机写c.txt

      [root@VM-4-9-centos ubuntu]# pwd
      /dockerbackup/ubuntu
      [root@VM-4-9-centos ubuntu]# touch c.txt
      [root@VM-4-9-centos ubuntu]# ls
      a.txt  b.txt  c.txt
      [root@VM-4-9-centos ubuntu]# 
      
    • 查看容器相应目录

      root@99c6b59ff576:/tmp/ubuntu# ls
      a.txt  b.txt  c.txt
      root@99c6b59ff576:/tmp/ubuntu# 
      
  3. 测试2:

    • 容器写d.txt(发现不能写,只读)

      root@99c6b59ff576:/tmp/ubuntu# touch d.txt
      touch: cannot touch 'd.txt': Read-only file system
      root@99c6b59ff576:/tmp/ubuntu# 
      
卷的继承和共享
  1. 容器1完成和宿主机的卷映射

    docker run -it --name="ubuntu-j2" --privileged=true -v /dockerbackup/ubuntu:/tmp/ubuntu:ro f706429da9df /bin/bash

  2. 容器2继承容器1的卷规则

    docker run -it --name="ubuntu-j3" --privileged=true --volumes-from ubuntu-j2 f706429da9df /bin/bash

  3. 测试

    • 查看容器2信息

      [root@VM-4-9-centos ~]# docker ps
      CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                                                           NAMES
      30045c2c0dbd   f706429da9df          "/bin/bash"              29 seconds ago   Up 28 seconds                                                                   ubuntu-j3
      99c6b59ff576   f706429da9df          "/bin/bash"              14 minutes ago   Up 14 minutes                                                                   ubuntu-j2
      f5346aab9063   registry              "/entrypoint.sh /etc…"   7 hours ago      Up 3 hours      0.0.0.0:5000->5000/tcp, :::5000->5000/tcp                       ecstatic_goldwasser
      3bb8baf477a0   portainer/portainer   "/portainer"             2 days ago       Up 4 hours      8000/tcp, 9443/tcp, 0.0.0.0:8088->9000/tcp, :::8088->9000/tcp   mystifying_knuth
      [root@VM-4-9-centos ~]# docker inspect 30045c2c0dbd
      ......
              "Mounts": [
                  {
                      "Type": "bind",
                      "Source": "/dockerbackup/ubuntu",
                      "Destination": "/tmp/ubuntu",
                      "Mode": "",
                      "RW": false,
                      "Propagation": "rprivate"
                  }
              ],
      ......
      [root@VM-4-9-centos ~]# 
      
    • 查看容器2内相应目录

      root@30045c2c0dbd:/# cd tmp/ubuntu/
      root@30045c2c0dbd:/tmp/ubuntu# ls
      a.txt  b.txt  c.txt
      root@30045c2c0dbd:/tmp/ubuntu# 
      
    • 宿主机写e.txt

      [root@VM-4-9-centos ubuntu]# pwd
      /dockerbackup/ubuntu
      [root@VM-4-9-centos ubuntu]# ls
      a.txt  b.txt  c.txt
      [root@VM-4-9-centos ubuntu]# touch e.txt
      [root@VM-4-9-centos ubuntu]# ls
      a.txt  b.txt  c.txt  e.txt
      [root@VM-4-9-centos ubuntu]# 
      
    • 查看容器2

      root@30045c2c0dbd:/tmp/ubuntu# ls
      a.txt  b.txt  c.txt  e.txt
      root@30045c2c0dbd:/tmp/ubuntu# 
      
    • 查看容器1

      root@99c6b59ff576:/tmp/ubuntu# ls
      a.txt  b.txt  c.txt  e.txt
      root@99c6b59ff576:/tmp/ubuntu# 
      

简单应用部署

1、部署MySQL
  1. 搜索mysql镜像
docker search mysql
  1. 拉取mysql镜像
docker pull mysql:5.7
  1. 创建容器,设置端口映射、目录映射
# 在/root目录下创建mysql目录用于存储mysql数据信息
mkdir ~/mysql
cd ~/mysql
docker run -id \
-p 3307:3306 \
--name=c_mysql \
--privileged=true \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=admin \
mysql:5.7
  • 参数说明:
    • -p 3307:3306:将容器的 3306 端口映射到宿主机的 3307 端口。
    • -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。配置目录
    • -v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。日志目录
    • -v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。数据目录
    • **-e MYSQL_ROOT_PASSWORD=123456:**初始化 root 用户的密码。
  1. 进入容器,操作mysql
docker exec –it c_mysql /bin/bash
  1. 使用外部机器连接容器中的mysql

在这里插入图片描述

中文乱码问题:

  1. 进入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   | latin1                     |
    | character_set_filesystem | binary                     |
    | character_set_results    | latin1                     |
    | character_set_server     | latin1                     |
    | character_set_system     | utf8                       |
    | character_sets_dir       | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+
    8 rows in set (0.00 sec)
    
    mysql> 
    
  2. character_set_client和character_set_database都是latin1编码,需将其改为utf-8,否则会引起中文乱码问题。

    • 通过容器卷同步配置给mysql容器实例

      [root@VM-4-9-centos conf]# pwd
      /root/mysql/conf
      [root@VM-4-9-centos conf]# vim my.cnf
      [root@VM-4-9-centos conf]# cat my.cnf
      [client]
      default_character_set=utf8
      [mysqld]
      collation_server = utf8_general_ci
      character_set_server = utf8
      [root@VM-4-9-centos conf]# 
      
    • 查看容器实例字符编码

      mysql> SHOW VARIABLES LIKE 'character%';
      +--------------------------+----------------------------+
      | Variable_name            | Value                      |
      +--------------------------+----------------------------+
      | character_set_client     | utf8                       |
      | character_set_connection | utf8                       |
      | character_set_database   | utf8                       |
      | character_set_filesystem | binary                     |
      | character_set_results    | utf8                       |
      | character_set_server     | utf8                       |
      | character_set_system     | utf8                       |
      | character_sets_dir       | /usr/share/mysql/charsets/ |
      +--------------------------+----------------------------+
      8 rows in set (0.00 sec)
      
      mysql> 
      
2、部署Tomcat

最新版首页需修改,可以使用8版本:

docker pull billygoo/tomcat8-jdk8

docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8

最新版:

  1. 搜索tomcat镜像
docker search tomcat
  1. 拉取tomcat镜像
docker pull tomcat
  1. 创建容器,设置端口映射、目录映射
# 在/root目录下创建tomcat目录用于存储tomcat数据信息
mkdir ~/tomcat
cd ~/tomcat
docker run -id --name=c_tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat 
  • 参数说明:

    • **-p 8080:8080:**将容器的8080端口映射到主机的8080端口

      **-v $PWD:/usr/local/tomcat/webapps:**将主机中当前目录挂载到容器的webapps

  1. 使用外部机器访问tomcat

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3、部署Nginx
  1. 搜索nginx镜像
docker search nginx
  1. 拉取nginx镜像
docker pull nginx
  1. 创建容器,设置端口映射、目录映射
# 在/root目录下创建nginx目录用于存储nginx数据信息
mkdir ~/nginx
cd ~/nginx
mkdir conf
cd conf
# 在~/nginx/conf/下创建nginx.conf文件,粘贴下面内容
vim nginx.conf
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}


docker run -id --name=c_nginx \
-p 80:80 \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/share/nginx/html \
nginx
  • 参数说明:
    • -p 80:80:将容器的 80端口映射到宿主机的 80 端口。
    • -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:将主机当前目录下的 /conf/nginx.conf 挂载到容器的 :/etc/nginx/nginx.conf。配置目录
    • -v $PWD/logs:/var/log/nginx:将主机当前目录下的 logs 目录挂载到容器的/var/log/nginx。日志目录
  1. 使用外部机器访问nginx

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4、部署Redis
  1. 搜索redis镜像
docker search redis
  1. 拉取redis镜像
docker pull redis:6.0.8
  1. 创建容器,置端口映射、目录映射
# 在/app目录下创建redis目录用于存储redis数据信息
mkdir -p /app/redis
cd /app/redis

# 将一份redis.conf文件模板拷贝到宿主机挂载目录下,并修改一些配置
[root@VM-4-9-centos redis]# pwd
/app/redis
[root@VM-4-9-centos redis]# ls
redis.conf
[root@VM-4-9-centos redis]# vim redis.conf 

# 开启登录验证 可选
requirepass 123

# 允许redis外地连接  必须
# 注释掉 bind 127.0.0.1

# 将daemonize yes注释起来或者 daemonize no设置,因为该配置和docker run中-d参数冲突,会导致容器一直启动失败
daemonize no

# 开启aof 可选
appendonly yes
docker run -d \
-p 6380:6379 \
--name myredis \
--privileged=true \
-v /app/redis/redis.conf:/etc/redis/redis.conf \
-v /app/redis/data:/data \
redis:6.0.8 redis-server /etc/redis/redis.conf
  1. 使用外部机器连接redis
./redis-cli.exe -h 121.4.126.115 -p 6380

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/286961.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HUAWEI华为荣耀MagicBook X 15酷睿i5-10210U处理器集显(BBR-WAH9)笔记本电脑原装出厂Windows10系统

链接:https://pan.baidu.com/s/1YVcnOP5YKfFOoLt0z706rg?pwdfwp0 提取码:fwp0 MagicBook荣耀原厂Win10系统自带所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办公软件、华为/荣耀电脑管家等预装程序 文件格式:esd/wim/swm 安装…

深度学习|10.5 卷积步长 10.6 三维卷积

文章目录 10.5 卷积步长10. 6 三维卷积![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/b5bfa24f57964b0f81f9602f5780c278.png) 10.5 卷积步长 卷积步长是指每计算一次卷积,卷积移动的距离。 设步长为k,原矩阵规模为nxn,核矩阵…

Python 实现给 pdf 文件自动识别标题并增添大纲

一、背景: 客户方提供过来一个开放平台的pdf文档,文档里有几十个接口,没有大纲和目录可以定位到具体内容,了解整体的API功能,观看体验极度差劲,所以想使用Python代码自动解析pdf文档,给文档增添…

【Spring实战】17 REST服务介绍

文章目录 1. 为什么出现2. 拥有哪些优势3. Spring中的应用4. spring-boot-starter-data-rest总结 REST(Representational State Transfer)是一种软件架构风格,通常用于设计网络应用程序的服务接口。RESTful 服务是基于 REST 原则构建的网络服…

手机录屏没有声音?让你的录屏有声有色

“有人知道手机录屏怎么录声音吗?今天录制了一个小时的直播视频,后面查看的时候发现没有声音,真的非常崩溃,想问问大家有没有办法,解决这个问题。” 在手机录屏的过程中,有时候我们可能会面临录制视频没有…

socket实现视频通话-WebRTC

最近喜欢研究视频流,所以思考了双向通信socket,接下来我们就一起来看看本地如何实现双向视频通讯的功能吧~ 客户端获取视频流 首先思考如何获取视频流呢? 其实跟录音的功能差不多,都是查询电脑上是否有媒体设备,如果…

杰发科技AC7840——Eclipse环境DMA注意事项

0.序 用 户 使 用 DMA 时 , 所 有 DMA 搬 运 的 SRAM 数 据 都 必 须 存 放 在 SRAM_U 区 (0x20000000~0x2000EFFF) 。 1. 修改办法 第一步: RAM定义 /* Specify the memory areas */ MEMORY {FLASH (rx) : ORIGIN 0x00000000, LENGT…

多功能号卡推广分销管理系统 流量卡推广分销网站源码

一套完善,多功能,的号卡分销系统,多接口,包括运营商接口,无限三级代理,最简单易用的PHP~ 目前市面上最优雅的号卡系统!没有之一 软件架构说明 环境要求php7.3以上(建议低于8.0&…

面试题理解深层次的数组名

目录 引言 一:一维数组 举例如下 1.铺垫知识 数组名是数组首元素的地址,但是有两个特殊情况 (1)sizeof(数组名) (2)&数组名 2.分析讲解上述代码结果 2.字符数组 举例一如下 1.知识铺垫 …

Python内置库os和sys的常用方法汇总

更多Python学习内容:ipengtao.com Python是一门强大的编程语言,具有丰富的标准库,其中包括os和sys两个常用模块。os模块用于与操作系统交互,提供了许多文件和目录操作的方法,而sys模块用于与Python解释器进行交互&…

OceanBase入选Gartner®云数据库管理系统魔力象限“荣誉提及”

近日,全球IT市场研究和咨询公司Gartner发布最新报告《Magic Quadrant™ for Cloud Database Management Systems》(全球云数据库管理系统魔力象限)。全自研分布式数据库 OceanBase 入选“荣誉提及”,2022 年推出的云数据库 OB Clo…

uniapp---安卓真机调试提示检测不到手机【解决办法】

最近在做APP,由于华为手机更新过系统,再次用来调试APP发现就不行了。下面给出具体的解决方法: 第一步:打开【允许开发人员选项】 找到【设置】点击【关于手机】找到【版本号】点击7次或多次,允许开发人员选项。 第二…

性能优化:Spark SQL中的谓词下推和列式存储

Apache Spark是一个强大的分布式计算框架,Spark SQL是其一个核心模块,用于处理结构化数据。性能优化是大数据处理中的一个关键问题,本文将深入探讨Spark SQL中的两个性能优化技术:谓词下推(Predicate Pushdown&#xf…

Ps:应用图像

Ps菜单:图像/应用图像 Image/Apply Image 应用图像 Apply Image命令可以将图像的内容(作为“源”)叠加到另一图像(作为“目标”)上,同时提供了控制混合的详细选项。 “应用图像”命令在图像合成、图层蒙版和…

彻底理解前端安全面试题(2)—— CSRF 攻击,跨站请求伪造攻击详解,建议收藏(含源码)

前言 前端关于网络安全看似高深莫测,其实来来回回就那么点东西,我总结一下就是 3 1 4,3个用字母描述的【分别是 XSS、CSRF、CORS】 一个中间人攻击。当然 CORS 同源策略是为了防止攻击的安全策略,其他的都是网络攻击。除了这…

音视频通信

文章目录 一、音视频通信流程二、流媒体协议1、RTSP2、RTMP3、HLS4、WebRTC 一、音视频通信流程 音视频通信完整流程有如下几个环节:采集、编码、前后处理、传输、解码、缓冲、渲染等。 每一个细分环节,还有更细分的技术模块。比如,前后处…

网络端口(包括TCP端口和UDP端口)的作用、定义、分类,以及在视频监控和流媒体通信中的定义

目 录 一、什么地方会用到网络端口? 二、端口的定义和作用 (一)TCP协议和UDP协议 (二)端口的定义 (三)在TCP/IP体系中,端口(TCP和UDP)的作用 (…

canvas绘制圆角矩形示例

查看专栏目录 canvas示例教程100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…

【期末考试】数据结构大题

~~08|2.03|2|8 ^^统计出没带头结点的单链表HL中结点的值等于给定值x的结点数。 int CountX(LNode *HL, ElemType x) {int i 0;LNode *p HL;while (p ! NULL){if (P->data x)i;p p->next;}return i; }简答:定义一个i变量来记录节点值等于x的节点个数&…

Debezium发布历史43

原文地址: https://debezium.io/blog/2018/12/05/automating-cache-invalidation-with-change-data-capture/ 欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯. 通过更改数据捕获自动使缓存失效 2018 年…