简介
DockerFile build run 手动操作,单个容器
Docker Compose 能够高效管理容器,运行多个容器
官方文档:https://docs.docker.com/compose/
Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration. To learn more about all the features of Compose, see the list of features.
Compose works in all environments: production, staging, development, testing, as well as CI workflows. You can learn more about each case in Common Use Cases.
Using Compose is basically a three-step process:
Dockerfile
so it can be reproduced anywhere.docker-compose.yml
so they can be run together in an isolated environment.docker compose up
and the Docker compose command starts and runs your entire app. You can alternatively run docker-compose up
using the docker-compose binary.Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。使用 Compose,您可以使用 YAML 文件来配置应用程序的服务。然后,使用一个命令,您可以从您的配置中创建并启动所有服务。要了解有关 Compose 的所有功能的更多信息,请参阅功能列表
Compose 适用于所有环境:生产、上线、开发、测试以及 CI 工作流程。您可以在常见用例中了解有关每个案例的更多信息
使用 Compose 基本上是一个三步过程:
Dockerfile
定义你的应用程序的环境,以便可以在任何地方复制它docker-compose.yml
以便它们可以在隔离环境中一起运行docker compose up
,Docker compose 命令启动并运行您的整个应用程序。您也可以docker-compose up
使用 docker-compose 二进制文件运行Compose 是 Docker 官方的开源项目,需要安装
简单的Compose实例(docker-compose.yml)
version: "3.9" # optional since v1.27.0
services:
web:
build: .
ports:
- "8000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
下载地址:https://docs.docker.com/compose/install/
国内地址:https://get.daocloud.io/#install-compose
# 使用国内镜像下载,可根据自己的情况指定下载后的路径
# /usr/local/bin/docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.2.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 对二进制文件应用可执行权限
sudo chmod +x /usr/local/bin/docker-compose
官方文档:https://docs.docker.com/compose/gettingstarted/
创建文件
# 选择在 /home 目录下创建,可自定选择
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)
创建Dockerfile文件
[root@vinjcent composetest]# pwd
/home/composetest
[root@vinjcent 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"]
# =================================文件内容=================================
在Compose文件中定义所需的服务
docker-compose.yml
文件version: "3.9"
services:
web:
build: .
ports:
- "8000:5000"
redis:
image: "redis:alpine"
使用Compose构建和运行app
【注】需要从当前的工程文件下运行,必须有这四个文件
# 运行命令,后台运行添加参数 -d 即可
docker-compose up
[root@vinjcent composetest]# curl localhost:8000
# 查看所有docker服务
[root@vinjcent composetest]# docker service ls
默认的服务名 文件名-服务名-num
num 代表副本的数量
如果在同一个网络下,可以直接通过域名访问
有效避免了服务出现故障之后,重新启动服务时,容器分配的域名发生改变(从172.27.0.2 => 172.27.0.3),保证HA(高可用)
停止运行Compose
# 需要在容器外部的存放yml文件的目录下执行
docker-compose down
# 快捷键需要在容器启动的地方使用
Ctrl + C
yml 规则
主要有三层
官方说明文档:https://docs.docker.com/compose/compose-file/compose-file-v3/
##### 三层
### 第一层: 版本
version: "" # 版本
services: # 多个服务配置
redis: # 服务1
### 第二层: 服务配置(docker容器的配置)
container_name: my-redis-container # 容器名称
images: redis:latest # 镜像拉取
build: .
depends_on: # 设置启动顺序依赖,先启动db服务,再启动redis
- db
- redis
network # 网络配置
...
web: # 服务2
...
mysql: # 服务3
...
### 第三层: 其它配置: 网络、卷、全局规则...
volumes:
networks:
configs:
用例测试
# 在 /home 目录下创建一个文件目录 my_wordpress
mkdir my_wordpress
cd my_wordpress/
# 创建一个docker-compose.yml文件
mkdir docker-compose.yml
# =====================================文件内容=====================================
version: "3.9"
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
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
wordpress_data: {}
# =====================================文件内容=====================================
# 过程有点久,耐心等待
[root@vinjcent my_wordpress]# docker-compose up
测试访问:http://192.168.159.100:8000/
1)创建一个SpringBoot工程,导入依赖
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-redisartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
2)编写controller
package com.vinjcent.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SuppressWarnings("all")
@RestController
public class HelloController {
@Autowired
StringRedisTemplate redisTemplate;
@GetMapping("/hello")
public String hello() {
long views = redisTemplate.opsForValue().increment("views");
return "hello,vinjcnet,views: "+ views;
}
}
3)在该工程下创建一个Dockerfile
文件
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=3035"]
EXPOSE 3035
ENTRYPOINT ["java","-jar","/app.jar"]
4)在该工程下创建一个docker-compose.yml
文件
version: '3.9'
services:
vinjcentapp:
build: .
image: vinjcentapp:1.0
depends_on:
- redis
ports:
- "3035:3035"
redis:
image: "redis:alpine"
5)将该工程打成一个jar包
6)将三个文件上传到 Linux 上的文件夹中
7)在该目录下运行命令
docker-compose up
# 重新构建
docker-compose up --build
8)测试访问
curl localhost:3035