-
前面使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器。然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而知
-
使用 Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具
三步骤:
1、Dockerfile 保证项目可以运行在任何地方
2、services 服务,docker-compose.yml 文件
3、启动项目
Compose重要的概念:
1、服务services。容器、应用
2、项目project。一组关联的容器
官网:https://docs.docker.com/compose/install/
2. 安装1、下载
# 1.官网,下载比较慢 sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose # 2.使用国内的 curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
2、授权
sudo chmod +x /usr/local/bin/docker-compose3. 操作(根据官网)
- 确保您已经安装了Docker Engine 和Docker Compose。您不需要安装 Python 或 Redis,因为两者都由 Docker 镜像提供。
第一步:设置
定义应用程序依赖项。
-
为项目创建一个目录:
mkdir composetest cd composetest
2.app.py在您的项目目录中创建一个名为的文件并将其粘贴到:
[root@iZwz99osrzvcx9zd72bqslZ composetest]# vim app.py
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 容器的主机名。我们使用 Redis 的默认端口6379。
- requirements.txt在您的项目目录中创建另一个文件并将其粘贴到:
[root@iZwz99osrzvcx9zd72bqslZ composetest]# vim requirements.txt
flask redis
第二步:创建一个 Dockerfile
在此步骤中,您将编写一个用于构建 Docker 映像的 Dockerfile。该图像包含 Python 应用程序所需的所有依赖项,包括 Python 本身。
在您的项目目录中,创建一个名为Dockerfile并粘贴以下内容的文件:
[root@iZwz99osrzvcx9zd72bqslZ composetest]# vim Dockerfile
# syntax=docker/dockerfile:1 FROM python:3.7-alpine WORKDIR /code ENV FLASK_APP=app.py ENV FLASK_RUN_HOST=0.0.0.0 RUN apk add --no-cache gcc musl-dev linux-headers COPY requirements.txt requirements.txt RUN pip install -r requirements.txt EXPOSE 5000 COPY . . CMD ["flask", "run"]
这告诉 Docker:
- 从 Python 3.7 映像开始构建映像。
- 将工作目录设置为/code.
- 设置flask命令使用的环境变量。
- 安装 gcc 和其他依赖项
- 复制requirements.txt并安装 Python 依赖项。
- 将元数据添加到图像以描述容器正在侦听端口 5000
- 将.项目中的当前目录复制到.镜像中的workdir 。
- 将容器的默认命令设置为flask run.
第三步:在 Compose 文件中定义服务
docker-compose.yml在您的项目目录中创建一个名为的文件并粘贴以下内容:
[root@iZwz99osrzvcx9zd72bqslZ composetest]# vim docker-compose.yml
version: "3.3"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
这个 Compose 文件定义了两个服务:web和redis.
该web服务使用从Dockerfile当前目录中构建的映像。然后它将容器和主机绑定到暴露的端口5000. 此示例服务使用 Flask Web 服务器的默认端口5000。
该redis服务使用 从 Docker Hub 注册表中提取的公共Redis映像。
第四步:使用 Compose 构建并运行您的应用程序
- 从您的项目目录,通过运行启动您的应用程序docker-compose up。
docker-compose up
Compose 会拉取一个 Redis 镜像,为您的代码构建一个镜像,并启动您定义的服务。在这种情况下,代码会在构建时静态复制到映像中
流程:
①创建网络
②执行 Docker-compose yaml
③启动服务
Starting composetest_web_1 … done
Starting composetest_redis_1 … done
- 在浏览器中输入 http://119.23.109.216:5000/ 以查看应用程序正在运行。
-
刷新页面。
数字应该递增。
docker images全部都帮我们下载好了
网络规则:
通过compose启动的项目,项目中的内容都在同个网络中,可以通过域名访问
docker inspect composetest_default
如果在同一个网络下,可以直接通过域名访问,服务挂了没关系,重新再拉起一个就可以了。如果写死ip,挂了就不能用了!
-
停止
①docker-compose down
②ctrl + c
docker-compose.yaml 核心!
https://docs.docker.com/compose/compose-file/compose-file-v3/
# 3层 version:" " # 版本 services: # 服务 服务1:web # 服务配置 images build network ... 服务2:redis ... # 其它配置 网络/卷、全局规则 volumes: networks: configs:5. 使用Compose一键部署WP博客
https://docs.docker.com/samples/wordpress/
1、将目录命名为my_wordpress
[root@iZwz99osrzvcx9zd72bqslZ home]# mkdir my_wordpress [root@iZwz99osrzvcx9zd72bqslZ home]# cd my_wordpress/
2、创建一个docker-compose.yml文件来启动您的 WordPress博客和一个单独的MySQL实例,该实例具有用于数据持久性的卷挂载:
[root@iZwz99osrzvcx9zd72bqslZ my_wordpress]# vim docker-compose.yml
version: "3.3"
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATAbase: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- wordpress_data:/var/www/html
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
wordpress_data: {}
3、启动docker-compose up -d
- -d 后台启动
[root@iZwz99osrzvcx9zd72bqslZ my_wordpress]# docker-compose up
4、在网络浏览器中启动 WordPress,并注册登录
http://119.23.109.216:8000
5、关闭和清理
该命令docker-compose down会删除容器和默认网络,但会保留您的 WordPress 数据库。
该命令docker-compose down --volumes将删除容器、默认网络和 WordPress 数据库。
6. 实战:编写微服务上线1、IDEA新建springboot项目,勾选web和redis
2、
编写代码
@RestController
public class HelloController {
@Autowired
StringRedisTemplate redisTemplate;
@GetMapping("/hello")
public String hello() {
Long views = redisTemplate.opsForValue().increment("views");
return "hello,world,views=" + views;
}
}
application.properties
server.port=8080 spring.redis.host=redis
Dockerfile 构建镜像
FROM java:8 COPY *.jar /app.jar CMD ["--server.port=8080"] EXPOSE 8080 ENTRYPOINT ["java","-jar","/app.jar"]
docker-compose.yaml 编排项目
version: '3.3'
services:
ghcapp:
build: .
image: ghcapp
depends_on:
- redis
ports:
- "8080:8080"
redis:
image: "library/redis:alpine"
3、打包,丢到服务器,docker-compose up
如果项目要重新部署,使用命令docker-compose up --build重新构建
4、访问
curl localhost:8080 curl localhost/hello



