服务器需要 Docker 环境
Docker 容器
Docker-Compose 是一个容器编排工具,通过编辑 yaml 文件将所有的容器的部署方法、文件映射、容器端口映射等情况进行提前设置,然后执行 docker-compose up 命令进行快速部署。
安装
选择合适的版本 - https://github.com/docker/compose
#下载最新版的 docker-compose 文件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#添加可执行权限chmod +x /usr/local/bin/docker-compose#添加软链接ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose#测试安装结果docker-compose --version
常用命令
#停止运行并移除容器docker-compose down#启动单个服务docker-compose up -d 服务名#查看当前运行的服务docker-compose ps#构建镜像,--no-cache 表示不用缓存docker-compose build --no-cache#查看镜像docker-compose images#查看日志docker-compose logs#启动/停止服务docker-compose start/stop 服务名#拉取镜像docker-compose pull 镜像名
编排
Docker-Compose 最重要的时 yaml 文件的结构和语法,更多内容见《官方文档》
version: "3.9" #语法格式版本services: #定义服务web: #服务名称build: . #指定 Dockerfile 路径ports: #端口- "8080:5000" #主机端口:容器端口volumes:- .:/code- logvolume01:/var/loglinks:- redisredis:image: redisvolumes:logvolume01: {}
实例
部署 Node.js、PHP、MySQL、Redis、RabbitMQ 前后端分离项目
version: '3' #语法格式版本services: #定义服务backend: #服务名称build: #Dockerfile 路径,可以是相对/绝对路径context: backend #Dockerfile 名称dockerfile: Dockerfilevolumes: #相当于 docker run -v- "./backend:/opt/www" #主机路径:容器路径command: [ #相当于 Dockfile 中的 CMD 且优先级更高"php","/opt/www/server.php"]container_name: backend-compose #容器名称depends_on: #该服务依赖的其他服务,可修改启动顺序- mysql- redis- rabbitmqports: #映射端口- "9502:9502" #主机端口:容器端口frontend:build:context: frontenddockerfile: Dockerfileports:- "3000:3000"container_name: frontend-composemysql:build:context: mysqldockerfile: Dockerfileports:- "3306:3306"environment: #相当于 docker run -eMYSQL_ROOT_PASSWORD: root@123 #初始化的数据库密码MYSQL_DATABASE: junyu #初始化的数据库名称container_name: mysql-composerestart: always #自动重启volumes:- "./mysql/db/:/var/lib/mysql"command: [ #相当于 Dockfile 中的 CMD 且优先级更高"mysqld","--lower_case_table_names=1", #设置表名不区分大小写"--default-authentication-plugin=mysql_native_password", #设置密码认证插件,低于 8.0.4 版本忽略"--character-set-server=utf8mb4","--collation-server=utf8mb4_general_ci","--max_connections=3000" #设置最大连接数]redis:image: redisports:- "6379:6379"container_name: redis-composerestart: alwayscommand: ["redis-server","--requirepass 123456", #设置密码为:123456"--appendonly yes" #开启持久化]rabbitmq:image: rabbitmq:managementports:- "5672:5672"- "15672:15672"container_name: rabbitmq-composeenvironment:RABBITMQ_DEFAULT_USER: admin #rabbitmq 的初始用户名RABBITMQ_DEFAULT_PASS: 123456 #rabbitmq 的初始密码networks:default:external:name: appnet#指定使用的网络,要提前创建好#docker network create --driver bridge --subnet 172.16.0.0/16 appnet#--driver/-d 指定连接方式,--subnet 指定网段 ,appnet 为网络名称#使用新的指定网络是为了防止网段占用完,route -n 查看网段占用情况
故障
Docker-Compose 配置容器启动顺序,有时依靠 depends_on 并不能完全解决,因为depends_on只能保证容器进入了running状态而不保证是否进入ready状态
解决方案:启动命令前增加判断依赖服务状态的工具
