后端基础班Day16-Docker-Compose | 青训营笔记

114 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 16 天

本篇笔记主要记录一下Docker-Compose的学习知识

1.Docker-compose是什么?

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

docker-compose将所管理的容器分为三层, 分别是工程(project)服务(service) 以及容器(containner)

docker-compose的工程配置文件默认为docker-compose.yml

使用Docker-compose的理由

使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独应用容器,但是在实际需求中,我们除了需要启动项目容器,也需要启动相关的环境容器,例如Redis、MySQL等等其他需要的容器,此时如果用Dockerfile模板文件我们需要执行多次 docker build指令,相对繁琐。而使用docker-compose我们可以按照指定顺序依次构建容器,更加的方便快捷

2.Docker-compose常用配置字段

build:指定Dockerfile文件名
dockerfile:构建镜像上下文路径
images:指定镜像
command:执行命令,会覆盖容器启动后默认执行的命令-CMD命令
container_name:指定容器名字
environment:添加环境变量
networks:加入网络
ports:暴露容器端口
volumes:挂载一个宿主机目录或者命令卷到容器
links:连接另一个容器
privileged:给容器root权限
depends_on:解决容器依赖,决定启动先后
restart:重启策略,定义是否重启容器

3.demo

version: '3'

# 编写相关服务容器指令

services: 
  # mysql容器
  mysql:
    image: 'mysql:latest' # 最好指定版本,避免兼容问题
    container_name: tiktok-mysql
    ports:
      - 3306:3306
    volumes:
      - $PWD/docker-compose/data/mysql/data:/var/lib/mysql # 挂载
    environment:
      - MYSQL_ALLOW_EMPTY_PASSWORD=yes # 允许mysql密码为空
    networks:
      - center_net # 指定网络,方便通信
  
  # etcd容器
  etcd-server:
    image: 'bitnami/etcd:latest' # 最好指定版本,避免兼容问题
    environment:
      - ALLOW_NONE_AUTHENTICATION=yes
    ports:
      - 2379:2379
    networks:
      - center_net # 指定网络,方便通信
      
  # redis容器
  redis:
    image: 'bitnami/redis:latest' # 最好指定版本,避免兼容问题
    container_name: tiktok-redis
    command: ["redis-server","/etc/redis/redis.conf"] # 根据配置文件启动redis
    ports:
      - "6379:6379"
    volumes:
      - $PWD/docker-compose/data/redis/data:/data # 挂载
      - $PWD/redis.conf:/etc/redis/redis.conf # 挂载配置文件
    restart: always
    networks:
      - center_net # 指定网络,方便通信

  # DIY服务
  demo:
    build: ./
    image: demo:1.0 # 自己的服务构建的镜像
    container_name: demo
    restart: always
    ports:
      - 8080:8080
    # 将会先启动依赖容器之后再启动该容器
    depends_on:
      - mysql
      - redis
      - etcd-server
    networks:
      - conter_net # 指定网络,方便通信

# docker网络
networks:
  center_net:
    external: true

因为容器之间是进程隔离的,因此如果需要通信的话,最好配置一个网络组供它们使用,之前在使用的时候没有配置网络会出现有时候连通不了的情况

人生苦短,不如go浪一下。