From Docker to Kubernetes(三)- Docker Volume&Compose

2022-08-19 16:33:30 浏览数 (1)

一、Docker数据持久化

Container中的数据仅限在Contrainer中存储,对于MySQL这种容器应用,需要把数据保存在本地,这就需要用到容器的数据持久化

Docker数据持久化的方案有两种

  • 基于本地文件系统的Volume,可以在执docker create 或者docker run命令时,通过-v参数将主机的目录作为容器的数据卷。将容器产生的数据保存在宿主机的文件系统中
  • 基于plugin的Volume,支持第三方存储方案,如aws

Volume数据卷

Volume的类型有两种,一种是受管理的data volume,由docker创建;另外一种是绑定挂载的volume,即由用户指定文件系统中已存在的具体目录

首先安装一个vagrant插件 vagrant-scp,用于将宿主机的文件拷贝的vagrant管理的虚拟机上

代码语言:javascript复制
vagrant plugin install vagrant-scp

数据持久化DataVolume

创建mysql容器,验证数据持久化Data Volume

代码语言:javascript复制
docker run -d --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
docker ps
# 查看volume 列表
docker volume ls
# 查看volume详情,Mountpoint表示容器数据存储在本地的位置
docker volume inspect <VOLUME NAME>


docker run -d --name mysql2 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
docker volume ls
docker volume inpsect <VOLUME NAME>
# 停止并删除容器
docker stop mysql1
docker stop mys1l2
docker rm mysql1
docker rm mysql2
# 查看volume列表
docker volume ls
# 删除docker volume
# docker volume rm <VOLUME NAME>


# 创建容器时指定volume, -v指定volume名字 ,:后面是存储地址
docker run -d --name mysql1 -v mysql:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
# 进入容器,进入mysql,创建一个表docker
docker exec -it mysql1 /bin/bash
mysql -u root -p
create database docker
exit
exit
docker stop mysql1
docker rm mysql1
# 新建一个容器mysql2,使用之前的volume
docker run -d --name mysql2 -v mysql:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
docker exec -it mysql2 /bin/bash
mysql -u root -p
# 包含之前创建的docker表
show databases;

数据持久化Bind Mounting

指定本地一个目录和容器中的一个目录一一对应,是同步的,做了映射,一个做了修改另外一个也会自动作相应的修改

Dockerfile文件内容

代码语言:javascript复制
# this same shows how we can extend/change an existing official image from Docker Hub


FROM nginx:latest
# highly recommend you always pin versions for anything beyond dev/learn


WORKDIR /usr/share/nginx/html
# change working directory to root of nginx webhost
# using WORKDIR is prefered to using 'RUN cd /some/path'


COPY index.html index.html


# I don't have to specify EXPOSE or CMD because they're in my FROM

index.html文件内容

代码语言:javascript复制
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">


  <title>hello</title>


</head>


<body>
  <h1>Hello Docker! </h1>
</body>
</html>

启动一个nginx容器,将vloume挂载到一个宿主机中已存在的文件系统中,在本地修改这个文件或者增加文件,从docker中查看是否也出现相应的修改或者新增加的文件

代码语言:javascript复制
docker build -t jingnanjia/my-nginx .
# -v 表示使用目录映射 $(pwd)表示当前(宿主机)地址,/usr/share/nginx/html是容器的地址
docker run -d --name web -p 80:80 -v $(pwd):/usr/share/nginx/html jingnanjia/my-nginx
docker exec -it web /bin/bash
# 查看文件中的文件,与对应宿主机当前目录下的文件一致
ls
# 创建新文件
touch test.txt
exit
# 查看宿主机当前文件夹下是否出现了容器中创建的test.txt文件
ll

Docker Bind Mount

Bind Mount 可以实时修改文件,实时在Docker容器中生效

代码语言:javascript复制
docker build -t jingnanjia/flask-skeleton .
# 如果报错没有权限,要先把文件设置可执行权限,重新build镜像,在创建容器
docker run -d --name flask-skeleton -p 80:5000 jingnanjia/flask-skeleton
# 停止并删除容器
docker stop flask-skeleton
docker rm flask-skeleton
# 重新创建一个容器,使用BindMount
docker run -d --name flask -p 80:5000 -v $(pwd):/skeleton jingnanjia/flask-skeleton
# 修改宿主机下文件,docker容器中映射的文件也会自动改变

二、Docker Compose

Docker Compose是一个工具

  • 可以批量操作容器
  • 可以通过一个yml文件定义多个容器的docker应用
  • 可以通过一条命令使用指定的yml文件中的定义来创建或者管理多个容器

Docker Compose解决了多容器创建和管理的问题。

Docker Compose中三大概念 Services:Docker Compose中的service就是之一个容器,容器即服务,这个容器可以是从docker hub中拉取到的image创建的,也可以是本地Dockerfile创建的 Service的启动类似docker run,可以指定network和volume

代码语言:javascript复制
services:
    db: 
       image: mysql:8.0.19
       volumes:
           - "db-data:/var/lib/mysql/data"
       networks:
           - back-tier

就类似命令行

代码语言:javascript复制
docker run -d --network back-tier -v db-data:/var/lib/mysql/data mysql:8.0.19

Docker Compose的安装和基本使用

Linux环境docker-compose安装,Mac,Windows安装docker时就已经安装好了docker-compose

代码语言:javascript复制
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod  x /usr/local/bin/docker-compose
# 也可使用docker compose
docker-compose --version
# 安装应用
cd wordpress
# 可以直接使用docker compose up,添加-d参数,不显示日志,后台启动
docker compose -f docker-compose.yml up
# 查看docker-compose.yml文件中容器的启动情况
docker compose ps
# 停止yml文件中容器
docker compose stop
# 停止,删除yml文件中的容器,存储,网络
docker compose down
docker compose start
# 查看yml文件的镜像
docker-compose images
# 进入yml文件中mysql service,以bash命令打开,即进入容器中
docker compose exec mysql bas

水平扩展和负载均衡

scale 命令,Set number of containers for a service,设置容器的数量,水平扩展

代码语言:javascript复制
# 将web容器扩展为3个,-d表示后台启动
docker compose up --scale web=3 -d
docker compose ps
cd ../lb-scale
docker compose up -d
curl 127.0.0.1:8080
docker compose up --scale web=3 -d
# 缩减容器数量
docker compose up --scale web=1 -d

0 人点赞