简介

之前使用docker时,写完一个项目之后需要定义一个docker file,再通过docker build生成一个镜像,并通过docker run执行;都是通过手动操作,用于单个容器,非常麻烦,现在想要的效果是:有100个微服务,存在依赖关系,通过docker compose来轻松高效的管理容器!定义和运行多个容器。

安装docker compose

linux的安装docker-compose需要从GitHub上面进行下载,GitHub的docker-compose下载地址:https://github.com/docker/compose/releases

1、下载docker-compose

wget https://github.com/docker/compose/releases/download/v2.14.2/docker-compose-linux-x86_64
mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose   #移动到执行目录
chmod 777 /usr/local/bin/docker-compose                        #授权

2、运行docker-compose命令

docker-compose

compose使用镜像 docker docker compose 本地镜像_redis

3、docker安装

指定安装Docker-ce 19.03版本

不指定默认安装最新版本
# docker yum源
[root@k8s-master01 ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装Docker-ce 19.03
[root@k8s-master01 ~]# yum install docker-ce-19.03.* -y

配置镜像国内源

[root@k8s-master01 ~]# mkdir /etc/docker
[root@k8s-master01 ~]# cat > /etc/docker/daemon.json <<EOF
{
 "exec-opts":["native.cgroupdriver=systemd"]
}
EOF

启动Docker

[root@k8s-master01 ~]# systemctl daemon-reload && systemctl enable --now docker
[root@k8s-master01 ~]# systemctl status docker   #查看启动状态

4、docker-compose常用命令

1、查看配置命令:

docker-compose config
2、后台启动:
docker-compose up -d
3、构建镜像:
docker-compose bulid
4、下载镜像:
docker-compose pull
5、查看运行的镜像:
docker-compose ps
6、查看进程:
docker-compose top
7、启动已存在的容器命令:
docker-compose start
8、停止正在运行的容器命令:
docker-compose stop
9、查看服务日志输出:
docker-compose logs

实践步骤

通过Docker Compose上构建一个简单的python web应用程序,该应用程序使用Flask框架并在redis中维护一个计数器,用来记录该web应用被访问的次数。
官方步骤地址:https://docs.docker.com/compose/gettingstarted/ 1,准备工作
yum -y install python-pip # pip是python包管理工具
yum -y install epel-release # 报错的话执行
2,为项目创建目录
mkdir composetest
cd composetest
3,在项目目录中创建一个名为app.py的文件,内容如下:
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

4,在项目目录中创建另一个名为requirements.txt的文件,内容如下:
vim requirements.txt
写入:

flask
redis

5,在项目目录中,创建名为 Dockerfile的文件:
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 ["python", "app.py"]

这告诉 Docker:
从 Python 3.7 映像开始构建映像。
将工作目录设置为 。/code
设置命令使用的环境变量。flask
安装 gcc 和其他依赖项
复制并安装 Python 依赖项。requirements.txt
将元数据添加到映像,以描述容器正在侦听端口 5000
将项目中的当前目录复制到映像中的工作目录。..
将容器的默认命令设置为 。flask run
6,在项目目录中创建一个名为docker-compose.yml的文件:
vim docker-compose.yml
写入:

version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:5000"
  redis:
    image: "redis:alpine"

此撰写文件定义了两个服务:web和redis
7,从项目目录中,通过运行 启动应用程序
docker-compose up
Compose 会拉取 Redis 映像,为代码构建映像,然后启动定义的服务。在这种情况下,代码在生成时静态复制到映像中

8,在浏览器中输入 http://localhost:8000/ 以查看正在运行的应用程序
curl local:8000
多次curl或者刷新页面会增加次数
Hello World!I have been seen 2 times.

如果你在 Linux、Docker Desktop for Mac 或 Docker Desktop for Windows 上本机使用 Docker,那么 Web 应用现在应该在 Docker 守护程序主机上的端口 8000 上侦听。
将 Web 浏览器指向 http://localhost:8000 以查找邮件。如果无法解决此问题,您也可以尝试 http://127.0.0.1:8000。Hello World
docker-compose
以前都是单个docker run启动容器
docker-compose 通过docker-compose编写yaml配置文件,可以通过compose一键启动所有服务或停止。

Top
docker小结
1,Docker镜像 run => 容器
2,DockerFile构建镜像(服务打包)
3,Docker-compose启动项目(编排,多个微服务/环境)
4,Docker网络

Top
Compose配置编写规则
yaml规则
可查看官网示例: https://docs.docker.com/compose/compose-file/#specifying-durations

# 三层
# 1
version: '' #版本
# 2
services: #服务
	服务1:  web
	   # 服务配置
	   images
	   build
	   network
	   ......
	服务2: redis
	   ......
	服务3: redis
	   ......	  
# 3
#其他配置 网络/卷,全局规则
volumes:
networks:
config: