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即可 -
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。
。。