狂神说Docker进阶版

Docker Compose

简介

Dockerfile build run 手动操作,单个容器!

微服务,100个微服务,依赖关系。

Docker Compose 来轻松高效的管理容器,定义运行多个容器。

官方介绍

  1. 定义运行多个容器
  2. YAML file配置文件
  3. single command。命令有哪些?

Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration. To learn more about all the features of Compose, see the list of features.

所有的环境都可以使用compose。

Compose works in all environments: production, staging, development, testing, as well as CI workflows. You can learn more about each case in Common Use Cases.

三步骤:

Using Compose is basically a three-step process:

  1. Define your app’s environment with a Dockerfile so it can be reproduced anywhere.

    • Dockerfile保证我们的项目再任何地方可以运行
  2. Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment.

    • services 什么是服务。
  3. Run docker-compose up and Compose starts and runs your entire app.

    • 启动项目

作用:批量容器编排

狂神的理解

Compose是Docker官方的开源项目,需要安装!

Dockerfile让程序在任何地方运行。web服务。redis、mysql、nginx… 多个容器。 run

Compose

version: '2.0'
services:
  web:
    build: .
    ports:
    - "5000:5000"
    volumes:
    - .:/code
    - logvolume01:/var/log
    links:
    - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

docker-compose up 100个服务

Compose:重要概念

  • 服务services, 容器、应用(web、redis、mysql…)
  • 项目project。 一组关联的容器.博客。web、mysql

安装

  1. 下载
# 官网提供 (没有下载成功)
curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
 
# 国内地址
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

2.授权

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

在这里插入图片描述

快速开始

python应用。 计数器。redis!

跟着官网做https://docs.docker.com/compose/gettingstarted/
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在Dockerfile文件第二行加入国内镜像


RUN echo -e http://mirrors.ustc.edu.cn/alpine/v3.7/main/ > /etc/apk/repositories


删掉Dockerfile文件中,“RUN apk add --no-cache gcc musl-dev linux-headers”
参考链接:https://github.com/docker/compose/issues/6292:

如果docker-compose up报错

在这里插入图片描述

img

sudo gpasswd -a ${USER} docker

感谢提功解决

[]: https://blog.csdn.net/yubo_725/article/details/89885429?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1

启动结果

在这里插入图片描述

启动的容器

在这里插入图片描述

没访问一次 会加一

在这里插入图片描述

总结

python应用。 计数器。redis!

  1. 应用app.py

  2. Dockerfile 应用打包为镜像

FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
 
# 官网的用来flask框架,我们这里不用它
# 这告诉Docker
# 从python3.7开始构建镜像
# 将当前目录添加到/code印像中的路径中
# 将工作目录设置为/code
# 安装Python依赖项
# 将容器的默认命令设置为python app.py
  1. Docker-compose yaml文件(定义整个服务,需要的环境 web、redis) 完整的上线服务!
version: '3.8'
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
  redis:
    image: "redis:alpine"
 
  1. 启动compose 项目 (docker-compose up)

流程

  1. 创建网络
  2. 执行Docker-compose.yaml
  3. 启动服务

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

网络规则

在这里插入图片描述

10个服务=》项目(项目中的内容都在同个网络下,域名访问)

docker network inspect [networkid]

在这里插入图片描述

如果在同一网络下,我们可以直接通过域名访问。

在这里插入图片描述

在这里插入图片描述

yaml规则

docker-compose.yaml 核心!

https://docs.docker.com/compose/compose-file/#compose-file-structure-and-examples

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

一键部署WP博客

https://docs.docker.com/compose/wordpress/

下载程序、安装数据库、配置…

compose应用 => 一键启动

在这里插入图片描述

[root@localhost home]# mkdir my_wordpress
[root@localhost home]# cd my_wordpress/
[root@localhost my_wordpress]# vi docker-compose.yml

docker-compose up #启动
version: '3.3'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
       WORDPRESS_DB_NAME: wordpress
volumes:
    db_data: {}
~                                                                                                                                                                                                                                                                                                                

在这里插入图片描述

在这里插入图片描述

