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

    xiaoxiao2022-07-04  129

    只是把数据库用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-stoppedvolumes挂载主机路径或命名卷,指定为服务的子选项。可以挂载主机路径作为单个服务定义的一部分,而不需要在顶级卷键中定义它。

    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:
    最新回复(0)