docker-compose

前言

Docker-Compose 项目由 Python 编写,调用 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理

一、Docker-Compose 简介

1. Dockerfile 与服务编排

我们知道使用一个 Dockerfile 模板文件可以定义一个单独的应用容器,如果需要定义多个容器就需要服务编排。服务编排有很多种技术方案,今天给大家介绍 Docker 官方产品 Docker-Compose。

Dockerfile 可以定义一个单独的应用容器;而 docker-compose 则允许用户在一个模板(YAML 格式)中定义一组相关联的应用容器(被称为一个 project,即项目),例如一个 Web 服务容器再加上后端的数据库服务容器(LNMP)等。

Docker-Compose 项目由 Python 编写,调用 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。

2. Docker-Compose 三层管理项

Docker-Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。

Docker-Compose 将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。

Docker-Compose 运行目录下的所有文件(docker-compose.yml,extends 文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。一个服务当中可包括多个容器实例。

Docker-Compose 并没有解决负载均衡的问题,因此需要借助其他工具实现服务发现及负载均衡,比如 Consul。

3. Docker-Compose 的配置文件

Docker-Compose 的工程配置文件默认为 docker-compose.yml,可通过环境变量COMPOSE_FILE 或 -f 参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器

4. YAML简介

YAML(语言)的设计目标,就是方便人类读写,它实质上是一种通用的数据串行化格式

它的基本语法规则如下:(# 表示注释说明)

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进时不允许使用Tab键,只允许使用空格
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

5. YAML支持的数据结构

  • 对象,键值对的集合

  • 数组,一组按次序排列的值,又称序列

  • 纯量,单个的,不可再分的值

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-deployment
    labels:
    app: nginx
    spec:
    replicas: 1
    selector:
    matchLabels:
    app: nginx
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 8080

6. 使用 YAML 时需要注意以下事项

大小写敏感

通过缩进表示层级关系

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

缩进的空格数目不重要,只要相同层级左对齐,通常开头缩进 2 个空格

用 # 号注释

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

如果包括特殊字符用单引号引起来会作为普通字符串处理,双引号特殊字符作为本身想表示的意思,例如 name: "Hi,\nTom"

7. Docker-Compose 配置常用字段

|----------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 常用字段 | 描述 |
| build | 指定Dockerfile文件名,要指定Dockerfile文件需要在build标签的子级标签中使用dockerfile标签指定 |
| dockerfile | 构建镜像上下文路径 |
| context | 可以是dockerfile的路径,或者是指向git仓库的url地址 |
| image | 指定镜像 |
| command | 执行命令,覆盖容器启动后默认执行的命令 |
| container name | 指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale |
| deploy | 指定部署和运行服务相关配置,只能在Swarm模式使用 |
| environment | 添加环境变量 |
| networks | 加入网络,引用顶级networks下条目 |
| ports | 暴露容器端口,与-p相同,但端口不能低于60 |
| volumes | 挂载一个宿主机目录或命令卷到容器,命名卷要在顶级volume定义卷名称 |
| volumes_from | 从另一个服务或容器挂载卷,可选参数:ro和:rw |
| hostname | 容器主机名 |
| sysctls | 在容器内设置内核参数 |
| links | 连接到另外一个容器,- 服务名称[:服务别名] |
| restart | 重启策略,默认为no,另有always/no-failure/unless-stoped no,默认策略,在容器退出时不重启容器。 no-failure,在容器非正常退出时(退出状态非0),才会重启容器。 on-failure:3,在容器非正常退出时重启容器,最多重启3次。 always,在容器退出时总是重启容器。 unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器 |
| |
| depends_on | 在使用Compose时,最大的好处就是少打启动命令,但一般项目容器启动的顺序是由要求的,如果直接从上到下启动容器,可能会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动应用容器,应用容器会因为找不到数据库而退出。depends_on标签用于解决容器的依赖、启动先后的问题 |

8. Docker-Compose 常用命令

|--------------------|----------------|
| 字段 | 描述 |
| build | 重新构建服务 |
| ps | 列出容器 |
| up | 创建和启动容器 |
| exec | 在容器里面执行 |
| scale | 指定一个服务容器启动数量 |
| top | 显示容器进程 |
| logs | 查看容器输出 |
| down | 删除容器、网络、数据卷和镜像 |
| stop/start/restart | 停止/启动/重启服务 |

9. Docker-Compose 文件结构

二、Docker-Compose 安装

Docker-Compose 是 Docker 的独立产品,因此需要安装 Docker 之后再单独安装 Docker-Compose

1. 安装 Docker

[root@docker ~]#curl -SsL http://101.34.22.188/shells/docker.sh > docker.sh
[root@docker ~]#bash docker.sh &> /dev/null
[root@docker ~]#systemctl status docker | grep Active
   Active: active (running) since 六 2021-12-04 12:16:16 CST; 1min 0s ago

2. 安装 Docker-Compose

#curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
 
[root@docker ~]#wget http://101.34.22.188/docker-compose/docker-compose -P /usr/local/bin/ &> /dev/null
[root@docker ~]#chmod +x /usr/local/bin/docker-compose
[root@docker ~]#docker-compose -v
docker-compose version 1.21.1, build 5a3f1a3

三、Docker-Compose 部署 Nginx

1. 准备依赖文件

[root@docker ~]#mkdir -p /opt/compose_nginx/nginx
[root@docker ~]#mkdir -p /opt/compose_nginx/wwwroot
[root@docker ~]#cd /opt/compose_nginx/nginx
[root@docker /opt/compose_nginx/nginx]#wget http://101.34.22.188/lnmp_wordpress/nginx-1.12.0.tar.gz &> /dev/null
[root@docker /opt/compose_nginx/nginx]#ls
nginx-1.12.0.tar.gz
[root@docker /opt/compose_nginx/nginx]#vim Dockerfile
[root@docker /opt/compose_nginx/nginx]#cat Dockerfile
FROM centos:7
MAINTAINER nginx:test
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make;useradd -M -s /sbin/nologin nginx
ADD nginx-1.12.0.tar.gz /usr/local/src/
WORKDIR /usr/local/src/nginx-1.12.0
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module;make -j 4 && make install
ENV PATH /usr/local/nginx/sbin:$PATH
EXPOSE 80
EXPOSE 443
VOLUME [ "/usr/local/nginx/html/" ]
CMD [ "/usr/local/nginx/sbin/nginx","-g","daemon off;" ]

2. 编写配置文件 docker-compose.yml

[root@docker /opt/compose_nginx/nginx]#cd ..
[root@docker /opt/compose_nginx]#vim docker-compose.yml
[root@docker /opt/compose_nginx]#cat docker-compose.yml
version: '3'
services:
  nginx:
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - 1216:80
      - 1217:443
    networks:
      - test
    volumes:
      - ./wwwroot:/usr/local/nginx/html
networks:
  test:
 
 
##参数说明
 
version: '3'					'//compose编排版本为3'
services:						'//服务:'
  nginx:						'//服务名称'
    hostname: nginx				'//容器主机名'
    build:						'//创建容器过程:'
      context: ./nginx			'//所需素材都在该目录(仓库)下'
      dockerfile: Dockerfile	'//指定Dockerfile文件'
    ports:						'//提供端口:'
      - 1216:80					'//对外提供(暴露)的端口'
      - 1217:443
    networks:					'//指定网络'
      - test					'//网络名称(群集名称需一致)'
    volumes:					'//数据卷'
      - ./wwwroot:/usr/local/nginx/html		'//将宿主机该仓库内文件与nginx首页文件相关联(容器)'
networks:		'//对外公开需要声明networks群集名称'
  test:

3. 生成镜像容器

[root@docker /opt/compose_nginx]#docker-compose -f docker-compose.yml up -d
[root@docker /opt/compose_nginx]#docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
compose_nginx_nginx   latest    eb67824e6021   33 seconds ago   472MB
centos                7         eeb6ee3f44bd   2 months ago     204MB
[root@docker /opt/compose_nginx]#docker ps -a
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                                                                            NAMES
98fe56f04f2a   compose_nginx_nginx   "/usr/local/nginx/sb..."   43 seconds ago   Up 41 seconds   0.0.0.0:1216->80/tcp, :::1216->80/tcp, 0.0.0.0:1217->443/tcp, :::1217->443/tcp   compose_nginx_nginx_1

参数说明

  • -f:使用特定的 compose 模板文件,默认为 docker-compose.yml
  • -p:指定项目名称,默认使用目录名称
  • -d:在后台运行

4. 访问测试

[root@docker /opt/compose_nginx/wwwroot]#echo "<h1>hello world</h1>" > index.html
[root@docker /opt/compose_nginx/wwwroot]#ls
index.html
[root@docker /opt/compose_nginx/wwwroot]#curl 192.168.223.53:1216
<h1>hello world</h1>

四、Docker-Compose 部署 LNMP

1. 编写 Dockerfile 文件

存放目录

[root@docker ~]#mkdir -p /opt/compose_lnmp/nginx/
[root@docker ~]#mkdir -p /opt/compose_lnmp/mysql/
[root@docker ~]#mkdir -p /opt/compose_lnmp/php/

文件配置

[root@docker ~]#ls /opt/compose_lnmp/nginx/
Dockerfile  nginx-1.12.0.tar.gz  nginx.conf  wordpress-4.9.4-zh_CN.tar.gz
[root@docker ~]#ls /opt/compose_lnmp/mysql/
Dockerfile  my.cnf  mysql-boost-5.7.20.tar.gz
[root@docker ~]#ls /opt/compose_lnmp/php/
Dockerfile  php-7.1.10.tar.bz2  php-fpm.conf  php.ini  www.conf

2. 编写配置文件 docker-compose.yml

[root@docker /opt/compose_lnmp]#cat docker-compose.yml
version: '2'
services:
  nginx:
    hostname: nginx
    build:
      context: /opt/compose_lnmp/nginx/
      dockerfile: Dockerfile
    ports:
      - 1111:80
      - 2222:443
    container_name: nginx_server
    networks:
      lnmp:
        ipv4_address: 172.111.0.10
 
  mysql:
    hostname: mysql
    build:
      context: /opt/compose_lnmp/mysql/
      dockerfile: Dockerfile
    ports:
      - 3306:3306
    container_name: mysql_server
    networks:
      lnmp:
        ipv4_address: 172.111.0.20
 
  php:
    hostname: php
    build:
      context: /opt/compose_lnmp/php/
      dockerfile: Dockerfile
    ports:
      - 9000:9000
    container_name: php_server
    networks:
      lnmp:
        ipv4_address: 172.111.0.30
 
networks:
  lnmp:
    driver: bridge
    ipam:
      config:
        - subnet: 172.111.0.0/16

3. 生成镜像容器

[root@docker /opt/compose_lnmp]#docker-compose -f docker-compose.yml up -d
......
[root@docker /opt/compose_lnmp]#docker images
REPOSITORY           TAG       IMAGE ID       CREATED              SIZE
compose_lnmp_php     latest    86b0447ebabd   About a minute ago   1.22GB
compose_lnmp_mysql   latest    59579ca01443   5 minutes ago        9.98GB
compose_lnmp_nginx   latest    82d760d5d811   17 minutes ago       528MB
centos               7         eeb6ee3f44bd   2 months ago         204MB
[root@docker /opt/compose_lnmp]#docker ps -a
CONTAINER ID   IMAGE                COMMAND                  CREATED              STATUS              PORTS                                                                            NAMES
53c87813597f   compose_lnmp_php     "/bin/sh -c '/usr/lo..."   About a minute ago   Up About a minute   0.0.0.0:9000->9000/tcp, :::9000->9000/tcp                                        php_server
2d671252967b   compose_lnmp_nginx   "/usr/local/nginx/sb..."   About a minute ago   Up About a minute   0.0.0.0:1111->80/tcp, :::1111->80/tcp, 0.0.0.0:2222->443/tcp, :::2222->443/tcp   nginx_server
9d5428cfdf54   compose_lnmp_mysql   "/usr/sbin/init"         About a minute ago   Up About a minute   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp                                        mysql_server

4. 启动 wordpress 服务

4.1 mysql 授权
[root@docker /opt/compose_lnmp]#docker exec -it mysql_server bash
[root@mysql bin]# mysql -u root -p
Enter password: 
#初始密码为空
mysql> create database wordpress;
Query OK, 1 row affected (0.00 sec)
 
mysql> grant all privileges on wordpress.* to 'wordpress'@'%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)
 
mysql> grant all privileges on *.* to 'root'@'%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)
 
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
4.2 浏览器访问测试

访问 http://192.168.223.53:11111/wordpress/index.php

相关推荐
梦游钓鱼21 分钟前
在window终端创建docker容器的问题
运维·docker·容器
孤寂大仙v28 分钟前
【Linux笔记】理解文件系统(上)
linux·运维·笔记
沉默的八哥1 小时前
K8S高可用Web应用部署方案
运维
winyh51 小时前
Vite 打包后Nginx部署配置
运维·nginx
钢板兽1 小时前
Java后端高频面经——JVM、Linux、Git、Docker
java·linux·jvm·git·后端·docker·面试
运维小贺2 小时前
Nginx常用的模块
运维·nginx·正则表达式
努力学习的小廉2 小时前
深入了解Linux —— 调试程序
linux·运维·服务器
努力学习的小廉2 小时前
深入了解Linux —— git三板斧
linux·运维·git
AI学IT3 小时前
(安全防御)旁挂组网双机热备负载分担实验
运维·服务器·网络
code monkey.4 小时前
【寻找Linux的奥秘】第一章:基础指令
linux·运维·服务器