自己编写微服务上线

在这里插入图片描述

在这里插入图片描述

Dockerfile构建镜像

FROM java:8
 
COPY *.jar /app.jar
 
CMD ["--server.port=8080"]
 
EXPOSE 8080
 
ENTRYPOINT ["java", "-jar", "/app.jar"]

docker-compose.yml编排项目

version '3.8'
services:
  xiaofanapp:
    build: .
    image: kuangapp
    depends_on:
      - redis
    ports:
      - "8080:8080"
 
  redis:
    image: "library/redis:alpine"

丢到服务器运行 docker-compose up

docker-compose down         # 关闭容器
docker-compose up   
docker-compose up --build   # 重新构建

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述在这里插入图片描述

总结:

工程、服务、容器

项目 compose: 三层

  • 工程 Project
  • 服务
  • 容器 运行实例! docker k8s 容器

Docker Swarm

购买服务器

  1. 登录阿里云账号,进入控制台,创建实例(4台服务器2G)

在这里插入图片描述

加粗样式

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

img

到此,我们的服务器购买成功!

四台机器安装docker

和我们单机安装一样

https://blog.csdn.net/fanjianhai/article/details/107860159

技巧: xshell直接同步操作,省时间!

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tk0ftDam-1637723718997)(C:\Users\zt\AppData\Roaming\Typora\typora-user-images\image-20211123200443913.png)]

在这里插入图片描述

在这里插入图片描述

Swarm集群搭建

工作机制:https://blog.csdn.net/qq_21197507/article/details/115071715

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

ip addr # 获取自己的ip(用内网的不要流量)
 
[root@iZ2ze58v8acnlxsnjoulk5Z ~]# docker swarm init --advertise-addr 172.16.250.97
Swarm initialized: current node (otdyxbk2ffbogdqq1kigysj1d) is now a manager.
To add a worker to this swarm, run the following command:
    docker swarm join --token SWMTKN-1-3vovnwb5pkkno2i3u2a42yrxc1dk51zxvto5hrm4asgn37syfn-0xkrprkuyyhrx7cidg381pdir 172.16.250.97:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.


初始化结点docker swarm init

docker swarm join 加入一个结点!

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. 生成主节点init
  2. 加入(管理者,worker)

Raft协议

双主双从:假设一个结点挂了!其他结点是否可以用!

Raft协议:保证大多数结点存活才可以使用,只要>1, 集群至少大于3台!

实验:

1、将docker1机器停止。宕机!双主,另外一个结点也不能使用了!

在这里插入图片描述

2.可以将其他结点离开docker swarm leave

在这里插入图片描述

worker就是工作的,管理结点操作! 3台结点设置为了管理结点。

Docker swarm集群增加节点

十分简单:集群,可用! 3个主节点。 > 1台管理结点存活!

Raft协议:保证大多数结点存活,才可以使用,高可用!

体会

弹性、扩缩容!集群!

以后告别 docker run!

docker-compose up!启动一个项目。单机!

集群: swarm docker-service

k8s service pods

容器 => 服务!

容器 => 服务! => 副本!

redis => 10个副本!(同时开启10个redis容器)

体验:创建服务、动态扩容服务、动态更新服务

在这里插入图片描述

灰度发布(金丝雀发布)

在这里插入图片描述

docker run 容器启动! 不具有扩缩容器
docker service 服务! 具有扩缩容器,滚动更新!

查看服务

在这里插入图片描述

动态扩缩容

[root@iZ2ze58v8acnlxsnjoulk5Z ~]# docker service update --replicas 3 my-nginx
1/3: running   [==================================================>] 
1/3: running   [==================================================>] 
2/3: running   [==================================================>] 
3/3: running   [==================================================>] 
verify: Service converged 
 
 
[root@iZ2ze58v8acnlxsnjoulk5Z ~]# docker service scale my-nginx=5
my-nginx scaled to 5
overall progress: 3 out of 5 tasks 
overall progress: 3 out of 5 tasks 
overall progress: 3 out of 5 tasks 
overall progress: 5 out of 5 tasks 
1/5: running   [==================================================>] 
2/5: running   [==================================================>] 
3/5: running   [==================================================>] 
4/5: running   [==================================================>] 
5/5: running   [==================================================>] 
verify: Service converged 
 
 
[root@iZ2ze58v8acnlxsnjoulk5Z ~]# docker service scale my-nginx=1
my-nginx scaled to 1
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service converged 
 

