docker笔记-容器数据卷与Dockerfile

docker笔记

容器数据卷

什么是容器数据卷?

​ 当我们容器启动之后,每个容器是单独隔离运行的,如果数据只保留在当前容器中,那么当容器被删除后,我们操作的数据也会被删除。

​ 为了解决这种容器内数据的持久化保存以及不同容器之间的数据共享问题,docker提供了容器卷技术,可以将容器内的文件目录挂载到容器外(比如Linux系统)的某个目录下,以实现容器的数据操作同步到容器外,并且被挂载目录内的数据共享给容器。

数据卷实现
方式一:-v 挂载命令实现
docker run -it -v 主机目录:容器目录 镜像

# 示例
docker run -it -v /home/centosData:/home/centosData centos bash
	# 通过挂载目录后,容器和主机操作的centosData.java文件在彼此内都可以看见,即使容器被删除了,本地的文件依然存在,实现数据的共享以及本地的持久化

在这里插入图片描述

方式二:DockerFile数据卷挂载 – 常用方式

​ 使用DockerFile进行构建镜像时可以直接在构建镜像的脚本中使用VOLUME构建数据卷。

#构建镜像语法:
docker build -f dockerFile -t volume-learn .

# -f 指定用于构建镜像的文件
# -t 指定目标镜像名称
# .  指定当前目录

示例:

[root@localhost volumn_learn]# pwd
/learn/volumn_learn
[root@localhost volumn_learn]# vi dockerFile
[root@localhost volumn_learn]# cat dockerFile
FROM centos

VOLUME ["volume01","volume02"]

CMD echo "---------end--------"
CMD /bin/bash

[root@localhost volumn_learn]# docker build -f dockerFile -t volume-learn .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 5d0da3dc9764
Step 2/4 : VOLUME ["volume01","volume02"]
 ---> Running in cd374350dac1
Removing intermediate container cd374350dac1
 ---> 192453b694dd
Step 3/4 : CMD echo "---------end--------"
 ---> Running in c34c9b7b1dd3
Removing intermediate container c34c9b7b1dd3
 ---> a3a48975dc22
Step 4/4 : CMD /bin/bash
 ---> Running in e4fa1aef2e18
Removing intermediate container e4fa1aef2e18
 ---> eb085d9bbb22
Successfully built eb085d9bbb22
Successfully tagged volume-learn:latest
[root@localhost volumn_learn]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
volume-learn          latest    eb085d9bbb22   4 minutes ago   231MB

从上图可以看见已正常构建volume-learn镜像,启动镜像后可以观察相关数据卷的挂载信息:

​ 可以使用 --volumes-from 父容器 镜像名 命令来实现多个数据卷容器之间的数据共享。

