Docker进阶篇

一、基础回顾

Docker基础

二、DockerCompose介绍

2.1 简介

Docker

DockerFile build run 这些命令都要手动操作,单个容器还好

对于很多微服务,100个微服务?麻烦

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

2.1.1 官方介绍

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

定义、运行多个容器

yaml file配置文件

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 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:

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

Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment.

Run docker-compose up and Compose starts and runs your entire app.

Compose是一个用于定义和运行多容器Docker应用程序的工具。使用Compose,您可以使用YAML文件来配置应用程序的服务。然后,只需一个命令,就可以从配置中创建并启动所有服务。要了解关于Compose的所有特性的更多信息,请参见特性列表。

在所有环境中组合工作:生产、分段、开发、测试,以及CI工作流。您可以在常见用例中了解关于每种用例的更多信息。

使用Compose基本上有三个步骤:

用Dockerfile定义你的应用程序的环境,这样它就可以在任何地方复制。

在docker-compose中定义组成应用程序的服务。yml可以在一个隔离的环境中一起运行。

运行docker-compose up,然后Compose启动并运行整个应用程序。

启动项目

作用:批量容器编排

理解:

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

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

Compose

version: "3.9"  # optional since v1.27.0
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    links:
      - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

Compose:重要的概念

服务services,容器,应用。(web、redis、mysql..)

项目project。一组关联的容器。

2.2 安装compose

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

2.2.1 下载

下载地址

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

# 2.授权
sudo chmod +x /usr/local/bin/docker-compose

2.3 体验

官方示例

2.3.1 创建文件夹

$ mkdir composetest
$ cd composetest

2.3.2 新建app.py

刷新计数加1

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)

2.3.3 新建requirements.txt

flask
redis

2.3.4 创建Dockerfile

FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]

2.3.5 创建docker-compose.yml

定义整个服务,需要的环境。web、redis、完整的上线服务

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

# 此compose文件定义了两个服务,web和redis,该web服务
使用从Dockerfile当前目录中构建的镜像
将容器上的公开端口5000转发到主机上的端口5000。我们使用Flask web服务器的默认端口5000.
该redis服务使用从Docker hub注册表中提取的公共Redis镜像

2.3.6 启动compose项目

docker-compose up

docker images

之前一个一个run

默认的服务名 文件名_服务名_num

多个服务器。集群,A,B _num副本数量

redis服务->4个副本

集群状态,服务都不可能只有一个运行实例。弹性

 

 10个服务->项目(项目中的内容都在同一个网络,这样就可以通过域名来访问)

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

2.3.7 停止

在yaml文件目录下 

docker-compose down 或者 ctrl + C

以前都是单个docker run启动容器,docker-compose,通过docker-compose编写yaml配置文件、可以通过compose一键启动所有服务,一键停止!

2.3.8 Docker小结

1.Docker镜像。run->容器

2.Docker构建镜像(服务打包)

3.docker-compose启动项目(编排、多个微服务/环境)

4.Docker网络

2.4 yaml规则

2.4.1 简介

docker-compose.yaml核心

https://docs.docker.com/compose/compose-file/compose-versioning/

# 3层

version: '' # 版本
services: # 服务
    服务1: web
        # 服务配置
        images
        build
        network
        ...
    服务2: redis
        ...
    服务3: redis
        ...
# 其他配置 网络/卷、全局规则
volumes:
networks:
configs:

2.4.2 示例

version: "2.4"
services:
  web:
    build: .
    ports:
     - "5000:5000"
    volumes:
     - .:/code
    networks:
      - front-tier
      - back-tier
  redis:
    image: redis
    volumes:
      - redis-data:/var/lib/redis
    networks:
      - back-tier
volumes:
  redis-data:
    driver: local
networks:
  front-tier:
    driver: bridge
  back-tier:
    driver: bridge

2.5 使用Compose一键部署wp博客

2.5.1 博客简介

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

compose应用->一键启动

官方示例

2.5.2 新建文件夹

mkdir my_wordpress

 2.5.3 编写docker-compose.yml

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: {}

2.5.4 docker-compose up启动 

2.5.5 测试访问

http://192.168.208.129:8000/

 

2.6 自己编写微服务上线

2.6.1 编写项目微服务

@RestController
public class HelloController {

    @Autowired
    StringRedisTemplate redisTemplate;

    @GetMapping("/hello")
    public String hello() {
        Long views = redisTemplate.opsForValue().increment("views");
        return "hello, docker" + views;
    }
}
server.port=8080
spring.redis.host=redis

 2.6.2 dockerfile构建镜像

FROM java:8

COPY *.jar /app.jar

CMD ["--server.port=8080"]

EXPOSE 8080

ENTRYPOINT ["java","-jar","/app.jar"]

2.6.3 docker-compose.yaml编排项目 

version: '3.8'
services:
  jakapp:
    build: . # 当前目录下的Dockerfile,等价于下面dockerfile
#      dockerfile: Dockerfile
    image: jakapp
    depends_on: # 先启动redis在启动jakapp
      - redis
    ports:
      - "8080:8080"
  redis:
    image: "redis:alpine"

2.6.4 丢到服务器docker-compose up

 

2.6.5 测试

假设项目要重新部署打包

docker-compose up --build #重新构建

三、Swarm

3.1 搭建集群

私网、公网

172.24.82.149用自己的

初始化节点 docker swarm init

docker swarm join加入一个节点

# 获取令牌
docker swarm join-token manager
docker swarm join-token worker

把后面的节点都搭建进去

1.生产主节点init

2.加入(管理者,worker)

3.2 Raft协议

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

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

视频教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值