在这里插入图片描述

移出!docker service rm

docker swarm其实并不难

只要会搭建集群、会启动服务、动态管理容器就可以了!

概念的总结

swarm

集群的管理和编号,docker可以初始化一个swarm集群,其他结点可以加入。(管理,工作者)

Node

就是一个docker结点,多个结点就组成了一个网络集群(管理、工作者)

Service

任务,可以在管理结点或者工作结点来运行。核心,用户访问。

Task

容器内的命令、细节任务!

在这里插入图片描述

service

在这里插入图片描述

命令 -> 管理 -> api -> 调度 -> 工作结点(创建Task容器维护创建!)

服务副本和全局服务

在这里插入图片描述

调整service以什么方式运行

--mode string                        
Service mode (replicated or global) (default "replicated")
 
docker service create --mode replicated --name mytom tomcat:7 默认的
docker service create --mode global  --name haha alpine ping www.baidu.com

拓展: 网络模式 “PublishMode”:“ingress”

Swarm:

Overlay:

ingress:特殊的Overlay网络!负载均衡的功能!ipvs vip!

虽然docker在4台机器上,实际网络是同一个!ingress网络,是一个特殊的Coverlay网络

[root@iZ2ze58v8acnlxsnjoulk5Z ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
74cecd37149f        bridge              bridge              local
168d35c86dd5        docker_gwbridge     bridge              local
2b8f4eb9c2e5        host                host                local
dmddfc14n7r3        ingress             overlay             swarm
8e0f5f648e69        none                null                local
 
 
[root@iZ2ze58v8acnlxsnjoulk5Z ~]# docker network inspect ingress
[
    {
        "Name": "ingress",
        "Id": "dmddfc14n7r3vms5vgw0k5eay",
        "Created": "2020-08-17T10:29:07.002315919+08:00",
        "Scope": "swarm",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "10.0.0.0/24",
                    "Gateway": "10.0.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": true,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "ingress-sbox": {
                "Name": "ingress-endpoint",
                "EndpointID": "9d6ec47ec8309eb209f4ff714fbe728abe9d88f9f1cc7e96e9da5ebd95adb1c4",
                "MacAddress": "02:42:0a:00:00:02",
                "IPv4Address": "10.0.0.2/24",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.driver.overlay.vxlanid_list": "4096"
        },
        "Labels": {},
        "Peers": [
            {
                "Name": "cea454a89163",
                "IP": "172.16.250.96"
            },
            {
                "Name": "899a05b64e09",
                "IP": "172.16.250.99"
            },
            {
                "Name": "81d65a0e8c03",
                "IP": "172.16.250.97"
            },
            {
                "Name": "36b31096f7e2",
                "IP": "172.16.250.98"
            }
        ]
    }
]
 

其他命令学习方式

  • Docker Stack
docker-compose 单机部署项目
docker stack 集群部署
 
# 单机
docker-compose up -d wordpress.yaml
# 集群
docker stack deploy wordpress.yaml
  • Docker Secret
安全!配置密码!证书!
 
[root@iZ2ze58v8acnlxsnjoulk5Z ~]# docker secret --help
 
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
  • Docker Config
配置!
[root@iZ2ze58v8acnlxsnjoulk5Z ~]# 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
 

拓展到k8s

云原生时代

Go语言!必须掌握! Java Go!

并发语言!

B语言,C语言的创始人。Unix创始人 V8

–help

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


- Docker Config

```sh
配置!
[root@iZ2ze58v8acnlxsnjoulk5Z ~]# 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
 

拓展到k8s

云原生时代

Go语言!必须掌握! Java Go!

并发语言!

B语言,C语言的创始人。Unix创始人 V8

go指针

<think>好的,我现在需要处理用户关于Docker教程的查询,特别是询问“”相关的Docker教学内容。首先,用户提到的“”可能是一个博主或教育者,可能提供过Docker的教程。根据用户提供的引用内容,特别是引用[1]和引用[2],里面提到了Docker Compose的使用步骤和一些学习资源的情况。 接下来,我需要确认用户的具体需求。他们可能正在寻找Docker教程,或者想了解Docker的使用方法,特别是进阶内容如Docker Compose。用户引用的内容中提到了Dockerfile和docker-compose.yml的使用,这可能明他们对构建和编排容器化应用感兴趣。 然后,我需要整理已有的信息。引用[1]详细明了使用Docker Compose的三个步骤,这可以作为回答的一部分。同时,引用[2]提到的笔记涉及华为的Java校招面试题,这可能暗示教程内容不仅涵盖Docker,还结合了Java开发的实际应用,这对用户来可能是一个重要的学习点。 接下来,我需要考虑如何组织回答结构。用户希望结构清晰,分步骤解决问题。因此,我应该先介绍Docker教程的概况,然后分模块讲解核心内容,如Docker基础、镜像管理、网络与存储、Compose编排等,并结合引用中的具体例子,如Docker Compose的三步流程。 此外,用户要求生成相关问题,我需要根据教程内容提出相关问题,例如Dockerfile的作用、Compose的优化方法等,这样可以帮助用户进一步深入学习。 最后,需要确保所有技术术语和步骤描述准确,符合LaTeX格式要求,数学表达式正确使用$...$或$$...$$。同时,引用标识要自然地附加在相关段落末尾,如引用[^1]和[^2]。 总结步骤: 1. 介绍Docker教程及其结构。 2. 分模块详细讲解核心内容,引用相关部分。 3. 提供学习路径建议,如结合视频和笔记。 4. 生成相关问题,帮助用户深入理解。 现在需要检查是否符合所有系统级指令,特别是格式和引用部分,确保没有遗漏。同时,确认回答是否解决了用户的查询,并引导他们找到所需资源。</think>### Docker 教程解析 Docker 教程以实战为核心,适合从入门到进阶的学习者,内容涵盖基础操作、容器编排及与开发环境的结合。以下是核心知识点和教程结构: --- #### **1. Docker 基础与安装** - **核心概念**:容器与镜像的区别(容器是镜像的运行实例,镜像通过$Dockerfile$定义构建步骤)。 - **安装流程**:在 Linux 系统中使用命令`curl -fsSL https://get.docker.com | bash -s docker`一键安装[^1]。 --- #### **2. 镜像管理与 Dockerfile** - **自定义镜像**:通过编写$Dockerfile$定义环境依赖,例如: ```dockerfile FROM ubuntu:20.04 RUN apt-get update && apt-get install -y python3 COPY app.py /app/ CMD ["python3", "/app/app.py"] ``` 使用`docker build -t my-app .`构建镜像[^1]。 - **镜像分层机制**:每层只读且可复用,优化构建效率。 --- #### **3. 容器网络与数据卷** - **网络模式**:默认桥接网络 vs 自定义网络(`docker network create my-net`),容器间通过服务名通信。 - **数据持久化**:通过`-v`挂载宿主机目录(如`-v /data:/app/data`)或命名卷(`docker volume create db_volume`)[^1]。 --- #### **4. Docker Compose 编排** - **三步部署应用**: 1. 编写$Dockerfile$定义单服务环境。 2. 在$docker-compose.yml$中配置多服务依赖: ```yaml version: "3" services: web: build: . ports: ["5000:5000"] redis: image: "redis:alpine" ``` 3. 运行`docker compose up`启动全栈应用。 - **适用场景**:微服务架构、本地开发环境快速部署。 --- #### **5. 学习路径建议** - **实战结合理论**:通过视频教程(如B站资源)理解概念,配合笔记中的代码片段动手实验。 - **常见问题**:镜像构建优化(如减少层数)、Compose 服务依赖顺序控制(`depends_on`字段)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值