10.docker卷

Docker Volume

​Docker Volume 是 docker的数据卷,用于保持数据持久化。MySQL运行在Docker容器中时,一般将数据通过Docker Volume保存在主机上,即使删除MySQL容器,数据不会丢失。

MySQL Dockerfile

找到docker hub上的mysql 5.7官方dockerfile
https://github.com/docker-library/mysql/blob/e0d43b2a29867c5b7d5c01a8fea30a086861df2b/5.7/Dockerfile.debian

#
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
#
# PLEASE DO NOT EDIT IT DIRECTLY.
#FROM debian:buster-slim# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
RUN groupadd -r mysql && useradd -r -g mysql mysqlRUN apt-get update && apt-get install -y --no-install-recommends gnupg dirmngr && rm -rf /var/lib/apt/lists/*# add gosu for easy step-down from root
# https://github.com/tianon/gosu/releases
ENV GOSU_VERSION 1.14
RUN set -eux; \savedAptMark="$(apt-mark showmanual)"; \apt-get update; \apt-get install -y --no-install-recommends ca-certificates wget; \rm -rf /var/lib/apt/lists/*; \dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')"; \wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch"; \wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch.asc"; \export GNUPGHOME="$(mktemp -d)"; \gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4; \gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu; \gpgconf --kill all; \rm -rf "$GNUPGHOME" /usr/local/bin/gosu.asc; \apt-mark auto '.*' > /dev/null; \[ -z "$savedAptMark" ] || apt-mark manual $savedAptMark > /dev/null; \apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \chmod +x /usr/local/bin/gosu; \gosu --version; \gosu nobody trueRUN mkdir /docker-entrypoint-initdb.dRUN set -eux; \apt-get update; \apt-get install -y --no-install-recommends \bzip2 \openssl \
# FATAL ERROR: please install the following Perl modules before executing /usr/local/mysql/scripts/mysql_install_db:
# File::Basename
# File::Copy
# Sys::Hostname
# Data::Dumperperl \xz-utils \zstd \; \rm -rf /var/lib/apt/lists/*RUN set -eux; \
# gpg: key 3A79BD29: public key "MySQL Release Engineering <mysql-build@oss.oracle.com>" importedkey='859BE8D7C586F538430B19C2467B942D3A79BD29'; \export GNUPGHOME="$(mktemp -d)"; \gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key"; \mkdir -p /etc/apt/keyrings; \gpg --batch --export "$key" > /etc/apt/keyrings/mysql.gpg; \gpgconf --kill all; \rm -rf "$GNUPGHOME"ENV MYSQL_MAJOR 5.7
ENV MYSQL_VERSION 5.7.40-1debian10RUN echo 'deb [ signed-by=/etc/apt/keyrings/mysql.gpg ] http://repo.mysql.com/apt/debian/ buster mysql-5.7' > /etc/apt/sources.list.d/mysql.list# the "/var/lib/mysql" stuff here is because the mysql-server postinst doesn't have an explicit way to disable the mysql_install_db codepath besides having a database already "configured" (ie, stuff in /var/lib/mysql/mysql)
# also, we set debconf keys to make APT a little quieter
RUN { \echo mysql-community-server mysql-community-server/data-dir select ''; \echo mysql-community-server mysql-community-server/root-pass password ''; \echo mysql-community-server mysql-community-server/re-root-pass password ''; \echo mysql-community-server mysql-community-server/remove-test-db select false; \} | debconf-set-selections \&& apt-get update \&& apt-get install -y \mysql-server="${MYSQL_VERSION}" \
# comment out a few problematic configuration values&& find /etc/mysql/ -name '*.cnf' -print0 \| xargs -0 grep -lZE '^(bind-address|log)' \| xargs -rt -0 sed -Ei 's/^(bind-address|log)/#&/' \
# don't reverse lookup hostnames, they are usually another container&& echo '[mysqld]\nskip-host-cache\nskip-name-resolve' > /etc/mysql/conf.d/docker.cnf \&& rm -rf /var/lib/apt/lists/* \&& rm -rf /var/lib/mysql && mkdir -p /var/lib/mysql /var/run/mysqld \&& chown -R mysql:mysql /var/lib/mysql /var/run/mysqld \
# ensure that /var/run/mysqld (used for socket and lock files) is writable regardless of the UID our mysqld instance ends up having at runtime&& chmod 1777 /var/run/mysqld /var/lib/mysqlVOLUME /var/lib/mysqlCOPY docker-entrypoint.sh /usr/local/bin/
RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat
ENTRYPOINT ["docker-entrypoint.sh"]EXPOSE 3306 33060
CMD ["mysqld"]

注意VOLUME /var/lib/mysql

docker volume

docker volume prunedocker image pull mysqldocker image inspect mysql
# "Volumes": {
#     "/var/lib/mysql": {}
# }# docker image inspect mysql --format '{{ .Config.Volumes }}'

启动mysql

docker container run -d --name mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=True mysqldocker container lsdocker container inspect mysql
# "Mounts": [
#      {
#          "Type": "volume",
#          "Name": "766475a93e0f1e4583f3d6067377451e444c14b15d2450ca349bbe36899f1806",
#          "Source": "/var/lib/docker/volumes/766475a93e0f1e4583f3d6067377451e444c14b15d2450ca349bbe36899f1806/_data",
#          "Destination": "/var/lib/mysql",
#          "Driver": "local",
#          "Mode": "",
#          "RW": true,
#          "Propagation": ""
#      }
#  ],# docker container inspect mysql --format '{{ .Mounts }}'
ls /var/lib/docker/volumes/

mounts显示了source和destination

docker volume ls
# DRIVER    VOLUME NAME
# local     766475a93e0f1e4583f3d6067377451e444c14b15d2450ca349bbe36899f1806docker volume inspect 766475a93e0f1e4583f3d6067377451e444c14b15d2450ca349bbe36899f1806
#[
#    {
#        "CreatedAt": "2023-01-15T23:52:38Z",
#        "Driver": "local",
#        "Labels": null,
#        "Mountpoint": "/var/lib/docker/volumes/766475a93e0f1e4583f3d6067377451e444c14b15d2450ca349bbe36899f1806/_data",
#        "Name": "766475a93e0f1e4583f3d6067377451e444c14b15d2450ca349bbe36899f1806",
#        "Options": null,
#        "Scope": "local"
#    }
#]

从volume视角,我们只能看到哪个数据卷挂载在主机上,但是不能得知该数据卷属于哪个容器

比如我们启动第二个mysql容器,再停止所有mysql

docker container run -d --name mysql2 -e MYSQL_ALLOW_EMPTY_PASSWORD=True mysqldocker volume lsdocker container rm -f mysql mysql2docker volume ls

volume并不会消失,但是很难直观判断属于哪个容器

Named Volume

docker container run -d --name mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=True -v mysql-db:/var/lib/mysql mysqldocker volume ls
# DRIVER    VOLUME NAME
# local     766475a93e0f1e4583f3d6067377451e444c14b15d2450ca349bbe36899f1806
# local     b3b2ab7a9557160a9066bef15c61af2cfc3d7d05dd5323fc51a80cb414ef6799
# local     mysql-db

显示指定数据卷

docker volume inspect mysql-db
# [
#     {
#         "CreatedAt": "2023-01-16T00:13:34Z",
#         "Driver": "local",
#         "Labels": null,
#         "Mountpoint": "/var/lib/docker/volumes/mysql-db/_data",
#         "Name": "mysql-db",
#         "Options": null,
#         "Scope": "local"
#     }
# ]

甚至可以创建新的容器,使用已有的数据卷

docker container run -d --name mysql3 -e MYSQL_ALLOW_EMPTY_PASSWORD=True -v mysql-db:/var/lib/mysql mysql

绑定挂载 volume

Volume的绑定只能使用container run,不能使用Dockerfile

挂载之后主机上的文件会覆盖掉容器内对应位置的文件

mkdir nginx
cd nginxecho "Nginx Docker" > index.htmldocker container run -d --name nginx -p 80:80 -v $(pwd):/usr/share/nginx/html nginxecho "test" > test.txt

利用这个方式可以将数据库的数据存储在指定位置,然后通过docker更新数据库的版本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/646380.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QEMU搭建arm虚拟机开发环境

获取QEMU代码 git clone https://gitlab.com/qemu-project/qemu.git 切换对应的工程分支 使用git指令切换到对应的分支上&#xff0c;我这里使用的是stable-4.0的分支 git checkout -b stable-4.0 remotes/origin/stable-4.0 配置&编译 在工程的根目录下执行 ./conf…

关于Spring和缓存雪崩、穿透、击穿、预热的最常见的十道面试题

面试题一&#xff1a;什么是缓存雪崩&#xff1f;如何解决缓存雪崩&#xff1f; 缓存雪崩指的是在短时间内&#xff0c;有大量的请求直接查询术后句酷&#xff0c;从而对数据库造成大量的压力&#xff0c;严重情况下可能导致数据库宕机的情况叫做缓存雪崩 我们可以看一下正常…

【CANoe使用大全】——DBC数据库制作

文章目录 1.DBC数据库选择1.1.DBC模板选择1.3. 新建报文1.4. 新建信号1.5.数值表建立 2. DBC导入 1.DBC数据库选择 首先找到DBC编辑器入口 1.1.DBC模板选择 举例说明&#xff1a; 新建选择CANFD的模板 1.3. 新建报文 注意上图中报文周期“Cycle Time”处于不可编辑状态…

初探二分法

推荐阅读 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;一&#xff09; 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;二&#xff09; 文章目录 推荐阅读题目解法一解法二 题目 题目&#xff1a;给定一个 n 个元素有序的&#xff0…

C语言常见面试题:什么是条件编译,条件编译的作用是什么?

条件编译是一种编程技术&#xff0c;它允许程序员根据不同的条件来选择性地编译源代码中的部分内容。条件编译在编译过程中起到了非常重要的作用&#xff0c;它可以根据不同的条件来生成不同的代码&#xff0c;从而实现更加灵活和高效的代码生成。 条件编译的作用主要有以下几…

kotlin中的初始化问题纪录

1. init 代码块的顺序问题 init代码块和成员变量实质上是按先后顺序执行的。若果init{} 中有成员变量使用。要把成员变量放到代码块之前。 2. init代码块之中的函数问题 下面是一段错误的代码&#xff1a; class mkotlin{val info:Stringinit {getInfoMethod()info "adad…

BGP路由反射-数据中心IDC项目经验

一、背景描述 R1,R2,R3在AS200区域内&#xff0c;R1和R2,R1和R3建立OSPF&#xff0c;宣告接口互联. AS200区域内&#xff0c;R1和R2建立IBGP, R1和R3建立IBGP R2和R4建立EBGP, R3和R5建立EBGP。 网络拓扑&#xff1a; 二、故障现象 R1和R2可以收到来自AS100区域R4的E…

nsenter比docker exec更底层的命令

文章目录 nsenter介绍安装方法简单使用 nsenter介绍 nsenter命令是一个可以在指定进程的命令空间下运行指定程序的命令。它位于util-linux包中。典型的用途就是进入容器的网络命令空间。相当多的容器为了轻量级&#xff0c;是不包含较为基础的命令的&#xff0c;比如说ip addr…

系统移植,GNU命令,Uboot移植

一.GNU命令 1、addr2line 把程序地址转换为文件名和行号 做调试 2、ar 建立&#xff0c;修改&#xff0c;提取归档文件 3、Id:GNU arm-none-linux-gnueabi-ld start.o main.o -Tmap.lds -o uart.elf 链接器 4、as 主要用来编译GNU编译器gcc输出的汇编文件&a…

‘HEAD‘ 是 HTTP 请求的一种方法

一、名词解释 ‘HEAD’ 是 HTTP 请求的一种方法&#xff0c;它与 ‘GET’ 方法类似&#xff0c;但有一些关键区别。 当你使用 ‘GET’ 请求时&#xff0c;服务器会返回请求的资源&#xff08;例如 HTML 页面或文件内容&#xff09;。而当你使用 ‘HEAD’ 请求时&#xff0c;服务…

嵌入式-stm32-江科大-EXTI外部中断

一&#xff1a;EXTI外部中断&#xff08;external interrupt&#xff09; 1.1 STM32 中断系统 中断是指在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前的程序&#xff0c;转而去处理中断程序&#xff0c;…

【Rust】第六节:结构体

0 前言 结构体&#xff0c;struct&#xff0c;听到这个名字大家可能会感觉“哇&#xff01;好熟悉&#xff01;”&#xff0c;毕竟在大学时学习c/cpp的时候已经接触过很多次了&#xff0c;实际上也确实很类似&#xff0c;即使有些不同&#xff0c;比如“所有权系统”&#xff…

字符金字塔(C语言刷题)

个人博客主页&#xff1a;https://blog.csdn.net/2301_79293429?typeblog 专栏&#xff1a;https://blog.csdn.net/2301_79293429/category_12545690.html 题目描述 请打印输出一个字符金字塔&#xff0c;字符金字塔的特征请参考样例 输入描述: 输入一个字母&#xff0c;保…

5.6 误差相关统计与计算

文章目录 1、平均值2、首次作为参考基准3、绝对差值4、方差、均方差、CV值4.1 方差&#xff08;variance&#xff09;4.2 均方差、标准差&#xff08;Standard Deviation&#xff09;4.3 CV值 1、平均值 Excel 公式&#xff1a;AVERAGE(C4:C20) 2、首次作为参考基准 Excel 操作…

docker面试题(一)

问题1&#xff1a;Docker的工作原理是什么&#xff1f; 答案1&#xff1a;Docker利用Linux内核的容器化技术&#xff0c;如命名空间&#xff08;namespaces&#xff09;和控制&#xff08;cgroups&#xff09;&#xff0c;来实现应用程序的隔离和封装。它使用镜像作为构建和分…

02.Elasticsearch应用(二)

Elasticsearch应用&#xff08;二&#xff09; 1.ElasticSearch-head 参考链接 https://github.com/mobz/elasticsearch-head 是什么 ElasticSearch可视化工具&#xff0c;跟Kibana差不多 四种运行方式 第一种&#xff1a;使用内置服务器运行 git clone git://github.c…

ITSS服务工程师:开启IT职业生涯的金钥匙

&#x1f525;ITSS是中国电子技术标准化研究院推出的&#xff0c;涵盖了“IT服务工程师”和“IT服务经理”的系列培训。它不仅满足GB/T 28827.1的符合性评估要求&#xff0c;还助力IT服务资质升级。 &#x1f3af;“IT服务工程师”培训从服务技术、服务技巧和服务规范三大板块&…

java复习篇 数据结构:链表第二节 哨兵

目录 单向链表哨兵 初始 头插 思路 代码 尾插 思路 遍历 遍历验证头插 尾插代码 尾插测试 get 思路 代码 测试 insert 思路 代码 测试 remove 移除头结点 提问 移除指定位置 测试 单向链表哨兵 单向链表里面有一个特殊的节点称为哨兵节点&#xff0c;…

ubuntu16程序kill后没有及时释放端口

当你在Ubuntu 16上使用kill命令结束一个程序后&#xff0c;如果该程序正在使用的端口没有被及时释放&#xff0c;可能是因为该程序在被结束时还有连接处于活动状态&#xff0c;系统会等待这些连接自然结束。 如果你想强制快速释放该端口&#xff0c;可以使用以下步骤&#xff…

C# AsyncLocal 是如何实现 Thread 间传值

一&#xff1a;背景 1. 讲故事 这个问题的由来是在.NET高级调试训练营第十期分享ThreadStatic底层玩法的时候&#xff0c;有朋友提出了AsyncLocal是如何实现的&#xff0c;虽然做了口头上的表述&#xff0c;但总还是会不具体&#xff0c;所以觉得有必要用文字图表的方式来系统…