docker微服务
站在Docker的角度,软件就是容器的组合:业务逻辑容器、数据库容器、储存容器、队列容器等等
软件可以拆分成若干个标准化容器,然后像搭积木一样组合起来
这正是微服务(microservices)的思想:软件把任务外包出去,让各种外部服务完成这些任务,软件本身只是底层服务的调度中心和组装层
docker-compose
Compose是Docker公司推出的一个工具软件,可以管理多个Docker容器组成一个应用
你需要定义一个YAML格式的配置文件docker-compose.yml,写好多个容器之间的调用关系
然后,只要一个命令,就能同时启动/关闭这些容器
配置docker-compose.yml
- version - 表示模板使用的规则版本号
- services - 表示所有服务
- webapp - 表示服务名称
- containername - 指定容器名称,不填默认为:项目名称服务名称_序号
- image - 表示镜像
- expose - 暴露端口,但不映射到宿主机,只被连接的服务访问
- ports - 表示端口映射
- env_file - 从文件中获取环境变量,可以是一个或多个文件
- depends_on - 解决容器的依赖、启动先后的问题,先启动redis再启动webapp
- redis - redis镜像
- mysql - mysql镜像
- environment - 设置环境变量
version: "1.0.0"
services:
webapp:
container_name: nginx-test
image: nginx
ports:
- "80:80"
env_file: .env
depends_on:
- redis
redis:
image: redis:latest
expose:
- "30000"
env_file:
- ./common.env
- ./apps/web.env
mysql:
image: mysql
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=test
使用Dockerfile
构建镜像
- context - Dockerfile路径
- dockerfile - Dockerfile文件名
- args - 制定构建镜像时的变量
version: '1.0.0'
services:
webapp:
build:
context: ./dockerfile_dir
dockerfile: dockerfile_name
args:
buildno: 1
# 查看版本
docker-compose --version
# 启动所有服务
docker-compose up
# 关闭所有服务
docker-compose stop
# 删除容器文件(容器必须已经停止运行)
docker-compose rm
自建lnmp容器
自建一个lnmp容器,能够实现新增、查询即可
假设我们lnmp环境需要网络隔离,如下配置,nginx、mysql、redis都有独立的网络,相互隔离,php可以连接它们
- volumes - 宿主机路径和容器文件路径的映射
version: '1.0.0'
services:
nginx:
image: nginx:alpine
# ...
networks:
- net-php
php:
working_dir: /wwwroot/
volumes:
- /Users/tangxiaofeng/wwwroot/:/wwwroot/
networks:
- net-php
- net-mysql
- net-redis
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
secrets:
- db_root_password
- my_other_secret
networks:
- net-mysql
redis:
image: redis:latest
# ..
networks:
- net-redis
networks:
net-php:
net-mysql:
net-redis:
secrets:
my_secret:
file: ./my_secret.txt
my_other_secret:
external: "true"