Docker 进阶学习笔记

Docker Compose

Docker Compose |概述Docker 文档

1、Docker Compose 是什么

Compose 是用于定义和运行多容器 Docker 应用程序的工具。使用 Compose,您可以使用 YAML 文件来配置应用程序的服务。然后,使用单个命令,从配置中创建并启动所有服务。

Compose 使用的三个步骤:

  • 使用 Dockerfile 定义应用程序的环境

  • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行

  • 最后,执行 docker-compose up 命令来启动并运行整个应用程序

docker-compose.yml 的配置案例:

version: "3.9"  # 自 v1.27.0 起可选
services:
  web:
    build: .
    ports:
      - "8000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    links:
      - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

Compose 是官方开源项目,需要自行安装!

Compose 重要的概念:

  • 服务 services:容器。应用。(web、Redis、MySQL、…)
  • 项目 project:一组关联的容器。

2、Docker Compose 的安装

安装 Docker Compose |Docker 文档

  • Docker Compose 需要 Docker Engine

  • Docker Compose 插件需要 Docker CLI

2.1、下载
# github 上
$ sudo curl -L "https://github.com/docker/compose/releases/download/v2.6.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 国内镜像地址,可能比较快 
# 要安装其他版本的 Compose,请替换 v2.6.1
$ sudo curl -L https://get.daocloud.io/docker/compose/releases/download/v2.6.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

在这里插入图片描述

2.2、授权
$ sudo chmod +x /usr/local/bin/docker-compose
2.3、创建软链
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
2.4、检查是否安装成功
$ docker-compose --version

3、Docker Compose 初体验

开始使用 Docker Compose |Docker 文档

构建一个在 Docker Compose 上运行的简单 Python Web 应用程序。 该应用程序使用 Flask 框架并在 Redis 中维护一个命中计数器。

前提

同时安装了 Docker EngineDocker Compose

3.1、准备
  1. 为项目创建一个目录:
$ mkdir composetest
$ cd composetest
  1. 在项目目录中创建一个名为app.py的文件并将粘贴以下内容:
import time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)

@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)
  1. 创建在项目目录中调用的另一个文件,并将其粘贴到:requirements.txt
flask
redis
3.2、创建 Dockerfile

在此步骤中,您将编写一个用于构建 Docker 镜像的 Docker 文件。该映像包含 Python 应用程序所需的所有依赖项,包括 Python 本身。

在项目目录中,创建一个名为 Dockerfile 的文件并粘贴以下内容:

# syntax=docker/dockerfile:1
FROM python:3.7-alpine					# 从 Python 3.7 镜像开始构建镜像。
WORKDIR /code							# 将工作目录设置为: /code
ENV FLASK_APP=app.py					# 设置 FLASK 命令使用的环境变量
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers	# 安装 gcc 和其他依赖项
COPY requirements.txt requirements.txt				# 复制并安装 Python 依赖项。requirements.txt
RUN pip install -r requirements.txt	
EXPOSE 5000								# 容器暴露的端口: 5000
COPY . .								# 将项目中的当前目录复制到镜像中的工作目录。
CMD ["flask", "run"]					# 将容器的默认命令设置为:flask run
3.3、在 Compose 文件中定义服务

在您的项目目录中创建一个名为 docker-compose.yml 的文件并粘贴以下内容:

version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:5000"
  redis:
    image: "redis:alpine"

这个 Compose 文件定义了两个服务:webredis

  • web: 该 web 服务使用当前目录中的 Dockerfile 来构建镜像。 然后它将容器和主机绑定到暴露的端口8000,此示例服务使用 Flask Web 服务器的默认端口 5000
  • redis:该 redis 服务使用 Docker Hub 的公共 Redis 镜像。
3.4、使用 Compose 构建和运行创建的应用程序
  1. 从项目目录中,通过运行以下命令来启动应用程序:
$ docker-compose up

# 如果你想在后台执行该服务可以加上 -d 参数:
$ docke-compose up -d

流程:

在这里插入图片描述

  1. 访问测试

​ Web 应用现在应该在 Docker 守护程序主机上的端口 8000 上侦听,访问测试。刷新页面。该数字应递增。

$ curl localhost:8000
  1. 切换到另一个终端窗口,然后查看本地镜像。
# 查看容器
$ docker ps
# 查看本地镜像
$ docker images

在这里插入图片描述

  1. 停止运行

​ 通过在启动应用的原始终端中按 Ctrl+C 来停止应用程序。通过从第二个终端的项目目录中运行 docker compose down

^C  # ctrl+c
Gracefully stopping... (press Ctrl+C again to force)
[+] Running 2/2
 ⠿ Container composetest-web-1    Stopped                                                                                  10.2s
 ⠿ Container composetest-redis-1  Stopped                                                                                   0.3s
