狂神Docker——数据卷

容器数据卷

初识Dockerfile

命令脚本→构建镜像→启动容器→查看

Dockerfile 就是用来构建docker镜像 的构建文件!就是命令脚本!

通过这个脚本可以生成镜像,镜像是一层一层的,脚本是一个个命令,每个命令都是一层!

#创建一个dockerfile文件,名字可以随机,建议就用dockerfile
#文件中的内容 指令(都是大写) 参数
FROM centos                    #基于centos镜像
​
VOLUME ["volume01","volume02"] #匿名挂载,容器内的目录
​
CMD echo  "----end----"
​
CMD /bin/bash
#这里的每个命令都是镜像的一层
#构建镜像
docker build -f /home/docker-test-volume/dockerfile1 -t duanqiao/centos .

img

#启动自己写的容器
docker run -it 镜像ID /bin/bash

img

这个卷和外部一定有一个同步的目录!

img

cd volume01           #进入volume01
touch container.txt   #新建文件

查看一下卷的挂载路径

docker inspect 容器ID

img

测试一下刚才的文件是否同步出去了

这种方式未来用的特别多,因为我们通常会自己构建镜像

假设构建镜像的时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径

数据卷容器

docker run -it --name docker02 --volumes-from docker01 duanqiao/centos

多个MySQL同步数据

img

--volumes-from
#启动三个容器,通过自己构建的镜像
docker run -it --name docker01 duanqiao/centos
 #启动docker01
docker run -it --name docker02 --volumes-from docker01 duanqiao/centos  #(镜像ID)
 #启动docker02并挂载到docker01,此时docker01就是数据卷容器
 #测试在docker01内的volume01下创建文件docker01.txt,在docker02下的volume01 查看
docker run -it --name docker03 --volumes-from docker01 duanqiao/centos 
#测试在docker03内的volume01下创建文件docker03.txt,在docker01和docker02下的volume01 查看

img

img

#测试:删除docker01,在docker02和docker03下查看文件还在不在
#测试依旧可以访问

img

多个mysql实现数据共享

[root@localhost home]# docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
 
[root@localhost home]# docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
#mysql02挂载到mysql01
# 这个时候,可以实现两个容器数据同步!
​

结论:

容器之间配置信息的传递,数据卷容器的生命周期是一直持续到没有容器使用为止。

但是一旦你持久化到了本地,这时候本地数据是不会丢失的

Dockerfile

dockerfile介绍

dockerfile是用来构建docker镜像文件的文件!它就是一个命令脚本

构建步骤:
​
1. 编写一个dockerfile文件
​
2. docker build 构建成为一个镜像
#docker build -f /home/docker-test-volume/dockerfile1  -t duanqiao/centos .
3. docker run 运行镜像
#docker run -it --name docker01 duanqiao/centos
4. docker push 发布镜像(dockerhub 阿里云镜像库)

img

查看一下官方是怎么做的

img

很多官方镜像都像是基础包,很多功能都不具备,我们通常会自己搭建自己的镜像!

官方既然可以制作镜像,能我们一样可以!

Dockerfile构建过程

基础知识

  1. 每个保留关键字(指令)都是必须大写字母

  2. 执行从上到下顺序执行

  3. # 表示注释

  4. 每个指令都会创建提交一个新的镜像层,并提交

    img

DockerFile是面向开发的, 我们以后要发布项目, 做镜像, 就需要编写dockefile文件, 这个文件十分简单!

Docker镜像逐渐成为企业的交互标准,必须要掌握!

步骤:开发,部署, 运维… 缺一不可!

DockerFile: 构建文件, 定义了一切的步骤,源代码

DockerImages: 通过DockerFile构建生成的镜像, 最终发布和运行的产品!

docker build -f /dockerfile文件路径 -t 名称标签

Docker容器:容器就是镜像运行起来提供服务器

dockerfile指令

FROM        #基础镜像,一切从这里开始构建
MAINTAINER  #镜像是谁写的,姓名+邮箱
RUN         #镜像构建的时候需要运行的命令
ADD         #步骤:tomcat镜像,这个tomcat的压缩包,添加内容
WORKDIR     #镜像的工作目录
VOLUME      #挂载的目录
EXPOSE      #暴露的端口
CMD         #指定这个容器启动时运行的命令 例:CMD echo,只有最后一个会生效,可被替代
            #例 ls -a    docker run ls -l  就会直接替换-a
ENTRYPOINT  #指定这个容器启动的时候要运行的命令,可以追加命令
            #例 ls -a    docker run ls -l   ls -a -l
ONBUILD     #当构建一个被继承的dockerfile的时候就会运行ONBUILD的指令。触发指令(了解即可)
COPY        #类似ADD,将我们的文件拷贝到镜像中
ENV         #构建的时候设置环境变量

img

实战测试

Dockerhub中90%的镜像都是从这个FROM scratch基础镜像 开始的

img

创建一个自己的centos

