容器是临时的,删除容器后数据会丢失。Docker提供三种数据持久化方式:
# 创建数据卷
docker volume create mydata
# 查看所有数据卷
docker volume ls
# 查看数据卷详情
docker volume inspect mydata
# 使用数据卷运行容器
docker run -d --name mysql-db -v mydata:/var/lib/mysql mysql
# 删除数据卷
docker volume rm mydata
# 删除所有未使用的数据卷
docker volume prune
# 挂载主机目录到容器
docker run -d -v /host/path:/container/path nginx
# 使用绝对路径
docker run -d -v $(pwd)/html:/usr/share/nginx/html nginx
# 只读挂载
docker run -d -v /host/path:/container/path:ro nginx
# 使用--mount语法(推荐)
docker run -d \
--mount type=bind,source=/host/path,target=/container/path \
nginx
# 创建MySQL容器并持久化数据
docker run -d \
--name mysql-server \
-e MYSQL_ROOT_PASSWORD=123456 \
-v mysql-data:/var/lib/mysql \
-p 3306:3306 \
mysql:8.0
# 验证数据持久化
docker exec -it mysql-server mysql -uroot -p123456 -e "CREATE DATABASE testdb;"
# 删除容器
docker rm -f mysql-server
# 重新创建容器,数据仍然存在
docker run -d \
--name mysql-server \
-e MYSQL_ROOT_PASSWORD=123456 \
-v mysql-data:/var/lib/mysql \
-p 3306:3306 \
mysql:8.0
# 验证数据库仍然存在
docker exec -it mysql-server mysql -uroot -p123456 -e "SHOW DATABASES;"
# 创建本地目录
mkdir -p ~/nginx/html ~/nginx/conf
# 创建配置文件
cat > ~/nginx/conf/nginx.conf << 'EOF'
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
EOF
# 创建网站文件
echo "Hello Docker!
" > ~/nginx/html/index.html
# 运行Nginx容器
docker run -d \
--name my-nginx \
-p 8080:80 \
-v ~/nginx/html:/usr/share/nginx/html:ro \
-v ~/nginx/conf/nginx.conf:/etc/nginx/conf.d/default.conf:ro \
nginx
# 创建数据卷容器
docker create -v /data --name datastore ubuntu
# 其他容器使用数据卷容器
docker run -d --volumes-from datastore --name app1 nginx
docker run -d --volumes-from datastore --name app2 nginx
# 多个容器共享同一数据卷
# 备份数据卷
docker run --rm \
-v mydata:/data \
-v $(pwd):/backup \
ubuntu tar czf /backup/mydata-backup.tar.gz /data
# 恢复数据卷
docker run --rm \
-v mydata:/data \
-v $(pwd):/backup \
ubuntu tar xzf /backup/mydata-backup.tar.gz -C /
# 复制数据卷
docker run --rm \
-v mydata:/from \
-v newdata:/to \
ubuntu cp -av /from/. /to/
# 使用tmpfs(数据存储在内存中)
docker run -d \
--tmpfs /tmp:rw,size=100m \
nginx
# 适用于敏感数据,容器停止后自动清除
# 查看容器挂载详情
docker inspect -f '{{ .Mounts }}' container_name
# 查看容器使用的数据卷
docker inspect -f '{{ range .Mounts }}{{ .Name }}{{ end }}' container_name