canceled
3.5、拓展

服务

[root@localhost ~]$ docker service ls
Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again

默认的服务名:文件名_服务名_num _num :表示副本数量。当有多个服务器部署集群时,进行了解。

网络

例:拥有10个服务的项目,项目中的内容都在同一个网络下、通过域名访问。如:MySQL:3306 ,这个 MySQL 就是一个域名,如果有10个MySQL容器实例,则有10个IP地址,用IP写死不灵活,可以使用域名来绑定这10个IP,到时直接使用域名就方便了。

在这里插入图片描述

在这里插入图片描述

在同一个网段下,可以通过域名来访问。以下为官方的例子:

在这里插入图片描述

理解

以前都是单个 docker run 启动。

docker-compose 通过编写 yml 配置文件,一键启动和停止所有的服务。

4、yml 配置指令

官网地址:Compose file version 3 reference | Docker Documentation

菜鸟教程:Docker Compose | 菜鸟教程 (runoob.com)

核心:docker-compose.yml , 可以分为3层。

# 三层
version: ""		# 1、版本
services:		# 2、服务
	服务1: web
	服务2: redis
	...
		# 服务配置 docker容器的配置
		
# 3、其他配置 网络、卷、全局规则
networks:
volumes:
configs:
version

指定本 yml 依从的 compose 哪个版本制定的。

build

指定为构建镜像上下文路径。

depends_on

设置依赖关系。

  • docker-compose up :以依赖性顺序启动服务。在以下示例中,先启动 db 和 redis ,才会启动 web。
  • docker-compose up SERVICE :自动包含 SERVICE 的依赖项。在以下示例中,docker-compose up web 还将创建并启动 db 和 redis。
  • docker-compose stop :按依赖关系顺序停止服务。在以下示例中,web 在 db 和 redis 之前停止。
version: "3.8"
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

注意: web 服务不会等待 redis db 完全启动之后才启动。

deploy

指定与服务的部署和运行有关的配置。只在 swarm 模式下才会有用。

多练习使用才能了解更多!

5、开源项目

快速入门:Compose 和 WordPress |Docker 文档

5.1、创建项目目录

创建一个空的项目目录

$ mkdir my_wordpress
$ cd my_wordpress/
5.2、编写 yml 文件

创建一个 docker-compose.yml 文件,该文件启动 WordPress blog 和一个单独的 MySQL 实例,该实例具有用于数据持久性的卷挂载:

version: "3.8"
services:
  db:
    # 我们使用支持 amd64 和 arm64 架构的 mariadb 镜像
    image: mariadb:10.6.4-focal
    # 如果您真的想使用 MySQL,请取消注释以下行
    image: mysql:8.0.27
    command: '--default-authentication-plugin=mysql_native_password'
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=somewordpress
      - MYSQL_DATABASE=wordpress
      - MYSQL_USER=wordpress
      - MYSQL_PASSWORD=wordpress
    expose:
      - 3306
      - 33060
  wordpress:
    image: wordpress:latest
    ports:
      - 80:80
    restart: always
    environment:
      - WORDPRESS_DB_HOST=db
      - WORDPRESS_DB_USER=wordpress
      - WORDPRESS_DB_PASSWORD=wordpress
      - WORDPRESS_DB_NAME=wordpress
volumes:
  db_data: {}
5.3、构建项目

注意: WordPress Multisite 仅适用于端口 80/443 。 如果您收到有关绑定到端口 0.0.0.0:80/443 的错误消息(取决于您指定的端口),则您为 WordPress 配置的端口可能已被其他服务使用。

$ docker-compose up
5.4、测试

注意: WordPress 站点无法立即在端口上使用,因为容器仍在初始化中,可能需要几分钟才能首次加载。

在浏览器中查看 WordPress:http://192.168.40.25:80

在这里插入图片描述

5.5、关机和清理
# 该命令会删除容器和默认网络,但保留您的 WordPress 数据库。
$ docker-compose down
# 该命令会删除容器、默认网络和 WordPress 数据库。
$ docker-compose down --volumes

6、实战

6.1、创建项目

使用IDEA创建 SpringBoot 项目,勾选 Spring WebSpring Data Redis

6.2、编写代码和配置文件

HelloController.java

/**
 * @desc
 * @auth llp
 * @date 2022年07月20日 23:48
 */
@RestController
public class HelloController {

    @Autowired
    private StringRedisTemplate redisTemplate;

    @RequestMapping("/hello")
    public String hello(){
        Long views = redisTemplate.opsForValue().increment("views");
        return "hello mianbao, docker compose views: " + views;
    }
}

