由于工作和学习需要,经常要开一个虚拟机开测试和开发,虚拟机我选择Oracle公司的VirtualBox(用了几年了,感觉不错的一款产品),经常开着这个窗口感觉有些浪费资源,这样隐藏窗口就在需求了。 将VirtualBox里安装的虚拟机在后台运行方法(在状态栏隐藏窗口) 开始=>运行=>cmd进入DOS窗口
1 2 3 |
d: cd D:\Program Files\VirtualBox D:\Program Files\VirtualBox> .\VBoxManage.exe startvm master --type headless |
这在Linux系统和MAC上同样适用,只要替换成相应的命令即可 解释:其中 master 是这个虚拟机的名称 Headless模式是系统的一种配置模式。在该模式下,系统缺少了显示设备、键盘或鼠标。<br>Headless模式针对在该模式下工作,尤其是服务器端程序开发者。因为服务器(如提供Web服务的主机)往往可能缺少前述设备,但又需要使用他们提供的功能,生成相应的数据,以提供给客户端(如浏览器所在的配有相关的显示设备、键盘和鼠标的主机)。 from:https://www.cnblogs.com/foonsun/p/5709784.html
View Details平时使用Docker,主要是用客户端 Kitematic,但 Kitematic 只实现了基本的使用功能,如果想更深入的使用Docker,命令行还是必不可少的。 前两课中,已经介绍过几个Docker命令:
1 2 3 4 5 6 7 8 |
docker pull:从镜像仓库中拉取镜像 。 docker run:通过镜像创建一个新的容器,并运行。需要注意的是,如果本地没有指定的镜像,会直接去镜像库下载,一定要保证拼写正确。 docker stop:停止一个容器 。 docker start:启动一个容器 。 docker restart:重启一个容器 。 docker ps:列出当前运行的容器机器状态 。 docker images 或 docker image ls:列出本地镜像。 docker build:使用Dockerfile创建自己的镜像。 |
这里记录几个Docker使用过程中,最容易用的的基础命令,包括镜像构建,镜像操作,容器使用。 镜像构建: docker build [OPTIONS] PATH | URL | – -t name:tag 表示给镜像命名,并指定标签(相当于版本号) -f Dockerfile 指定Dockerfile文件,默认为’PATH/Dockerfile’,即当前目录下的Dockerfile-t name:tag 表示给镜像命名,并指定标签(相当于版本号) PATH 表示本地工作目录(也就是命令最后的 . ,我这里是项目文件夹) 示例:(注意命令的执行目录和工作目录) docker build -t slide-verify:1.0 . 镜像操作命令: 查看本机镜像:docker images 移除指定镜像: docker image rm 镜像ID docker rmi 镜像ID 清除无效镜像:docker image prune(清除没有名称且未被使用的镜像) 查看镜像信息:docker inspect 镜像ID 容器操作命令: 运行容器:docker run -it -p 5000:80 --name slide-verify10 slide-verify:1.0 查看运行中的容器: docker ps docker container ls 查看全部容器:docker ps -a 移除容器:docker container rm 容器ID 启动容器:docker start 容器ID 关闭容器:docker stop 容器ID 重启容器:docker restart 容器ID 进入容器:docker exec -it 容器ID /bin/bash (相当于远程登录虚拟机) 退出容器:exit […]
View Details今天聊一聊Dockerfile,docker build,希望通过这篇文章,能让你对docker镜像构建过程有一个认识。 事情还得从一次Docker镜像创建失败说起。 问题背景: 环境VS2017,dotnet 2.1 版本 ,使用默认生成的Dockerfile文件,当我使用docker build命令创建镜像的时候,竟然报错了
1 2 |
Step 6/16 : ...... COPY failed: stat /mnt/sda1/var/lib/docker/tmp/docker-builder802544848/EasySlideVerificationDemoServer/EasySlideVerificationDemoServer.csproj: no such file or directory |
错误信息是,第6步,找不到指定的文件或文件夹,由于我执行docker build命令的路径与 项目文件(xxx.csproj)在同一目录下,所以,这个文件找不到也很正常,那到底是哪里出问题了呢?我们来捋一捋。 执行docker build命令的路径与项目文件(xxx.csproj)在同一路径。 docker build 命令如下:
1 |
docker build -t slide-verify:1.0 . |
Dockerfile内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80 FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY ["EasySlideVerificationDemoServer/EasySlideVerificationDemoServer.csproj", "EasySlideVerificationDemoServer/"] RUN dotnet restore "EasySlideVerificationDemoServer/EasySlideVerificationDemoServer.csproj" COPY . . WORKDIR "/src/EasySlideVerificationDemoServer" RUN dotnet build "EasySlideVerificationDemoServer.csproj" -c Release -o /app FROM build AS publish RUN dotnet publish "EasySlideVerificationDemoServer.csproj" -c Release -o /app FROM base AS final WORKDIR /app COPY --from=publish /app . ENTRYPOINT ["dotnet", "EasySlideVerificationDemoServer.dll"] |
Docker镜像生成原理: Docker镜像与操作系统镜像本质上是一样的,首先需要一个基础镜像,然后在基础镜像上搭建所需环境,安装软件,最后生成一个新的镜像,新的镜像就可以在Docker中进行部署,生成容器实例,从而开始运行服务。 Dockerfile中的命令: 从上面Dockerfile中,我们可以看到有这几个命令:FROM,WORKDIR,EXPOSE,COPY,RUN,ENTRYPOINT,大概了解一下这几个命令的意思。 FROM: 指定一个基础镜像 WORKDIR: 在镜像内指定一个目录,作为当前工作目录 EXPOSE: 指定端口号 COPY: 从一个目录(这个目录可以是本地目录或中间镜像的目录)中复制文件或者目录到容器里指定路径 RUN: 在镜像内执行相应命令 ENTRYPOINT: 入口点,与RUN类似,同样是执行程序命令,表示容器启动时需要执行的命令。 Dockerfile文件解读: 我们来解读一下这个Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
将镜像 microsoft/dotnet:2.1-aspnetcore-runtime 作为基础镜像 (base) 指定镜像内工作目录为:/app 指定端口号为:80 将镜像 microsoft/dotnet:2.1-sdk 作为系统构建中间镜像(build) 指定镜像内工作目录为: /src 复制项目文件 "EasySlideVerificationDemoServer/EasySlideVerificationDemoServer.csproj" 到镜像目录 "EasySlideVerificationDemoServer/" 执行dotnet restore命令: dotnet restore "EasySlideVerificationDemoServer/EasySlideVerificationDemoServer.csproj" 复制当前目录下所有文件到镜像的工作目录(/src)下:COPY . . 指定新的工作目录: "/src/EasySlideVerificationDemoServer" 执行dotnet build命令: dotnet build "EasySlideVerificationDemoServer.csproj" -c Release -o /app 将构建好的中间镜像(build) 作为发布中间镜像(publish) 执行dotnet publish命令: dotnet publish "EasySlideVerificationDemoServer.csproj" -c Release -o /app 将基础镜像(base)作为最终镜像(final) 指定工作目录: /app 复制发布中间镜像(publish)中的/app目录到工作目录:COPY --from=publish /app . 指定入口点命令:ENTRYPOINT ["dotnet", "EasySlideVerificationDemoServer.dll"] |
解读完之后,我们了解了这个Dockerfile究竟做了哪些事情。 镜像构建命令: 然后看一下Docker镜像构建命令:docker build。 命令行输入:docker build --help,可查看完整使用方式,此处省略。 Usage: docker build [OPTIONS] PATH | URL | – 下面是我使用的构建命令:
1 |
docker build -t slide-verify:1.0 . |
-t name:tag 表示给镜像命名,并指定标签(相当于版本号) -f Dockerfile 指定Dockerfile文件,默认为’PATH/Dockerfile’,即当前目录下的Dockerfile PATH 表示本地工作目录(也就是命令最后的 . ,我这里是项目文件夹) 发现问题: 到这里不难发现,由于镜像构建命令的执行目录与项目文件所在目录一致,并且命令中PATH指定的是当前目录(.),也就是项目文件所在目录,而Dockerfile中文件复制命令明显是在项目文件的上一级,即解决方案文件夹目录, 这样问题似乎就容易解决了,将构建命令改成下面的格式,果不其然,构建成功。
1 |
docker build -t slide-verify:1.3 -f Dockerfile .. |
然后执行docker run命令,运行构建好的镜像,启动成功,浏览器访问:http://192.168.99.100:5008/ ,项目成功运行。
1 |
docker run -it -p 5008:80 --name slide-verify13 slide-verify:1.3 |
使用进阶: 我们回头再看一下Dockerfile文件,文件中的5到14行命令,包含了源码复制,项目还原(restore),构建(build),发布(publish)几个步骤。
1 2 3 4 5 6 7 8 9 10 |
FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY ["EasySlideVerificationDemoServer/EasySlideVerificationDemoServer.csproj", "EasySlideVerificationDemoServer/"] RUN dotnet restore "EasySlideVerificationDemoServer/EasySlideVerificationDemoServer.csproj" COPY . . WORKDIR "/src/EasySlideVerificationDemoServer" RUN dotnet build "EasySlideVerificationDemoServer.csproj" -c Release -o /app FROM build AS publish RUN dotnet publish "EasySlideVerificationDemoServer.csproj" -c Release -o /app |
[…]
View Detailsdocker run :创建一个新的容器并运行一个命令 语法
1 |
docker run [OPTIONS] IMAGE [COMMAND] [ARG...] |
OPTIONS说明: -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项; -d: 后台运行容器,并返回容器ID; -i: 以交互模式运行容器,通常与 -t 同时使用; -P: 随机端口映射,容器内部端口随机映射到主机的端口 -p: 指定端口映射,格式为:主机(宿主)端口:容器端口 -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用; --name="nginx-lb": 为容器指定一个名称; --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致; --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致; -h "mars": 指定容器的hostname; -e username="ritchie": 设置环境变量; --env-file=[]: 从指定文件读入环境变量; --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行; -m :设置容器使用内存最大值; --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container:<name|id> 四种类型; --link=[]: 添加链接到另一个容器; --expose=[]: 开放一个端口或一组端口; --volume , -v: 绑定一个卷 实例 使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。
1 |
docker run --name mynginx -d nginx:latest |
使用镜像nginx:latest以后台模式启动一个容器,并将容器的80端口映射到主机随机端口。
1 |
docker run -P -d nginx:latest |
使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。
1 |
docker run -p 80:80 -v /data:/data -d nginx:latest |
绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上。
1 |
$ docker run -p 127.0.0.1:80:8080/tcp ubuntu bash |
使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
1 2 |
runoob@runoob:~$ docker run -it nginx:latest /bin/bash root@b8573233d675:/# |
from:https://www.runoob.com/docker/docker-run-command.html
View Details有两种可能性。 1) 直接在主机上编辑文件系统 。这有些危险,并且有可能完全破坏容器,并可能根据发生的问题而破坏其他数据。 2) 将启动脚本更改为 永不失败的内容,例如启动bash,进行修复/编辑,然后将启动程序再次更改为所需的程序(例如节点或之前的版本)。 更多细节: 1)使用
1 2 |
docker ps |
查找正在运行的容器或
1 2 |
docker ps -a |
查找所有容器(包括停止的容器)并
1 2 |
docker inspect (containername) |
查找“ Id”,第一个值之一。 这是包含实现细节的部分,可能会更改,请注意,这样可能会丢失容器。 去
1 2 |
/var/lib/docker/aufs/diff/9bc343a9..(long container id)/ |
在那里您将找到所有更改为容器所基于的图像的文件。您可以覆盖文件,添加或编辑文件。 同样,我不建议这样做。 2)您可以在以下路径找到配置jsonconfig.json
1 2 |
/var/lib/docker/containers/9bc343a99..(long container id)/config.json |
在那里,您可以将参数从“ nodejs app.js”更改为“ / bin / bash”。现在重新启动docker服务并启动容器(您应该看到它现在已正确启动)。你应该用
1 2 |
docker start -i (containername) |
确保它不会立即退出。您现在可以使用容器和/或以后再附加
1 2 |
docker exec -ti (containername) /bin/bash |
另外,docker cp对于复制在容器外部编辑的文件非常有用。 同样,如果容器无论如何或多或少地“丢失”,则应该只使用那些措施,因此任何更改都是一种改进。 参考:http://codingdict.com/questions/53248
View Details一、创建.net core web api 的Demo 修改部分代码 端口随意指定,ip用星号“*”,方便接下来docker虚拟网络自动分配ip 下一步是Dockerfile文件,如果发现你的项目中没有此文件,很简单,右键项目=》添加=》Docker支持即可,然后修改文件如下图 然后发布项目并上传文件到服务器 二、将api项目部署到docker中 首先,进入到你上传的文件目录 根据目录下的Dockerfile创建镜像:docker build -t dockerapitestimage . (注意,注意,注意后面有一个点“.”,看清楚了,这个点表示当前目录上下文) 如果你在这一步失败了,请先尝试在docker下拉取dotnet镜像,执行命令 docker pull dotnet:latest ,拉取完之后再创建api镜像 这里要下载好几百兆的镜像包,网速太慢的话,建议尝试阿里云镜像加速,具体见我另外一篇文章 docker使用阿里云镜像加速 镜像创建成功后,我们就可以来创建容器并使用啦,继续往下 可以看到服务已经成功启动了,接下来准备访问一下试试 在linux中,首先我们输入$ docker ps 看下详情,如下图 发现我们的dockerapitest容器的ip地址是 0.0.0.0:8001,接着在linux中访问看看,成功了 linux下都没问题了,然后我们回windows下看看,如下图,显然成功了。 from:https://www.cnblogs.com/luoocean/p/11100684.html
View Details本教程演示如何在 Docker 容器中运行 ASP.NET Core 应用。 在本教程中,你将了解: 了解 Microsoft.NET 核心 Docker 映像 下载 ASP.NET Core 示例应用 本地运行示例应用 在 Linux 容器中运行示例应用 在 Windows 容器中运行示例应用 手动生成和部署 ASP.NET Core Docker 映像 在本教程中,你下载 ASP.NET Core 示例应用并在 Docker 容器中运行它。 此示例适用于 Linux 和 Windows 容器。 示例 Dockerfile 使用 Docker 多阶段构建功能在不同的容器中生成和运行。 生成和运行容器是由 Microsoft 从 Docker 中心提供的映像中创建的: dotnet/core/sdk 此示例将此映像用于生成应用。 此映像包含带有命令行工具 (CLI) 的 .NET Core SDK。 此映像对本地开发、调试和单元测试进行了优化。 为开发和编译而安装的工具使其成为一个相对较大的映像。 dotnet/core/aspnet 此示例将此映像用于运行应用。 此映像包含 ASP.NET Core 运行时和库,并针对在生产中运行应用进行了优化。 此映像专为部署和应用启动的速度而设计,相对较小,因此优化了从 Docker 注册表到 Docker 主机的网络性能。 仅将运行应用所需的二进制文件和内容复制到容器。 已准备运行内容,以此实现从 Docker run 到应用启动的最快时间。 Docker 模型中不需要动态代码编译。 先决条件 .NET Core SDK 3.0 Docker 客户端 18.03 或更高版本 Linux 分布 CentOS Debian Fedora Ubuntu macOS Windows Git 下载示例应用 通过克隆 .NET Core Docker 存储库下载示例: 控制台复制 […]
View DetailsDocker容器启动的时候,如果要挂载宿主机的一个目录,可以用-v参数指定。 譬如我要启动一个centos容器,宿主机的/test目录挂载到容器的/soft目录,可通过以下方式指定: # docker run -it -v /test:/soft centos /bin/bash 这样在容器启动后,容器内会自动创建/soft的目录。通过这种方式,我们可以明确一点,即-v参数中,冒号":"前面的目录是宿主机目录,后面的目录是容器内目录。 貌似简单,其实不然,下面我们来验证一下: 一、容器目录不可以为相对路径
1 2 3 |
[root@localhost ~]# docker run -it -v /test:soft centos /bin/bash invalid value "/test:soft" for flag -v: soft is not an absolute path See 'docker run --help'. |
直接报错,提示soft不是一个绝对路径,所谓的绝对路径,必须以下斜线“/”开头。 二、宿主机目录如果不存在,则会自动生成 如果宿主机中存在/test目录,首先删除它
1 2 3 |
[root@localhost ~]# rm -rf /test [root@localhost ~]# ls / bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var |
启动容器
1 2 3 |
[root@localhost ~]# docker run -it -v /test:/soft centos /bin/bash [root@a487a3ca7997 /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin soft srv sys tmp usr var |
查看宿主机,发现新增了一个/test目录
1 2 |
[root@localhost ~]# ls / bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys test tmp usr var |
三、宿主机的目录如果为相对路径呢? 这次,我们换个目录名test1试试
1 |
# docker run -it -v test1:/soft centos /bin/bash |
再到宿主机上查看是否新增了一个/test1目录,结果没有,是不是因为我用的是相对路径,所以生成的test1目录在当前目录下,结果发现还是没有。那容器内的/soft目录挂载到哪里去了?通过docker inspect命令,查看容器“Mounts”那一部分,我们可以得到这个问题的答案。
1 2 3 4 5 6 7 8 9 10 |
"Mounts": [ { "Name": "test1", "Source": "/var/lib/docker/volumes/test1/_data", "Destination": "/soft", "Driver": "local", "Mode": "z", "RW": true } ], |
可以看出,容器内的/soft目录挂载的是宿主机上的/var/lib/docker/volumes/test1/_data目录 原来,所谓的相对路径指的是/var/lib/docker/volumes/,与宿主机的当前目录无关。 四、如果只是-v指定一个目录,这个又是如何对应呢? 启动一个容器
1 2 3 |
[root@localhost ~]# docker run -it -v /test2 centos /bin/bash [root@ea24067bc902 /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys test2 tmp usr var |
同样使用docker inspect命令查看宿主机的挂载目录
1 2 3 4 5 6 7 8 9 10 |
"Mounts": [ { "Name": "96256232eb74edb139d652746f0fe426e57fbacdf73376963e3acdb411b3d73a", "Source": "/var/lib/docker/volumes/96256232eb74edb139d652746f0fe426e57fbacdf73376963e3acdb411b3d73a/_data", "Destination": "/test2", "Driver": "local", "Mode": "", "RW": true } ], |
可以看出,同3中的结果类似,只不过,它不是相对路径的目录名,而是随机生成的一个目录名。 五、如果在容器内修改了目录的属主和属组,那么对应的挂载点是否会修改呢? 首先开启一个容器,查看容器内/soft目录的属性
1 2 3 |
[root@localhost ~]# docker run -it -v /test:/soft centos /bin/bash [root@b5ed8216401f /]# ll -d /soft/ drwxr-xr-x 2 root root 6 Sep 24 03:48 /soft/ |
查看宿主机内/test目录的属性
1 2 |
[root@localhost ~]# ll -d /test/ drwxr-xr-x 2 root root 6 Sep 24 11:48 /test/ |
在容器内新建用户,修改/soft的属主和属组
1 2 3 4 |
[root@b5ed8216401f /]# useradd victor [root@b5ed8216401f /]# chown -R victor.victor /soft/ [root@b5ed8216401f /]# ll -d /soft/ drwxr-xr-x 2 victor victor 6 Sep 24 03:48 /soft/ |
再来看看宿主机内/test目录的属主和属组是否会发生变化?
1 2 |
[root@localhost ~]# ll -d /test/ drwxr-xr-x 2 mycat mycat 6 Sep 24 11:48 /test/ |
竟然变为mycat了。。。 原来,这个与UID有关系,UID,即“用户标识号”,是一个整数,系统内部用它来标识用户。一般情况下它与用户名是一一对应的。 首先查看容器内victor对应的UID是多少,
1 2 |
[root@b5ed8216401f /]# cat /etc/passwd | grep victor victor:x:1000:1000::/home/victor:/bin/bash |
victor的UID为1000,那么宿主机内1000对应的用户是谁呢?
1 2 |
[root@localhost ~]# cat /etc/passwd |grep 1000 mycat:x:1000:1000::/home/mycat:/bin/bash |
可以看出,宿主机内UID 1000对应的用户是mycat。 六、容器销毁了,在宿主机上新建的挂载目录是否会消失? 在这里,主要验证两种情况:一、指定了宿主机目录,即 -v /test:/soft。二、没有指定宿主机目录,即-v /soft 第一种情况:
1 2 3 4 5 6 7 8 9 10 |
[root@localhost ~]# rm -rf /test --首先删除宿主机的/test目录 [root@localhost ~]# ls / --可以看到,宿主机上无/test目录 bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var [root@localhost ~]# docker run -it --name=centos_test -v /test:/soft centos /bin/bash --启动容器,为了删除方便,我用--name参数指定了容器的名字 [root@82ad7f3a779a /]# exit exit [root@localhost ~]# docker rm centos_test --删除容器 centos_test [root@localhost ~]# ls / --发现 /test目录依旧存在 bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys test tmp usr var |
可以看出,即便容器销毁了,新建的挂载目录不会消失。进一步也可验证,如果宿主机目录的属主和属组发生了变化,容器销毁后,宿主机目录的属主和属组不会恢复到挂载之前的状态。 第二种情况,通过上面的验证知道,如果没有指定宿主机的目录,则容器会在/var/lib/docker/volumes/随机配置一个目录,那么我们看看这种情况下的容器销毁是否会导致相应目录的删除 首先启动容器
1 2 3 |
[root@localhost ~]# docker run -it --name=centos_test -v /soft centos /bin/bash [root@6b75579ec934 /]# exit exit |
通过docker inspect命令查看容器在宿主机上生成的挂载目录
1 2 3 4 5 6 7 8 9 10 |
"Mounts": [ { "Name": "b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301", "Source": "/var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301/_data", "Destination": "/soft", "Driver": "local", "Mode": "", "RW": true } ], |
对应的是/var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301/_data目录 销毁容器,看目录是否存在
1 2 3 4 5 |
[root@localhost ~]# docker rm centos_test centos_test [root@localhost ~]# ll /var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301 total 0 drwxr-xr-x 2 root root 6 Sep 24 14:25 _data |
发现该目录依旧存在,即便重启了docker服务,该目录依旧存在
1 2 3 4 |
[root@localhost ~]# systemctl restart docker [root@localhost ~]# ll /var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301 total 0 drwxr-xr-x 2 root root 6 Sep 24 14:25 _data |
七、挂载宿主机已存在目录后,在容器内对其进行操作,报“Permission denied”。 可通过两种方式解决: 1> 关闭selinux。 临时关闭:# setenforce 0 永久关闭:修改/etc/sysconfig/selinux文件,将SELINUX的值设置为disabled。 2> 以特权方式启动容器 指定--privileged参数 如:# docker run -it --privileged=true -v […]
View Details1、Docker导入本地镜像 有时候我们自己在本地或者其它小伙伴电脑上拷贝了一份镜像,有了这个镜像之后,我们可以把本地的镜像导入,使用docker import 命令。 例如这里下载了一个 alibaba-rocketmq-3.2.6.tar.gz 镜像文件,使用下列命令导入:
1 2 3 4 5 6 7 8 |
[root@rocketmq-nameserver4 dev]# <strong>cat alibaba-rocketmq-3.2.6.tar.gz | docker import - rocketmq:3.2.6</strong>(镜像名自己定义) [root@rocketmq-nameserver4 dev]#<strong> docker images</strong> REPOSITORY TAG IMAGE ID CREATED SIZE rocketmq 3.2.6 53925d1cf9f0 23 seconds ago 14MB my/python v1 36b6e288656c 2 days ago 281MB my/centos_width_python v1.0.1 36b6e288656c 2 days ago 281MB my/sinatra v2 8ba1d6a3ce4e 2 days ago 453MB hello-world latest 725dcfab7d63 4 months ago 1.84kB |
可以看到导入完成后,docker为我们生成了一个镜像ID,使用docker images也可以看到我们刚刚从本地导入的镜像。 注意镜像文件必须是tar.gz类型的文件。 [root@rocketmq-nameserver4 dev]# docker run -it rocketmq:3.2.6 /bin/bash ##启动导入本地镜像,会报如下异常 docker: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "exec: \"/bin/bash\": stat /bin/bash: no such file or directory". 解决方案: 暂时无解,有知道的兄台请在下面留言,在此先谢了。 2、保存镜像 我们的镜像做好之后,我们要保存起来,以供备份使用,该怎么做?使用docker save命令,保存镜像到本地。
1 2 |
[root@rocketmq-nameserver4 dev]# docker save -o rocketmq.tar rocketmq ##-o:指定保存的镜像的名字;rocketmq.tar:保存到本地的镜像名称;rocketmq:镜像名字,通过"docker images"查看 [root@rocketmq-nameserver4 dev]# ll |
rocketmq.tar为刚保存的镜像 3、载入镜像 我们有了本地的镜像文件,在需要的时候可以使用docker load将本地保存的镜像再次导入docker中。 docker load --input rocketmq.tar 或 docker load < rocketmq.tar 4、删除镜像 有些镜像过时了,我们需要删除。使用如下的命令:docker rmi -f image_id ##-f:表示强制删除镜像;image_id:镜像id from:https://www.cnblogs.com/linjiqin/p/8604756.html
View Details