侧边栏壁纸
博主头像
canary 博主等级

行动起来,活在当下

  • 累计撰写 7 篇文章
  • 累计创建 1 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

【云原生】Docker-Compose介绍、安装与使用

Administrator
2025-04-15 / 0 评论 / 0 点赞 / 10 阅读 / 0 字

一、Docker Compose介绍

  • Docker-Compose是Docker官方的开源项目,负载实现对Docker容器集群的快速编排。作用是定义及运行多个Docker容器

  • Docker-Compose非常适合使用多个容器进行开发的场景

  • Docker-Compose允许用户通过一个单独的docker-compose.yml模板文件来定义一组相关联的应用容器为一个项目,它有2个重要的概念

# 服务(service):一个应用容器,实际上包括若干个应用容器实例。在docker-compose.yml中定义
​
# 项目(project):由一组关联的应用容器组成的一个完整业务单元,一个dokcer-compose.yml文件就代表一个项目

二、YAML文件格式编写注意事项

2.1、YAML文件格式

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

  • YAML数据结构通过缩进来表示,连续的项目通过“-”来表示,键值对用:分隔,数组用中括号[]括起来,bash用花括号{ }括起来

2.2、YAML文件格式注意事项

  • 不支持制表符tab键缩进,只能使用空格所经

  • 通常开头缩进2个空格

  • 字符后缩进一个空格,如冒号【:】、逗号【,】、横杠【-】

  • 用#号表示注释

  • 如果包含特俗字符用单引号【’ ‘】引起来作为普通字符,如果用双引号【“ ”】表示特殊字符本身的意思

  • 布尔值必须用【“ ”】括起来,如yes或no

  • YAML区分大小写

三、Docker-Compose使用

3.1、Docker-compose配置常用字段

字段

描述

build

指定Dockerfile文件名(要指定的Dockerfile文件需要在build标签的子级标签中使用dockerfile标签指定)

dockerfile

构建镜像上下文路径

context

可以是dockerfile路径,或者只当git仓库的url地址

images

指定镜像(已存在)

command

指定命令,会覆盖启动后默认指定的命令(会覆盖dockerfile中的CMD指令)

container_name

指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale指定容器数量

deploy

指定部署和运行相关配置,只能在swarm模式使用

environment

添加环境变量

networks

加入网络,引用顶级networks下条目

network-mode

设置容器的网络模式

ports

暴露容器端口,与-p相同,但是端口不能低于60

volumes

挂载一个宿主机目录或命令卷到容器,命令卷要在顶级volumes定义卷名称

volumes_from

从另一个服务或容器挂在卷,可选参数:ro和rw(仅版本2支持)

hostname

设置容器主机名

links

连接另一个容器,- 服务名称[:]

privileged

用来给容器root权限,注意不安全的,true

restart

重启策略,定义是否重启容器,no(默认策略,在容器退出时不重启容器),always(在容器退出时总是重启容器),no-failure(在容器非正常退出时,才会重启容器),unless-stoped(在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器)

depends_on

此标签用于解决容器的依赖,启动先后问题,如启动应用容器,需要先启动数据库容器。

3.2、Docker-compose常用命令

  • 运行这些命令需要结合docker-compose一起使用

  • 且必须要在含有docker-compose.yml文件的目录中才可以使用,不然会报错

命令

描述

build

重新构建服务

ps

列出容器

up

创建和启动容器

exec

在容器里面执行命令

scale

指定一个服务容器启动数量

top

显示正在运行的容器进程

logs

查看服务容器的日志输出

down

删除容器、网络、数据卷和镜像

stop/start/restart

停止/启动/重启服务

  • 运行容器

# 前台运行
docker-compose up
​
# 后台运行
docker-compose up -d
​
# 重启构建运行
docker-compose up --build -d
  • 关闭容器

# 关闭指定容器
docker-compose stop <容器名称>
示例
docker-compose stop nginx
​
​
# 全部关闭
docker-compose stop
  • 启动容器

# 启动指定容器
docker-compose start <容器名称>
示例
docker-compose start nginx
​
​
# 全部启动
docker-compose start
  • 删除

docker-compose down

3.3、使用Docker-compose步骤

  • 编写Dockerfile文件,定义应用程序的环境

  • 编写docker-compose.yml,定义应用程序的服务,以便他们可以在隔离的环境中一起运行

  • 运行docker-compose up 启动并运行整个应用程序

四、安装Docker-compose

4.1、方法一

  • 从github网站上下载Docker-compose二进制文件安装

[root@docker-01 ~]# curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
​
# 国内访问太慢,不推荐使用

4.2、方法二

  • 从阿里云镜像站下载Docker-compose二进制文件安装