# volume01	volume02 数据卷在容器内正常存在
[root@localhost volumn_learn]# docker run -it volume-learn /bin/bash
[root@a58d88199047 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01	volume02
# 通过docker inspect 容器id 查看数据挂载情况,并且如下图展示,已实现数据之间的共享
[root@localhost volumn_learn]# docker inspect a58d88199047
···
"Mounts": [
            {
                "Type": "volume",
                "Name": "73b2b24706b792f173efd9b45ddb99641dc13653ed6eb4687a5b3ce7db04d2d2",
                "Source": "/var/lib/docker/volumes/73b2b24706b792f173efd9b45ddb99641dc13653ed6eb4687a5b3ce7db04d2d2/_data",
                "Destination": "volume01",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "8008dec9795095ee1e37eae3fd9c91f58de424b044187cb92ca0e96bc3d98e2d",
                "Source": "/var/lib/docker/volumes/8008dec9795095ee1e37eae3fd9c91f58de424b044187cb92ca0e96bc3d98e2d/_data",
                "Destination": "volume02",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ]
···

在这里插入图片描述

具名挂载与匿名挂载

​ 通常在我们使用-v命令进行挂载时,可以区分为具名挂载、匿名挂载以及上图展示的绝对路径挂载。

# -v命令格式包括:
-v 容器内路径					# 匿名挂载
-v 指定数据卷名:容器内路径			# 具名挂载
-v /宿主机绝对路径:容器内路径		# 绝对路径挂载

# 容器数据权限,可以在容器路径后面指定ro,rw读写权限
-v 容器内路径:ro					# 只读
-v 容器内路径:rw					# 读写

# 查询数据卷名命令
docker volume 
	ls 				# 列出数据卷
	inspect			# 列出某个数据卷相信信息

示例:

[root@localhost /]# docker run -d -p 3301:3306 -v mysql-juming:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql-juming  mysql:5.7
df8a1485ce66c7ce74cd81240a2e87cfaf605c3123b8426e39b6a70fc3817099
[root@localhost /]# docker volume

Usage:  docker volume COMMAND

Manage volumes

Commands:
  create      Create a volume
  inspect     Display detailed information on one or more volumes
  ls          List volumes
  prune       Remove all unused local volumes
  rm          Remove one or more volumes

Run 'docker volume COMMAND --help' for more information on a command.
[root@localhost /]# docker volume ls
DRIVER    VOLUME NAME
local     9f155325f86c5ccbfdd75d1a2fa65af90f0b6aead0d7c02467981be78362b593
local     757afa5fced4bf4899985896b10413d5608e0377467f89c56d141fa8f5889c58
local     b9745c8460d39a8973c29ab1f1a7103d77acf296dee3a319790008257fad41c3
local     ea4f9e5c2501df7c42ac1bfc58898a00cf5acde2a4f93b39a4880688dcee7913
local     mysql-juming
[root@localhost /]# docker volume inspect mysql-juming
[
    {
        "CreatedAt": "2022-08-09T16:31:37+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/mysql-juming/_data",
        "Name": "mysql-juming",
        "Options": null,
        "Scope": "local"
    }
]
DockerFile

​ dockerfile是构建镜像的文件,通过编写脚本文件来构建我们自己的镜像。

dockerFile常用指令
FROM 				# 基础镜像
MAINTAINER			# 作者 姓名+邮箱
RUN					# 镜像构建是需要运行的命令
ADD 				# 添加内容,会自动解压压缩包
WORKDIR				# 镜像工作目录
VOLUME				# 挂载卷
EXPOSE				# 暴露端口
CMD					# 指定容器启动时需要运行的命令,只有最后一个生效,可被替代
ENTRYPOINT			# 指定容器启动时需要运行的命令,可以追加命令
ONBUILD 			# 触发指令,当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行
COPY				# 将文件copy到镜像中
ENV					# 构建时设置环境变量
构建tomcat镜像实战

tomcat压缩包下载地址:https://mirrors.cnnic.cn/apache/tomcat/

jdk8压缩包下载地址: https://www.oracle.com/java/technologies/downloads/

  • 编写镜像构建文件Dockerfile,官方文件名,使用它可以build构建时可以不使用-f指定文件
FROM centos
MAINTAINER shuirong<ShuiR0129@126.com>

COPY readme.txt /usr/local/readme.txt

ADD  jdk-8u341-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-10.0.23.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_333
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-10.0.23
ENV CATALINA_BASE /usr/local/apache-tomcat-10.0.23
FROM centos
MAINTAINER shuirong<ShuiR0129@126.com>

COPY readme.txt /usr/local/readme.txt

ADD  jdk-8u341-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-10.0.23.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_333
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-10.0.23
ENV CATALINA_BASE /usr/local/apache-tomcat-10.0.23
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-10.0.23/bin/startup.sh && tail -F /usr/local/apache-tomcat-10.0.23/bin/logs/catalina.out
  • 构建镜像
docker build -t mytomcat .
  • 运行启动镜像
docker run -d -p 8080:8080 -v /learn/volumn_myTomcat/test:/usr/local/apache-tomcat-10.0.23/webapps/test -v /learn/volumn_myTomcat/tomcatLogs/:/usr/local/apache-tomcat-10.0.23/logs mytomcat
  • 在宿主机发布web项目测试
# web.xml文件
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

</web-app>
# jsp主页
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2>
 
</body>
</html>

在这里插入图片描述

docker发布
发布dockerHub
  • 登录dockerhub 账号: docker login -u userName
[root@localhost myTomcat]# docker login -u shui0129
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
  • docker push imagesName:tag 发布镜像
 docker push shui0129/mytomcat:1.0
发布阿里云
  • 容器镜像服务中创建自己的命名空间
  • 创建相关仓库
  • 根据仓库操作指南push自己的镜像
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值