Docker Compose使用详解

一、Docker Compose简介

Docker Compose是Docker的一个官方工具,用于定义和运行多容器Docker应用程序。它使用YAML文件来配置应用程序的服务,并通过命令行界面来管理多个Docker容器的生命周期。以下是一个示例Docker Compose文件:

version: '3'
services:
  app:
    image: myapp:latest
    ports:
      - "8000:8000"
    volumes:
      - .:/app
    links:
      - db
  db:
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: password

该文件定义了两个服务:一个名为“app”的服务和一个名为“db”的服务。它们都使用不同的容器。App服务使用myapp镜像,并将容器端口8000映射到主机端口8000。将当前目录挂载到容器的/app目录,以便在容器内访问该目录中的文件。它还指定了一个名为“db”的链接,该链接将允许app服务访问名为“db”的服务。db服务则使用MYSQL镜像,并设置根密码为“password”。

二、Docker Compose命令

以下是常用的Docker Compose命令:

  • docker-compose up:启动全部服务
  • docker-compose down:停止并删除所有容器
  • docker-compose ps:列出所有容器的状态
  • docker-compose logs:查看容器的日志
  • docker-compose exec:在容器内执行命令
  • docker-compose build:构建服务镜像

三、Docker Compose使用示例

1. 搭建Web应用

假设我们有一个简单的Web应用程序,它使用Python和Flask框架编写。我们需要将应用程序部署到Docker容器中,并使用Nginx反向代理。以下是Docker Compose配置文件的示例:

version: '3'
services:
  app:
    build:
      context: .
    ports:
      - "5000:5000"
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    depends_on:
      - app

该文件定义了两个服务,一个名为“app”的服务和一个名为“nginx”的服务。app服务使用当前目录中的Dockerfile构建镜像,并将容器端口5000映射到主机端口5000。Nginx服务使用官方的Nginx镜像,并将容器端口80映射到主机端口80。它还将容器中的/etc/nginx/nginx.conf文件挂载到主机上的./nginx.conf文件,并指定将其作为只读文件。它还使用depends_on选项来指定Nginx服务需要在app服务之后启动。

在当前目录中创建名为“Dockerfile”的文件,添加以下内容:

FROM python:3.9-slim-buster

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt

COPY . .

EXPOSE 5000

CMD ["python3", "app.py"]

该Dockerfile使用最新版的Python3镜像,并将容器的工作目录设置为/app。它复制requirements.txt文件并使用pip3安装它们。它将当前目录的所有文件复制到容器中。最后,它将容器端口5000公开,并使用CMD命令运行app.py。

在当前目录中创建名为“nginx.conf”的文件,添加以下内容:

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    server {
        listen  80;
        server_name  localhost;
        location / {
            proxy_pass http://app:5000;
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;
        }
    }
}

该文件定义了Nginx的配置。它将Worker进程数设置为1。它配置了一个监听端口为80的HTTP服务器,并将其命名为localhost。该服务器定义了名为“/”的位置,其指向app服务的5000端口。它还设置了代理服务器的一些头信息。

在当前目录中创建名为“app.py”的文件,添加以下内容:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run(host='0.0.0.0')

该文件使用Flask框架编写的一个简单的Web应用程序。它定义了一个名为“/”的路由,并返回“Hello,World!”。

最后,在终端中导航到包含这些文件的目录,并运行以下命令启动服务:

$ docker-compose up

Nginx将侦听主机上的80端口,并将请求转发到app容器的5000端口。你可以在浏览器中键入http://localhost来查看应用程序的输出。

2. 使用MySQL数据库

现在,假设我们需将我们的应用程序与MySQL数据库一起使用。以下是Docker Compose配置文件的示例:

version: '3'
services:
  app:
    build:
      context: .
    ports:
      - "5000:5000"
    environment:
      MYSQL_HOST: db
      MYSQL_USER: root
      MYSQL_PASSWORD: password
      MYSQL_DATABASE: mydb
    depends_on:
      - db
  db:
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: mydb
    volumes:
      - "./mysql_data:/var/lib/mysql"

