#博学谷IT学习技术支持#
一、遇到的问题
在之前的命令中,进入容器内部之后,因为没有vi命令,如果要对文件进行编辑,修改是极其不方便的。这便是容器与数据耦合的后果。
这里学习数据卷来解决这个问题。
二、数据卷
数据卷(volume) 是一个虚拟目录,指向宿主机文件系统中的某个目录。
三、数据卷命令
数据卷操作的基本语法如下:
docker volume [COMMAND]
docker volume 命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:
- create 创建一个volume
- inspect 显示一个或多个volume的信息
- ls 列出所有的volume
- prune 删除未使用的volume
- rm 删除一个或多个指定的volume
四、挂载数据卷命令
注: 只能在创建容器时进行挂载。
我们在创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器内目录,命令格式如下:
docker run \
--name mn \
-v html:/root/html \
-p 8080:80 \
nginx
这里的-v就是挂载数据卷的命令:
- -v html:/root/html :把html数据卷挂载到容器内的/root/html这个目录
挂载之后便可以进入数据卷内部,对文件进行方便的修改了。
# 查看html数据卷的位置
docker volume inspect html
# 进入该目录
cd /var/lib/docker/volumes/html/_data
# 修改文件
vi index.html
五、挂载本地目录命令
容器不仅仅可以挂载数据卷,也可以直接挂载到宿主机目录上。
命令是相似的,只是将数据卷的目录(文件)换成了本地目录(文件)
六、两种方式区别
- 带数据卷模式:宿主机目录 --> 数据卷 —> 容器内目录
- 直接挂载模式:宿主机目录 —> 容器内目录
七、自定义Docker镜像
镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。
简单来说,镜像就是在系统函数库、运行环境基础上,添加应用程序文件、配置文件、依赖文件等组合,然后编写好启动脚本打包在一起形成的文件。
我们要构建镜像,其实就是实现上述打包的过程。
八、Dockerfile语法
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。
九、实践
需求:基于Ubuntu镜像构建一个新镜像,运行一个java项目
-
将准备好的docker-demo.jar(换成自己的项目)和jdk8.tar.gz (linux下的安装包) 放在一个docker-demo目录
-
创建Dockerfile文件
# 指定基础镜像 FROM ubuntu:16.04 # 配置环境变量,JDK的安装目录 ENV JAVA_DIR=/usr/local # 拷贝jdk和java项目的包 COPY ./jdk8.tar.gz $JAVA_DIR/ COPY ./docker-demo.jar /tmp/app.jar # 安装JDK RUN cd $JAVA_DIR \ && tar -xf ./jdk8.tar.gz \ && mv ./jdk1.8.0_144 ./java8 # 配置环境变量 ENV JAVA_HOME=$JAVA_DIR/java8 ENV PATH=$PATH:$JAVA_HOME/bin # 暴露端口 EXPOSE 8090 # 入口,java项目的启动命令 ENTRYPOINT java -jar /tmp/app.jar
-
将准备好的docker-demo上传到虚拟机任意目录,然后进入docker-demo目录下
-
执行命令
docker build -t javaweb:1.0 .
- 访问自己项目的接口便可以了