服务器需要 Docker 环境
Docker 容器
Docker-Compose 是一个容器编排工具,通过编辑 yaml 文件将所有的容器的部署方法、文件映射、容器端口映射等情况进行提前设置,然后执行 docker-compose up 命令进行快速部署。
Docker Compose - 图1

安装

选择合适的版本 - https://github.com/docker/compose

  1. #下载最新版的 docker-compose 文件
  2. curl -L https://github.com/docker/compose/releases/download/v2.6.0/docker-compose-linux-x86_64-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
  3. #添加可执行权限
  4. chmod +x /usr/local/bin/docker-compose
  5. #添加软链接
  6. ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
  7. #测试安装结果
  8. docker-compose --version

常用命令

  1. #停止运行并移除容器
  2. docker-compose down
  3. #启动单个服务
  4. docker-compose up -d 服务名
  5. #查看当前运行的服务
  6. docker-compose ps
  7. #构建镜像,--no-cache 表示不用缓存
  8. docker-compose build --no-cache
  9. #查看镜像
  10. docker-compose images
  11. #查看日志
  12. docker-compose logs
  13. #启动/停止服务
  14. docker-compose start/stop 服务名
  15. #拉取镜像
  16. docker-compose pull 镜像名

编排

Docker-Compose 最重要的时 yaml 文件的结构和语法,更多内容见《官方文档

  1. version: "3.9" #语法格式版本
  2. services: #定义服务
  3. web: #服务名称
  4. build: . #指定 Dockerfile 路径
  5. ports: #端口
  6. - "8080:5000" #主机端口:容器端口
  7. volumes:
  8. - .:/code
  9. - logvolume01:/var/log
  10. links:
  11. - redis
  12. redis:
  13. image: redis
  14. volumes:
  15. logvolume01: {}

实例

部署 Node.js、PHP、MySQL、Redis、RabbitMQ 前后端分离项目

  1. version: '3' #语法格式版本
  2. services: #定义服务
  3. backend: #服务名称
  4. build: #Dockerfile 路径,可以是相对/绝对路径
  5. context: backend #Dockerfile 名称
  6. dockerfile: Dockerfile
  7. volumes: #相当于 docker run -v
  8. - "./backend:/opt/www" #主机路径:容器路径
  9. command: [ #相当于 Dockfile 中的 CMD 且优先级更高
  10. "php",
  11. "/opt/www/server.php"
  12. ]
  13. container_name: backend-compose #容器名称
  14. depends_on: #该服务依赖的其他服务,可修改启动顺序
  15. - mysql
  16. - redis
  17. - rabbitmq
  18. ports: #映射端口
  19. - "9502:9502" #主机端口:容器端口
  20. frontend:
  21. build:
  22. context: frontend
  23. dockerfile: Dockerfile
  24. ports:
  25. - "3000:3000"
  26. container_name: frontend-compose
  27. mysql:
  28. build:
  29. context: mysql
  30. dockerfile: Dockerfile
  31. ports:
  32. - "3306:3306"
  33. environment: #相当于 docker run -e
  34. MYSQL_ROOT_PASSWORD: root@123 #初始化的数据库密码
  35. MYSQL_DATABASE: junyu #初始化的数据库名称
  36. container_name: mysql-compose
  37. restart: always #自动重启
  38. volumes:
  39. - "./mysql/db/:/var/lib/mysql"
  40. command: [ #相当于 Dockfile 中的 CMD 且优先级更高
  41. "mysqld",
  42. "--lower_case_table_names=1", #设置表名不区分大小写
  43. "--default-authentication-plugin=mysql_native_password", #设置密码认证插件,低于 8.0.4 版本忽略
  44. "--character-set-server=utf8mb4",
  45. "--collation-server=utf8mb4_general_ci",
  46. "--max_connections=3000" #设置最大连接数
  47. ]
  48. redis:
  49. image: redis
  50. ports:
  51. - "6379:6379"
  52. container_name: redis-compose
  53. restart: always
  54. command: [
  55. "redis-server",
  56. "--requirepass 123456", #设置密码为:123456
  57. "--appendonly yes" #开启持久化
  58. ]
  59. rabbitmq:
  60. image: rabbitmq:management
  61. ports:
  62. - "5672:5672"
  63. - "15672:15672"
  64. container_name: rabbitmq-compose
  65. environment:
  66. RABBITMQ_DEFAULT_USER: admin #rabbitmq 的初始用户名
  67. RABBITMQ_DEFAULT_PASS: 123456 #rabbitmq 的初始密码
  68. networks:
  69. default:
  70. external:
  71. name: appnet
  72. #指定使用的网络,要提前创建好
  73. #docker network create --driver bridge --subnet 172.16.0.0/16 appnet
  74. #--driver/-d 指定连接方式,--subnet 指定网段 ,appnet 为网络名称
  75. #使用新的指定网络是为了防止网段占用完,route -n 查看网段占用情况

故障

Docker-Compose 配置容器启动顺序,有时依靠 depends_on 并不能完全解决,因为depends_on只能保证容器进入了running状态而不保证是否进入ready状态
解决方案:启动命令前增加判断依赖服务状态的工具