docker-compose 使用及问题解决

docker-compose 使用及问题解决

方便新手理解docker-compose

dockerfile 与 docker-compose的区别

简单总结
1.dockerfile: 构建镜像;
2.docker run: 启动容器;
3.docker-compose: 启动服务;
dockerfile 和docker相关的基本命令这里不在赘述。
这里来说说docker和docker-compose的区别
对于单个镜像的服务来说来说,比如简搭一个jekins或者redmine,两者几乎一样的效果,但对于有几个镜像的来说,尤其是还带有依赖关系的,docker-compose 会非常方便。

举个例子
下面的服务有4个服务 db, web, midware, mail,其中web和midware 和 web 用一个镜像。其中 web, midware 的启动还需依赖db的启动。
这里稍微解释一下相关语法:
build-- 找到本地相关目录下的dockerfile, 按照其内容构建镜像
image-- 若本地有同名镜像,则用本地,若没有,则去配置的公共仓库或私有仓库下载

version: "3"
services:
  db:
    build: ./docker/mysql
    ports:
      - 3306:3306
    hostname: db
    volumes:
      - ./data/db:/var/lib/mysql
    environment:
      TZ: Asia/Shanghai
      MYSQL_DATABASE: xx
      MYSQL_ROOT_PASSWORD: password
      MAX_CONNECTIONS: 256
      MAX_ALLOWED_PACKET: 512M
      KEY_BUFFER_SIZE: 16M
      THREAD_CACHE_SIZE: 8
      INNODB_BUFFER_POOL_SIZE: 128M
      INNODB_FLUSH_LOG_AT_TRX_COMMIT: 1
  web:
    build: .
    image: xx_img
    hostname: "xx_web"
    volumes:
      - .:/opt/application/current:cached
    ports:
      - "3000:3000"
    environment:
      TZ: Asia/Shanghai
      DB_HOST: "db"
      DB_PORT: "3306"
      DB_USER: "root"
      DB_PASSWORD: "password"
      DB_NAME: "xx"
      RAILS_LOG_TO_STDOUT: "yes"
      SECRET_KEY_BASE: "${SECRET_KEY_BASE:-invalid}"
      MAIL_HOST: "smtp.mxhichina.com"
      MAIL_PORT: "25"
      MAIL_FROM: "admin"
      MAIL_DOMAIN: "10646.cn"
      MAIL_USER: ""
      MAIL_PWD: ""
      DUTIES: "xx_web"
    env_file:
      - ./env/api.env
    links:
      - db
    depends_on:
      - db
  midware:
    image: xx_img
    hostname: "xx_midware"
    volumes:
      - .:/opt/application/current:cached
    ports:
      - "3001:3000"
    environment:
      TZ: Asia/Tokyo
      DB_HOST: "db"
      DB_PORT: "3306"
      DB_USER: "root"
      DB_PASSWORD: "password"
      DB_NAME: "coldchain"
      DB_POOL: 10
      RAILS_LOG_TO_STDOUT: "yes"
      SECRET_KEY_BASE: "${SECRET_KEY_BASE:-invalid}"
      DUTIES: "xx_midware"
    env_file:
      - ./env/amap_api.env
    links:
      - db
    depends_on:
      - db
mail:
   image: schickling/mailcatcher
   ports:
     - "1080:1080"
     - "1025:1025"
   environment:
     TZ: Asia/Shanghai
     hostname: mail

所以,docker-compose是用来编排容器的。比如上面的例子。如果没有docker-compose,那么每次启动的时候,你需要敲各个容器的启动参数,环境变量,容器命名,指定不同容器的链接参数等等一系列的操作,相当繁琐。而用了docker-composer之后,你就可以把这些命令一次性写在docker-composer.yml文件中,以后每次启动这一整个环境(含多个容器)的时候,你只要敲一个docker-composer up命令就ok了。

docker-compose up后相关问题解决

  • recreate err
    docker-compose 使用及问题解决_第1张图片
    解决方案:重启docker即可

  • exit with err_code_1/2
    解决方案:
    (1)docker rm $(docker ps -a -q)
    docker rmi $(docker images -q)
    (2)也可能是数据库等文件数据损坏导致,将项目中挂载的数据卷删除,比如data文件夹,然后将shared driver里的磁盘重置(先设成不共享,再打开共享)

  • exit with err_code_127
    解决方案:将内存设置大一些,比如设为8192。
    。。

你可能感兴趣的:(docker-compose 使用及问题解决)