1. 首页
  2. 技术知识

docker volumes 文件映射方式

背景

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


实现

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

配置文件示例:

volumes:

   – /var/run/:/host/var/run/

   – ./channel-artifacts:/var/hyperledger/configs

   – ./fabric_logs:/tmp/fabric_logs/把容器中/tmp/fabric_logs目录映X宿主机当前目录下的./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主机将分享的文件夹映X容器中,使得对应的容器可以共享到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以上为个人经验,希望能给大家一个参考,也希望大家多多支持共生网络。如有错误或未考虑完全的地方,望不吝赐教。

原创文章,作者:starterknow,如若转载,请注明出处:https://www.starterknow.com/106349.html

联系我们