在docker中使用U盘

问题

最初的解决方案是映射host中固定的目录到container中,但是只能把U盘中的数据拷贝到固定的目录中,在container中才可以看到。
如果在container创建前把U盘mount到固定目录,这个也没有问题。
如果在container创建以后,再把U盘mount到固定的目录中,在container中无法看到。

我的需求:

  1. 程序是B/S结构,需要24小时不间断运行
  2. 程序的输入数据从U盘或者移动硬盘中读取
  3. 不依赖host的环境

插个广告:滴滴云,比其他云服务器都便宜,用于测试什么的没有什么大问题,但是用于生产环境要谨慎。这个我的推广链接https://i.didiyun.com/2bxpVi3P0N0

解决

在创建container的时候增加选项--privileged,这样才可以放开docker的所有系统操作权限,但是这种操作带来的安全风险比较大;还有比较安全的方式没有测试,可以参考:
如何在Docker容器内部使用gdb进行debug

在程序中利用inotify监控/dev目录,如果发现有U盘插入,自动mount到一个目录中即可。具体的代码参考网上很多,这里就不重复了。

  • 我尝试使用nfs、samba网络文件系统,似乎也不行。
  • 我也测试了--device的方式,但是设备名称需要在container创建的时候指定,似乎不能支持U盘的热插拔。这样就需要在host中部署一定量的程序,这个和我的应用要求不一样。所以没有深入的测试了。
  • 还可以利用nsenter,做动态的卷映射,这个可以支持U盘的热插拔,但是还是需要在host中部署一定量的程序,对host有一定的依赖,所以也没有摄入的测试了。
  • 也可以尝试使用udev,这个应该是可以解决的,因为这个和inotify的作用一样,都是把内核事件通知到用户空间,但是我简单试了一下,没有通。
<think>好的,我现在需要帮助用户在离线Linux环境下使用Docker部署MySQL容器。用户已经提到他们处于无网络连接的环境,所以首先我得考虑如何在没有网络的情况下获取所需的Docker镜像和相关依赖。 首先,Docker在离线安装时通常需要预先下载好镜像文件,然后传输到目标机器上。用户之前可能参考过如何下载MySQL的Docker镜像,比如引用[1]提到的MySQL 9.1标记,不过实际中MySQL的版本可能有所不同,比如常见的5.7或8.0版本。用户提供的引用[2]中使用了mysql:5.7的镜像,所以可能用户需要的是这个版本或者类似的。不过用户的问题中并没有指定具体版本,可能需要后续询问或假设一个常用版本。 接下来,步骤应该是这样的: 1. **在有网络的环境中准备镜像**:用户需要在另一台可以联网的机器上下载所需的MySQL Docker镜像,然后导出为tar文件。使用`docker save`命令将镜像保存,比如`docker save -o mysql.tar mysql:5.7`。 2. **传输镜像到离线环境**:通过U、移动硬或者内部网络将tar文件复制到目标Linux系统。 3. **在离线环境中加载镜像**:使用`docker load`命令导入镜像,比如`docker load -i mysql.tar`。 4. **运行MySQL容器**:参考引用[2]中的命令,但需要调整可能的路径和参数。确保挂载的卷(volumes)路径在离线环境中存在,并且正确配置MySQL的root密码等环境变量。例如: ```bash docker run -p 3306:3306 --name mysql -v /mydata/mysql/log:/var/log/mysql -v /mydata/mysql/data:/var/lib/mysql -v /mydata/mysql/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7 ``` 这里需要确认/mydata目录是否存在,或者在命令中使用用户自定义的路径。 可能遇到的问题包括: - 镜像版本是否正确:用户需要确保导出的镜像版本与运行的命令中的标签一致,比如如果保存的是mysql:5.7,运行时也要指定同样的标签。 - 文件权限问题:挂载的本地目录可能需要适当的权限,否则MySQL容器可能无法写入数据。需要指导用户创建目录并设置权限,比如使用`mkdir -p /mydata/mysql/{data,conf,log}`和`chmod -R 777 /mydata`(不过777权限可能不安全,实际生产环境需要更严格的设置)。 - 端口冲突:如果主机已经占用了3306端口,需要更改映射的端口,比如`-p 3307:3306`。 此外,用户可能需要配置MySQL的配置文件,比如my.cnf,这时候需要提前在conf目录下准备好配置文件,或者在容器启动后进入容器内部修改。不过离线环境下,用户可能需要手动创建配置文件,并挂载到容器的/etc/mysql目录下。 还需要考虑Docker是否已经安装在离线环境中。如果Docker本身也没有安装,用户需要先离线安装Docker引擎,这可能涉及下载Docker的rpm或deb包,传输到离线机器上进行安装。但用户的问题中可能已经假设Docker已经安装,所以这一步可能不需要。 总结步骤: 1. 在有网络的环境下载并导出MySQL镜像。 2. 传输镜像到离线机器。 3. 加载镜像到Docker。 4. 创建必要的本地目录。 5. 运行容器命令,挂载目录并设置环境变量。 6. 验证容器是否正常运行,检查日志是否有错误。 用户可能还会问如何验证安装是否成功,比如使用`docker ps`查看容器状态,或者进入容器执行`mysql -uroot -p`输入密码后测试连接。 需要确保所有步骤中的命令正确,路径存在,权限正确,镜像版本一致。如果用户遇到问题,可能需要检查这些方面。</think>### 离线环境下使用Docker部署MySQL容器步骤 #### 1. 准备Docker镜像(联网环境) 在有网络的机器上下载MySQL镜像并导出: ```bash docker pull mysql:5.7 # 根据需求选择版本[^2] docker save -o mysql.tar mysql:5.7 ``` #### 2. 传输镜像到离线环境 将`mysql.tar`文件通过U或内部存储复制到目标服务器。 #### 3. 加载Docker镜像(离线环境) ```bash docker load -i mysql.tar ``` #### 4. 创建本地数据存储目录 ```bash mkdir -p /mydata/mysql/{data,conf,log} chmod -R 755 /mydata/mysql # 确保目录可读写 ``` #### 5. 启动MySQL容器 ```bash docker run -p 3306:3306 --name mysql \ -v /mydata/mysql/log:/var/log/mysql \ -v /mydata/mysql/data:/var/lib/mysql \ -v /mydata/mysql/conf:/etc/mysql \ -e MYSQL_ROOT_PASSWORD=root \ -d mysql:5.7 ``` #### 6. 验证容器状态 ```bash docker ps | grep mysql # 查看容器是否运行 docker logs mysql # 检查启动日志 ``` ### 常见问题解决 - **目录权限问题**:若容器启动失败,检查挂载目录权限是否开放(测试时可临时使用`chmod 777`)。 - **端口冲突**:修改`-p 3307:3306`调整映射端口。 - **配置文件加载**:在`/mydata/mysql/conf`目录下添加`my.cnf`文件,重启容器生效。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值