一、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