application.properties

# 应用名称
spring.application.name=dockerComposeDemo
# 应用服务 WEB 访问端口
server.port=8080
# redis 地址
spring.redis.host=redis
6.3、编写 Dockerfile 构建镜像
FROM openjdk:8u332-jdk
# 服务器 dockerfile 和 jar 在同级目录
COPY *.jar /app.jar
CMD ["--server.port=8080"]
# 指定容器内要暴露的端口
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
6.4、编写 docker-compose.yml 编排项目
version: "3.8"
services:
  mianbao_app:
    # 当前目录下的 Dockerfile
    build: .
    image: mianbao_app
    depends_on:
      - redis
    ports:
      - "8080:8080"
  redis:
    image: "redis:alpine"
6.5、打成 Jar 包上传 Jar包

在这里插入图片描述

6.6、运行
$ docker-compose up

在这里插入图片描述

访问测试:192.168.40.25:8080/hello

防火墙记得打开端口:

firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --add-port=8080/tcp
firewall-cmd --reload
# 查看已开启的端口
firewall-cmd --list-port

在这里插入图片描述

Docker Swarm

Swarm mode overview | Docker Documentation

如何工作

Docker Engine 1.12 引入了 swarm 模式,使您能够创建一个由一个或多个 Docker 引擎组成的集群,称为 swarm。 一个 swarm 由一个或多个节点组成:在 swarm 模式下运行 Docker Engine 1.12 或更高版本的物理机或虚拟机。

有两种类型的节点:管理节点 and 工作节点. woker就是工作的,manager就是操作的。

在这里插入图片描述

如果您还没有,请通读 swarm 模式概述关键概念

命令

$ docker swarm --help
使用方式:  docker swarm COMMAND
管理集群
命令:
  ca          显示和旋转 root CA
  init        初始化一个集群
  join        作为节点和/或管理器加入集群
  join-token  管理加入令牌
  leave       离开集群
  unlock      解锁集群
  unlock-key  管理解锁密钥
  update      更新集群

运行 'docker swarm COMMAND --help' 以获取有关命令的更多信息。

$ docker swarm  init --help
Usage:  docker swarm init [OPTIONS]
Initialize a swarm
Options:
      --advertise-addr string                  广播地址 (format: <ip|interface>[:port])
# 获取令牌
$ docker swarm join-token manager
$ docker swarm join-token worker

# 查看集群节点
$ docker node ls

Raft 协议

保证大多数节点存活才可以使用。3个主节点的集群要大于1个管理节点存活。

了解容器==>服务 的概念

$ docker service --help
使用方式:  docker service COMMAND
管理服务
命令:
  create      创建新服务
  inspect     显示一项或多项服务的详细信息
  logs        获取服务或任务的日志
  ls          列出服务
  ps          列出一项或多项服务的任务
  rm          删除一项或多项服务
  rollback    恢复对服务配置的更改
  scale       扩展一个或多个复制服务
  update      更新服务
运行 'docker service COMMAND --help' 以获取有关命令的更多信息。
$ docker run  容器启动!不具有扩缩容
$ docker servcice 服务!具有扩缩容,滚动更新

总结

搭建集群、启动服务、动态管理容器。

Docker stack

docker-compose : 单机部署项目

docker-stack: 集群部署

# 单机
$ docker-compose up -d wordpress.yml
# 集群
$ docke-stack deploy wordpress.yml

[root@localhost mianbao_app]# docker stack --help

Usage:  docker stack [OPTIONS] COMMAND

Manage Docker stacks

Options:
      --orchestrator string   Orchestrator to use (swarm|kubernetes|all)

Commands:
  deploy      Deploy a new stack or update an existing stack
  ls          List stacks
  ps          List the tasks in the stack
  rm          Remove one or more stacks
  services    List the services in the stack

Run 'docker stack COMMAND --help' for more information on a command.

Docker Secret

[root@localhost mianbao_app]# docker secret

Usage:  docker secret COMMAND

Manage Docker secrets

Commands:
  create      Create a secret from a file or STDIN as content
  inspect     Display detailed information on one or more secrets
  ls          List secrets
  rm          Remove one or more secrets

Run 'docker secret COMMAND --help' for more information on a command.

Docker Config

[root@localhost mianbao_app]# docker config --help

Usage:  docker config COMMAND

Manage Docker configs

Commands:
  create      Create a config from a file or STDIN
  inspect     Display detailed information on one or more configs
  ls          List configs
  rm          Remove one or more configs

Run 'docker config COMMAND --help' for more information on a command.

K8s

Kubernetes(k8s)中文文档 Kubernetes概述_Kubernetes中文社区

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值