docker容器数据卷
什么是数据卷?
容器和主机之间共享数据。它允许容器内的文件持久存在,并且可以被多个容器共享和访问。
数据卷的主要作用如下:
- 数据持久性:容器内的数据卷可以在容器被删除后仍然存在,确保数据的持久性。这对于需要长期存储数据的应用程序非常重要,如数据库。
- 数据共享:多个容器可以共享相同的数据卷,使它们能够访问和修改相同的数据。这对于构建分布式应用程序或共享配置文件等数据非常有用。
- 数据备份和恢复:数据卷可以方便地备份和恢复到其他位置,包括其他主机或云存储。这样可以确保数据的安全性,并且在需要时可以轻松地恢复数据。
- 数据交换:数据卷可以作为容器之间传输数据的中间介质。一个容器可以将数据写入数据卷,另一个容器可以读取并处理该数据。这对于构建复杂的应用程序架构非常有用。
使用数据卷时,需要创建一个数据卷,并将其挂载到容器中的指定路径。Docker提供了多种方式来创建和管理数据卷,包括命令行工具和Docker Compose等。
总之,数据卷是Docker中非常重要的概念,可以实现数据持久性、共享和交换,为容器化应用程序提供了更多的灵活性和可靠性。
配置数据卷
配置宿主机数据卷,同时容器内部内容也会修改;
第一步:查看所有容器进程 docker ps -a
第二步:配置数据卷
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
第四步:使用IP地址访问80端口号;
修改容器内部内容,宿主机内容也会得到修改;
第一步:进入到容器内部 docker exec -it n01 /bin/bash
第二步:进入到/usr/share/nginx/html目录下;
第三步:在此次访问80端口号;
Docker应用部署
docker部署mysql
第一步:拉去MySQL镜像 docker pull mysql:版本号
第二步:创建容器;
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
第三步:连接数据库客户端测试 ;
成功以后创建库,表添加数据,看看/qy72/data/mysql /data目录中是否获取到数据库中的库和表的数据;
注:我们这时要是把为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:版本号;
第二步:创建容器;
第三步:访问8080端口号;
解决方案:
第一步:进入到容器内部; docker exec -it t01 /bin/bash;
第二步:删除webapps文件;
docker部署redis
第一步:拉去redis docker pull redis:版本号;
第二步:创建容器;
注:如果数据卷挂载时,绑定的是文件--必须先创建该文件。目录不存在时可以自动创建;
创建/qy172/data/redis/redis.conf文件
创建容器
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
redis连接设置密码 /qy172/data/redis/redis.conf 中输入 requirepass root
自定义镜像
上面讲解的内容需要的镜像 都是从远程仓库拉取,我们能否把自己写的工程也变成一个镜像[运维工作者就可以从远程仓库拉取自己镜像]。可以的。 需要自定义镜像;
镜像制作
自定义镜像:提供两种方式:第一种:基于容器来制作镜像;第二种:通过dockerfile文件来制作镜像;
dockerfile的概念
- Dockerfile是一个文本---任意一个镜像都是通过dockerfile来制作
- 文件包含了一条条的指令
- 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
- 对于开发人员:可以为开发团队提供一个完全一致的开发环境
- 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了
- 对于运维人员:在部署时,可以实现应用的无缝跨平台移植
dockerfile关键字
FROM:基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from;
MAINTAINER:镜像维护者的姓名和邮箱地址;
RUN:容器构建时需要运行的命令;两种格式:shell格式;exec格式;RUN是在 docker build运行;
EXPOSE:当前容器对外暴露出的端口;
WORKDIR:指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点;
USER:指定该镜像以什么样的用户去执行,如果都不指定。默认是root;
ENV:用来在构建镜像过程中设置环境变量;
ADD:将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包;
CORY:类似于ADD,拷贝文件和目录到镜像中,将从构建上下文目录<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置;
Dockerfil案例1
第一步:拉去centos7镜像 docker pull centos:7;
第二步:编辑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 run -it --name=xc xc_asd:1 直接进入uer目录
可以使用vim编辑器;
Dockerfile案例2
第一步:先创建一个SpringBoot项目 添加Web依赖;
第二步:写一个简单的controller层;
第三步:将项目打成jar包;在配置文件application.properties配置端口号
第四步:配置Dockerfile文件内容;
FROM java:8
ADD docker-0.0.1-SNAPSHOT.jar docker01.jar
EXPOSE 8080
CMD java -jar docker01.jar
找到文件路径,将这两个文件托到 /qy172/springboot目录下
根据Dockerfile制作镜像
docker build -f Dockerfile -t app:1 .
启动并做端口号映射
docker run --name=app -d -p 8080:8080 app:1
访问:ip地址+端口号/hello路径访问成功