我们之前在使用docker的时候,如使用spring boot连接MySQL ,我们先使用dockerfile创建Java的镜像,然后 在dockerfile里面写上各种 RUN 命令。当我们需要使用其他内容时,如redis,nginx,那么就又需要写各种 RUN ,我们会感觉到十分麻烦,那么docker-compose就可以轻松的高效管理容器,可以解决我们的问题
文章目录
Docker Compose
概述
docker Compose来轻松的高效管理容器,定义并允许多个容器
使用compose的三步骤:
- 编写dockerfile ,保证我们的项目可以在任何地方运行
- 编写 docker-compose.yml(必须是这个文件名)
- 使用 docker compose up 命令来启动项目
作用: 批量容器编排
Compose是Docker官方的开源项目,需要去安装
我们如果原来的容器里需要各种环境,如web,redis,mysql等等,那么我们需要在Dockerfile里面一个个RUN ,但是compose能简化我们的操作。
先来看docker-compose.yml的官方示例文件:
version: "3.9" # optional since v1.27.0
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
- 服务service: 容器、应用,这里就是使用了web和redis这两个容器
- 项目project : 一组关联的容器,所有容器合起来作为了一个项目
卸载docker compose:
sudo rm /usr/local/bin/docker-compose
安装docker compose:
使用命令安装(如果下载很慢,取消掉之后再试一次):
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
然后就需要授权:sudo chmod +x /usr/local/bin/docker-compose
进入 /usr/local/bin
目录下,使用命令 查看版本确认安装成功:docker-compose version
快速开始:
-
创建一个compose项目:
mkdir composetest
并切换目录cd composetest
-
创建python文件:
aap.py
,这是使用python编写的web应用import time import redis from flask import Flask app = Flask(__name__) cache = redis.Redis(host='redis', port=6379) def get_hit_count(): retries = 5 while True: try: return cache.incr('hits') except redis.exceptions.ConnectionError as exc: if retries == 0: raise exc retries -= 1 time.sleep(0.5) @app.route('/') def hello(): count = get_hit_count() return 'Hello World! I have been seen {} times.\n'.format(count)
这里连接Redis时主机名设置的是 redis而不是localhost或者是ip地址,是因为docker-compose在连接其他容器时可以直接使用服务名
-
创建
requirements.txt
:flask redis
-
创建
Dockerfile
:
shell
#syntax=docker/dockerfile:1
#使用 Python 3.7镜像
FROM python:3.7-alpine
RUN sed -i 's/https/http/' /etc/apk/repositories
RUN apk add curl
#调整工作目录为 /code
WORKDIR /code
#配置环境变量
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
#安装gcc等依赖
RUN apk add --no-cache gcc musl-dev linux-headers
#复制我们的 requirements.txt文件
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
#把宿主机的当前的 . 目录复制到镜像里的 . 目录
COPY . .
#配置默认指令 flask run
CMD ["flask", "run"]
要注意,shell文件里面表示注释必须是 单独一行开头使用 #
-
创建 docker-compose文件
docker-compose.yml
version: "3.9" services: web: build: . ports: - "5000:5000" redis: image: "redis:alpine"
docker compose配置文件里定义了两个 service : web和redis
web service使用 . 目录下的dockerfile来创建镜像 并绑定了主机的5000端口号
redis service使用dockerhub上的redis镜像
-
构建并运行compose:
docker-compose up
如图就是启动成功了,我们可以访问服务器的 5000端口:
docker-compose up用于构建、启动容器,那么我们使用 docker ps
查看:
可以发现,我们在 docker_compose.yml
文件里配置的两个service都被启动了
步骤:
- 编写应用 app.py
- Dockerfile将应用打包为镜像
- Docker-compose.yml文件,定义整个服务,需要的环境(web,redis),完整的上线服务
- 启动compose项目 (docker-compose up)
- 创建网络
- 执行docker-compose.yaml
- 启动服务(我们在docker-compose.yml里定义的服务service)
我们在compose.yml里面所有写的 image ,docker-compose自动帮我们下载并运行容器了
docker-compose 启动项目(编排,一次性运行多个容器,适用于多个微服务、环境)
docker-compose.yml
这个文件只有三层:
-
version : 版本
-
services :服务
services: redis: #服务配置,在docker run时添加的配置均可以写在这 image: redis:alpine ports: - "6379" networks: - frontend db: image: postgres:9.4 volumes: - db-data:/var/lib/postgresql/data vote: image: dockersamples/examplevotingapp_vote:before
-
其他配置: volumes (卷),networks(网络),configs(全局配置)
Services
services中的服务配置具体有哪些可以查看官网:docker-compose
其中 depends_on
是设置启动顺序的,如果web的depends_on
中有redis,那么启动顺序就是先启动redis后启动web
如:
version: "3.9"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
- 我们使用
docker-compose up
来启动服务的时候就会用依赖的顺序,先是db,redis,最后是web - 使用
docker-compose up web
也会创建和启动db和redis - 使用
docker-compose stop
停止服务时,是先 web,后 db,最后 redis
docker-compose+wordpress
我们使用doker-compose可以很容易的部署我们的项目,加上wordpress就可以很容易地部署个人博客了
跟着上面做出部署有手就行,这里就不写了
spring boot使用 docker-compose 部署
我们要写redis+spring boot,依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.4.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
编写Controller:
@RestController
public class HelloController {
@Autowired
StringRedisTemplate stringRedisTemplate;
@GetMapping("/helo")
public String hello(){
long views =stringRedisTemplate.opsForValue().increment("views");
return "hello,views: "+views;
}
}
配置文件:
server.port=8080
spring.redis.host=redis #这里主机名是redis而不是ip地址
然后我们要把项目使用docker-compose来部署,那就必须要Dockerfile
:
FROM java:8
COPY *.jar /app.jar
CMD ["----server.port:8080----"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]
也需要docker-compose.yml
:
version: '3.9'
services:
kuangapp:
build: .
image: kuangapp
depends_on:
- redis
ports:
- "8181:8080" # 映射到宿主机是8181端口,容器内是8080
redis:
image: redis:alpine
然后使用maven package
把项目打包成jar包,把jar包
、dockerfile
和docker-compose.yml
都放到Linux里去,
然后我们在 该目录下直接使用docker-compose up
即可运行
如果报错,修改文件后,需要重新部署的话使用 docker-compose up --build 来重新构建
如图,就是启动成功了,我们可以访问服务器的8181端口: