需要事先安装docker
CentOS 7.9 安装Docker
Docker-compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
docker-compose 通过一个 yml 模板文件来统一管理多个容器的配置,如网络、数据卷、执行指令、环境变量、资源限制等等。有了 docker-compose 我们便可以一键重启、关闭、删除、监控所有的 docker 服务,只需要一次配置,则可以对容器进行统一管理,那么此时我们则不必为了每次要运行一堆容器时写大量的命令而头疼。
1.从github上下载docker-compose二进制文件安装
下载最新版的docker-compose文件
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
若是github访问太慢,可以用daocloud下载
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose
测试是否安装成功:
docker-compose --version
如果docker-compose安装后命令失败,请检查您的路径。您还可以/usr/bin在路径中创建指向或任何其他目录的符号链接。
符号链接类似于Windows的快捷方式,快捷方式存储了指向那个文件的绝对路径
符号链接是一个指针,指向文件在文件系统中的位置。符号链接可以跨文件系统,甚至可以指向远程文件系统中的文件。符号链接只是指明了原始文件的位置,用户需要对原始文件的位置有访问权限才可以使用链接。如果原始文件被删除,所有指向它的符号链接也就都被破坏了。它们会指向文件系统中并不存在的一个位置(删除链接并不会删除原文件,删除源文件会删除链接)。
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
查看环境变量
echo $PATH
可以看见是有usr/local/bin 路径的,所以能找到docker-compose
Compose 使用的三个步骤:
Compose 具有用于管理应用程序整个生命周期的命令:
构建一个在 Docker Compose 上运行的简单 Python Web 应用程序。该应用程序使用 Flask 框架并在 Redis 中维护一个计数器。
定义应用程序依赖项。
1.为项目创建一个目录:
mkdir composetest
cd composetest
2.创建app.py文件,复制如下代码到这个app.py文件中(因为linux中不太好操作,我直接在本地写好,然后使用xftp软件上传到指定文件夹composetest下面,后面的文件也是一样,全部在电脑本地写完之后,使用xftp软件上传到服务器composetest文件夹下面)
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.
3.在composetest文件夹下再创建requirements.txt 文件,复制以下内容放入这个文件中
flask
redis
在此步骤中,您将编写一个用于构建 Docker image的 Dockerfile。该image包含 Python 应用程序所需的所有依赖项,包括 Python 本身。
在您的项目目录composetest中,创建一个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:
在项目目录中创建一个名为docker-compose.yml的文件并粘贴以下内容:
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
这个 Compose 文件定义了两个服务:web和redis.
web服务
该web服务使用的是从当前目录Dockerfile中构建的镜像。然后它将容器的5000端口绑定到主机端口5000. 此示例服务使用 Flask Web 服务器的默认端口5000.
Redis服务
该redis服务使用 从 Docker Hub 注册表中提取的公共Redis映像。
上传文件到服务器composetest文件夹下
上传失败,说明服务器的这个文件夹权限不够,授予读写可执行权限7
777就是rwxrwxrwx,意思是该登录用户(可以用命令id查看)、他所在的组和其他人都有最高权限
chmod 777 composetest
再次拖拽成功
1.从您的项目目录,通过运行docker-compose up启动您的应用程序。
docker-compose up
2.在浏览器中输入 http://服务器IP:5000/ 以查看运行的应用程序。
不要忘记开放服务器防火墙的5000端口
运行成功
3.刷新页面,次数递增
4.切换到另一个终端窗口,然后键入docker image ls以列出本地image。
docker image ls
您可以使用docker inspect .来查看容器/镜像的元数据
docker inspect composetest_web
5.停止应用程序,方法是docker-compose down 在第二个终端的项目目录中(composetest)运行,或者在启动应用程序的原始终端中按 CTRL+C。
docker-compose down
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
environment:
FLASK_ENV: development
redis:
image: "redis:alpine"
volumes将主机上的项目目录(当前目录)挂载到容器内部的/code文件夹,允许您即时修改代码,而无需重新构建镜像。该environment键设置 FLASK_ENV环境变量,它告诉flask run在开发模式下运行,并重新加载更改代码。这种模式应该只在开发中使用。
从您的项目目录中,键入docker-compose up以使用更新的docker-compose.yml 文件构建应用程序,然后运行它。
docker-compose up
由于应用程序代码现在使用volumes挂载到容器中,因此您可以对其代码进行更改并立即查看更改,而无需重新构建镜像。
更改应用程序app.py并保存。例如,将Hello World! 消息更改为Hello from xt !!!:
刷新网页,即时生效
首先按Ctrl + C 停止当前运行
然后加上 -d 让服务在后台运行
docker-compose up -d
docker-compose ps
该docker-compose run命令允许您为您的服务运行一次性命令。例如,要查看web服务可用的环境变量 :
docker-compose run web env
如果您使用docker-compose up -d在后台启动了服务 ,你可以停止服务:
docker-compose stop
docker-compose --help
如果想了解详细信息,可以看如下两篇,整理的挺全的
docker-compose.yml 配置文件编写详解
docker-compose教程(安装,使用, 快速入门)
(写博客主要是对自己学习的归纳整理,资料大部分来源于书籍、网络资料和自己的实践,整理不易,但是难免有不足之处,如有错误,请大家评论区批评指正。同时感谢广大博主和广大作者辛苦整理出来的资源。)