时间:2021-05-19
在做区块链日志模块时,如果容器运行,需要把日志文件映射到宿主机上以方便查看。下面介绍一下我的实现方式。
通过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容器不保持任何数据
重要数据请使用外部卷存储(数据持久化)
容器可以挂载真实机目录或共享存储为卷
思路:
将一台主机做为nfs主机, 创建相应的文件夹,并将其共享给docker的两台主机,两台docker主机将分享的文件夹映射到容器中,使得对应的容器可以共享到nfs主机的内容。可以将http等服务器的相应的页面文件夹使用这种形式,从而实现多个容器跑一个业务。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
docker-compose.yml文件中允许使用'./'相对路径version:'3'...volumes:-./init-mongo.js:/docker-
只显示Docker容器挂载目录信息dockerinspect--format"{{.Config.Volumes}}"369a1376f78c显示Docker容
阅读本文前,希望你已经对volumes有了初步的了解,具体可以参考这篇文章:docker数据存储之volumes详解默认容器的数据的读写发生在容器的存储层,当容
阅读本文前,希望你已经对volumes,bindmounts和tmpfsmounts有了初步的了解,具体可以参考以下文章:docker数据存储之volumesd
最近在学习docker,今天了解了Docker端口映射,给自己留个小笔记,也分享给大家为什么要端口映射?在启动容器时,如果不配置宿主机器与虚拟机的端口映射,外部