30

容器数据卷

容器的持久化和同步操作。容器数据也是可以共享的

方式一:直接使用命令挂载目录 -v

docker run -it -v 主机目录:容器目录

docker run -it -v /home/ceshi:/home centos /bin/bash

通过docker inspect 容器id 查看是否挂载成功

image-20210107211358469

测试文件同步

image-20210107211425572

使用容器卷后,以后修改只需要在本地进行修改,容器内会自动同步。

实战:安装MySQL

下载容器
docker pull mysql:5.7

运行容器(挂载目录)
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=qihukeji360@123 --name mysql01 mysql:5.7

-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名字

容器即使被删除,数据仍在本地,即容器数据持久化功能!

具名挂载和匿名挂载

docker run -d -P --name nginx01 -v /etc/nginx nginx 匿名挂载(不建议使用)

docker run -d -P --name nginx01 -v juming:/etc/nginx nginx 具名挂载

docker volume
docker volume ls 查看卷状态
docker volumre inspect juming 查看具名挂载路径

拓展:

ro		readonly		只读
rw readwrite 可读可写

如下挂载为容器被设置的读写权限
docker run -d -P --name nginx01 -v juming:/etc/nginx:ro nginx
docker run -d -P --name nginx01 -v juming:/etc/nginx:rw nginx

Dockerfile 构建docker镜像的构建文件,命令脚本

通过此脚本可生成镜像,一个命令为一层镜像

FROM centos		#已centos为基础镜像

VOLUME ["volume01","volume02"] #挂载目录

CMD echo "-------end------" #输出

CMD /bin/bash
构建命令
docker build -t centos_time:1.0 .

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

镜像容器卷同步

启动第一个容器
docker run -it --name centos01 centos_time:1.0 /bin/bash

image-20210108192701044

启动第二个容器
docker run -it --name centos02 --volumes-from centos01 centos_time:1.0

image-20210108194944788

启动第三个容器
docker run -it --name centos03 --volumes-from centos01 centos_time:1.0

image-20210108200102595

多个MySQL实现数据共享

第一个:
docker run -d -p 3306:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=12345 --name mysql01 mysql:5.7

第二个:
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=12345 --name mysql02 --volumes-from mysql01 mysql:5.7

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

但是一旦持久化到本地,那么本地的数据是不会被删除的。

Dockerfile构建

构建步骤

1、编写dockerfile文件

2、docker build 构建成一个镜像

3、docker run 运行镜像

4、docker push 发布镜像

Dockerfile命令

image-20210109135646067

构建自己的docker镜像

FROM centos													#以centos为基础镜像
MAINTAINER Time<89273238@qq.com> #作者信息

ENV MYPATH /usr/local #设置环境
WORKDIR $MYPATH #获取镜像工作目录
RUN yum -y install vim net-tools #安装基础工具
RUN echo "-------end-------" #输出
EXPOSE 80 #映射到外部端口
CMD /bin/bash #终端

docker history 镜像id 可查看历史镜像构建的操作

image-20210109150301134

CMD 和 ENTRYPOINT区别

CMD

FROM centos
CMD ['ls','-la']

构建后,当我们执行 docker run 32bb736dabe2 ls -la 时命令正常运行

image-20210109151327484

当我们执行docker run 32bb736dabe2 -ll报错

image-20210109151414459

结论:CMD下会使用-ll 替换掉ls -la命令,而不是追加成ls -l-ll 命令

ENTRYPOINT

FROM centos
ENTRYPOINT ["ls","-a"]

正常运行

image-20210109152529188

正常运行,使用ENTRYPOINT构建的镜像,会将docker run cc21b9ec59dd -ll 追加到命令中,最后执行的命令就是ls -a -ll

image-20210109152616451

构建Tomcat镜像

1、准备Tomcat安装包和JDK安装包

2、构建镜像

FROM centos																	#基础镜像
MAINTAINER Time<xxxx@qq.com> #作者信息

ENV MYPATH /usr/local/apache-tomcat-9.0.41/webapps #环境目录
WORKDIR $MYPATH #镜像工作目录设置

ADD jdk-linux-x64.tar.gz /usr/local #添加jdk包并解压到目录中
ADD apache-tomcat-9.0.41.tar.gz /usr/local #添加Tomcat包并解压到目录中

RUN yum install -y vim net-tools #安装基础工具

ENV JAVA_HOME /usr/local/jdk1.8.0_131 #设置java环境
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.41 #设置Tomcat环境
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.41
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:CATALINA_HOME/bin #添加到系统环境中

EXPOSE 8080 #映射端口
CMD /usr/local/apache-tomcat-9.0.41/bin/startup.sh && tail -F /usr/local/apache-tomcat- 9.0.41/logs/catalina.out #启动tomcat并设置日志

构建镜像命令。注意:tomcat和java需上传到同目录下

docker build -t tomcat_time:1.0 .

image-20210109224359048

构建成功

image-20210109224205125

image-20210109224422646

启动环境

docker run -d -p 9090:8080 --name mytomcat -v /root/1/time:/usr/local/apache-tomcat-9.0.41/webapps/time(挂载网站根目录)  -v /root/1/logs:/usr/local/apache-tomcat-9.0.41/logs(挂载日志目录)  tomcat_time:1.0

启动成功

image-20210109225951682

image-20210109230011025

目录挂载也成功,后续本地目录和容器目录会进行同步

image-20210109230144487

发布镜像到docker hub

docker login -u name   #登录docker hub账户

以下为登录成功

image-20210109230609451

上传镜像之前需将镜像命令改为如下格式
docker账号/镜像名称

给镜像生成一个新的tag名称
docker tag 56b45f5db054 docker账号/tomcat_time:1.0

image-20210109230904255

上传镜像

docker push docker账号/tomcat_time:1.0

image-20210109231212802

实战搭建s2-061漏洞环境

Dockerfile

FROM tomcat:9

MAINTAINER Time

ENV MYPATH /usr/local/tomcat/webapps
WORKDIR $MYPATH

COPY SimpleStruts.war /usr/local/tomcat/webapps/

EXPOSE 8080

CMD ["/usr/local/tomcat/bin/catalina.sh","run"]

构建命令

docker build -t s2-061_time:1.0 .

坑点

在启动tomcat时踩坑,当时写入以下两种命令时,一直无法启动。

CMD chmod a+x /usr/local/tomcat/bin/*.sh && sudo sh /usr/local/tomcat/bin/startup.sh

CMD sudo sh /usr/local/tomcat/bin/startup.sh

最后百度一波,官网给出解答,当docker命令无法自启动tomcat时,写入以下命令即可。正确环境在Dockefile中给出

CMD ["/usr/local/tomcat/bin/catalina.sh","run"]

启动

docker run -d -P --name s2-061 s2-061_time:1.0

image-20210113222005878

Payload:SimpleStruts/S2061.action?id=%25%7b8%2a8%7d

image-20210113222208024