docker-compose是基于docker的由python实现的编排工具,托管于github上,使容器的操作能够批量的,可视的执行,是一个管理多个容器的工具,比如可以解决容器之间的依赖关系,当在宿主机启动较多的容器时候,如果都是手动操作会觉得比较麻烦而且容器出错,这个时候推荐使用 dockerd的单机编排工具 docker-compose。
1.下载docker compose
https://github.com/docker/compose/releases
执行命令:curl "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
然后将docker-compose-linux-x86_64移动到docker-compose中
2.修改权限
chmod +x /usr/local/bin/docker-compose
3.查看版本
docker-compose version
4.启动docker-compose
docker-compose
__________________________________________________________
docker-compse 常用命令:
查看配置:docker-compose config
后台启动:docker-compose up -d
构建镜像:docker-compose build
下载镜像:docker-compose pull
运行中的容器:docker-compose ps
进程:docker-compose top
启动:docker-compose start
停止:docker-compose stop
5.编排 docker-compose
配置文件,通过docker-compose.yml文件管理各容器
可参考:docker-compose官方文档
开启三个服务service-a
, service-b
, service-eureka
# 第一个区域:version代表docker-compose的版本号
version: '3'
# 第二个区域:services区域下,定义容器
services:
# 容器0 web
web:
build: ./project # 此处的build跟docker build一样,构建镜;./project 代表当前目录下的project目录,会去当前目录下的project目录里面寻找Dockerfile构建镜像
dockerfile: Dockerfile_xxx # 如果你的Dockerfile文件不是默认的Dockerfile,则需指定。
ports: # 端口映射,冒号前面为宿主机端口,后面为容器端口,类似执行命令:docker run -p
- "9999:5000"
# 容器1 redis
redis:
# 若使用官方的镜像启动容器,直接用image:xxx指定,会先去本地查找,本地没找到会去docker hub查找镜像来构建
image: "redis:alpine"
# 容器2 service-eureka
service-eureka:
image: java
volumes:
- /Users/objcat/jar/service-eureka.jar:/usr/local/service-eureka.jar
ports:
- 8081:8081
command:
- /bin/sh
- -c
- |
echo 192.168.1.126 servicehost >> /etc/hosts
java -jar /usr/local/service-eureka.jar
# 容器3 service-a
service-a:
image: java
volumes:
- /Users/objcat/jar/service-a.jar:/usr/local/service-a.jar
ports:
- 8082:8082
command:
- /bin/sh
- -c
- |
echo 192.168.1.126 servicehost >> /etc/hosts
java -jar /usr/local/service-a.jar
# 容器4 service-b
service-b:
image: java
volumes:
- /Users/objcat/jar/service-b.jar:/usr/local/service-b.jar
ports:
- 8083:8083
command:
- /bin/sh
- -c
- |
echo 192.168.1.126 servicehost >> /etc/hosts
java -jar /usr/local/service-b.jar
docker-compose 相关命令:
docker-compose --help
6.运行docker-compose
docker-compose up -d
-d:后台运行
7.查看运行起来的容器
docker ps -a
对应服务容器运行起来后就可以通过公网访问对应端口访问该服务了。
使用docker-compose部署flask项目:
dockerfile
# flask 项目的dockerfile文件
FROM python:3-alpine
LABEL maintainer="chuntian_tester"
LABEL description="Deploy flask project"
WORKDIR /usr/src/app # 切换目录
COPY ./dev01 ./dev01 # 将宿主机上此dockerfile文件同目录下的dev01项目代码复制至容器内
COPY ./gunicorn_config.py ./configs/
WORKDIR dev01 # 切换目录,进入项目目录
RUN pip install --no-cache-dir -i https://pypi.douban.com/simple -r requirements.txt && \
pip install -i https://pypi.douban.com/simple gunicorn && \
mkdir ./logs/
VOLUME /usr/src/app/logs/ # 映射容器内的logs目录,可以直接在宿主机上访问
VOLUME /usr/src/app/dev01
EXPOSE 5000
CMD ["/usr/local/bin/gunicorn","-c","/usr/src/app/config/gunicorn_config.py","run:app"]
gunicorn_config.py :
dockerfile同级中目录创建gunicorn_config.py文件
# import multiprocessing
bind = "0.0.0.0:5000" # gunicorn 绑定端口后监听端口5000
# workers = multiprocessing.cpu_count() * 2 +1 # 指定进程数
# threads = 2 # 指定线程数
#daemon = True # 后台执行;!!!!gunicorn 容器中不能使用后台执行!!!!
reload = True # 源码修改了就自动重启
# loglevel = "warning" # 指定日志级别
pidfile = "/usr/src/app/logs/gunicorn.pid" # 指定进程号存放的文件
accesslog = "/usr/src/app/logs/gunicorn_access.log" # 指定访问日志
errorlog = "/usr/src/app/logs/gunicorn_error.log" # 指定失败日志
docker-compose.yml
# 一个docker-compose.yml文件至少含有以下前2个区域,
# docker-compose.yml文件中的注释只能放注释行的上面,不能放注释行的右边,以下注释不规范
#
# 第一个区域下指定docekr-compose版本
version: "3"
# 第二个区域下定义容器
services:
db: # 数据库容器
image: mysql:5.7 # 此处会判断上面步骤有没有build,有就会去本地查找dockerfile,没有就回去dockerhub下载或使用指定的镜像
# command类似docker run -d xxx mysql:5.7 ls /etc/,在启动容器后会运行额外的命令
command: --default-authentication-plugin=mysql_native_password
volumes: # 指定volume,可以多个
- dbdata:/var/lib/mysql # 容器中的目录
restart: always # 指定重载策略,当容器挂了,自动重启.其他:no/always/on-failure/unless-stopped
# 指定容器内部的环境变量,类似:docker run -e MYSQL_ROOT_PASSWORD=123456,这么设置后,这个环境变量就会被追加入容器内部的环境变量中
environment:
MYSQL_ROOT_PASSWORD: 123456 # 默认设置root用户密码为123456
MYSQL_DATABASE: dev01 # 默认创建一个数据库,数据库名为dev01
# 启动app时,需要匹配项目源代码中的数据库配置文件,如果是SQLALCHEMY,配置如:
# SQLALCHEMY_DATABASE_URI= “mysql+pymysql://root:123456@db:3306/dev01” 这里可直接用“db"代替数据库容器ip
app: # 项目app容器
depends_on: # 指定容器的启动依赖关系,当db容器启动成功后,再启动此app容器
- db
build: .
image: app2:latest # 指定你制作的项目镜像
# 指定映射的端口
ports:
- "5000:5000"
volumes:
- mycode:/usr/src/app/dev01/
- logs:/usr/src/app/logs/
restart: always
environment:
FLASK_APP: run.py
# 第三个区域声明要创建的volumes
volumes: # 声明要创建的volumes
dbdata:
mycode:
logs:
运行docker-compose.yml
docker-compose -f docker-compose.yml up -d
结果:
会自动创建一个docker_file_default的网络
flask数据迁移:
1.进入容器:docker exec -it 容器名 /bin/sh
2.迁移:db_migrate.txt
export FLASK_APP=run.py
flask db init
flask db migrate
flask db upgrade