在docker中、image是只读层。container是在image层面上、增加了一个可读写的层面。
数据持久化的方案
基于本地文件系统的Volume
可以在执行Docker create或Docker run时,通过-v参数将主机的目录作为容器的数据卷。这部分功能便是基于本地文件系统的volume管理。
基于plugin的volume
支持第三方的存储方案,比如nas,aws
volume的类型
受管理的data volume,由docker后台自动创建。
绑定挂在的volume,具体挂在为位置由用户指定。
Data volume
在docker hub上的mysql官方源的Dockerfile中有指定volume关键字
添加国内镜像源加速
$ sudo vi /etc/docker/daemon.json
# 加入以下内容
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
sudo systemctl restart docker
下载mysql并且启动它
docker run -d –name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD mysql
发现并没有启动它 、docker ps
用docker logs mysql1查看原因
删除容器和volume然后重建一个
docker run -d --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
docker volume查看 启动的volume name
docker volume inspect b5ec010ee2fe5bfdc0f618dcf68dc4c6f4fbe6e51ed8d5cb9e39f1b0f9fcb72d
这个volume的名字不怎么友好、如果另起一个cantainer的话指定volume的名字也不太好。
重新指定volume参数来指定volume的值
#
docker run -d -v mysql:/var/lib/mysql --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true my
sql
#
进入创建一个数据库
推出强制删除mysql1然后新建一个mysql2
强制删除mysql1
docker rm -f mysql1
`docker run -d -v mysql:/var/lib/mysql --name mysql2 -e MYSQL_ALLOW_EMPTY_PASSWORD=true my
sql`
-v mysql:/var/lib/mysql 这个方式相当于启别名。
而且在dockerfile里定义了 volume关键字。
Bind Mouting
语法 docker run -v /home/aaa:/root/aaa
对应本地主机和容器目录进行同步。目录映射。
新建一个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
~
目录
build 一个image
docker build -t a364482611/nginx .
启动并且映射到本地
docker run -d -v $(pwd):/usr/share/nginx/html -p 80:80 --name web a364482611/nginx
$(pwd)代表当前目录
两个之间是同步的。