# 下载阿里云docker-compose二进制文件
curl -L https://mirrors.aliyun.com/docker-toolbox/linux/compose/1.21.2/docker-compose-Linux-x86_64 -o /usr/local/bin/docker-compose
# 添加可执行权限
chmod +x /usr/local/bin/docker-compose
# 查看docker-compose版本
docker-compose -v

五、使用Docker-compose部署LNMP平台

5.1、创建工作目录

# 创建项目目录
[root@docker-01 ~]# mkdir -p /opt/lnmp
# 创建服务项目
[root@docker-01 ~]# mkdir -p /opt/lnmp/nginx
[root@docker-01 ~]# mkdir -p /opt/lnmp/mysql/conf
[root@docker-01 ~]# mkdir -p /opt/lnmp/mysql/data
[root@docker-01 ~]# mkdir -p /opt/lnmp/php
# 创建测试网络目录
[root@docker-01 ~]# mkdir -p /opt/lnmp/wwwroot

5.2、编写docker-compose.yml文件

[root@docker-01 ~]# cd /opt/lnmp/
[root@docker-01 lnmp]# vim docker-compose.yml
# 定义docker-compose版本
version: "3"
# 定义服务
services:
# 定义一个nginx服务
  nginx:
# nginx容器主机名
    hostname: nginx
    build:
# 指定nginx,Dockerfile文件上下文
      context: ./nginx
# 定义dockerfile文件的名字
      dockerfile: Dockerfile
# 暴露端口,将本机的80端口映射为容器的80端口,与run命令中的-p选项一样意思
    ports:
      - "80:80"
# 连接php容器
    links:
      - php
# 定义容器数据卷挂载
    volumes:
      - ./wwwroot:/usr/local/nginx/html

  php:
    hostname: php
    build: ./php
    links:
      - mysql
    volumes:
      - ./wwwroot:/usr/local/nginx/html

  mysql:
    hostname: mysql
    image: mysql:5.7.34
    ports:
      - "3306:3306"
    volumes:
      - ./mysql/conf:/etc/mysql/conf.d
      - ./mysql/data:/var/lib/mysql
# 添加环境变量,主要是设置一下数据库root密码
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: wordpress
      MYSQL_USER: user
      MYSQL_PASSWORD: user123

5.3、检测docker-compose.yml文件语法

  • 语法校验工具:docker-compose config

# 若文件语法正确则显示配置信息,若语法错误显示错误原因
docker-compose config

5.4、上传文件

# 把对应的dockerfile文件、nginx软件包、php软件包、测试网络上传到对应的目录下

5.5、查看文件目录

[root@docker-01 lnmp]# tree /opt/lnmp/
/opt/lnmp/
├── docker-compose.yml
├── mysql
│   ├── conf
│   │   └── my.cnf
│   └── data
├── nginx
│   ├── Dockerfile
│   ├── nginx-1.16.0.tar.gz
│   └── nginx.conf
├── php
│   ├── Dockerfile
│   ├── libzip-1.2.0.tar.gz
│   └── php-7.3.9.tar.gz
└── wwwroot
    ├── index.html
    └── test.php

6 directories, 10 files

5.6、创建并后台启动容器

# 必须在docker-compose.yml文件所在目录执行
[root@docker-01 lnmp]# docker-compose -f docker-c




-f:指定项目文件(可以省略)
-d:代表后台启动 不加代表前台启动

5.7、查看所有容器运行状态

[root@docker-01 lnmp]# docker-compose ps
    Name                  Command               State                          Ports                       
-----------------------------------------------------------------------------------------------------------
lnmp_mysql_1   docker-entrypoint.sh mysqld      Up      0.0.0.0:3306->3306/tcp,:::3306->3306/tcp, 33060/tcp
lnmp_nginx_1   /usr/local/nginx/sbin/ngin ...   Up      0.0.0.0:80->80/tcp,:::80->80/tcp                   
lnmp_php_1     /bin/sh -c /etc/init.d/php ...   Up      9000/tcp  

5.8、查看所有容器镜像

[root@docker-01 lnmp]# docker-compose images
 Container     Repository    Tag       Image Id      Size  
-----------------------------------------------------------
lnmp_mysql_1   mysql        5.7.34   09361feeb475   426 MB 
lnmp_nginx_1   lnmp_nginx   latest   e2da6042a3b4   548 MB 
lnmp_php_1     lnmp_php     latest   a837db37e73c   1.44 GB

5.9、访问测试

5.10、进入容器

# 查看所有容器状态
[root@docker-01 lnmp]# docker-compose ps
    Name                  Command               State                          Ports                       
