docker volumes 文件映射方式

2025-05-27 0 73

背景

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

实现

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

配置文件示例:

?

1

2

3

4
volumes:

- /var/run/:/host/var/run/

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

- ./fabric_logs:/tmp/fabric_logs/

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

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

代码中创建容器时添加:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52
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容器不保持任何数据

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

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

主机卷的映射

?

1

2

3

4

5

6

7

8

9

10
[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】

?

1

2

3

4

5

6

7

8

9

10
[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主机配置

?

1

2

3

4

5

6

7

8

9

10

11
[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主机配置

?

1

2

3

4

5

6

7

8

9

10

11
[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

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

原文链接:https://blog.csdn.net/yunlilang/article/details/78411872

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 行业资讯 docker volumes 文件映射方式 https://www.kuaiidc.com/65336.html

相关文章

发表评论
暂无评论