【Docker】Docker-compose 单机容器集群编排工具

目录

一.Docker-compose 概述

1.容器编排管理与传统的容器管理的区别

2.docker-compose 作用

3.docker-compose 本质

4.docker-compose 的三大概念

二.YML文件格式及编写注意事项

1.yml文件是什么

2.yml问价使用注意事项

3.yml文件的基本数据结构

三.Docker-compose 配置

1.Docker-Compose 配置常用字段

2.Docker Compose常用命令

3.使用Docker-compose创建LNMP环境,并运行Wordpress网站平台

3.1.配置nginx的Dockerfile文件 

3.2.配置mysql的Dockerfile

3.3.部署php的Dockerfile

3.4.部署docker-compose.yml

3.5.浏览器访问测试


一.Docker-compose 概述

  • 一个Dockerfile模板文件可以定义一个单独的应用容器
  • Docker Compose作为Docker官方产品可以服务编排定义多个容器

1.容器编排管理与传统的容器管理的区别

  • 传统的容器管理

Dockerfile文件 -> 手动执行 docker build 一个个镜像的构建 -> 手动执行 docker run 一个个容器的

                            创建和启动

  • 容器编排管理

Dockerfile文件 -> 在docker-compose.yml配置模板文件里定义容器启动参数和依赖关系

                        -> 执行docker-compose命令指定配置模板文件,根据模板文件的配置一键完成所

                            有镜像的构建和容器的创建启动

2.docker-compose 作用

  • 是一个可以实现在单机上对容器集群编排管理的工具
  • 使用python开发的,能运行docker的平台也都能用docker-compose编排管理容器

3.docker-compose 本质

  • 就是在yaml格式的docker-compose配置模板文件里定义一个或多个服务及其容器的启动参数和依赖关系,并使用docker-compose命令根据配置模板文件中的参数来启动和管理容器

4.docker-compose 的三大概念

  • 项目project
  • 服务service
  • 容器container

项目project -> 包含一个或多个服务service -> 包含容器container的镜像、端口映射、数据卷、环

境变量、依赖关系等启动参数

默认使用项目的目录名作为project的项目名,也支持使用 -p 或 --project-name 选项指定项目名称

项目目录里要包含一个docker-compose配置模板文件,默认为docker-compose.yml,也支持使用

-f 或 --file 选项指定项目的配置模板文件

在配置模板文件里要包含一个或多个服务及其容器的配置,每个服务要包含容器的名称、镜像、映

射端口、数据卷、网络模式、依赖关系等容器的启动参数

二.YML文件格式及编写注意事项

1.yml文件是什么

YAML 是一种标记语言,它可以很直观的展示数据序列化格式,可读性高。类似于 json 数据描述

语言,语法比 json 简单的很多。YAML 数据结构通过缩进来表示,连续的项目通过减号来表示,

键值对用冒号分隔,数组用中括号 [ ] 括起来, hash 用花括号 { } 括起来

2.yml问价使用注意事项

  • 大小写敏感
  • 通过缩进表示层级关系
  • 只能使用空格缩进不能使用tab键
  • 可以使用井号键进行注释
  • 符号字符都有一个空格 如test:
  •  单引号起来的字符,会被当作普通字符串处理。"#&" 双引号里面如果是特殊字符,就表示本意
  • '$' 表示普通字符串
  • "$" 表示就是$

3.yml文件的基本数据结构

yaml格式文件: 文件名以 .yaml .yml 为后缀,用 空格缩进 表示字段的层级关系

特点:可读性高,易于管理

#一级字段
key1: value1              #一个key只有一个值,值的类型为 纯量
key2: 
- value1                        #一个key有多个值的纵向格式,值的类型为 列表
- value2
key3: ["value1", "value2"]      #一个key有多个值的横向格式,值的类型为 数组
key4:
  #二级字段
  subkey1: value1               #用 空格缩进 表示字段的层级关系,同一层字段要靠左对齐
  subkey2:value2
  subkey3:                      #key的值也是键值对,值的类型为 对象
    #三级字段
    sskey1: value1
	sskey2: value2

json格式文件:文件名以 .json 为后缀,用 大括号{} 表示字段的层级关系,每层字段除了最后一个

字段都要用逗号 , 结尾

特点:易于编程语言的api接口解析

#一级字段
{
   "key1": ["value1"],
   "key2": ["value2", "value3"],
   "key3": {
      #二级字段
      "subkey1": ["value1"],
      "subkey2": ["value2"],
      "subkey3": {
         #三级字段
         "sskey1": ["value1"],
         "sskey2": ["value2"]
      }
   }
}


