㈠ docker怎么指定容器卷挂载到某个目录
docker可以支持把一个宿主机上的目录挂载到镜像里。 docker run -it -v /home/dock/Downloads:/usr/Downloads ubuntu64 /bin/bash 通过-v参数,枣做冒号前为宿主机目录,必须为绝对路径,冒号后为镜像内挂载的路径。 现在镜像内就可以共凳历衡享宿烂盯主机里的
㈡ 如何让Windows 8/Windows 10用户也用上Docker
默认情况下Boot2Docker需要安装Virtualbox,而不支持Hype-V,这很麻烦,还得修改BCD引导文件,因为Hyper-V和Virtualbox不兼容。
现在好了,有人将其做成可以支持Hyper-V的光盘版,可以直接下载使用最新的ISO文件。步骤:
1. 首先下载前面所顷伍述的ISO文件。
2. 新建虚拟机,选择第一代。
3. 确保虚拟网络能访问外部网络,因为后面需要从外网Docker Hub下载容器唤慧映像。
4. 不要新建虚拟硬盘。
5. 然后启动虚拟机,运行ifconfig查看IP地址,比如是192.168.0.113。
6. 接下来关闭虚拟机,在虚拟机里新建虚拟硬盘,并用fdisk进行分区并格式化。然后再创建差异磁盘,为甚要创建差异磁盘,这是为了方便,今后可以每个容器放在独立的差异磁盘里,方便今后测试调试。
7. 为了方便,可以通过Putty等SSH工具连接到Boot2Docker虚拟机,并用docker version查看版本信息。
注意用户名和密码:docker/tcuser
8. 运行以下命令,构建wordPress博客的容器:
docker build -rm -t hualaisi /wordpress git://github.com/jbfink/docker-wordpress.git
其中 hualaisi 可以用任意名称代替。
根据网络速度,等待一段时间,等wordpress下载构建完毕。
9. 运行以下命令,启动WordPress容器,并设置该容器的NAT端口为80:
docker run --name wordpress -d -p 80:80 hualaisi /wordpress
10. 可以运行以下命令查看当前环境里运行的docker容器:
docker ps -a
最后,可以直接在Windows里打开Web浏览器,输入以下地址(注意IP地址和端口号),即可配置并访问构建在docker容器里的WordPress博客。和乎答
http://192.168.0.113
㈢ docker一定要挂载才能使用吗
是。Docker是一个开源的应用容器引擎,只有挂载才能进行使用,让开答改老发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的linux或Windows操作系统的机器歼举上,也可以实现虚拟化。容器是完全使用沙箱机制,相清升互之间不会有任何接口。
㈣ 如何使用win10装docker,然后再虚拟win系统
1.Windows操作系统中安装Docker,如果是Win10以下的系统安装Docker T...
2.接下来Windows系统需要开启Hyper-V,打开控制面板,找到程序和功能选项,...
3.接下来进行Docker Desktop的安装,打开安装包进行安装,安装完选择添加...
4.接下来是启动Docker Desktop,在自动重启的过程中可以看到右下角的图像...
5.Docker Desktop启动成功后,我们可以使用cmd打开命令行工具
㈤ docker desktop win10挂载问题解决
更新于2020/8/13
此文章适用于安装完docker desktop install ,for windows10,并且是默认使用wsl2安装的docker。现在的win10家庭版也已经支持安装。
注意如果我们不把docker集成到已有的wsl2的linux发行版(如图),docker自己的发行版是没有bash(如果有进入docker发行版shell的方法请大佬告知)
在power shell输入(CMD 不支持将 UNC 路径作为当前目录)
最开始的想法是docker的分发版中是不是可以像Linux一样的挂载文件,可惜没有成功。
在docker-desktop-data会保存docker的iamge和容器数据,暂时不清余衫楚docker-desktop分发版的作用,可能是docker实际运行的分发版?
通过查看官方的文档,发现docker wsl2安装的版本Settings已经没有Shared Devices选项,因为docker的文件挂载交给了wsl2的机制处理。
我们可以看到docker安装后wsl2默认的分发版是dockers-desktop-data,尝试使用sh或者bash进入这个分发版竖毁宏:
可以看到这个Linux分发版中没有sh和bash。我们切换为另一个分发版:
很明显,docker-desktop分发版中有sh和bash。但是这个分发版的根目录其实不是docker挂载时的根目录。
官方文档介绍了挂载的方法
https://docs.docker.com/docker-for-windows/wsl/
不报错但根本没有挂载成功。
可能是官方文档的失误,我又查找了wsl2的说明文档,找到了win系统磁盘在余册wsl2上的设置文件:
显然c盘映射到了/mnt/host/c,而不是/mnt/c。但是使用此路径挂载依旧无效。
最后在前辈的文章 https://www.jianshu.com/p/18593d1f4fc3 上找到答案,此处记录一下正确的挂载命令:
注意盘符一定要小写。
挂载文件一定要注意windows的CRLF文件在Linux上有兼容问题,最好始终使用LF文件,windows上的IDE基本都可以正常读取LF文件。windows上的git默认选项会自动把项目的LF换为CRLF,取消方法
既然官方建议我们在linux文件系统下进行挂载,我最后找到了方法把挂载文件放在Linux文件系统中。通过文件资源管理器将挂载文件直接放入docker的运行时根目录下(开启docker后才可以访问)
比如我们要挂载下面的文件夹:(可以直接在windows文件资源管理器地址栏输入查看)
命令为
更新:注意这个目录是运行时目录,docker停止运行后会失去持久化,重启后还原为原目录。暂时没有找到其持久化的方法。
㈥ win10下docker挂载文件夹报错
执行命令
docker run -d -v D:\wnmp\mysql57-log:/var/log/mysql/ -v D:\wnmp\mysql57-conf:/etc/mysql/ -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root --name mysql mysql:5.6
报错
docker: Error response from daemon: status code not OK but 500: � ����� � FDocker.Core, Version=2.5.0.49550, Culture=neutral, PublicKeyToken=null�� ocker.Core.DockerException ClassNameMessage�Data�������� � ��System.Collections.IDictionary�System.Excepti�� �� ocker.Core.DockerException�� �Filesharing has been cancelled
�� �� 在 Docker.ApiServices.Mounting.FileSharing.<DoShareAsync>d__8.MoveNext() 位置 C:\workspaces\stable-2.5.x\src\颤旅github.com\docker\pinata\win\src\Docker.ApiServices\Mounting\FileSharing.cs:行号 0
--- 引发异常的上塌陪一位置中堆栈跟踪的末尾 ---
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 System.Runtime.CompilerServices.TaskAwaiter.(Task task)
在 Docker.ApiServices.Mounting.FileSharing.<ShareAsync>d__6.MoveNext() 位置 C:\workspaces\stable-2.5.x\src\github.com\docker\pinata\win\src\Docker.ApiServices\Mounting\FileSharing.cs:行号 55
--- 引发异常的上一位置中堆栈跟踪的末尾 ---
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 System.Runtime.CompilerServices.TaskAwaiter.(Task task)
在 Docker.HttpApi.Controllers.FilesharingController.<ShareDirectory>d__2.MoveNext() 位置 C:\workspaces\stable-2.5.x\src\github.com\docker\pinata\win\src\Docker.HttpApi\Controllers\FilesharingController.cs:行号 21
--- 引发异常的上一位置中堆栈跟踪的末尾 ---
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在团洞蠢 System.Runtime.CompilerServices.TaskAwaiter.(Task task)
在 System.Threading.Tasks.TaskHelpersExtensions.<CastToObject>d__1`1.MoveNext()
--- 引发异常的上一位置中堆栈跟踪的末尾 ---
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 System.Runtime.CompilerServices.TaskAwaiter.(Task task)
在 System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__1.MoveNext()
--- 引发异常的上一位置中堆栈跟踪的末尾 ---
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 System.Runtime.CompilerServices.TaskAwaiter.(Task task)
在 System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__5.MoveNext()
--- 引发异常的上一位置中堆栈跟踪的末尾 ---
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 System.Runtime.CompilerServices.TaskAwaiter.(Task task)
在 System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__15.MoveNext()
�� ��8
MoveNext
Docker.ApiServices, Version=2.5.0.49550, Culture=neutral, PublicKeyToken=null
Docker.ApiServices.Mounting.FileSharing+<DoShareAsync>d__8
Void MoveNext() ���� �Docker.ApiServices.
See 'docker run --help'.
打开设置,添加挂载目录
点击保存
㈦ 解决 Docker 数据卷挂载的文件权限问题
Docker 提供了数据卷 绑定挂载 的机制简斗拦(volume bind mounts)来将主机上的文件 (file) 或者目录 (directory) 挂载进容器 (container)。也就是 docker run 命令中熟知的 -v 参数。根据 Docker 官方文档,绑定挂载一般适合于 三种场景 :
但是实际使用时,会遇到文件权限问题:
譬如执行如下命令创建一个容器,挂载当前目录到容器内,并在容器内向主机当前目录创建 tmp.txt:
主机当前目录出现了容器内创建的 tmp.txt,但是其权限、用户和组均是 root,其他用户不可写。
常见解决方法是可以通过 Docker 提供的 User 命令、 --user 参拦胡数 来指定容器内部的用户和组的 id,譬如:
可以看到输出,current_user 处会显示主机当前用户的名字,所以解决了主机用户对挂载的卷没有权限的问题。
user 参数的缺陷
使用 user 参数有一些缺陷,如果你进入容器内部的 terminal,会显示如下内容:
b.sh 的用户名会显示 I have no name!,这是因为我们通过 --user 参数指定了容器内部的用户 id,但该 id 不存在于容器内的 /etc/passwd 文件中。
除此之外,使用 user 参数仍然存在权限问题:
除了绑定挂载的主机路径之外的所有路径,对于容器内部的用户都没有写权限。
这也是不可接受的,因为容器运行过程中我们可能会进行一些临时文件的写入,这些临时文件我们并不想要写到主机的挂载目录,但除了挂载路径之外的任何路径容器都没有写入权限。
譬如我们在主机上创建 models 目录。
我们使用 Docker 挂载 models 目录,然而在 Docker 容器内部除了 models 文件夹都没有访问权限。
这可以通过增加挂载路径:
这样容器运行过程往 /project 写的临时文件都会出现在主机上。
可见, user 参数并不能解决所有问题。它存在两个问题:
我们需要一种手段,既可以像 user 参数一样在容器运行时可以将用户切换到和主机相同的用户,又希望 Docker 容器保留 root 用户,并给主机用户想要访问的目录授权(对特定目录 chown 、 chmod 等)。
Docker 官方文档对 Entrypoint 介绍时给出了 一种最佳实践 。
编写如下的 Dockerfile:
该 Dockerfile 中安装了一个 gosu 的工具,并设置了程序的 Entrypoint。由于 Docker 内使用 sudo 可能导致一些不可预知的 TTY 和信号转发问题,所以 Docker 官方推荐了使用 gosu 这个工具,用于保持容器在 root 用户下运行,并用 sudo 来切换到指定用户。
其中 docker-entrypoint.sh 内容如下:
可以看到 docker-entrypoint.sh 中创建了一个名为 user 的用户,该用户的 uid 由 docker run 的参数传入,这里利用了 linux 系统的一个特点,容器内外用户权限的记录和用户的名字无关,只和 uid 有关,因此容器内我们将用户命名为 user 没有影响。docker-entrypoint.sh 最后一行调用 gosu 来切换到 user 用户并执行 Dockerfile 中的用户命令。
有了如上两个脚本,我们构建镜像并执行:
运行容器时指定 LOCAL_USER_ID 参数:
可见不仅容器内往挂载目录 /project/models 写入的文件 model.txt 所有者是主机用户,而且在容器内往非挂载目录 /project/tmp.txt 写入销简文件也不会遇到权限问题。
Docker 运行时容器内默认使用 root 用户运行,但是我们不是总是想要用 root 用户,因为有时候我们希望容器计算产生一些文件,并通过 volume 的绑定挂载在主机上获取。特别是我们用 jenkins 等工具写一些持续集成的脚本时候。容器内用 root 用户运行会导致产生的文件也是 root 用户的,主机上没有读取权限。因此我们需要让容器在运行的时候切换到主机上的用户。
Docker 对于这种情况仍然没有提供足够便利的基础设施,我们采用了 Docker 官方目前推荐的一个方式,通过编写一个 docker-entrypoint.sh 脚本作为 Dockerfile 的 Entrypoint,脚本中创建和主机上相同 uid 的用户,并通过 gosu 工具切换到该用户执行命令。 uid 需要在 docker run 阶段通过参数传入。我们在脚本中设置了缺省 uid ,上面的脚本随机选择了一个 9001,注意要将该缺省值避免设置成和 Docker 镜像中存在的用户冲突的 uid。
参考链接:
㈧ win10系统怎么装docker
1.前言
Docker最近推出了可以运行在Win10和Mac上的稳定版本,让我们赶紧来体验一下。
2.安装准备
需要的条件为: 64bit Windows 10,开启Hyper-V
2.1 下载Docker for Windows
从官网的下面地址可以下载
https://download.docker.com/win/stable/InstallDocker.msi
2.2 开启win10的Hyper-V
控制面板 -> 程序 -> 启用或关闭Windows功能 -> 选中Hyper-V
这里写图片描述
完成后自动重启
3.安装Docker
用刚才下载的安装包安装,安装完成后,启动Docker
这里写图片描述
这里写图片描述
如果没有开启Hyper-V,启动Docker的时候会提示开启Hyper-V
这里写图片描述
如果启动的时候,提示内存不足,启动失败,可以在setting设定中调节VM内存大小
这里写图片描述
4.使用Docker
4.1 查看版本等信息
㈨ docker添加挂载目录或者添加端口
docker添加挂载目录:先在docker容器里创建目尘段喊录/import
1.关闭docker
2.sudo su切换到root身份,cd /var/lib/docker/containers/容器id/,进入对应容器目录
3.vi hostconfig.json,修改如下,将容器目录/import绑定到主机/data目录:
4.vi config.v2.json,修改如下,添加MountPoints:
5.启动docker
最后docker ecec -it 容器id /bin/bash进入ls -l /就可以看见import目录
添加端口在这个文件hostconfig.json
首先输入
可以看到我当前的名叫mynginx容器只打开了80端口
在给mynginx容器添加上这条命令:
来设置重启docker之后自动启动该容器。设置完成后再修改hostconfig.json文件中的"PortBindings"就行。
然后停止容器systemctl stop docker
然后进入到该容器的hostconfig.json文件中,增加一个8000的端口
保存后退出
再次启动docker容器systemctl start docker
输入docker ps -a查看燃陪
发现已派野经增加了8000端口
若想要增加容器端口,则需要把config.v2.json中的ExposedPorts也加上你想添加的端口号