一、Docker数据持久化
Container中的数据仅限在Contrainer中存储,对于MySQL这种容器应用,需要把数据保存在本地,这就需要用到容器的数据持久化
Docker数据持久化的方案有两种
- 基于本地文件系统的Volume,可以在执docker create 或者docker run命令时,通过-v参数将主机的目录作为容器的数据卷。将容器产生的数据保存在宿主机的文件系统中
- 基于plugin的Volume,支持第三方存储方案,如aws
Volume数据卷
Volume的类型有两种,一种是受管理的data volume,由docker创建;另外一种是绑定挂载的volume,即由用户指定文件系统中已存在的具体目录
首先安装一个vagrant插件 vagrant-scp,用于将宿主机的文件拷贝的vagrant管理的虚拟机上
vagrant plugin install vagrant-scp 复制代码
数据持久化DataVolume
创建mysql容器,验证数据持久化Data Volume
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文件内容
# 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文件内容
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>hello</title> </head> <body> <h1>Hello Docker! </h1> </body> </html> 复制代码
启动一个nginx容器,将vloume挂载到一个宿主机中已存在的文件系统中,在本地修改这个文件或者增加文件,从docker中查看是否也出现相应的修改或者新增加的文件
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容器中生效
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
如
services: db: image: mysql:8.0.19 volumes: - "db-data:/var/lib/mysql/data" networks: - back-tier 复制代码
就类似命令行
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
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,设置容器的数量,水平扩展
# 将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