key1:           值相当于echo "helloworld"
  hello
  world
  
key2: |         值相当于echo -e "hello\nworld"      #key: |  表示保留文本块中的换行符
  hello
  world
  
key3: |-        值相当于echo -e "hello\nworld\c"
  hello
  world
  
key4: |+        值相当于echo -e "hello\nworld\n"
  hello
  world
  
key5: > hello       值相当于echo  "hello world"    #> 会将文本块中的回车替换为空格
  world
  
key1: &a value1      #定义数据锚点,即定义复制的数据,相当于 a="value1"
key2: *a             #引用锚点数据,值相当于为 echo $a ,  key2: "value1"

三.Docker-compose 配置

1.Docker-Compose 配置常用字段

image使用本地镜像或从仓库拉取镜像创建容器
build使用dockerfile现场构建镜像创建容器
context指定dockerfile文件所在的目录路径
dockerfile指定dockerfile文件名
command设置容器的启动命令,会覆盖镜像中的CMD指令
container_name设置容器名   --name
environment设置环境变量  -e  -env
networks设置容器使用的自定义网络和IP  --ip
network_mode设置容器的网络模式  --network
ports设置容器端口映射  -p
volumes 设置数据卷挂载   -v
volumes_from设置数据卷容器挂载,版本3不支持  --volumes-from
hostname设置容器主机名   -h  --hostname
sysctls设置容器的内核参数  --sysctl
links设置容器互联   --link
privileged设置容器拥有root权限  --privileged
restart设置容器重启策略   --restart
depends_on设置容器的依赖关系

2.Docker Compose常用命令

docker-compose [-f docker-compose.yml] up -d               根据模板文件创建并后台启动所有容器
                                       down                根据模板文件删除所有容器
									   ps                  根据模板文件查看所有容器状态
									   start|stop|restart  根据模板文件启动|停止|重启所有容器

3.使用Docker-compose创建LNMP环境,并运行Wordpress网站平台

3.1.配置nginx的Dockerfile文件 

mkdir lnmp
cd lnmp
mkdir nginx mysql php
 
