docker-compose

Docker Compose

官方文档:https://docs.docker.com/compose/gettingstarted/

简介

Dockerfile build run 手动操作,单个容器?

微服务。100个微服务,依赖关系

Docker Compose 来轻松高效来管理容器,定义运行多个容器

三步骤

  1. Dockerfile文件保证项目在任何地方都可以运行
  2. docker-compose.yml 配置多个服务
  3. docker-compose up 启动 -d--》后台启动

作用:批量容器编排。

Docker Compose是Docker官方开源项目,需要安装

Dockerfile让程序在任何地方运行。web服务。redis mysql nginx......多个容器

Compose:根据配置,先去启动redis,再启动web

version: "3.9"  # optional since v1.27.0
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    links:
      - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

Compose重要概念

  • 服务services 容器,应用 (web,redis,mysql..)
  • 项目project 一组关联的容器.。博客---(文本,mysql.......)
安装
# 1.下载
# 官方,速度慢
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 国内源
curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

# 2.授权
chmod +x /usr/local/bin/docker-compose
体验
  • 应用app.py
  • Dockerfile 应用打包为镜像
  • compose.yaml文件(定义整个服务,需要的环境,web redis。。。)完整的上线服务
  • 启动compose项目(docker-compose up)
  1. 准备
# 1.创建一个项目文件夹
mkdir composetest
cd composetest


# 2.创建一个应用,以python为例,是一个计数器的功能
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)
    
# 3.环境依赖包文件
vim requirements.txt

#添加内容
flask
redis
  1. 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"]
    
  2. docker-compose.yml

    version: "3.9"
    services:
      web:
        build: .
        ports:
          - "5000:5000"
      redis:
        image: "redis:alpine"
    
  3. 启动

    docker-compose up
    
  4. 停止

    • docker-compose down(要进入文件下)或者ctrl+c

执行流程

  1. 创建网络
  2. 执行docker-compose.yaml
  3. 启动服务

自动的默认规则

docker ps

总结:

默认的服务名:文件名 _服务名 _num

多个服务器,集群。A B _num 副本数量 num代表第几个

集群状态。服务都不可能只有一个运行实例。

docker images

[root@jinpengyong ~]# docker images
REPOSITORY          TAG          IMAGE ID       CREATED        SIZE
composetest_web     latest       9c3f79649e3c   27 hours ago   183MB
docker-springboot   latest       05ea3a57ebaa   2 days ago     661MB
redis               latest       40c68ed3a4d2   7 days ago     113MB
tomcat              9.0          4e2e87a81bc1   9 days ago     680MB
redis               alpine       5c08f13a2b92   11 days ago    32.4MB
python              3.7-alpine   f0c1a69798c7   12 days ago    41.9MB
java                8            d23bdf5b1b1b   4 years ago    643MB

docker services ls

[root@jinpengyong ~]# docker service ls
Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.

docker 网络

[root@jinpengyong ~]# docker network ls
NETWORK ID     NAME                  DRIVER    SCOPE
1f122f7cec2f   bridge                bridge    local
3812b609d226   composetest_default   bridge    local

[root@jinpengyong ~]# docker network inspect composetest_default
"Containers": {
            "7eab26682a2a79c61567d108f5463f5108c44ddc1e8dc6eef5e4a174d877dced": {
                "Name": "composetest_web_1",
                "EndpointID": "c5a00826a64bd5dfe578528d37a9f65a05eedbe2a2bc331e0baf2e1cb4c2a1f1",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            },
            "e4007a5b24a6e45d545dc48c5a055e52d986bd532801a87f83561c496d208dce": {
                "Name": "composetest_redis_1",
                "EndpointID": "9626a6ac4b2189001f2736dabdf1aac059aaf12868c493f9922ee0e24c8e6533",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            }
        },

项目中的各个服务都在同一个网络下。可以通过名字访问。

也可以再应用里看到cache = redis.Redis(host='redis', port=6379),这里写的是名字--》redis

总结

以前都是单个docker run 启动容器

docker-compose 通过docker-compose编写yaml配置文件,然后docker-compose up一键启动所有服务或停止

Docker小结
  1. docker镜像。run==>镜像
  2. Dockerfile构建镜像
  3. docker-compose 启动项目,(编排,多个微服务)
  4. docker网络
yaml规则

https://docs.docker.com/compose/compose-file/compose-file-v3/

# 3层
version: "3.9"	# 第1层:版本
services:	# 第2层:服务
  服务1:web
    # 服务配置
    images
    build
    network
    ..... 
  服务n:redis
    ......
    
# 其他配置 网络/卷 全剧规则 第3层
volumes:
networks:
configs:


 
开源项目

博客:wordpress

https://docs.docker.com/samples/wordpress/

下载程序,安装数据库,配置。。。

compose应用--》一键启动

  1. 下载项目(docker-compose.yml)
  2. 如果需要文件Dockerfile( docker build)
  3. 文件准备齐全

启动:docker-compose up -d 后台启动

实战

  1. 项目代码

  2. docker-compose.yml

    version: '3.9'
    services:
      myapp:
        build: .
        image: myapp
        depends_on:
          - redis
        ports:
          - '8081:8081'
      redis:
        image: 'redis:alpine'
    
  3. Dockerfile

    FROM java:8
    COPY *.jar /app.jar
    CMD ["--server.port=8081"]
    EXPOSE 8080
    ENTRYPOINT ["java","-jar","app.jar"]
    
  4. 启动

    docker-compose up -d
    # 如果第一次报错。后面启动
    docker-compose up -d --build
    

总结

工程 服务 容器

项目compose:三层

  • 工程 porject
  • 服务(环境也算)
  • 容器 运行实例 docker k8s
posted @   jpy  阅读(55)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示