Docker——compose

在实际生产环境中,一个应用往往由许多服务构成,而 docker 的最佳实践是一个容器只运行一个进程,因此运行多个微服务就要运行多个容器。多个容器协同工作需要一个有效的工具来管理他们,定义这些容器如何相互关联。compose 应运而生。

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它通过一个YAML文件来配置应用程序的服务、网络和卷,然后使用一个命令即可创建并启动所有容器

下载地址: https://github.com/docker/compose/releases

在 Docker Compose 的世界里,主要有三个核心概念:

  • 服务 (Services):定义应用中的各个组件。每个服务对应一个或多个容器(通常是一个容器),你可以指定它使用哪个镜像、暴露哪些端口、需要哪些环境变量等。

  • 网络 (Networks) :定义容器之间如何通信。Compose 会自动为你的应用创建一个默认网络,容器之间可以通过服务名直接互相访问,这解决了手动链接容器的麻烦。

  • 卷 (Volumes):用于持久化存储数据。当容器删除后,卷中的数据不会丢失,这对于数据库等服务至关重要

解决的核心痛点
  • 简化操作 :将原本需要多条 docker run 命令的复杂操作,简化成一条 docker compose up 。

  • 环境一致性:通过一个配置文件固化所有容器的配置,确保开发、测试、生产环境高度一致,解决"在我电脑上明明是好的"这类问题。

  • 依赖管理 :通过 depends_on 配置项,可以定义服务之间的启动顺序,确保数据库等依赖服务先启动

1、创建docker-compose文件

root@Anolis2 compose# cat docker-compose.yaml

version: '1.0'

services:

httpd:

restart: always

image: nginx

container_name: my-nginx

ports:

  • 8888:80

environment:

TZ: Asia/Shanghai

volumes:

  • /webroot:/var/www/html

2、启动删除

启动

root@Anolis2 compose# docker-compose up -d

WARN0000 /opt/compose/docker-compose.yaml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion

+ up 2/2

✔ Network compose_default Created 0.3s

✔ Container my-nginx Started

删除

root@Anolis2 compose# docker-compose down

WARN0000 /opt/compose/docker-compose.yaml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion

+ down 2/2

✔ Container my-nginx Removed 0.2s

✔ Network compose_default Removed
查看

root@Anolis2 compose# docker-compose ps

-f动态查看日志

root@Anolis2 compose# docker-compose logs -f

关键字:

image

指定为镜像名称或者镜像ID,如果本地不存在则自动拉取

image: httpd

image: a2b2c3d4

ports

暴露的端口(推荐字符串形式)

ports:

  • "3000"

  • "80:80"

  • "127.0.0.1:80:80"

sysctls

配置容器内核参数

sysctls:

net.core.somaxconn: 1024

net.ipv4.tcp_syncookies: 0

sysctls:

  • net.core.somaxconn=1024

  • net.ipv4.tcp_syncookies=0

volumes

数据卷所挂载的路径设置,可以设置为宿主机路径,并可以设置访问模式(HOST:CONTAINER:ro)

volumes: #绝对路径映射

  • /var/www/html

  • /webroot:/var/www/html

  • ~/webroot:/var/www/html:ro

networks

定义网桥

配置容器连接的网络

environment:

MYSQL_ROOT_PASSWORD: 123456

command: 覆盖镜像默认命令

docker run --name redis -d redis redis-server --appendonly yes

ulimits:

指定容器的ulimits限制的值

如: 进程最大数: 65535 soft软限制 应用可以修改 硬限不能超过

depends_on:

解决容器的依赖,启动顺序的问题

healthcheck:

检查命令,检查容器是否健康运行

build:

配合Dockerfile使用

查看网桥

root@Anolis2 compose# docker network ls

NETWORK ID NAME DRIVER SCOPE

4cf9a5498e7e bridge bridge local

048a56fdbe2b compose_default bridge local

14c5ca7b6bf7 docker_gwbridge bridge local

f514dce8f745 host host local

vx087gslj0a0 ingress overlay swarm

76ff95406838 my-bridge-141 bridge local

fece4dc44e5b my-net bridge local

ca515278a1e2 none null local

示例:

复制代码
redis:
  image: redis:5.0.10
  container_name: redis
  ports:
    - "6379:6379"
  volumes:
    - redisdata:/data
  command: "redis-server --appendonly yes"

ulimits:
  nproc: 65535
  nofile:
    soft: 20000
    hard: 40000

services:
  httpd:
    image: httpd
    container_name: apache
    depends_on:
      - db #服务名
      - redis
  redis:
    image: redis
  db:
    image: mysql

healthcheck:
  test: ['CMD', 'curl', '-f', 'http://localhost']
  interval: 30s
  timeout: 10s

version: '1.0'
services:
  httpd:
    restart: always
    build:                #构建自定义镜像
      context: ../        #dockerfile路径
      dockerfile: Dockerfile #指定dockerfile名字      

    container_name: myweb
    ports:
      - 80:80
    environment:
      TZ: Asia/Shanghai
    volumes:
      - /webroot:/var/www/html
相关推荐
wewowilling19 分钟前
认识微服务
java·运维·微服务·springcloud
玖石书27 分钟前
Ubuntu 24.04 UFW 全命令攻略:从入门到端口开放实战
linux·运维·ubuntu
VIP_CQCRE2 小时前
给团队搭一个 AI 工作台:Open WebUI 接入 Ace Data Cloud 实战
docker·ai·rag·open webui·ace data cloud
weifont2 小时前
自动化抓取和上架商品:能不动手,就少动手
运维·前端·自动化
拂拉氏3 小时前
【知识讲解】 Linux之动静态库的了解
linux·运维·服务器·动静态库
Mikko73 小时前
Linux 重启后日志没了?进程被 OOM 杀了去哪看?logrotate 之后日志还往旧文件写?三台真机实测日志与性能排查
linux·运维·centos
光依旧3 小时前
发版就掉请求?Spring Boot优雅停机的四步
运维·spring boot·nginx·高可用·优雅停机·mcp server
yichengerp5 小时前
电子行业常用erp系统有哪些?推荐适合中小电子厂的易呈erp软件,操作简单,易落地
大数据·运维·人工智能·云计算·制造
天国梦5 小时前
国密门禁品牌怎么选?2026年最新3个避坑要点
运维·服务器·数据库·python
程序员老赵6 小时前
Docker 部署 Portainer CE:轻松搭建容器管理平台
docker·容器·开源