文章目录
Docker
Docker Compose
1. 概述
前面我们学习了通过Dockerfile,build、run构建单个容器服务,而Docker Compose是docker的开源项目,用于定义和运行多容器 Docker 应用程序的工具。通过 Compose 可以使用 YML 文件来配置应用程序需要的所有服务。然后使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
官网地址:https://docs.docker.com/compose/
2. 使用步骤
- 使用 Dockerfile 定义应用程序的环境;
- 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行;
- 执行
docker-compose up
命令来启动并运行整个应用程序。
3. Compose安装
- 运行以下命令以下载Docker Compose的当前稳定版本(官方)
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
这个下载的很慢!
推荐使用国内高速下载地址:https://get.daocloud.io
curl -L https://get.daocloud.io/docker/compose/releases/download/1.26.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
- 将可执行权限应用于二进制文件
sudo chmod +x /usr/local/bin/docker-compose
- 测试安装
docker-compose --version
4. Docker Compose入门
官网入门案例:https://docs.docker.com/compose/gettingstarted/
构建一个运行在Docker Compose上的简单Python Web应用程序,该应用程序使用Flask框架,并在Redis中维护一个计数器。
- 创建文件夹
mkdir composetest
cd composetest
- 在项目目录中创建一个名为: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)
if __name__ == "__main__":
app.run(host=="0.0.0.0",debug==True)
代码主要内容:导入redis和Flask框架,进入方法就会自增,访问页面返回Hello World! I have been seen加次数。
- 在项目目录中创建另一个名为:requirements.txt 的文件
flask
redis
- 编写Dockerfile
官方:
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"]
Dockerfile内容:
- 从Python 3.7映像开始构建映像。
- 将工作目录设置为 /code。
- 设置flask命令使用的环境变量。
- 安装gcc和其他依赖项。
- 复制requirements.txt并安装Python依赖项。
- 向图像添加元数据以描述容器正在侦听端口5000。
- 将.项目中的当前目录复制到.映像中的工作目录。
- 将容器的默认命令设置为 flask run。
官方提供的下载一直卡着不动。。
我们修改一下Dockerfile:
FROM python:3.7-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
Dockerfile内容:
- 从Python 3.7映像开始构建映像。
- 将当前目录添加 . 到 /code映射的路径中。
- 将工作目录设置为 /code。
- 安装Python依赖项。
- 将容器的默认命令设置为
- 定义服务
在项目目录中创建一个名为:docker-compose.yml 的文件
version: '3.8'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
redis:
image: "redis:alpine"
该Compose文件定义了两个服务:web和redis。
web服务:该web服务使用从Dockerfile当前目录中构建的映像。然后,它将容器和主机绑定到暴露的端口5000。此示例服务使用Flask Web服务器的默认端口5000。
redis服务:该redis服务使用 从Docker Hub中提取的公共Redis镜像。
- 生成和运行程序
在项目目录中,通过命令:docker-compose up
,运行来启动应用程序。
镜像信息:docker images
容器信息:docker ps
网络规则:项目部署在同一网络下,可以直接通过域名访问
docker network ls
docker network inspect docker-compose
- 停止服务&删除数据卷
# 停止服务或者Ctrl+c
docker-compose stop
# 删除数据卷
docker-compose down --volumes
4. docker-compose.yml规则
官网文档:https://docs.docker.com/compose/compose-file/
主体分三层:
- version
版本信息。
- services
服务
services
服务一:redis
# 服务配置
build
images
network
depends_on
...
服务二:web
...
服务三:...
...
- depends_on,表达服务之间的依赖性
示例:
version: "3.8"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
注意点:
docker-compose up
以依赖性顺序启动服务。在以下示例中,db和redis在之前启动web。docker-compose up SERVICE
自动包含SERVICE的依赖项。在下面的示例中,docker-compose up web还将创建并启动db和redis。docker-compose stop
按依赖关系顺序停止服务。在以下示例中,web在db和之前停止redis。
- 其他配置
网络、卷、全局规则…
5. 使用Compose部署WP博客
官网教程:https://docs.docker.com/compose/wordpress/
- 创建项目目录
mkdir my_wordpress
cd my_wordpress
- 创建一个 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:
# 依赖于db
depends_on:
- db
image: wordpress:latest
# 端口暴露
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: {}
- 启动运行
docker-compose up
# 后台启动
docker-compose up -d
- 测试访问:ip:8000
6. 上线自己的微服务
- 创建一个SpringBoot项目
2. 编写测试类
@RestController
public class HelloTest {
@Autowired
StringRedisTemplate stringRedisTemplate;
@RequestMapping("/hello")
public String hello() {
Long views = stringRedisTemplate.opsForValue().increment("views");
return "Hello,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.yml
version: "3.8"
services:
codechen:
build: .
image: codechen
depends_on:
- redis
ports:
- "8080:8080"
redis:
image: "redis:alpine"
- 使用maven打包项目成jar包,然后上传jar包、Dockerfile、docker-compose.yml到linux主机。
- 使用docker-compose up 部署
如果需要重新部署,使用命令docker-compose up --build
- 访问测试:curl localhost:8080/hello
//下篇再见…谢谢