vim /opt/lnmp/nginx/Dockerfile
FROM centos:7
RUN yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel
ADD nginx-1.22.0.tar.gz /usr/local/src/
RUN useradd -M -s /sbin/nologin nginx
WORKDIR /usr/local/src/nginx-1.22.0
RUN ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module && make -j 4 && make install
ENV PATH /usr/local/nginx/sbin:$PATH
COPY nginx.conf /usr/local/nginx/conf/
ADD wordpress-6.4.2-zh_CN.tar.gz /usr/local/nginx/html
RUN chmod -R 777 /usr/local/nginx/html
EXPOSE 80
VOLUME ["/usr/local/nginx/html/"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

3.2.配置mysql的Dockerfile

vim /opt/lnmp/mysql/Dockerfile
FROM centos:7
RUN yum -y install ncurses ncurses-devel bison cmake pcre-devel zlib-devel gcc gcc-c++ make && useradd -M -s /sbin/nologin mysql
ADD mysql-boost-5.7.20.tar.gz /usr/local/src
WORKDIR /usr/local/src/mysql-5.7.20/
RUN cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8  \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=boost \
-DWITH_SYSTEMD=1 && make -j 4 && make install
COPY my.cnf /etc/my.cnf
EXPOSE 3306
RUN chown -R mysql:mysql /usr/local/mysql && chown mysql:mysql /etc/my.cnf
WORKDIR /usr/local/mysql/bin/
RUN ./mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data && cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/ && systemctl enable mysqld
ENV PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
VOLUME ["/usr/local/mysql"]
ENTRYPOINT ["/usr/sbin/init"]

3.3.部署php的Dockerfile

vim /opt/lnmp/php/Dockerfile
FROM centos:7
RUN yum -y install gd \
libjpeg libjpeg-devel \
libpng libpng-devel \
freetype freetype-devel \
libxml2 libxml2-devel \
zlib zlib-devel \
curl curl-devel \
openssl openssl-devel \
gcc gcc-c++ make pcre-devel && useradd -M -s /sbin/nologin nginx
ADD php-7.1.10.tar.bz2 /usr/local/src
WORKDIR /usr/local/src/php-7.1.10
RUN ./configure \
--prefix=/usr/local/php \
--with-mysql-sock=/usr/local/mysql/mysql.sock \
--with-mysqli \
--with-zlib \
--with-curl \
--with-gd \
--with-jpeg-dir \
--with-png-dir \
--with-freetype-dir \
--with-openssl \
--enable-fpm \
--enable-mbstring \
--enable-xml \
--enable-session \
--enable-ftp \
--enable-pdo \
--enable-tokenizer \
--enable-zip && make -j 4 && make install
ENV PATH /usr/local/php/bin:/usr/local/php/sbin:$PATH
COPY php.ini /usr/local/php/lib
COPY php-fpm.conf /usr/local/php/etc/
COPY www.conf /usr/local/php/etc/php-fpm.d/
EXPOSE 9000
ENTRYPOINT ["/usr/local/php/sbin/php-fpm","-F"]

3.4.部署docker-compose.yml

vim docker-compose
version: '3'
services:
  nginx:
    hostname: nginx
    build:
      context: /opt/lnmp/nginx/
      dockerfile: Dockerfile
    ports:
      - 1314:80
    container_name: nginx_server
    networks:
      lnmp:
        ipv4_address: 172.111.0.10
    volumes:
      - "nginx-data:/usr/local/nginx/html"
#声明挂在卷名称和目录
  mysql:
    hostname: mysql
    build:
      context: /opt/lnmp/mysql
      dockerfile: Dockerfile
    ports:
      - 3306:3306
    container_name: mysql_server
    networks:
      lnmp:
        ipv4_address: 172.111.0.20
    privileged: true
#给数据库权限。true:虽然登录容器,显示的是root用户,但是它是一个伪管理员
#一旦privileged: true,容器内的root用户和宿主机的root用户,拥有一样的权限
#生产中尽量不给
    volumes:
      - "mysql-data:/usr/local/mysql/"
  php:
    hostname: php
    build:
      context: /opt/lnmp/php/
      dockerfile: Dockerfile
    ports:
      - 9000:9000
    container_name: php_server
    networks:
      lnmp:
        ipv4_address: 172.111.0.30
    volumes:
      - "nginx-data:/usr/local/nginx/html/"
      - "mysql-data:/usr/local/mysql/"
networks:
  lnmp:
    driver: bridge
    ipam:
      config:
        - subnet: 172.111.0.0/16
volumes:
  nginx-data:
  mysql-data:
 
docker-compose -f docker-compose.yml up -d
 
创建完成!

3.5.浏览器访问测试

http://192.168.80.101/index.php
http://192.168.80.101/wordpress/index.php

<think>好的,用户现在想了解如何根据docker-compose.yml部署容器。我需要先回顾之前的对话历史。之前用户遇到了Spring Boot应用中从Session获取admin对象为空的问题,我帮他分析了可能的原因并给出了解决方案。现在用户的问题转向了Docker Compose部署,这可能意味着他正在尝试将应用容器化,或者准备部署到测试/生产环境。 用户可能的情况是,他已经解决了代码中的问题,现在需要将应用部署到Docker环境中。可能的深层需求包括:如何编写docker-compose文件,如何配置服务依赖,如何设置网络和卷,或者如何处理环境变量等问题。用户可能对Docker Compose有一定了解,但需要具体的步骤指导和示例。 我需要确保回答结构清晰,步骤详细,并提供示例代码。同时,要考虑到用户可能遇到的常见问题,比如端口冲突、服务启动顺序、环境变量配置等。另外,用户可能使用的是Spring Boot应用,可能需要连接数据库如MySQL,所以需要包含如何配置数据库服务以及应用如何连接到它。 首先,我应该解释docker-compose的基本概念和优势,然后分步骤说明如何创建docker-compose.yml文件,包括定义服务、网络、卷等。需要给出一个典型的Spring Boot应用与MySQL配合的示例,并解释每个部分的作用。还要提醒用户注意事项,比如版本兼容性、依赖启动顺序、环境变量的管理,以及调试技巧如查看日志等。 此外,可能需要提到如何构建自定义镜像,或者使用现有的镜像,如何处理应用配置文件的挂载,以及数据持久化的问题。比如,MySQL的数据目录应该使用卷来持久化,避免容器重启后数据丢失。同时,健康检查的设置可以确保服务依赖正确启动。 最后,用户可能想知道部署后的基本管理命令,如启动、停止、查看状态等,这些也应该包含在回答中。确保所有命令和示例都是正确且经过验证的,避免用户执行时出现错误。 总结来说,回答需要覆盖docker-compose的基本用法、示例文件解析、常见配置项说明、部署命令和调试方法,同时针对Spring Boot应用提供针对性的建议,帮助用户顺利完成容器化部署。</think>以下是使用`docker-compose.yml`部署容器的完整指南,包含关键配置项解析和最佳实践: --- ### 一、基础部署流程 1. **编写`docker-compose.yml`文件**(示例) ```yaml version: '3.8' # 推荐使用3.x版本 services: webapp: image: your-webapp-image:latest # 你的应用镜像 container_name: my_webapp ports: - "8080:8080" # 宿主机端口:容器端口 environment: - SPRING_PROFILES_ACTIVE=prod - DB_URL=jdbc:mysql://mysql_db:3306/appdb depends_on: - mysql_db networks: - app_network mysql_db: image: mysql:8.0 container_name: mysql_db ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: rootpass MYSQL_DATABASE: appdb MYSQL_USER: appuser MYSQL_PASSWORD: userpass volumes: - mysql_data:/var/lib/mysql networks: - app_network healthcheck: # 健康检查确保数据库就绪 test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 5s timeout: 10s retries: 5 volumes: mysql_data: # 持久化MySQL数据 networks: app_network: # 创建专用网络 driver: bridge ``` 2. **启动服务** ```bash # 启动所有服务(后台模式) docker-compose up -d # 查看运行状态 docker-compose ps # 查看实时日志 docker-compose logs -f webapp ``` 3. **常用命令** ```bash # 停止并删除容器 docker-compose down # 重建镜像后重启 docker-compose up -d --build # 进入容器执行命令 docker-compose exec webapp sh ``` --- ### 二、核心配置项详解 #### 1. **服务依赖控制** ```yaml depends_on: - mysql_db - redis ``` - **问题**:默认仅控制启动顺序,不等待服务就绪 - **解决方案**:结合`healthcheck`确保依赖服务可用 #### 2. **环境变量管理** ```yaml # 方式1:直接定义 environment: - DB_HOST=mysql_db # 方式2:引用.env文件(推荐) env_file: - .env ``` `.env`文件内容: ```properties DB_HOST=mysql_db DB_PORT=3306 ``` #### 3. **多环境配置策略 ```yaml # 使用多个compose文件 docker-compose -f docker-compose.yml -f docker-compose.prod.yml up ``` #### 4. **资源限制 ```yaml deploy: # 仅适用于Swarm模式 resources: limits: cpus: '0.50' memory: 512M reservations: cpus: '0.25' memory: 256M ``` --- ### 三、生产环境最佳实践 1. **镜像安全** ```yaml # 使用特定版本标签代替latest image: your-registry/app:v1.2.3 # 启用内容信任 export DOCKER_CONTENT_TRUST=1 ``` 2. **日志管理 ```yaml logging: driver: "json-file" options: max-size: "10m" max-file: "3" ``` 3. **网络隔离 ```yaml networks: app_network: driver: bridge internal: true # 禁止外部访问 ``` 4. **密钥管理 ```yaml secrets: db_password: file: ./secrets/db_password.txt services: mysql_db: environment: MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_password secrets: - db_password ``` --- ### 四、常见问题排查 #### 1. 端口冲突 ```bash # 查看端口占用 sudo lsof -i :8080 # 修改compose文件端口映射 ports: - "8081:8080" ``` #### 2. 服务启动顺序问题 ```yaml # 使用wait-for脚本(官方推荐) command: ["./wait-for-it.sh", "mysql_db:3306", "--", "java", "-jar", "app.jar"] ``` #### 3. 数据卷权限问题 ```yaml volumes: - ./data:/var/lib/mysql:z # SELinux上下文 - app_data:/data:rw # 明确读写权限 ``` --- ### 五、高级技巧 1. **多阶段构建集成** ```yaml services: webapp: build: context: . target: runtime-stage # 引用Dockerfile中的构建阶段 image: final-app-image ``` 2. **动态扩缩容** ```bash # 横向扩展web服务实例 docker-compose up -d --scale webapp=3 ``` 3. **GPU支持 ```yaml deploy: resources: reservations: devices: - driver: nvidia count: 1 capabilities: [gpu] ``` --- 通过合理配置`docker-compose.yml`,可以实现: - 一键部署复杂多服务应用 - 版本控制基础设施配置 - 快速复制环境(开发、测试、生产) - 资源隔离和优化分配 建议结合CI/CD流水线实现自动化部署,同时使用`docker-compose config`命令验证配置文件语法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值