-----------------------------------------------------------------------------------------------------------
lnmp_mysql_1   docker-entrypoint.sh mysqld      Up      0.0.0.0:3306->3306/tcp,:::3306->3306/tcp, 33060/tcp
lnmp_nginx_1   /usr/local/nginx/sbin/ngin ...   Up      0.0.0.0:80->80/tcp,:::80->80/tcp                   
lnmp_php_1     /bin/sh -c /etc/init.d/php ...   Up      9000/tcp

# 进入服务容器
[root@docker-01 lnmp]# docker-compose exec nginx bash

5.11、停止容器

# 停止nginx容器
[root@docker-01 lnmp]# docker-compose stop nginx

# 停止所有容器
[root@docker-01 lnmp]# docker-compose stop

5.12、查看容器日志

[root@docker-01 lnmp]# docker-compose logs -t -f nginx
# 选项解释
-t:输出时间
-f:实时输出

5.13、删除所有容器、网络、镜像、数据卷

# 删除所有容器、网络(不删除数据卷)
[root@docker-01 lnmp]# docker-compose down

# 删除所有容器、网络、镜像
[root@docker-01 lnmp]# docker-compose down --rmi all

# 删除所有容器、网络、数据卷
[root@docker-01 lnmp]# docker-compose down -v

六、扩展命令

# 手动构建或重新构建服务
docker-compose build

# 查看容器进程
docker-compose stop nginx

# 暂停容器
docker-compose pause nginx

# 恢复容器
docker-compose unpause nginx

# 停止容器
docker-compose kill nginx

# 重启所有容器
docker-compose restart

# 重启nginx容器
docker-compose restart nginx

七、Docker-compose额外示例

# 创建项目目录
[root@docker-01 ~]# mkdir demo
[root@docker-01 ~]# cd demo/
# 创建nginx工作目录
[root@docker-01 demo]# mkdir nginx
# 下载nginx源码包到nginx目录下
[root@docker-01 demo]# wget -P nginx/ http://nginx.org/download/nginx-1.15.2.tar.gz
# 创建nginx的Dockerfile文件
[root@docker-01 demo]# cat nginx/Dockerfile 
FROM centos:7.6.1810
RUN yum -y install gcc make pcre-devel zlib-devel tar zlib
ADD nginx-1.15.2.tar.gz /usr/src/
RUN cd /usr/src/nginx-1.15.2 \
&& mkdir /usr/local/nginx \
&& ./configure --prefix=/usr/local/nginx && make && make install \
&& ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
 
RUN rm -rf /usr/src/nginx-1.15.2
EXPOSE 80 
EXPOSE 443
 
CMD ["nginx","-g","daemon off;"]


# 创建mysql工作目录
[root@docker-01 demo]# mkdir mysql
# 创建mysql的Dockerfile文件
[root@docker-01 demo]# cat mysql/Dockerfile 
# 指定基础镜像
FROM mysql:5.7
# 修改编码方式
RUN echo "character-set-server=utf8" >> /etc/mysql/mysql.conf.d/mysqld.cnf
EXPOSE 3306
[root@docker-01 demo]# echo 'MYSQL_ROOT_PASSWORD=root' > mysql/mysql.env


# 创建项目文件docker-compose.yaml
[root@docker-01 demo]# cat docker-compose.yaml 
# 指定docker-compose版本
version: "3"
# 定义服务,此处定义了两个服务一个nginx一个redis
services:
  nginx:
    # 指定nginx构建镜像上下文路径
    build: ./nginx
    # 启动nginx之前先启动redis和mysql
    depends_on:
      - redis
      - mysql
    # 指定暴露的端口,也就是端口映射
    ports:
      - "80:80"
  redis:
    # 使用公用redis镜像创建容器
    image: "redis:alpine"
    ports: 
      - "6379:6379"

  mysql:
    # 指定构建镜像上下文路径
    build: 
      context: ./mysql
      dockerfile: Dockerfile
    # 从文件中添加环境变量
    env_file:
      - ./mysql/mysql.env
    ports:
      - "3306:3306"  

# 检查docker-compose文件语法
[root@docker-01 demo]# docker-compose config


# 运行docker-compose
[root@docker-01 demo]# docker-compose up -d

# 查看容器运行情况
[root@docker-01 demo]# docker-compose ps
    Name                  Command               State                          Ports                       
-----------------------------------------------------------------------------------------------------------
demo_mysql_1   docker-entrypoint.sh mysqld      Up      0.0.0.0:3306->3306/tcp,:::3306->3306/tcp, 33060/tcp
demo_nginx_1   nginx -g daemon off;             Up      443/tcp, 0.0.0.0:80->80/tcp,:::80->80/tcp          
demo_redis_1   docker-entrypoint.sh redis ...   Up      0.0.0.0:6379->6379/tcp,:::6379->6379/tcp   


0

评论区