背景
在做区块链日志模块时,如果容器运行,需要把日志文件映射到宿主机上以方便查看。下面介绍一下我的实现方式。
实现
配置文件示例:
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
|
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。如有错误或未考虑完全的地方,望不吝赐教。
原文链接:https://blog.csdn.net/yunlilang/article/details/78411872