docker容器数据卷

        什么是数据卷?

容器和主机之间共享数据。它允许容器内的文件持久存在,并且可以被多个容器共享和访问。

        数据卷的主要作用如下:

  1. 数据持久性:容器内的数据卷可以在容器被删除后仍然存在,确保数据的持久性。这对于需要长期存储数据的应用程序非常重要,如数据库。
  2. 数据共享:多个容器可以共享相同的数据卷,使它们能够访问和修改相同的数据。这对于构建分布式应用程序或共享配置文件等数据非常有用。
  3. 数据备份和恢复:数据卷可以方便地备份和恢复到其他位置,包括其他主机或云存储。这样可以确保数据的安全性,并且在需要时可以轻松地恢复数据。
  4. 数据交换:数据卷可以作为容器之间传输数据的中间介质。一个容器可以将数据写入数据卷,另一个容器可以读取并处理该数据。这对于构建复杂的应用程序架构非常有用。

使用数据卷时,需要创建一个数据卷,并将其挂载到容器中的指定路径。Docker提供了多种方式来创建和管理数据卷,包括命令行工具和Docker Compose等。

总之,数据卷是Docker中非常重要的概念,可以实现数据持久性、共享和交换,为容器化应用程序提供了更多的灵活性和可靠性。

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_容器

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_mysql_02

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_容器_03

配置数据卷 

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_容器_04

配置宿主机数据卷,同时容器内部内容也会修改; 

第一步:查看所有容器进程   docker ps -a

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_运维_05

第二步:配置数据卷 

docker run --name=容器名字 -d --restart=alaways -p 80:80 -v 容器目录:容器内部html目录镜像名

案例1: 如果目录不存在,会自动创建;

docker run --name=n01 -d --restart=alawys -p 80:80 -v /qy172/data/nginx/html:/usr/share/nginx/html nginx

 第三步:进入/qy172/data/nginx/html目录里,输入内容 vim index.html

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_mysql_06

第四步:使用IP地址访问80端口号;

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_数据_07

修改容器内部内容,宿主机内容也会得到修改;

第一步:进入到容器内部 docker exec -it n01 /bin/bash

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_运维_08

第二步:进入到/usr/share/nginx/html目录下;

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_运维_09

第三步:在此次访问80端口号;

Docker应用部署

        docker部署mysql

第一步:拉去MySQL镜像  docker  pull mysql:版本号

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_mysql_10

第二步:创建容器;

docker run --name=m01 -d --restart=always -p 3307:3306 -v /qy172/data/mysql/log:/var/log/mysql -v /qy172/data/mysql/data:/var/lib/mysql -v /qy172/data/mysql/conf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=root mysql:8.2.0

第三步:连接数据库客户端测试 ;

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_运维_11

成功以后创建库,表添加数据,看看/qy72/data/mysql /data目录中是否获取到数据库中的库和表的数据;

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_容器_12

注:我们这时要是把为m01的容器删除掉的话,再次创建容器,只是修改端口号把3307修改为3308的话,我们再去数据库创建新的数据库时,3307的数据库连接不上,但是3308只需创建数据库即可,数据不会丢失,实现了数据的持久性;

docker run --name=m01 -d --restart=always -p 3308:3306 -v /qy172/data/mysql/log:/var/log/mysql -v /qy172/data/mysql/data:/var/lib/mysql -v /qy172/data/mysql/conf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=root mysql:8.2.0

docker部署tomcat

第一步:拉去tomcat镜像; docker pull tomcat:版本号;

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_mysql_13

第二步:创建容器; 

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_数据_14

第三步:访问8080端口号;

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_docker_15

解决方案:

第一步:进入到容器内部; docker exec -it t01 /bin/bash;

第二步:删除webapps文件;

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_docker_16

 

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_docker_17

 docker部署redis

第一步:拉去redis docker pull redis:版本号;

 

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_mysql_18

 第二步:创建容器;

注:如果数据卷挂载时,绑定的是文件--必须先创建该文件。目录不存在时可以自动创建;

创建/qy172/data/redis/redis.conf文件

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_运维_19

创建容器

docker run --name=r01 -d -p 6379:6379 -v /qy172/data/redis/redis.conf:/etc/redis/redis.conf -v /qy172/data/redis/data:/data redis:latest redis-server /etc/redis/redis.conf

 

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_运维_20

redis连接设置密码  /qy172/data/redis/redis.conf  中输入 requirepass root

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_mysql_21

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_docker_22

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_docker_23

自定义镜像

上面讲解的内容需要的镜像 都是从远程仓库拉取,我们能否把自己写的工程也变成一个镜像[运维工作者就可以从远程仓库拉取自己镜像]。可以的。 需要自定义镜像;
 

镜像制作

自定义镜像:提供两种方式:第一种:基于容器来制作镜像;第二种:通过dockerfile文件来制作镜像;

dockerfile的概念

  • Dockerfile是一个文本---任意一个镜像都是通过dockerfile来制作
  • 文件包含了一条条的指令
  • 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
  • 对于开发人员:可以为开发团队提供一个完全一致的开发环境
  • 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了
  • 对于运维人员:在部署时,可以实现应用的无缝跨平台移植
  • Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_容器_24

dockerfile关键字

FROM:基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from;

MAINTAINER:镜像维护者的姓名和邮箱地址;

RUN:容器构建时需要运行的命令;两种格式:shell格式;exec格式;RUN是在 docker build运行;

EXPOSE:当前容器对外暴露出的端口;

WORKDIR:指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点;

USER:指定该镜像以什么样的用户去执行,如果都不指定。默认是root; 

ENV:用来在构建镜像过程中设置环境变量;

ADD:将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包;

CORY:类似于ADD,拷贝文件和目录到镜像中,将从构建上下文目录<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置;

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_容器_25

Dockerfil案例1

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_运维_26

第一步:拉去centos7镜像   docker pull centos:7;

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_mysql_27

第二步:编辑Dockerfile文件;/qy172/Dockerfile;
#基于某个镜像
FROM centos:7
#作者姓名和邮箱
MAINTAINER zhao<zhk166@126.com>
#工作目录
WORKDIR /usr
#打包镜像时需要执行的命令
RUN yum -y install vim
#镜像运行容器时要执行的命令
CMD /bin/bash
第三步:构建镜像

docker build -f Dockerfile -t xc_asd:1 .

-f:表示dockerfile文件
-t: 镜像名称版本号 
.: 必须加上

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_mysql_28

第四步:创建容器

docker run -it --name=xc  xc_asd:1   直接进入uer目录

 

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_docker_29

可以使用vim编辑器;

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_容器_30

Dockerfile案例2

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_容器_31

第一步:先创建一个SpringBoot项目  添加Web依赖;

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_容器_32

第二步:写一个简单的controller层;

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_数据_33

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_数据_34

第三步:将项目打成jar包;在配置文件application.properties配置端口号

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_数据_35

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_mysql_36

第四步:配置Dockerfile文件内容;

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_运维_37

FROM java:8
ADD docker-0.0.1-SNAPSHOT.jar docker01.jar
EXPOSE 8080
CMD java -jar docker01.jar

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_数据_38

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_mysql_39

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_mysql_40

找到文件路径,将这两个文件托到 /qy172/springboot目录下

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_运维_41

 根据Dockerfile制作镜像

docker build -f Dockerfile -t app:1 .

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_容器_42

Docker查看容器是否已经把本地目录挂载到镜像 docker查看容器文件目录_docker_43

启动并做端口号映射

docker run --name=app  -d -p 8080:8080 app:1

访问:ip地址+端口号/hello路径访问成功