Docker练习部署go项目mongodb进阶版(docker-compose)

本文介绍了如何使用docker-compose来部署Go项目并配合MongoDB,重点在于通过容器目录映射实现数据持久化。首先,解释了docker-compose的作用和安装步骤,接着展示了配置文件的关键字,特别是`volumes`用于将数据库容器的目录挂载到宿主机。文章还提到了`environment`创建数据库用户和`command`覆盖默认启动指令。由于容器间的网络连接问题,文章详细阐述了如何添加网络服务,使外部容器能链接到MongoDB容器。最后,讨论了如何在docker-compose中添加服务器服务,确保外部访问和与数据库的连接。
摘要由CSDN通过智能技术生成

只是把数据库用docker部署在容器里,那么保存的数据也就在容器里,每次导入导出,或者容器被删除,那么将会很麻烦,docker本身自带路径映射,可以将宿主机器的目录映射到容器里,说干就干,来试着重新部署一下。
这次我们主要用到了docker-compose,什么是docker-compose?

  • docker-compose 简介和安装

docker-compose 是 用于定义和启动多容器Docker应用程序的工具,使用过程大致分为三步:

1.Define your app’s environment with a Dockerfile so it can be reproduced anywhere.
1.用dockerfile配置环境,以便与可以复制到其他任意地方。

2.Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment.
2.在docker-compose.yml中定义组成应用程序的Service,这样这些Service可以在一个隔离环境运行。

3.Run docker-compose up and Compose starts and runs your entire app.
3.用docker-compose up启动。

安装:
linux

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version
  • yml 文件配置

上篇文章我们用docker启动一个mongo容器,用了两种方式,一种是命令行,一种是yml文件配置,当然也可以用dockerfile。这里我们主要使用yml文件。
先了解一下配置文件的关键字:yml文件关键字
建议优先参考文档,文档中写出了关键字的有效版本,我只列一部分常用的。

描述字用法
build可以指定构建上下文的字符串,也就是 docker build -t 的路径。
context指向包含Dockerfile的目录的路径,或者指向git存储库的url。
dockerfile替代Dockerfile,组合使用另一个文件来构建,还必须指定构建路径。
args添加构建参数,这些环境变量只能在构建过程中访问。
cache_from用于缓存解析的image列表。
command覆盖默认命令,也可以是字符串列表。
container_name指定容器的名称。
depends_on指定依赖关系:docker-compose up 按依赖关系启动,优先启动被依赖的服务;docker-compose up SERVICE 启动单项服务时,自动包含依赖关系;docker-compose stop 按依赖关系停止,优先停止不被依赖的服务。
expose在不将端口发布到主机的情况下公开端口——它们只能被链接的服务访问,只能指定内部端口。
external_links链接到从这个docker-compose.yml启动的或外部启动的容器。
image指定要从哪个image启动容器。可以是repository/tag,也可以是image id。
networks要加入网络,请在顶级网络键下引用条目。
pid将PID模式设置为主机PID模式。这将在容器和主机操作系统之间共享PID地址空间。使用此标志启动的容器可以访问和操作裸机名称空间中的其他容器,反之亦然。
ports暴露端口。
restart是否重启,有四种配置:no ;always;on-failure;unless-stopped
volumes挂载主机路径或命名卷,指定为服务的子选项。可以挂载主机路径作为单个服务定义的一部分,而不需要在顶级卷键中定义它。

1.配置db服务
我们的需求是,启动mongo并将容器的db目录挂载到宿主机上,添加 volumes 来映射,规则是:【HOST :CONTAINER】如果只是让容器只读,可以【HOST :CONTAINER :ro】。
environment 会创建初始的db user。
command 是 覆盖指令,这里用这些覆盖 mongod启动,也可以是 ["–dbpath", “/data/db”, “–logpath”, “/data/log/dblog.log”, “–auth”]这样的形式。

services:
  db:
    image: mongo
    container_name: pmongo
    restart: always
    volumes:
      - "./data/db:/data/db"
      - "./data/log:/data/log"
    ports:
      - "27017:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: 654321
    command: --dbpath /data/db --logpath /data/log/dblog.log --auth

用命令行启动容器,-d是后台运行,启动后,可以用dokcer logs 容器名查看log。

$ docker-compose -f xxxx.yml up -d

2.添加网络服务
这样启动db后,尝试用外部容器–link 这 db容器,发现无法连接,是因为这个容器并没有放在网络上,缺少network。
修改如下:

version: '3.1'

services:
  db:
    image: mongo
    container_name: dahenhen-mongo
    restart: always
    volumes:
      - "./data/db:/data/db"
      - "./data/log:/data/log"
    ports:
      - "27017:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: 654321
    command: --dbpath /data/db --logpath /data/log/dblog.log --auth
    
networks:
  frontend:
  backend:

然后启动外部容器 $ docker run --name p3server --link pmongo p3server:0.1.1
发现还是提示错误:docker: Error response from daemon: Cannot link to /pmongo, as it does not belong to the default network.
原因是两个容器不在一个服务网络里,怎么办呢,用docker把外部容器添加到 db所在的网络里,db所在的网络是什么?

$ docker network ls
NETWORK ID          NAME                     DRIVER              SCOPE
7f7865ce0fde        bridge                   bridge              local
1443fa646863        host                     host                local
18a8cd304d61        src_default              bridge              local

src_default 是属于 stack.yml启动的网络,src是yml文件所在的目录上一级。
如何添加呢,用–net [args] 指令

 $ docker run --name p3server --link pmongo --net src_default p3server:0.1.1

这样才能让外部容器通过网络连接到compose里的容器,现在不止要启动db服务,还在compose里启动我们的服务器,并连接db服务,还要能让外部访问到。

3.添加服务器
注意yml文件的结构,services 和 network 平级,db属于services里的,那么我们的服务器应该放在什么级别下呢。
我们先了解下top-level,也就是yml文件顶层的关键字有哪些:version, services, networks, volumes, secrets, 和"x-"开头的,也就说其他任何关键字的层级不能和这些相同。

version: '3.1'

services:
  db:
    image: mongo
    container_name: pmongo
    restart: always
    volumes:
      - "./data/db:/data/db"
      - "./data/log:/data/log"
    ports:
      - "27017:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: 654321
    command: --dbpath /data/db --logpath /data/log/dblog.log --auth

  web:
    image: p3server:0.1.1
    container_name: p3server
    restart: always
    depends_on:
      - db
    ports:
      - "8888:8888"
    
networks:
  frontend:
  backend:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值