该文件定义了两个服务,一个名为“app”的服务和一个名为“db”的服务。app服务使用当前目录中的Dockerfile构建镜像,并将容器端口5000映射到主机端口5000。它将一些环境变量传递到容器中,以便应用程序连接到MySQL数据库。此外,它使用depends_on选项来指定db服务需要在app服务之后启动。db服务使用MYSQL镜像,并设置根密码为“password”和数据库名称为“mydb”。它还将容器中的/var/lib/mysql目录挂载到主机上的./mysql_data目录。

在app.py文件中添加以下内容以连接到数据库:

from flask import Flask, render_template
from flask_mysqldb import MySQL

app = Flask(__name__)

app.config['MYSQL_HOST'] = 'db'
app.config['MYSQL_USER'] = 'root'
app.config['MYSQL_PASSWORD'] = 'password'
app.config['MYSQL_DB'] = 'mydb'

mysql = MySQL(app)

@app.route('/')
def index():
    cur = mysql.connection.cursor()
    cur.execute("SELECT COUNT(*) FROM users")
    count = cur.fetchone()[0]
    cur.close()
    return render_template('index.html', count=count)

if __name__ == '__main__':
    app.run(host='0.0.0.0')

该文件使用了Flask框架,以及用于MySQL连接的Flask-MySQLdb库。它定义了mysql属性,该属性是一个MySQL对象。该对象使用应用程序的配置属性来连接到MySQL数据库。它还定义了一个名为“/”的路由,该路由从数据库中获取数据并在网页中返回数据。

在当前目录中创建名为“index.html”的文件,添加以下内容:




    
    MySQL Example


    

Number of users

{{ count }}

该文件是应用程序的HTML模板。它使用Flask的渲染模板功能,以dynamic方式将计数值传递到模板中。

最后,在终端中导航到包含这些文件的目录,并运行以下命令启动服务:

$ docker-compose up

你可以在浏览器中键入http://localhost来查看应用程序的输出。它将显示数据库中的用户数量。

四、总结

在这篇文章中,我们了解了Docker Compose以及如何使用它来构建和运行多容器Docker应用程序。我们创建了一个简单的Web应用程序,使用Nginx反向代理,以及与MySQL数据库一起使用的应用程序。通过使用Docker Compose,我们可以更轻松地管理多容器应用程序的部署和生命周期。

原创文章,作者:FUWRD,如若转载,请注明出处:https://www.506064.com/n/371919.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
FUWRDFUWRD
上一篇 2025-04-23 18:08
下一篇 2025-04-23 18:08

相关推荐

  • docker-ce-18.03.1.ce-1.el7.centos.x86_64需要pigz这个依赖的解决方案

    当我们在linux centos系统中安装docker-ce-18.03.1.ce-1.el7.centos.x86_64时,有时可能会遇到“nothing provides pi…

    编程 2025-04-29
  • 如何解决Docker+k8s报错413 Request Entity Too Large

    对于使用Docker容器和Kubernetes集群的开发人员,在处理HTTP请求时,常常会遇到413 Request Entity Too Large的报错。这通常是由于请求的大小…

    编程 2025-04-27
  • docker-compose编写用法介绍

    本文将详细介绍docker-compose编写的各个方面,包括语法、常见命令等等,旨在帮助读者更好的了解如何使用docker-compose。 一、docker-compose的语…

    编程 2025-04-27
  • Docker 垃圾电脑的解决方案

    Docker 是一种轻量级的容器化技术,可以在一个操作系统中,同时运行多个独立的应用。在使用 Docker 的过程中,可能会出现 Docker 占用大量硬盘空间,导致电脑变得极其缓…

    编程 2025-04-27
  • Docker挂载目录–graph用法介绍

    本文将从如下几个方面详细阐述Docker挂载目录–graph: 一、基本概念 在Docker中,镜像是由一系列只读层组成的文件系统。当我们启动一个容器时,Docker会…

    编程 2025-04-27
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25
  • Python安装OS库详解

    一、OS简介 OS库是Python标准库的一部分,它提供了跨平台的操作系统功能,使得Python可以进行文件操作、进程管理、环境变量读取等系统级操作。 OS库中包含了大量的文件和目…

    编程 2025-04-25
  • git config user.name的详解

    一、为什么要使用git config user.name? git是一个非常流行的分布式版本控制系统,很多程序员都会用到它。在使用git commit提交代码时,需要记录commi…

    编程 2025-04-25

发表回复

登录后才能评论