Docker Compose与云原生初识

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 目前为止,我所有的操作都是围绕单个容器进行的

目前为止,我所有的操作都是围绕单个容器进行的,


但当我们的业务越来越复杂时,需要多个容器相互配合,例如需要数据库、nginx、web、spark…


当然可以写在一个docker file中,显然这是不推荐的:


因为

1、耦合

2、镜像臃肿


我们在写程序的时候不就是一直在避免这些事情吗?

一、应用场景


有时候需要多个主机组成容器集群才能满足我们的业务需求,这个时候就需要用到容器的编排工具了。因为容器编排工具可以帮助我们批量地创建、调度和管理容器,帮助我们解决规模化容器的部署问题。


编排工具主要有三种,本次主要讨论docker 官方推荐的docker compose

20210426222740769.png

二、概述


Docker Compose 的前身是 Orchard 公司开发的 Fig,2014 年 Docker 收购了 Orchard 公司,然后将 Fig 重命名为 Docker Compose。现阶段 Docker Compose 是 Docker 官方的单机多容器管理系统,它本质是一个 Python 脚本,它通过解析用户编写的 yaml 文件,调用 Docker API 实现动态的创建和管理多个容器。

20210426222850655.png

三、安装


(1)使用 curl 命令(一种发送 http 请求的命令行工具)下载 Docker Compose 的安装包:

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.27.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

如果你想要安装其他版本的 Docker Compose,将 1.27.3 替换为你想要安装的版本即可。


国内高速镜像

curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

(2)修改 Docker Compose 执行权限:

$ sudo chmod +x /usr/local/bin/docker-compose

(3)检查 Docker Compose 是否安装成功:

$ docker-compose --version
docker-compose version 1.27.3, build 1110ad01

离线安装: 先下载然后copy到/usr/local/bin

注意: 从github上下载的docker-compose是一个二进制可执行文件.

bin]# mv docker-compose-Linux-x86_64 docker-compose
]# ll
-rw-r--r-- 1 root root 12728384 Apr 27 17:20 docker-compose
]# 
]# chmod +x /usr/local/bin/docker-compose
[root@p1edaspk02 bin]# ll
-rwxr-xr-x 1 root root 12728384 Apr 27 17:20 docker-compose
]# docker-compose --version
docker-compose version 1.29.1, build c34c88b2

当我们执行完上述命令后,如果 Docker Compose 输出了当前版本号,就表示我们的 Docker Compose 已经安装成功。 Docker Compose 安装成功后,我们就可以很方便地使用它了。


在使用 Docker Compose 之前,我们首先需要先编写 Docker Compose 模板文件,因为 Docker Compose 运行的时候是根据 Docker Compose 模板文件中的定义来运行的。

四、编写Docker Compose 模板文件


在使用 Docker Compose 启动容器时, Docker Compose 会默认使用 docker-compose.yml 文件, docker-compose.yml 文件的格式为 yaml(类似于 json,一种标记语言)。


Docker Compose 模板文件一共有三个版本: v1、v2 和 v3。目前最新的版本为 v3,也是功能最全面的一个版本,下面我主要围绕 v3 版本介绍一下如何编写 Docker Compose 文件。


Docker Compose 文件主要分为三部分: services(服务)、networks(网络) 和 volumes(数据卷)。

2021042622311625.png

Docker Compose 文件主要分为三部分: services(服务)、networks(网络) 和 volumes(数据卷)。

2021042622322842.png

一个典型的 Docker Compose 文件结构如下:

version: "3"
services:
  nginx:
    ## ... 省略部分配置
networks:
  frontend:
  backend:
volumes:
  db-data:

编写 Service 配置


services 下,首先需要定义服务名称,例如你这个服务是 nginx 服务,你可以定义 service 名称为 nginx,格式如下:

version: "3.8"
services:
  nginx: 

服务名称定义完毕后,我们需要在服务名称的下一级定义当前服务的各项配置,使得我们的服务可以按照配置正常启动。常用的 16 种 service 配置如下。如果你比较了解,可以直接跳过看 Volume 配置和后续实操即可。

build


用于构建 Docker 镜像,类似于docker build命令,build 可以指定 Dockerfile 文件路径,然后根据 Dockerfile 命令来构建文件。使用方法如下:

build:
  ## 构建执行的上下文目录
  context: .
  ## Dockerfile 名称
  dockerfile: Dockerfile-name

cap_add、cap_drop


指定容器可以使用到哪些内核能力(capabilities)。使用格式如下:

cap_add:
  - NET_ADMIN
