• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    docker volumes 文件映射方式

    背景

    在做区块链日志模块时,如果容器运行,需要把日志文件映射到宿主机上以方便查看。下面介绍一下我的实现方式。

    实现

    通过docker-compose配置文件volumes参数

    配置文件示例:

     volumes:
       - /var/run/:/host/var/run/
       - ./channel-artifacts:/var/hyperledger/configs
       - ./fabric_logs:/tmp/fabric_logs/

    把容器中/tmp/fabric_logs目录映射到宿主机当前目录下的./fabric_logs目录下。这两个目录会共享数据。

    创建容器时,代码中配置相关参数

    代码中创建容器时添加:

    func (vm *DockerVM) createContainer(ctxt context.Context, client dockerClient,
     imageID string, containerID string, args []string,
     env []string, attachStdout bool) error {
     volumes := make(map[string]struct{})
     var mounts []docker.Mount
     var source string
     var destination string
     var fabricCfgPath = os.Getenv("FABRIC_CFG_PATH")
     var configName string
     _, err := os.Stat(fabricCfgPath)
     if err == nil {
      configName = strings.ToLower(Peer_Prefix)
      config := viper.New()
      config.SetConfigName(configName)
      config.AddConfigPath(fabricCfgPath)
      config.ReadInConfig()
      config.SetEnvPrefix("CORE")
      config.AutomaticEnv()
      replacer := strings.NewReplacer(".", "_")
      config.SetEnvKeyReplacer(replacer)
      config.SetConfigType("yaml")
      destination = config.GetString("logging.logpath")
      //fmt.Println(destination)
     }
     if destination == "" {
      destination = "/tmp/fabric_logs/"
     }
     source = "/tmp/chaincode_logs/" + containerID
     volumes[destination] = struct{}{}
     mount := docker.Mount{
      Name:  "bind",
      Source:  source,
      Destination: destination,
      Mode:  "rw",
      RW:   true,
      Driver:  "rprivate",
     }
     mounts = append(mounts, mount)
     config := docker.Config{Cmd: args, Image: imageID, Env: env, Volumes: volumes, Mounts: mounts, AttachStdout: attachStdout, AttachStderr: attachStdout}
     hostConfig := getDockerHostConfig()
     hostConfig.Binds = []string{
      source + ":" + destination + ":rw",
     }
     copts := docker.CreateContainerOptions{Name: containerID, Config: &config, HostConfig: hostConfig}
     dockerLogger.Debugf("Create container: %s", containerID)
     _, err = client.CreateContainer(copts)
     if err != nil {
      return err
     }
     dockerLogger.Debugf("Created container: %s", imageID)
     return nil
    }

    其中volumes,Mounts, Hostconfig.Binds参数需要按照自己的映射关系去填写。

    这样和通过:

    1、docker-compose 配置文件启动

    2、或者docker -v 参数命令行启动

    达到一样效果。

    补充:docker文件夹映射的两种方式---主机卷映射和共享文件夹映射

    docker容器不保持任何数据

    重要数据请使用外部卷存储(数据持久化)

    容器可以挂载真实机目录或共享存储为卷

    主机卷的映射

    [root@docker1 ~]# mkdir /var/data
    [root@docker1 ~]# docker run -it -v /var/data:/abc myos
    [root@f1fb58b85671 /]# cd /abc/
    [root@f1fb58b85671 abc]# touch f1
    [root@f1fb58b85671 abc]# ls
    f1 zhy
    [root@docker1 ~]# cd /var/data/
    [root@docker1 data]# ls
    f1
    [root@docker1 data]# touch zhy
    

    使用共享存储的映射

    思路:

    将一台主机做为nfs主机, 创建相应的文件夹,并将其共享给docker的两台主机,两台docker主机将分享的文件夹映射到容器中,使得对应的容器可以共享到nfs主机的内容。可以将http等服务器的相应的页面文件夹使用这种形式,从而实现多个容器跑一个业务。

    nfs主机配置【192.168.6.77】

    [root@nfs ~]# yum -y install nfs-utils
    [root@nfs ~]# vim /etc/exports
    /public *(rw)
    [root@nfs ~]# systemctl restart nfs-server
    Failed to restart nfs-serve.service: Unit not found
    [root@nfs ~]# mkdir /public
    [root@nfs ~]# cd /public/
    [root@nfs public]# touch nfs.txt
    [root@nfs public]# ls
    nfs.txt

    docker1主机配置

    [root@docker1 ~]# vim /etc/fstab 
    192.168.6.77:/public /mnt/nfs nfs defaults,_netdev 0 0
    [root@docker1 ~]# mkdir /mnt/nfs 
    [root@docker1 ~]# systemctl restart nfs-server
    [root@docker1 ~]# mount -a
    [root@docker1 ~]# df -h
    192.168.6.77:/public  17G 3.2G  14G  19% /mnt/nfs
    [root@docker1 ~]# docker run -it -v /mnt/nfs/:/zhuhaiyan 192.168.6.153:5000/myos
    [root@c7c376e3755a /]# cd /zhuhaiyan 
    [root@c7c376e3755a zhuhaiyan]# ls
    nfs.txt

    docker2主机配置

    [root@docker2 ~]# vim /etc/fstab 
    192.168.6.77:/public /mnt/nfs nfs defaults,_netdev 0 0
    [root@docker2 ~]# mkdir /mnt/nfs 
    [root@docker2 ~]# systemctl restart nfs-server
    [root@docker2 ~]# mount -a
    [root@docker2 ~]# df -h
    192.168.6.77:/public  17G 3.2G  14G  19% /mnt/nfs
    [root@docker2 ~]# docker run -it -v /mnt/nfs/:/zhuhaiyan 192.168.6.153:5000/myos
    [root@cdd805771d07 /]# cd /zhuhaiyan/
    [root@cdd805771d07 zhuhaiyan]# ls
    nfs.txt

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

    上一篇:docker 命令报异常permission denied的解决方案
    下一篇:docker 查看容器的挂载目录操作
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    docker volumes 文件映射方式 docker,volumes,文件,映射,方式,