目录
Docker宿主机和容器之间文件拷贝docker copy
前言:
Docker 数据管理
在生产环境中使用 Docker ,往往需要对数据进行持久化,或者需要在多个容器之间进行
数据共享,这必然涉及容器的数据管理操作
容器中的管理数据主要有两种方式:
数据卷 Data Volumes 容器内数据直接映射到本地主机环境;
数据卷容器(Data Volume Containers 使用特定容器维护数据卷
当然还有最原始的copy方式,这个也是管理数据的方式,但是基本不会用到;
最原始的copy方式管理数据:
宿主机文件 copy to 容器内
docker cp 需要拷贝的文件或者目录 容器名称:容器目录
容器内 copy to 宿主机
docker cp 容器名称:容器目录 宿主机目录
引言:利用MySQL镜像安装MySQL服务
现在3307没有此服务
docker run -p 3307:3306 --name mysql1 -di -v /home/javaoy/data/mysql/mysql.conf.d/:/etc/mysql/mysql.conf.d/ -v /home/javaoy/data/mysql/data/:/var/lib/mysql -v /home/javaoy/data/mysql/log/:/var/log -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
运行此代码
连接成功
注意:同时访问两个容器里面的端口号会存在问题,若想访问第二个容器中的,要先停止第一个容器
我们创建tomcat3容器
如果要部署项目的时候,肯定要进入webapps里面去将项目放里面,但是这是原生Linux里面是需要这么做的,但是现在这里面没有这个东西,这就意味着,当我们的Tomcat要运行某个项目时,就必须将项目放到这里面来,可这是在docker容器里面,该怎么将文件传到容器内部呢?
从容器中拷贝文件到宿主机
docker cp tomcat1:/usr/local/tomcat/webapps/hello /javaoy/software/apache-tomcat-8.5.20/webapps
创建一个文件
将压缩包放入mydocker
(以apache-tomcat-8.5.20.tar.gz为例)
进入tomcat3这个容器中
现在我们将文件传到这个容器中去
现在进入容器内部查看是否复制进去了
可以看见,已经进去了,我们将这个解压包当成项目就行,都是一样的操作。可项目运行啥的都会有日志文件的,日志文件又是实时更新的,不能写一个就复制一个吧?
创建一个文件
我们就将刚刚所创建的文件当成日志文件,把这个文件 放到宿主机上面去
从容器中拷贝文件到宿主机
docker cp tomcat3:/usr/local/tomcat/webapps/111.log /javaoy/software/mydocker/
查看是否拷贝成功
数据卷
数据卷(Data Volumes)
数据卷是一个可供一个或多个容器使用的特殊目录,它将主机操作系统目录直接映射进容器
它可以提供很多有用的特性:
1.数据卷 可以在容器之间共享和重用
2.对数据卷的修改会立马生效
3.对数据卷的更新,不会影响镜像
4.数据卷 默认会一直存在,即使容器被删除
数据卷相关操作
将宿主机的目录与容器的目录进行挂载,实现数据共享
docker run -di --name c2 -v /home/oyang/data/:/home/nxing/data/ centos:7
看一下oyang有没有与nxing进行信息的互通
我们进入oyang的目录
可以看到,现在是没有东西的,现在我们在oyang目录中上传一张照片,看nxing容器里面能否接收的到
我们使用nxing登录那个容器,是能够看到这个照片的, 就是可能会乱码
nxing看到之后回复一个好帅,看oyang能否接收到这个回复
我们在宿主机可以看家这个文件
结论:不管宿主机、容器在指定目录创建文件夹还是文件,都会会被共享;
数据卷容器
如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。
数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载
创建一个数据卷容器
docker run -di -v /home/javaoy/data/c4 --name c4 centos:7
这个目录是没有挂载任何东西的的,我们只是把它做成一个数据卷容器,想要共享数据的容器,都需要挂载这个c4
挂载数据卷容器
docker run -di --volumes-from c4 --name c6 centos:7
凡是执行了这条代码的容器吗,都会有(/home/javaoy/data/)目录
现在进入c4容器,并且创建一个文件夹,添加内容
从c4容器退出来,进入c6看是否能够实现数据卷功能
在c6里面有c4的目录,并且拥有刚刚创建的c4文件
我们在c6里面修改c4.txt,待会儿看c4是否也拥有数据卷的功能,可以观看到我们更改的内容
小知识:小编这个镜像是依据centos:7制造出来的镜像,所以才拥有vi命令
OK,我们现在进入c4里面看
里面的数据也是共享的
注意:数据卷容器的本质就是数据卷
通过docker inspect 容器名 可以看到该容器的所有信息
其中c4为数据卷容器,c6为普通容器,其中c4就起到一个桥接作用,我们可以通过docker inspect查看容器的详细情况
docker inspect c4 docker inspect c6
会发现c4、c6目录挂载情况是一样的
结论:不管c4、c6在指定目录创建文件夹还是文件,都会会被共享;
Dockerfile
自定义centos,具备vim及ifconfig作用
centos:7 通过它运行的容器,是没有vim命令的,我希望我自己制作一个镜像mycontos:7 然后我自己制作的镜像运行一个容器,而这个容器,是存在vim命令的
创建mycentosDockerfile文件
vi mycentosDockerfile
向 mycentosDockerfile 编辑内容
FROM centos:7
MAINTAINER javaoy "1828190940@qq.com"
RUN yum -y install vim
RUN yum install net-tools.x86_64 -y
CMD /bin/bash
构建镜像
docker build -f mycentosDockerfile -t javaoy/centos:v1.0 .
这里的名字就是上面创建的文件名(如果文件名叫Dockerfile,那么-f mycentosDockerfile 可以省略)
构建完成
通过镜像运行一个容器进行测试
docker run -it --name mc1 javaoy/centos:v1.0 /bin/bash
自定义tomcat8
cd /javaoy/software
mkdir mydocker
vi mytomcatDockerfile
向 mytomcatDockerfile 编辑内容
FROM centos:7
MAINTAINER javaoy "1828190940@qq.com"ENV workerDir /home/javaoy/dockerfile/3
WORKDIR $workerDirADD jdk-8u151-linux-x64.tar.gz $workerDir
COPY apache-tomcat-8.5.20.tar.gz $workerDir
RUN tar -xvf apache-tomcat-8.5.20.tar.gz apache-tomcat-8.5.20ENV JAVA_HOME $workerDir/jdk1.8.0_151
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV TOMCAT_HOME $workerDir/apache-tomcat-8.5.20
ENV PATH $JAVA_HOME/bin:$TOMCAT_HOME/bin:$TOMCAT_HOME/lib:$PATHEXPOSE 8080
ENTRYPOINT ["/home/javaoy/dockerfile/3/apache-tomcat-8.5.20/bin/catalina.sh","run"]
需要有上面配置所对应的安装包
构建镜像
docker build -f mytomcatDockerfile -t javaoy/tomcat8:v1.0 .
通过镜像运行2个容器进行测试
docker run -di --name mt1 -P javaoy/tomcat8:v1.0
docker run -di --name mt2 -P javaoy/tomcat8:v1.0
随机的端口号
浏览器输入/都可以访问到tomcat