docker-compose笔记

卖萌小老头
2022-09-18 / 0 评论 / 346 阅读 / 正在检测是否收录...

docker 和 docker-compose 对比

1、Docker进行项目部署存在的问题
Docker进行项目部署存在的问题

2、假设未编排的容器启动顺序
假设未编排的容器启动顺序

  • 缺陷:容器间,不能使用容器名称访问

什么是Docker Compose

compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排

快速编排:站在项目角度讲一组相关联容器整合在一起,对这组容器按照指定顺序启动。compose定位于多个docker容器管理

理解

docker-compose.yml 就是一个compose应用(project)

应用(project)就是docker-compose.yml

Project:有一组关联的应用容器(服务)组成一个完整的业务单元,在docker-compose.yml文件中定义

Service:一个项目中某一个容器,称之为服务

安装

  • 注意:只有Linux平台上安装Docker时,没有安装docker-compose,Windows、MacOS安装Docker时自动安装docker-compose

1、在线安装

# 下载文件,{1.16.1}为变量,根据自己的需求下载
sudo curl -L https://github.com/docker/compose/releases/download/{1.16.1}/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

# 修改权限
chmod +x /usr/local/bin/docker-compose

2、离线安装

# a、下载docker-compose脚本
# b、放入/usr/local/bin目录
# c、修改权限

命令

  • 指定这个命令在docker-compose.yml配置文件目录
docker-compose up # 启动
docker-compose down # 停止

docker-compose 命令 项目|项目中某个服务 注意:没有特殊说明,默认都是对项目操作

语法:docker-compose -f docker-compose.yml 命令 [选项] [服务ID]

  1. up -d [服务ID]
    docker-compose up 启动整个项目

docker-compose up [服务ID] 对当前docker-compose中对应的服务ID的容器操作

  1. down
    docker-compose down 停止整个项目

docker-compose down [服务ID]
注意:docker-compose down 关闭所有容器,并溢出网络

  1. exec
    docker-compose exec [服务ID] bash # 进入指定容器
  2. ps
    docker-compose ps # 列出所有运行的服务,-q 只显示ID
  3. restart
    docker-compose restart 重启整个项目

docker-compose restart -t 20 [服务ID] 20s后重启指定服务容器

  1. rm
    docker-compose rm -f(强制删除) [服务ID] -v(删除容器锁挂载的数据卷)不指定服务ID时,删除所有停止的服务

    • 注意:-v谨慎使用
  2. top
    docker-compose top [服务ID] 查看整个项目中所有服务容器内运行进程或指定服务ID的容器的进程
  3. pause暂停 和 unpause回复
    docker-compose (pause|unpause) [服务ID] 暂停或回复所有服务或指定服务ID的服务
  4. logs
    docker-compose logs -f(实时)[服务ID] 查看日志

示例

docker-compose.yaml(引用已有镜像的)

# 代表使用docker-compose项目的版本号
# https://docs.docker.com/compose/compose-file/compose-file-v3/
version: "3"

services:
  app:
    #container_name:web-app1 # 代表给容器指定一个名称 类似于docker run --name 参数
    image: app:1.0
    ports:
      - 8080:8080

  redis:
    image: redis:5.0.21
    ports:
      - 6379:6379

  mysql:
    image: mysql:5.7.21
    ports:
      - 3306:3306
    environment: # 代表给当前容器指定环境,类似于docker run -e MYSQL_ROOT_PASSWORD=root
      - "MYSQL_ROOT_PASSWORD=root"
    volumes:
      #- /home/mysql/data:/var/lib/mysql # 绝对路径
      - mysqlData:/var/lib/mysql # 相对路径,但是需要先申明

volumes:
  mysqlData:

docker-compose.yaml(根据Dockerfile构建)

# 代表使用docker-compose项目的版本号
# https://docs.docker.com/compose/compose-file/compose-file-v3/
version: "3"

services:
  apps:
    # build: ./ # 指定Dockerfile上下文目录,一切都是默认值
    build:
      context: ./ # 指定Dockerfile上下文目录
      dockerfile: Dockerfile # 指定Dockerfile文件名称
    ports:
      - 8085:8085
    # command:["app-2.0.jar"] # 用来覆盖容器启动后默认指令,类似于docker run image 覆盖的指令
    depends_on:
      - mysql
      - redis
    networks:
      - appNetwork

  redis:
    image: redis:5.0.21
    ports:
      - 6379:6379
    networks:
      - appNetwork

  mysql:
    image: mysql:5.7.21
    ports:
      - 3306:3306
      #environment: # 代表给当前容器指定环境,类似于docker run -e MYSQL_ROOT_PASSWORD=root
      #MYSQL_ROOT_PASSWORD: root
    env_file:
      - ./common.env
      - ./config.env
    volumes:
      #- /home/mysql/data:/var/lib/mysql # 绝对路径
      - mysqlData:/var/lib/mysql # 相对路径,但是需要先申明
    networks:
      - appNetwork

# 申明存储卷
volumes:
  mysqlData:

# 声明网桥
networks:
  appNetwork:

common.env 文件

MYSQL_ROOT_PASSWORD: root

自定义build,而不是应用已有镜像

docker-compose.yml中支持模板命令

  1. build 通过docker-compose在启动容器之前根据Dockerfile构建镜像,然后根据构建镜像启动容器
  2. command 覆盖容器启动后默认执行的命令
  3. container_name 指定docker-compose启动容器名称,(注意:不推荐指定容器名称)
  4. depends_on 解决容器的依赖,启动先后的问题

    • 注意:当前服务不会等待被依赖的服务【完全启动】之后才启动
  5. environment 用来给容器启动指定环境变量,相当于docker run -e
  6. env_file 用来给容器指定环境变量文件
  7. expose 用来指定构建镜像过程中容器暴露的端口号
  8. image 用来指定启动容器使用的镜像是谁,相当于docker run image(镜像)
  9. network 用来指定启动的容器使用的网桥,相当于docker run --network
  10. ports 用来指定宿主机和容器之间的端口映射,相当于docker run -p
  11. volumes 用来指定宿主机目录和容器中目录映射,相当于docker run -v
  12. restart 用来指定docker容器(服务)总是运行,相当于docker run --restart=always
0

评论 (0)

取消