cap_drop:
  - SYS_ADMIN

command


用于覆盖容器默认的启动命令,它和 Dockerfile 中的 CMD 用法类似,也有两种使用方式:

command: sleep 3000
command: ["sleep", "3000"]

container_name


用于指定容器启动时容器的名称。使用格式如下:

container_name: nginx

depends_on


用于指定服务间的依赖关系,这样可以先启动被依赖的服务。例如,我们的服务依赖数据库服务 db,可以指定 depends_on 为 db。使用格式如下:

version: "3.8"
services:
  my-web:
    build: .
    depends_on:
      - db
  db:
    image: mysql

devices


挂载主机的设备到容器中。使用格式如下:

devices:
  - "/dev/sba:/dev/sda"

dns


自定义容器中的 dns 配置。

dns:
  - 8.8.8.8
  - 114.114.114.114

dns_search


配置 dns 的搜索域。

dns_search:
  - svc.cluster.com
  - svc1.cluster.com

entrypoint


覆盖容器的 entrypoint 命令。

entrypoint: sleep 3000
entrypoint: ["sleep", "3000"]

env_file


指定容器的环境变量文件,启动时会把该文件中的环境变量值注入容器中。

env_file:
  - ./dbs.env

env 文件的内容格式如下:

KEY_ENV=values

environment


指定容器启动时的环境变量。

environment:
  - KEY_ENV=values

image


指定容器镜像的地址。

image: busybox:latest

pid


共享主机的进程命名空间,像在主机上直接启动进程一样,可以看到主机的进程信息。

pid: "host"
端口。

ports


暴露端口信息,使用格式为 HOST:CONTAINER,前面填写要映射到主机上的端口,后面填写对应的容器内的

ports:
  - "1000"
  - "1000-1005"
  - "8080:8080"
  - "8888-8890:8888-8890"
  - "2222:22"
  - "127.0.0.1:9999:9999"
  - "127.0.0.1:3000-3005:3000-3005"
  - "6789:6789/udp"

networks


这是服务要使用的网络名称,对应顶级的 networks 中的配置。

services:
  my-service:
    networks:
     - hello-network
     - hello1-network

volumes


不仅可以挂载主机数据卷到容器中,也可以直接挂载主机的目录到容器中,使用方式类似于使用docker run启动容器时添加 -v 参数。

version: "3"
services:
  db:
    image: mysql:5.6
    volumes:
      - type: volume
        source: /var/lib/mysql
        target: /var/lib/mysql

volumes 除了上面介绍的长语法外,还支持短语法的书写方式,例如上面的写法可以精简为:

version: "3"
services:
  db:
    image: mysql:5.6
    volumes:
      - /var/lib/mysql:/var/lib/mysql

编写 Volume 配置


在多个容器间共享数据卷,则需要在外部声明数据卷,然后在容器里声明使用数据卷。例如我想在两个服务间共享日志目录,则使用以下配置:

version: "3"
services:
  my-service1:
    image: service:v1
    volumes:
      - type: volume
        source: logdata
        target: /var/log/mylog
  my-service2:
    image: service:v2
    volumes:
      - type: volume
        source: logdata
        target: /var/log/mylog
volumes:
  logdata:

编写 Network 配置


Docker Compose 文件顶级声明的 networks 允许你创建自定义的网络,类似于docker network create命令。


例如你想声明一个自定义 bridge 网络配置,并且在服务中使用它,使用格式如下

version: "3"
services:
  web:
    networks:
      mybridge: 
        ipv4_address: 172.16.1.11
networks:
  mybridge:
    driver: bridge
    ipam: 
      driver: default
      config:
        subnet: 172.16.1.0/24

五、Docker Compose 操作命令


使用docker-compose -h命令来查看 docker-compose 的用法,docker-compose 的基本使用格式如下:

  -f, --file FILE             指定 docker-compose 文件,默认为 docker-compose.yml
  -p, --project-name NAME     指定项目名称,默认使用当前目录名称作为项目名称
  --verbose                   输出调试信息
  --log-level LEVEL           日志级别 (DEBUG, INFO, WARNING, ERROR, CRITICAL)
  -v, --version               输出当前版本并退出
  -H, --host HOST             指定要连接的 Docker 地址
  --tls                       启用 TLS 认证
  --tlscacert CA_PATH         TLS CA 证书路径
  --tlscert CLIENT_CERT_PATH  TLS 公钥证书问价
  --tlskey TLS_KEY_PATH       TLS 私钥证书文件
  --tlsverify                 使用 TLS 校验对端
  --skip-hostname-check       不校验主机名
  --project-directory PATH    指定工作目录,默认是 Compose 文件所在路径。

