Docker Compose多容器部署
多容器的APP
- 要从Dockerfile build image 或者Dockerhub拉取image
- 要创建多个container
- 要管理这些container(启动停止删除)
- 麻烦!!!!!!
这个时候就出现了Docker Compose “批处理”工具
Docker Compose
- Docker Compose是一个工具
- 这个工具可以通过一个yml文件(docker-compose.yml)定义多容器的docker应用
- 通过一条命令就可以根据yml文件的定义去创建或者管理这多个容器
安装Docker-compose
docker-compose.yml
只简单写了部分概念,更多概念请移步至官方文档
-
Services
- 一个service代表一个container,这个container可以从dockerhub的image来创建,或者从本地的Dockerfile build出来的image来创建
- service的启动类似docker run,我们可以给其指定network和volume,所以可以给service指定network和Volume的引用
-
Networks
-
Volumes
安装Docker-Compose及案例
案例一
wordpress+mysql
1.安装docker-compose 参考官网
2.准备一个yml文件如下:
docker-compose.yml
version: '3'
services:
wordpress:
image: wordpress
ports:
- 8080:80
depends_on:
- mysql
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_PASSWORD: root
networks:
- my-bridge
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress
volumes:
- mysql-data:/var/lib/mysql
networks:
- my-bridge
volumes:
mysql-data:
networks:
my-bridge:
driver: bridge
3.cd / & mkdir docker-compose & cd docker-compose & 将准备的文件移到当前目录或者vim docker-compose.yml 复制进去就行
4.启动docker-compose:docker-compose -f docker-compose.yml(yml的名字) up
一些其它常用命令:
1.查看docker-compose里运行的容器:docker-compose ps
2.查看docker-compose里所定义的images:docker-compose images
3.停止/开始docker-compose:docker-compose stop | docker-compose start
4.停止并删除资源:docker-compose down
5.让docker-compose后台运行:docker-compose up -d
6.进入docker-compose里定义的servie:docker-compose exec [服务名] bash
6.其余命令参看官网或使用docker-compose --help查看
案例二
部署一个统计访问次数(redis+java)的docker-compose
jar包里的redis:host:指定为redis
1.准备一个docker-compose.yml文件
version: '3'
services:
redis:
image: redis
networks:
- mynet
web:
build:
context: .
dockerfile: Dockerfile
ports:
- 8080:8080
networks: //这里将他们加入到
- mynet
networks:
mynet:
driver: bridge
2.编写Dockerfile
FROM java:8
LABEL maintaner="Ray 1437927944@qq.com"
COPY *.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
CMD []
3.将jar包移动到和Dockerfile与docker-compose.yml同级()
4.启动即可:docker-compose up -d
案例二第一个的延续测试二:
docker-compose如何动态配置springboot项目的application.yml的配置
jar包里的redis:host:指定为redis
version: '3'
services:
redis:
image: redis
web:
build:
context: .
dockerfile: Dockerfile
ports:
- 8080:8080
与上一个测试用例对比一下少了network,其它操作都相同但是我们启动之后发现并不能访问,
总结原因如下:
1、这是由于docker网络的问题,如果我们不自己指定每个容器的网络,那么docker0将为每个容器分配一个网络,docker0分配的网络默认容器之间不能通过域名ping通,如果需要让两个容器可以互相ping通,那么需要我么你自己新建一个网络并将容器加入同一个网络下
2.由于当前web程序指定的redis的host是redis,由于无法ping通,因此无法访问
案例二第一个的延续测试三:
jar中没有指定redis的host,或者我们应该如何覆盖我们配置好的redis:host呢
解决方案:可以在docker-compose.yml文件中指定配置就行如下,其余操作都相同
version: '3'
services:
redis:
image: redis
networks:
- mynet
web:
build:
context: .
dockerfile: Dockerfile
ports:
- 8080:8080
networks: //这里将他们加入到
- mynet
environment:
- SPRING_REDIS_HOST=redis(我们依赖的服务名,这里一定要让redis和web服务处于我们自己建的网络中去)
networks:
mynet:
driver: bridge