zoukankan      html  css  js  c++  java
  • Docker笔记三:Docker数据卷和DockerFile

    参考资料

    笔记二之后的Docker内容都参考哔哩哔哩的up主:狂神说Java的Docker视频,在此贴出他的主页,推荐去看看,讲的是真的好

    狂神说Java

    容器数据卷

    什么是容器数据卷?先来看看目前Docker容器之间不方便的地方

    不方便的数据共享和持久化

    1. Docker的容器和容器之间数据咋共享啊,我的前台和后台网站的图片和数据库都是共享的啊
    2. 容器中数据库的数据怎么同步到linux主机上

    以上两个问题,很不方便,所以容器数据卷可以解决这些数据的问题

    例如我的mysql也是使用docker容器运行的,那我的网站产生的数据都在mysql容器里面

    万一某一天谁不小心把mysql这个容器删除了,那我的数据岂不是全没了????

    真删容器跑路

    所以数据这一块,基本都是数据库这里,我们需要使用容器数据卷,也就是把容器中的mysql之类的数据库,把数据地址挂载到linux主机上,实现数据的持久化,这样就安全多了

    容器数据卷命令

    使用-v来挂载,-p都知道吧暴露的主机端口:软件的默认端口,-v也是一样

    #运行容器的时候直接使用数据卷挂载
    docker run -v 主机目录:容器目录 .......
    
    

    使用容器数据卷使Mysql数据挂载到主机

    #mysql的配置文件
    /etc/mysql/conf.d
    #mysql的数据
    /var/lib/mysql
    

    使用的命令还是run的时候起效的

    docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql
    

    已经启动的Mysql可以使用 待补充

    具名挂载和匿名挂载

    先回顾一下挂载, -v 主机目录:容器目录

    具名挂载

    具名挂载就是-v 主机目录:容器目录,这个是我们最常用的方式

    匿名挂载

    匿名挂载就是

    1. -v 容器目录
    2. -v 卷名:容器目录

    第一种是没有直接指定我的主机目录,相当于让Docker自动给我分配了主机目录

    第二种也是没有指定主机目录,但是我起了个名字,还是让Docker自动给我分配了主机目录

    注意,起名字的时候不要带斜杠 vae是名字 /vae就是目录了

    这就是匿名挂载

    可以使用

    docker volume ls #查看所有的挂载
    docker volume inspect #查看挂载的具体信息
    

    通过查看可以发现,在使用匿名挂载的情况下,Docker自动分配的主机目录都是在

    /var/lib/docker/volumes/.....

    下面的

    数据卷的权限

    docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d:ro
    docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d:rw
    

    在容器目录后面加冒号加ro或者rw就是权限了

    1. ro : readonly只读
    2. rw : read write可读可写

    数据卷实战一:tomcat webapps和log映射

    拉取一个tomcat镜像,然后来使用数据卷映射一下webapps文件夹和logs文件夹,映射到我们的主机上的home目录下

    这样我们以后发布的时候直接发布到linux主机上即可,容器内也会有这些文件

    docker run -d -p 8080:8080 --name tomcat -v /home/tomcat/webapps/test:/usr/local/tomcat/webapps/test  -v /home/tomcat/logs/:/usr/local/tomcat/logs tomcat
    
    1. 主机上的/home/tomcat/webapps/test 映射容器的 /usr/local/tomcat/webapps/test
    2. 主机上的/home/tomcat/logs/ 映射容器的 /usr/local/tomcat/logs

    我们新建一个web.xml和index.jsp在主机上的/home/tomcat/webapps/test

    web.xml

     <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns="http://java.sun.com/xml/ns/javaee"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                                   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
               version="2.5">
      </web-app>
    

    index.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>shuyunquan</title>
    </head>
    <body>
    Hello World!<br/>
    蜀云泉
        
    <%
    System.out.println("Hello,我是蜀云泉 !");
    %>
    </body>
    </html>
    

    然后直接运行 http://192.168.28.128:8080/test/ 换成你们自己的ip + 8080/test

    可以看到访问成功

    我们也可以进入到tomcat容器里面

    docker exec -it tomcat bash
    

    然后进入到webapps/test下面,创建一个文件啥的,你可以看到主机上的test文件夹也是有的,这两个地方通过我们的数据卷同步了

    DockerFile文件

    编写DockerFile

    先熟记指令,必须是大写,不能写成小写

    FROM            #指定基础镜像
    MAINTAINER      #镜像的作者,一般是 姓名+邮箱
    RUN             #运行镜像
    ADD		#添加依赖内容,例如我这个镜像需要tomcat,就ADD一个tomcat
    COPY		#类似ADD,讲文件内容拷贝到镜像中
    WORKDIR 	#设置当前的工作目录
    VOLUME		#挂载目录,和上面的工作目录不一样
    EXPOSE		#暴露端口,不然run的时候你得-p指定暴露,这里写了就不需要-p
    CMD		#指定容器运行时需要运行的命令,会被替换
    ENTRYPOINT	#指定容器运行时需要运行的命令,会被追加
    ONBUILD         #继承DockerFile的时候触发指令
    ENV		#构建的时候设置环境变量
    

    Docker build 构建镜像

    docker build -t mycentos .
    

    Docker run 运行镜像

    docker run -d -p 80:80 --name xxx 镜像Id
    

    Docker push 发布镜像

    发布到DockerHub

    首先得注册一个账号,然后

    #登录,回车输密码
    docker login -u vae
    #发布镜像到Dockerhub,带上自己的名字和镜像加版本号
    docker push vae/mytomcat:1.0
    

    但是有一个问题,DockerHub毕竟在国外,速度可能有时候还是很慢,可以选择发布阿里云

    发布到阿里云

    注册一个阿里云账号,然后搜索容器镜像服务,点进来之后新建命名空间,注意,命名空间最多只能建立3个

    然后建立镜像仓库,比如我建立的是redis镜像仓库

    然后下一步,选择本地仓库即可

    操作阿里云讲的很清楚,你点击创建的镜像仓库会有一些基础的文档,很详细了

    $ sudo docker login --username= 
    $ sudo docker tag [ImageId] //:[镜像版本号]
    $ sudo docker push //:[镜像版本号]
    

    DockerFile生成新的Centos镜像,包含vim,网络基础组件

    Docker下载的默认的CentOS是精简版的,没有vim,没有ll,没有ifconfig

    可以写一个DockerFile生成一个新的CentOs镜像,把这些都加进去,如下

    FROM centos
    MAINTAINER  Vae<shuyunquan@qq.com>
    
    ENV MYPATH /user/local  #设置环境变量为/user/local
    WORKDIR $MYPATH         #设置工作目录为/user/local
    
    #安装vim和网络的基础组件,比如ifconfig
    RUN yum -y install vim
    RUN yum -y install net-tools
    
    EXPOSE 80
    
    CMD echo $MYPATH
    CMD echo "---end---"
    CMD /bin/bash
    

    执行此DockerFile

    docker build -t mycentos .
    

    查看镜像生成的步骤

    docker history 镜像Id
    
  • 相关阅读:
    解决RuntimeError: cuda runtime error (30) : unknown error at /pytorch/aten/src/THC/THCGeneral.cpp:70&NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the late
    查看Ubuntu/Anaconda/cuda/cudnn/Tensorflow/Pytorch版本
    创建新用户
    142. Linked List Cycle II
    网页版Instagram如何发照片
    141. Linked List Cycle
    将博客搬至CSDN
    92. Reverse Linked List II
    Dlib使用过程全记录(一)
    定制new和delete
  • 原文地址:https://www.cnblogs.com/yunquan/p/12953766.html
Copyright © 2011-2022 走看看