COMMAND 为 docker-compose 支持的命令。支持的命令如下:

  build              构建服务
  config             校验和查看 Compose 文件
  create             创建服务
  down               停止服务,并且删除相关资源
  events             实时监控容器的时间信息
  exec               在一个运行的容器中运行指定命令
  help               获取帮助
  images             列出镜像
  kill               杀死容器
  logs               查看容器输出
  pause              暂停容器
  port               打印容器端口所映射出的公共端口
  ps                 列出项目中的容器列表
  pull               拉取服务中的所有镜像
  push               推送服务中的所有镜像
  restart            重启服务
  rm                 删除项目中已经停止的容器
  run                在指定服务上运行一个命令
  scale              设置服务运行的容器个数
  start              启动服务
  stop               停止服务
  top                限制服务中正在运行中的进程信息
  unpause            恢复暂停的容器
  up                 创建并且启动服务
  version            打印版本信息并退出

六、使用 Docker Compose 管理 WordPress


启动 WordPress


第一步

创建项目目录。首先我们在 /tmp 目录下创建一个 WordPress 的目录,这个目录将作为我们的工作目录。

$ mkdir /tmp/wordpress

第二步,进入工作目录。

$ cd /tmp/wordpress

第三步,创建 docker-compose.yml 文件。

$ touch docker-compose.yml

然后写入以下内容:

version: '3'
services:
   mysql:
     image: mysql:5.7
     volumes:
       - mysql_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: root
       MYSQL_DATABASE: mywordpress
       MYSQL_USER: mywordpress
       MYSQL_PASSWORD: mywordpress
   wordpress:
     depends_on:
       - mysql
     image: wordpress:php7.4
     ports:
       - "8080:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: mysql:3306
       WORDPRESS_DB_USER: mywordpress
       WORDPRESS_DB_PASSWORD: mywordpress
       WORDPRESS_DB_NAME: mywordpress
volumes:
    mysql_data: {}

第四步,启动 MySQL 数据库和 WordPress 服务。

$ docker-compose up -d
Starting wordpress_mysql_1 ... done
Starting wordpress_wordpress_1 ... done

执行完以上命令后,Docker Compose 首先会为我们启动一个 MySQL 数据库,按照 MySQL 服务中声明的环境变量来设置 MySQL 数据库的用户名和密码。然后等待 MySQL 数据库启动后,再启动 WordPress 服务。WordPress 服务启动后,我们就可以通过 http://localhost:8080 访问它了

停止 WordPress


$ docker-compose stop
Stopping wordpress_wordpress_1 ... done
Stopping wordpress_mysql_1     ... done

挑战


使用 Docker Compose 一键启动一个 LNMP 开发环境

七、为什么kuberneters越来越流行?


20210515210053247.png

八、什么是云原生


20210515210559768.png2021051521025141.png

20210515210318219.png

!](https://ucc.alicdn.com/images/user-upload-01/20210515210614252.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L015eVNvcGhpYQ==,size_16,color_FFFFFF,t_70)

20210515210702488.png


20210515210734191.png20210515210912321.png

2021051521095295.png

20210515211211758.png

20210515211321453.png20210515211534831.png

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
111 2
|
2月前
|
运维 Cloud Native 虚拟化
一文吃透云原生 Docker 容器,建议收藏!
本文深入解析云原生Docker容器技术,涵盖容器与Docker的概念、优势、架构设计及应用场景等,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
一文吃透云原生 Docker 容器,建议收藏!
|
2月前
|
关系型数据库 MySQL API
|
25天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
184 77
|
11天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
74 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
8天前
|
存储 Kubernetes Docker
Kubernetes(k8s)和Docker Compose本质区别
理解它们的区别和各自的优势,有助于选择合适的工具来满足特定的项目需求。
62 19
|
22天前
|
关系型数据库 MySQL Docker
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
84 24
|
24天前
|
关系型数据库 MySQL Docker
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
109 6
|
2月前
|
运维 Cloud Native 云计算
云原生之旅:Docker容器化实战
本文将带你走进云原生的世界,深入理解Docker技术如何改变应用部署与运维。我们将通过实际案例,展示如何利用Docker简化开发流程,提升应用的可移植性和伸缩性。文章不仅介绍基础概念,还提供操作指南和最佳实践,帮助你快速上手Docker,开启云原生的第一步。
|
2月前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。