docker是一个开源的应用容器引擎。
让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
众所周知,一个Java应用war包或者jar包启动成功,有能够对外提供服务的能力,能正常访问页面,做 *** 作,需要部署到一台有tomcat的linux环境中,没有容器技术前的上线流程通常出现这样的或那样的问题。
docker的架构
Docker使用客户端服务器架构模式,使用远程API来管理和创建Docker容器,Docker容器通过Docker镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类,Docker daemon一般在宿主主机后台运行,等待接收来自客户端的消息。Docker客户端则为用户提供一系列可执行命令,用户用这些命令实现跟Docker daemon交互。
Docker daemon作为服务端接受来自客户的请求,并处理这些请求创建、运行、分发容器。 客户端和服务端既可以运行在一个机器上,也可通过socket或者RESTfulAPI来进行通信。
设想,为了推出一个网站,您不必从裸机安装一个完整的服务器。 而不是安装 *** 作系统,然后安装服务器软件,然后部署精心设计的应用程序或站点,您可以简单地在一个独立的包中开发所有内容,并使用单个命令将其推出。
这是使用容器的众多好处之一。它们使开发和部署周期变得异常高效。但是你如何部署这些容器?我想在这里指导你完成这个过程。我们将专注于在Ubuntu Server 1804上部署基本的NGINX Web服务器作为容器。所有这一切都将在Docker的帮助下完成。
为了成功将NGINX部署为容器,您需要具备以下条件:
- 一个安装了Docker的Ubuntu Server 1804的运行实例。
- 一个docker 用户组的成员用户
是的,有了这两部分,你就准备好了。
您部署的每个容器都将基于从DockerHub中提取的镜像。 您可以下拉单个镜像并根据需要随时使用。 DockerHub上还有许多镜像用于单个应用程序或平台。 以NGINX为例。 如果你在DockerHub上搜索NGINX,你会得到大约56,172个条目。 这并不意味着每个条目都是您可以使用的可用图像。
图像命名如下:
例如,对于NGINX,您可能会找到一个名字为的镜像:
或许你可能找到:
您也看到了,有几乎所有需要的镜像。
在使用图像之前,必须将其保存在本地驱动器上。 有两种方法可以做到这一点:
- 直接使用pull命令
- 间接地,在容器部署过程中。
要从DockerHub中拉取图像,您将打开一个终端窗口并发出命令:
如果你想拉取Ingress图像,该命令是:
当你拉取你需要的图像之后,你可以使用命令确认是否存在:
上面的命令将列出你拉取的所有镜像(图A)。
拉取随意图像时要谨慎。 为什么? 因为你永远不知道创造它们的原因。 容器可能包含恶意代码,可能会对您的网络或数据造成严重破坏。 因此,最好只使用官方图像(例如NGINX图像)。
现在该部署容器了, 如果您尚未拉取镜像,则在部署阶段将下拉所需要的镜像。 由于我们拉取官方NGINX图像,我们将使用它。
要部署容器,请使用docker命令,如下所示:
备注:
- NAME等于您要为容器提供的名称(这可以是任何内容,例如nginx-webserver)。
- PORTS您要使用的端口(以NETWORK PORT:CONTAINER PORT形式)。
- IMAGE用于容器的图像(例如nginx)。
因此,部署NGINX容器的基本命令是:
容器将要部署,NGINX Web服务器将在端口80上可用于本地网络。但是,如果已在服务器上使用端口80来部署容器,该怎么办? 您可以将其部署在网络端口8080上,如下所示:
此时,您可能会看到下一个问题。 运行上述命令之一后,不返回bash提示符(图B)。
你如何运行一个容器,并获得你的bash提示? 为此,您必须以分离模式运行容器。 在此之前,您必须使用键盘组合[Ctrl] +终止当前容器。 该组合将返回提示并杀死容器。
要确定容器是否运行,使用命令:
将列出所有容器及其状态(图C)。
如果容器仍在运行,我们必须在同一端口部署另一个容器之前将其终止(否则端口会发生冲突,从而阻止容器部署)。 要杀死正在运行的容器,首先需要Container ID(随机字符串)。 发出docker ps -a命令时会显示此字符串。 要终止正在运行的容器,使用命令:
其中CONTAINER_ID是相关容器的ID。
然后,您可以使用以下命令删除容器:
其中CONTAINER_ID是相关容器的ID。
请注意,您不必输入完整的Container ID,字符串的前四个字符就足够了。
现在,要以分离模式部署容器,命令是:
这次你不仅会得到你的提示,而且Docker会为你显示容器ID(图D)。
如果你想在正在运行的容器上工作怎么办? 假设您想对NGINX进行更改甚至开始开发它将显示的网站? 因此,您必须访问容器。 因此,您需要Container ID。 使用ID,发出命令:
其中CONTAINER_ID是容器的ID。
您现在应该处于运行容器提示符(图E)中,您可以在其中开始处理NGINX服务器。
要退出容器,只需键入命令exit。
七、比你想象的容易
希望到现在为止,您看到容器部署并不像您想象的那样具有挑战性。 在Docker的帮助下,您可以在几分钟内推出专业版的应用和服务。
原文链接:
做开发的基本都听说过沙盒 (Sandbox) 和虚拟机 (Virtual Machine,简称 VM) ,如今容器技术很火,其中以 docker 最受大家欢迎。作为一种集群管理工具,K8s 最近也是火的不要不要的。 我们经常会讲 docker 和 K8s 联系起来,那么两者之间又存在什么关联呢?
首先 Sandbox 和 VM 都是属于 虚拟技术 ,用来虚拟软件运行环境并具有资源隔离的功能。Sandbox 比较“轻”(只需要虚拟出一个小的环境)且一旦退出就释放之前占用的资源;VM 则比较重(虚拟出整个 *** 作系统,相当于子电脑)。关于 Sandbox 和 VM 的区别可以参考博客: >运行容器
sudo docker run -it -v /home/lcj/test_docker:/home/lcj/test_docker tensorflow/tensorflow:1131-gpu-py3
参数:
-d 后台运行并返回容器ID,如 -itd
-e 设置环境变量,如 -e NVIDIA_VISIBLE_DEVICE=0 使用编号为 0 的GPU
-i 打开 STDIN,用于控制台交互,通常跟 -t 一起使用
--net 容器网络设置,如 --net my_network,或者 --net=contianer:NAME_or_ID,使用其他容器的网络,共享 IP 和 PORT 等资源
--restart 指定容器停止后的启动的策略,如 --restart=always
--runtime=nvidia 使用 nvidia 模式运行,跟 -e 一起使用,可以在容器里使用 GPU
-t 为容器重新分配一个伪输入终端,通常与 -i 一起使用
-v 给容器挂载存储卷,挂载到容器的某个目录,如 -v /home/lcj/test_docker:/home/lcj/test_docker
-w 指定容器的工作目录
停止容器
docker stop 容器ID
或者 docker stop `docker ps -a -q` 停止所有容器
重启容器
docker restart 容器ID
进入一个运行中的容器
docker attach 容器ID
保存容器
docker save myimage | bzip2 -9 -c > /home/lcj/savetarbz2
加载容器
bzip2 -d -c < /home/lcj/savetarbz2 | docker load
杀掉运行中的容器
docker kill -s KILL 容器ID
-s:向容器中发送一个信号
docker rm 命令
参数:
-f :通过 SIGKILL 强制删除一个容器,如 docker rm -f a
-l:移除容器间的网络连接,而非容器本身,如 docker rm -l b,其中 b 为连接名,而非容器名
-v:删除与容器关联的卷
docker create :创建一个容器但不运行它,语法同 docker run
docker ps
-a:显示所有的容器,包括未运行的
-f:根据条件过滤显示的内容
-l:显示最近创建的容器
-n:列出最近创建的 n 个容器
-q:静默模式,只显示容器 ID
列出所有创建的容器 ID
docker ps -a -q
停止所有容器 ID
docker stop `docker ps -a -q`
获取容器/镜像的元数据
docker inspect 容器/镜像名
docker top :查看容器中的进程信息
docker top a(a 是容器)
docker attach :链接到正在运行的容器(该容器必须正在运行)
docker attach a (a 是容器)
docker events :从服务器获取实时事件
-f:根据条件过滤事件
--since:从指定的时间戳后显示所有的事件
--until:流水时间显示到指定的时间为止
显示docker 2016年7月1日后的所有事件
docker events -since="1467302400"
显示docker 镜像为mysql:56 2016年7月1日后的相关事件
docker events -f "image"="mysql:56" --since="1467302400"
备注:如果指定的时间是到秒级的,需要将时间转成时间戳。如果时间为日期的话,可以直接使用,如--since="2016-07-01"
docker export :将文件系统作为一个 tar 压缩文件导出到 STDOUT
docker port :列出指定的容器端口的映射,或者查找将 PRIVATE_PORT NAT 到面向公众的端口
docker port a(a 为容器名)
docker commit : 从容器创建一个新的镜像
-a:提交的镜像作者
-c:使用 Dockerfile 文件来创建镜像
-m:提交时说明的文字
-p:在 commit 时暂停容器
docker commit -a 'lcj' -m 'has update' 容器 ID 镜像名
docker cp :用于容器与主机之间的数据拷贝
将主机的 test_docker 目录拷贝到容器 /home/lcj 目录下
docker cp /home/lcj/test_docker 容器 ID:/home/lcj/
将容器 /home/lcj 目录拷贝到主机的 test_docker 目录下
docker cp 容器 ID:/home/lcj/ /home/lcj/test_docker
docker login/logout :登录或退出一个 Docker 镜像仓库,如果未指定镜像仓库地址,则默认为 官方 Docker Hub
docker login -u 用户名 -p 密码
docker logout
docker pull :从镜像仓库中拉取或者更新指定镜像
docker pull java
docker push :将本地的镜像上传到镜像仓库,需先登录到镜像仓库
docker push myapache:v1
docker search :从 Docker Hub 查找镜像
--automated,只列出 automated build(自动生成) 类型的镜像
--no-trunc,显示完整的镜像描述
-s:列出收藏数不少于指定值的镜像
从Docker Hub查找所有镜像名包含java,并且收藏数大于10的镜像
docker search -s 10 java
docker images :列出本地所有的镜像
-a:列出本地所有的镜像(含中间映像层,默认情况下,过滤中间映像层)
-q:只显示镜像 ID
docker images 或 docker images ubuntu,列出本地所有镜像或本地仓库名为 ubuntu 的所有的镜像
docker rmi :删除一个或多个镜像
-f:强制移除
--no_prune:不移除该镜像的过程镜像,默认移除
强制删除本地镜像w3cschool/ubuntu:v4
docker rmi -f w3cschool/ubuntu:v4
docker tag :标记本地镜像,将其归入到某一个仓库
将镜像ubuntu:1510标记为 w3cschool/ubuntu:v3 镜像
docker tag ubuntu:1510 w3cschool/ubuntu:v3
docker build:使用 Dockerfile 文件创建镜像
使用当前目录的Dockerfile创建镜像
docker build -t w3cscholl/ubuntu:v3 (不要漏掉最后的 符号)
使用URL githubcom/creack/docker-firefox 的 Dockerfile 创建镜像
docker build githubcom/creack/docker-firefox
docker history :查看指定镜像的创建历史
docker save :将指定镜像保存成 tar 压缩文件
-o:输出到文件
docker save -o my_ubuntu_v3tar w3cschool/ubuntu:v3
docker import:从压缩文件中创建镜像
-c:应用 docker 指令创建镜像
-m:提交时的说明文字
从镜像归档文件my_ubuntu_v3tar创建镜像,命名为w3cschool/ubuntu:v4
docker import my_buntu_v3tar w3cschool/ubuntu:v4
由于容器是进程级的,相比于虚拟机有着很多的优势
一:启动速度快:由于容器里面的应用软件,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以启动容器时,不是启动一整个 *** 作系统,速度就快了很多。
二:资源占用少:相比于虚拟机而言,容器只占用需要的资源,不会去占有无效的资源,而虚拟机则是一个完整的 *** 作系统,不可避免的占用了所有资源。
三:体积小,轻量级:容器只需要包含用到的组件,对比于虚拟机,容器文件要比虚拟机小很多。
四:方便移动:容器技术最重要的就是为不同的主机上运行服务一个轻便,一致的格式。容器的格式更加标准化且方便客户对工作负载的迁移,有效避免单一的平台提供商。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)