#1 编写dockerfile文件
[root@iZbp12ek0pnkij5zwark6lZ dockerfile]# cat mydockerfile
FROM centos                               #基于centos创建
MAINTAINER duanqiao<1173232150@qq.com>    #镜像是谁写的,名字+邮箱
​
ENV MYPATH /usr/loacl                     
WORKDIR $MYPATH
​
RUN yum -y install vim                   #安装vim编辑器
RUN yum -y install net-tools             #安装ifconfig命令 
​
EXPOSE 80                                #暴露80端口
​
CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash
​
dokcer build -f mydockerfile -t juyou/centos .
#ERROR: failed to solve: process “/bin/sh -c yum -y install vim“ did not complete s....
#是因为Docker默认拉取的是centos最新版,此时需要我们指定一下拉取的版本就比如:docker pull docker pull centos:7.9.2009
FROM centos:7  
MAINTAINER duanqiao<1173232150@qq.com>    #镜像是谁写的,名字+邮箱
​
ENV MYPATH /usr/loacl                     
WORKDIR $MYPATH
​
RUN yum -y install vim                   #安装vim编辑器
RUN yum -y install net-tools             #安装ifconfig命令 
​
EXPOSE 80                                #暴露80端口
​
CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash

问题:

解决:

#2. 通过这个文件构建镜像
# 命令 docker build -f mydockerfile(dockerfile 文件路径) -t juyou/centos 镜像名:[tag]
#3. 测试运行

与原生centos对比:进去之后是根目录,没有ifconfig、vim

img

img

我们可以列出本地进行的变更历史

# 命令
docker history IMAGE ID
docker history REPOSITORY:[TAG]     # 需要指定版本号,不然默认最新找不到
# 研究一下 mycentos 怎么做的?

img

CMD和ENTRYPOINT的区别

CMD         #指定这个容器启动时运行的命令 例:CMD echo,只有最后一个会生效,可被替代
            #例 ls -a    docker run ls -l  就会直接替换-a
ENTRYPOINT  #指定这个容器启动的时候要运行的命令,可以追加命令
            #例 ls -a    docker run ls -l   ls -a -l
# 测试CMD
vim docker-cmd-test
FROM centos
CMD ["ls","-a"]
# 构建镜像
docker build -f docker-cmd-test -t cmd/centos .
#run 运行,发现我们的命令ls -a生效
[root@iZbp12ek0pnkij5zwark6lZ dockerfile]# docker run 7d202bdf002b
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
​
#想追加一个命令 -l,理想的影视 ls -al
[root@iZbp12ek0pnkij5zwark6lZ dockerfile]# docker run 7d202bdf002b -l
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "-l": executable file not found in $PATH: unknown.
#用CMD的情况下 -l 替换了CMD ["ls","-a"]这条命令,而-l不是命令所以报错
#测试ENTRYPOINT
vim dockerfile-ENT-test
FROM centos
ENTRYPOINT ["ls","-a"]
​
#构建镜像  出现了一个小错误,原因镜像名称必须小写
[root@iZbp12ek0pnkij5zwark6lZ dockerfile]# docker build -f dockerfile-ENT-test -t ENT/centos .
[+] Building 0.0s (0/0)                                                   docker:default
ERROR: failed to solve: invalid reference format: repository name must be lowercase
[root@iZbp12ek0pnkij5zwark6lZ dockerfile]# docker build -f dockerfile-ENT-test -t ent/centos .
[+] Building 0.0s (5/5) FINISHED                                          docker:default
 => [internal] load build definition from dockerfile-ENT-test                       0.0s
 => => transferring dockerfile: 82B                                                 0.0s
 => [internal] load .dockerignore                                                   0.0s
 => => transferring context: 2B                                                     0.0s
 => [internal] load metadata for docker.io/library/centos:latest                    0.0s
 => CACHED [1/1] FROM docker.io/library/centos                                      0.0s
 => exporting to image                                                              0.0s
 => => exporting layers                                                             0.0s
 => => writing image sha256:b325f5b972337e763ad3b2c0f1a720eb2d5b11a39b3d88008cc5a0  0.0s
 => => naming to docker.io/ent/centos   
 #run运行,追加命令之后发现了不一样,
 [root@iZbp12ek0pnkij5zwark6lZ dockerfile]# docker run ent/centos
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
[root@iZbp12ek0pnkij5zwark6lZ dockerfile]# docker run ent/centos -l
total 0
drwxr-xr-x   1 root root   6 Jul 11 07:13 .
drwxr-xr-x   1 root root   6 Jul 11 07:13 ..
-rwxr-xr-x   1 root root   0 Jul 11 07:13 .dockerenv
lrwxrwxrwx   1 root root   7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x   5 root root 340 Jul 11 07:13 dev
drwxr-xr-x   1 root root  66 Jul 11 07:13 etc
drwxr-xr-x   2 root root   6 Nov  3  2020 home
lrwxrwxrwx   1 root root   7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx   1 root root   9 Nov  3  2020 lib64 -> usr/lib64

实战Tomcat镜像

#上传apache-tomcat-9.0.65.tar.gz  jdk-8u371-linux-x64.tar.gz

  1. 准备镜像文件tomcat压缩包,jdk的压缩包

  2. 编写dockerfile文件,官方命名Dockerfile,build会自动寻找这个文件,就不需要-f指定了

#编写dockerfile文件
[root@iZbp12ek0pnkij5zwark6lZ tomcat]# cat Dockerfile
FROM centos
MAINTAINER duanqiao<1173232150@qq.com>
​
COPY readme.txt /usr/local/readme.txt
​
ADD jdk-8u371-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.65.tar.gz /usr/local/
​
RUN yum -y install vim
​
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.65
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.65
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
​
CMD /usr/local/apache-tomcat-9.0.65/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.65/bin/logs/catalina.out
​
  1. 构建镜像

    docker build -t diytomcat .  #由于Dockerfile是官方命名,所以不需要-f

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值