• Docker手把手教程(三)实践 & 数据管理(数据卷)


    目录

    一.实践 

    1. docker下配置java环境

    (1)bug:Got permission denied while trying to connect to the Docker daemon socket

    (2)安装JDK

    2. docker下安装Tomcat

    3.docker安装Mysql

    二.数据管理

    1.为什么使用数据卷

    2.配置数据卷 

    3.数据卷容器 

    4.Mysql数据卷挂载


    一.实践 

    1. docker下配置java环境

    (1)bug:Got permission denied while trying to connect to the Docker daemon socket

    在确保docker已经启动起来的前提下(参考本系列的第一篇文章,此系列在容器专栏,也可以设置docker自启动,这样比较方便),然后su切换到超级用户就好了。

    (2)安装JDK

    查看JDK镜像

    docker search java

    或者

    docker search jdk

     一搜出来一堆。

    下载jdk镜像

    docker pull java

    刚开始拉取失败因为,显式not found lastest,默认加载最新的版本,但我们的docker的源还是官方源,访问国外网站当然慢 ,出现各种异常也在所难免,那么我们接下来要进行换源,修改/etc/docker/daemon.json,内容修改为下:

    1. {
    2. "registry-mirrors": [
    3. "https://hub-mirror.c.163.com",
    4. "https://ustc-edu-cn.mirror.aliyuncs.com",
    5. "https://ghcr.io",
    6. "https://mirror.baidubce.com"
    7. ]
    8. }

    然后重启docker

    service docker restart

     然后即可拉取最新版本。

    查看一下现在咱们有哪些镜像

     可见docker.io/java已在其中

     运行jdk镜像

    1. docker run java java -version
    2. #或
    3. docker run -it java java -version

    docker run java的意思是创建并运行Java容器,后面的java -version是在这个容器里输出jdk的版本。

    如果不是使用docker,咱们原来得配置环境变量,好麻烦的,现在就方便多了。

    2. docker下安装Tomcat

    查看tomcat镜像

    docker search tomcat

    下载tomcat镜像

    docker pull tomcat

    启动tomcat容器

    docker run -d --name mytomcat -p 9090:8080 tomcat

    -d代表后台守护态运行,--name是为容器起一个别名,

    -p代表端口的绑定,p是port的缩写,冒号左边是宿主机的端口号,而冒号右边是容器内部的端口号,形成绑定,因为外部的浏览器无法直接访问到容器的端口号,所以需要绑定端口号,如下图外部浏览器如果想访问容器的8080端口,那么需要访问宿主机的9090端口。也即这条命令是

    docker run tomcat,只不过中间加了参数。

     

    安装成功之后最后一行返回的信息是容器id号 

    执行docker ps查看正在运行的容器

    有一个tomcat容器是运行着的,STATUS是Up就代表正在运行。

    先执行ip addr查看虚拟机ip地址,然后加上端口号访问

    如上查询,应该访问192.168.191.138:9090 

    但是我们浏览器访问192.168.191.138:9090 却访问不到东西,这是因为docker安装的tomcat和咱们之前在windows下手动安装的那个不太一样,现在我们进入这个容器查看一下,执行如下命令进入容器

    docker exec -it mytomcat /bin/bash

    进入容器之后查看webapps文件夹(tomcat中与web相关的都放在里面),但是发现该文件里面没有东西,其实东西都在webapps.dist(webapps的备用文件)中,所以我们把 webapps文件夹删除,然后把webapps.dist改名为webapps即可。

    重启容器

    docker restart ce

    咱们在上面的docker ps命令中已经可以知道已经创建的tomcat容器的id号,ce是其前两位。

    然后再访问即可成功!

    注意:

    • -p 映射端口 宿主机端口号:容器内应用端口
    • -P随机端口

    停掉并删除这个正在运行的容器,注意删除容器和删除镜像不是一回事

    1. docker stop ce
    2. docker rm ce

    3.docker安装Mysql

    查看镜像
    docker search mysql:5.7
    下载镜像
    docker pull mysql:5.7
    启动镜像
    docker run --name mysql -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
    参数:
    • -p 我们以后使用3307 端口来访问mysql 为了防止黑客攻击
    • -e 配置环境变量:MYSQL_ROOT_PASSWORD 设置容器内mysql root 密码  

    接下来就可以直接进入数据库

    然后也可以用外部工具,连接此数据库,比如用Navicat

    新建连接,连接成功!

    二.数据管理

    1.为什么使用数据卷

    什么是容器数据卷

    Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data
    Volume)
    思考
    Docker 容器删除后,在容器中产生的数据还在吗?答:不在

    Docker容器和外部机器可以直接交换文件吗?答:不能

    容器之间能进行数据交互? 答:不能

    以上三个问题本来是不能的,但是有了数据卷技术之后,就变得都可以实现了。

    数据卷概念
    • 数据卷是宿主机中的一个目录或文件。
    • 当容器目录和数据卷目录绑定后,对方修改会立即同步。
    • 一个数据卷可以同时被多个容器同时挂载。
    • 一个容器也可以被挂载多个数据卷。

    容器挂载了某个数据卷后,就有了这个数据卷的数据。

    数据卷作用
    • 容器数据持久化。
    • 外部机器和容器间接通信。
    • 容器之间数据交换。

    一句话: 卷技术就是为了实现数据的持久化和同步操作,容器间也是数据共享。  

    2.配置数据卷 

    命令
    docker run -v 宿主机目录(文件):容器内目录(文件)

    -v代表配置数据卷,从命令格式中可以看到所谓的数据卷目录就是宿主机目录(即我们的虚拟机)。 

    注意事项
    1. 目录必须是绝对路径
    2. 如果目录不存在则会自动创建
    3. 可以挂载多个数据卷
    示例
    Tomcat 服务器挂载 /opt/webapps 路径。

    咱们先查看一下webapps的目录,需要先创建并启动(run)tomcat容器,然后进入tomcat容器目录里,然后进入webapp下,输入pwd目录,获得webapp的绝对路径。

     获得了我们想要的绝对路径之后我们删除该容器,重新启动一下,并挂载

     

    然后开始启动并绑定端口号和目录路径 

    docker run -d --name mytomcat -p 8080:8080 -v /opt/webapps:/usr/local/tomcat/webapps tomcat

    可以看到咱们指定的宿主机路径下的webapps啥也没有,因为本来不存在这个文件,执行启动命令的时候没有就给自动创建了,所以这里面ls之后啥也没有,这样咱们把这个目录与tomcat的webapps目录绑定之后,访问tomcat还是没有页面,因为咱们宿主机的webapps空空如也,咱们现在添加一个html页面。然后重启这个容器。

    在vim的文件里随便写句话就行,不用写HTML代码。

    在电脑浏览器上访问192.168.191.138:8080/test/index.html

    3.数据卷容器 

    实现多个容器之间进行数据共享。

    Volume 基本使用
    参数:
    • create # 创建数据卷
    • inspect #查看数据卷元数据
    • ls #查看数据卷列表
    • prune #删除所有未使用的卷
    • rm #删除数据卷
    下面的命令基本都在头顶注释过了,大家应该都能看懂。
    1. #创建数据卷
    2. [root@localhost test]# docker volume create test_web
    3. test_web
    4. ##查看数据卷列表
    5. [root@localhost test]# docker volume ls
    6. DRIVER VOLUME NAME
    7. local 15b7507fd76c1c7e793780e2c3fc88564f55cc5905454b2b087b52b0d43ed041
    8. local test_web
    9. #查看数据卷元数据
    10. [root@localhost test]# docker volume inspect test_web
    11. [
    12. {
    13. "Driver": "local",
    14. "Labels": {},
    15. "Mountpoint": "/var/lib/docker/volumes/test_web/_data",
    16. "Name": "test_web",
    17. "Options": {},
    18. "Scope": "local"
    19. }
    20. ]
    21. #这个路径下保存了docker的各种文件
    22. [root@localhost test]# cd /var/lib/docker/
    23. [root@localhost docker]# ls
    24. containers image network overlay2 plugins swarm tmp trust volumes
    25. [root@localhost docker]# cd /var/lib/docker/volumes/test_web/_data
    26. [root@localhost _data]# ls
    27. [root@localhost _data]# mkdir test
    28. [root@localhost _data]# cd test/
    29. [root@localhost test]# vim index.html
    30. #查看运行中的容器
    31. [root@localhost test]# docker ps
    32. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    33. #显式所有容器
    34. [root@localhost test]# docker ps -a
    35. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    36. 29cb2fd3634e tomcat "catalina.sh run" 29 minutes ago Exited (143) 24 minutes ago mytomcat
    37. 44bed10f18b6 mysql:5.7 "docker-entrypoint..." 12 hours ago Exited (0) About an hour ago mysql
    38. 4b253ba77689 java "java -version" 14 hours ago Exited (0) 14 hours ago eager_fermi
    39. 7ce7bdf289d8 hello-world "/hello" 17 hours ago Exited (0) 17 hours ago hardcore_nightingale
    40. 81547f6c4634 hello-world "/hello" 42 hours ago Exited (0) 42 hours ago gracious_golick
    41. #利用tomcat镜像新建一个tomcat容器,注意这次的路径绑定用了数据卷容器名替换了宿主机目录路径!
    42. [root@localhost test]# docker run -d --name mytomcat1 -p 8080:8080 -v test_web:/usr/local/tomcat/webapps tomcat
    43. e933a93178de940b474700c758408d15fdb2409667c3d52ce61ee754915d9363
    44. [root@localhost test]# docker ps -a
    45. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    46. e933a93178de tomcat "catalina.sh run" 8 seconds ago Up 8 seconds 0.0.0.0:8080->8080/tcp mytomcat1
    47. 29cb2fd3634e tomcat "catalina.sh run" 31 minutes ago Exited (143) 26 minutes ago mytomcat
    48. 44bed10f18b6 mysql:5.7 "docker-entrypoint..." 12 hours ago Exited (0) About an hour ago mysql
    49. 4b253ba77689 java "java -version" 14 hours ago Exited (0) 14 hours ago eager_fermi
    50. 7ce7bdf289d8 hello-world "/hello" 17 hours ago Exited (0) 17 hours ago hardcore_nightingale
    51. 81547f6c4634 hello-world "/hello" 42 hours ago Exited (0) 42 hours ago gracious_golick
    注意:
    -v代表挂载数据卷,这里使用自定数据卷test_web,并且将数据卷挂载到/usr/local/tomcat/webapps 。如果没有通过-v指定,那么Docker会默认帮我们创建匿名数据卷进行映射和挂载。

    访问成功!以后想实现多个容器之间进行数据共享就可以这样,比如多个容器挂载时都把宿主机目录写成同一个,eg:test_web

    4.Mysql数据卷挂载

    数据卷挂载解决Mysql数据丢失问题。
    搜索镜像

    docker search mysql:5.7
    下载镜像
    docker pull mysql:5.7
    运行镜像
    下面的命令过程检测了把容器删了,容器的数据会不会丢失,基本命令上方都标有注释,大家应该都可以看懂。
    1. #之前已经下载过mysql镜像,所以我们选择直接run,并进行挂载绑定等参数设置
    2. [root@localhost seven]# docker run -d -p 3306:3306 \
    3. > -v /opt/mysql/conf:/etc/mysql/conf.d \
    4. > -v /opt/mysql/data:/var/lib/mysql \
    5. > -e MYSQL_ROOT_PASSWORD=123456 --name my_mysql mysql:5.7
    6. #返回一个容器id号
    7. 33b472f8eec2bb2e7d5491427bf9546285725a11c5989f49620aebc3164a1d57
    8. #进入mysql容器里
    9. [root@localhost seven]# docker exec -it 33 /bin/bash
    10. #登录数据库
    11. root@33b472f8eec2:/# mysql -uroot -p
    12. Enter password:
    13. Welcome to the MySQL monitor. Commands end with ; or \g.
    14. Your MySQL connection id is 2
    15. Server version: 5.7.36 MySQL Community Server (GPL)
    16. Copyright (c) 2000, 2021, Oracle and/or its affiliates.
    17. Oracle is a registered trademark of Oracle Corporation and/or its
    18. affiliates. Other names may be trademarks of their respective
    19. owners.
    20. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    21. mysql> show databases;
    22. +--------------------+
    23. | Database |
    24. +--------------------+
    25. | information_schema |
    26. | mysql |
    27. | performance_schema |
    28. | sys |
    29. +--------------------+
    30. 4 rows in set (0.01 sec)
    31. mysql> create database test;
    32. Query OK, 1 row affected (0.05 sec)
    33. mysql> use test;
    34. Database changed
    35. mysql> create table dog(id int,name varchar(255));
    36. Query OK, 0 rows affected (0.06 sec)
    37. mysql> insert into dog value(1,"tom");
    38. Query OK, 1 row affected (0.04 sec)
    39. mysql> select * from dog;
    40. +------+------+
    41. | id | name |
    42. +------+------+
    43. | 1 | tom |
    44. +------+------+
    45. 1 row in set (0.00 sec)
    46. mysql> exit
    47. Bye
    48. root@33b472f8eec2:/# exit
    49. exit
    50. [root@localhost seven]# docker ps
    51. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    52. 33b472f8eec2 mysql:5.7 "docker-entrypoint..." 6 minutes ago Up 6 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp my_mysql
    53. #停止并卸载mysql容器
    54. [root@localhost seven]# docker stop 33
    55. 33
    56. [root@localhost seven]# docker rm 33
    57. 33
    58. #下面的命令时进入到挂载的宿主机的目录里查看是否有东西(数据持久化,所以数据都已保存在这里,
    59. #不会因为删除容器而导致数据丢失)
    60. [root@localhost seven]# cd /opt
    61. [root@localhost opt]# ls
    62. mysql rh webapps
    63. [root@localhost opt]# cd mysql/
    64. [root@localhost mysql]# ls
    65. conf data
    66. [root@localhost mysql]# cd data/
    67. [root@localhost data]# ls
    68. auto.cnf client-cert.pem ibdata1 mysql public_key.pem sys
    69. ca-key.pem client-key.pem ib_logfile0 performance_schema server-cert.pem test
    70. ca.pem ib_buffer_pool ib_logfile1 private_key.pem server-key.pem
    71. [root@localhost data]# docker ps
    72. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    73. [root@localhost data]# docker ps -a
    74. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    75. e933a93178de tomcat "catalina.sh run" 3 hours ago Exited (143) 2 hours ago mytomcat1
    76. 29cb2fd3634e tomcat "catalina.sh run" 3 hours ago Exited (143) 3 hours ago mytomcat
    77. 44bed10f18b6 mysql:5.7 "docker-entrypoint..." 15 hours ago Exited (0) 5 hours ago mysql
    78. 4b253ba77689 java "java -version" 18 hours ago Exited (0) 18 hours ago eager_fermi
    79. 7ce7bdf289d8 hello-world "/hello" 20 hours ago Exited (0) 20 hours ago hardcore_nightingale
    80. 81547f6c4634 hello-world "/hello" 45 hours ago Exited (0) 45 hours ago gracious_golick
    81. #下面的操作时重新启动数据库然后进行查找,发现依然能够查找到数据
    82. #说明数据并没有因为删除容器而丢失
    83. [root@localhost data]# docker run -d -p 3306:3306 -v /opt/mysql/conf:/etc/mysql/conf.d -v /opt/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name my_mysql mysql:5.7
    84. 23fdffe2f34113782fa3de85e6ce8c193e3e0db7b6cba05c7e57014b3ed8d23b
    85. [root@localhost data]# docker exec -it 23 /bin/bash
    86. root@23fdffe2f341:/# mysql -uroot -p
    87. Enter password:
    88. Welcome to the MySQL monitor. Commands end with ; or \g.
    89. Your MySQL connection id is 2
    90. Server version: 5.7.36 MySQL Community Server (GPL)
    91. Copyright (c) 2000, 2021, Oracle and/or its affiliates.
    92. Oracle is a registered trademark of Oracle Corporation and/or its
    93. affiliates. Other names may be trademarks of their respective
    94. owners.
    95. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    96. mysql> show databases;
    97. +--------------------+
    98. | Database |
    99. +--------------------+
    100. | information_schema |
    101. | mysql |
    102. | performance_schema |
    103. | sys |
    104. | test |
    105. +--------------------+
    106. 5 rows in set (0.09 sec)
    107. mysql> use test;
    108. Reading table information for completion of table and column names
    109. You can turn off this feature to get a quicker startup with -A
    110. Database changed
    111. mysql> select * from test;
    112. ERROR 1146 (42S02): Table 'test.test' doesn't exist
    113. mysql> show table;
    114. ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
    115. mysql> show tables;
    116. +----------------+
    117. | Tables_in_test |
    118. +----------------+
    119. | dog |
    120. +----------------+
    121. 1 row in set (0.00 sec)
    122. mysql> select * from dog;
    123. +------+------+
    124. | id | name |
    125. +------+------+
    126. | 1 | tom |
    127. +------+------+
    128. 1 row in set (0.00 sec)

    具名和匿名挂载

    语法格式
    -V 容器内路径 #匿名挂载,系统帮我们指定了一个路径,但是没有明确告诉我们在哪,用docker inspect 容器id 可以查到,输出的信息里Mounts属性下有Source和Destination,Source就是系统给我们指定的路径,Destination就是咱们自己指定的容器内路径,这个方式一般用的少,下面两种方式用的比较多。
    -v 卷名:容器内路径 #具名挂载
    -v /宿主内路径:容器内路径 #指定路径挂载
    注意:
    匿名挂载:卷挂载只写容器里面的路径,不写容器外的路径。

    拓展

    1. ro readonly # 只读
    2. rw readwrite # 可读可写

     参数:

    通过 -v 容器内路径 ro rw 改变目录读写权限

     看到下面的命令,路径绑定后边跟一个冒号,然后后面写权限。

    1. docker run -d -P --name tomcat -v my-nginx:/etc/nginx:ro tomcat
    2. docker run -d -P --name tomcat -v my-nginx:/etc/nginx:rw tomcat

    昨天是二十大召开的日子,笔者看到祖国已经风风雨雨经历了这么多年头,到如今繁荣昌盛,心中充满了感激与自豪,希望祖国越来越好!

  • 相关阅读:
    linux驱动学习笔记(1)
    Python在工业自动化领域的应用详解
    空气扬尘远程监控物联网解决方案
    【OpenCV 例程200篇】236. 特征提取之主成分分析(OpenCV)
    java计算机毕业设计固定资产管理系统源码+mysql数据库+系统+lw文档+部署
    SpringCloud Alibaba(七) - JWT(JSON Web Token)
    Prompt万能框架与常用评估指标
    .NET 组件连接 activemq
    一站式开源持续测试平台 MerterSphere 之测试跟踪操作详解
    哈希表题目:宝石与石头
  • 原文地址:https://blog.csdn.net/weixin_44593822/article/details/127348923