广告
返回顶部
首页 > 资讯 > 精选 >Docker中容器的创建与启停问题怎么解决
  • 849
分享到

Docker中容器的创建与启停问题怎么解决

2023-07-01 05:07:56 849人浏览 八月长安
摘要

今天小编给大家分享一下Docker中容器的创建与启停问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 镜像和容

今天小编给大家分享一下Docker容器的创建与启停问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

1. 镜像和容器

看待镜像和容器的一种方式是将它们类比成程序与进程。一个进程可以视为一个被执行的应用程序,同样,一个Docker容器可以视为一个运行中的Docker镜像。

Docker中容器的创建与启停问题怎么解决

如果大家熟悉面向对象原理,看待镜像和容器的另一种方法是将镜像看作类而将容器看作对象。对象是类的具体实例,同样,容器是镜像的实例。用户可以从单个镜像创建多个容器,就像对象一样,它们之间全都是相互隔离的。不论用户在对象内修改了什么,都不会影响类的定义——它们从根本上就是不同的东西。

2. 新建并启动容器

首先,我们会查看Docker是否能正常工作,然后学习基本的Docker的工作流:创建并管理容器。我们将浏览容器的典型生命周期:从创建、管理到停止,直到最终删除。 第一步,查看docker程序是否存在,功能是否正常:

[root@localhost ~]# sudo docker infoContainers: 1Images: 8Storage Driver: aufs    Root Dir: /var/lib/docker/aufs    Backing Filesystem: extfs    Dirs: 10Execution Driver: native-0.2Kernel Version: 3.13.0-43-genericOperating System: ubuntu 14.04.2 LTSCPUs: 1Total Memory: 994 MiBName: riemannaID: DOIT:XN5S:WNYP:WP7Q:BEUP:EBBL:KGIX:Go3V:NDR7:YW6E:VFXT:FXHM WARNING: No swap limit support

在这里我们调用了docker可执行程序的info命令,该命令会返回所有容器和镜像(镜像即是Docker用来构建容器的“构建块”)的数量、Docker使用的执行驱动和存储驱动(execution and storage driver),以及Docker的基本配置。

Docker是基于客户端-服务器构架的。它有一个docker程序,既能作为客户端,也可以作为服务器端。作为客户端时,docker程序向Docker守护进程发送请求(如请求返回守护进程自身的信息),然后再对返回的请求结果进行处理。

现在,让我们尝试启动第一个Docker容器。我们可以使用docker run命令创建容器。 docker run命令提供了Docker容器的创建到启动的功能:

[root@localhost ~]# sudo docker run -i -t ubuntu /bin/bashUnable to find image 'ubuntu' locallyubuntu:latest: The image you are pulling has been verified 511136ea3c5a: Pull completed497ad3926c8: Pull completeccb62158e970: Pull completee791be0477f2: Pull complete3680052c0f5c: Pull complete22093c35d77b: Pull complete5506de2b643b: Pull completeStatus: Downloaded newer image for ubuntu:latestroot@fcd78e1a3569:/#
官方文档列出了完整的Docker命令列表,也可以使用docker help获取这些命令。此外,还可以使用Docker的man页(即执行man docker-run)。
[root@localhost ~]# sudo docker run -i -t ubuntu /bin/bash

上述命令中:

上述命令中:

        -t  选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,
        -i  则让容器的标准输入保持打开。
利用docker run来创建并启动容器时,Docker在后台运行的标准操作包括:
        ·检查本地是否存在指定的镜像,不存在就从公有仓库下载;
        ·利用镜像创建一个容器,并启动该容器;
        ·分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层;
        ·从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中;
        ·从网桥的地址池配置一个IP地址给容器;
        ·执行用户指定的应用程序;
        ·执行完毕后容器被自动终止。

官方文档上列出了docker run命令的所有标志,此外还可以用命令docker help run查看这些标志。或者,也可以用Docker的man页(也就是执行man docker-run命令)。

接下来,我们告诉Docker基于什么镜像来创建容器,示例中使用的是ubuntu镜像。ubuntu镜像是一个常备镜像,也可以称为“基础”(base)镜像,它由Docker公司提供,保存在Docker HubReGIStry上。可以以ubuntu基础镜像(以及类似的fedora、debian、Centos等镜像)为基础,在选择的操作系统上构建自己的镜像。到目前为止,我们基于此基础镜像启动了一个容器,并且没有对容器增加任何东西。

首先Docker会检查本地是否存在ubuntu镜像,如果本地还没有该镜像的话,那么Docker就会连接官方维护的Docker Hub Registry,查看Docker Hub中是否有该镜像。Docker一旦找到该镜像,就会下载该镜像并将其保存到本地宿主机中。 随后,Docker在文件系统内部用这个镜像创建了一个新容器。该容器拥有自己的网络、IP地址,以及一个用来和宿主机进行通信的桥接网络接口。最后,我们告诉Docker在新容器中要运行什么命令,在本例中我们在容器中运行/bin/bash命令启动了一个Bash shell。 当容器创建完毕之后,Docker就会执行容器中的/bin/bash命令,这时就可以看到容器内的shell了,如下:

root@f7cbdac22a02:/#

3. 使用第一个容器

现在,我们已经以root用户登录到了新容器中,容器的ID f7cbdac22a02,乍看起来有些令人迷惑的字符串`。这是一个完整的Ubuntu系统,可以用它来做任何事情。下面就来研究一下这个容器。首先,我们可以获取该容器的主机名,如下:

root@f7cbdac22a02:/# hostname f7cbdac22a02

可以看到,容器的主机名就是该容器的ID。再来看看/etc/hosts文件内容:

root@f7cbdac22a02:/# cat /etc/hosts172.17.0.4 f7cbdac22a02127.0.0.1 localhost::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnetff00::0 ip6-mcastprefixff02::1 ip6-allnodesff02::2 ip6-allrouters

Docker已在hosts文件中为该容器的IP地址添加了一条主机配置项。 再来看看容器的网络配置情况,如下:

root@f7cbdac22a02:/# ip a1: lo: <LOOPBACK,UP,LOWER_UP> mtu 1500 qdisc noqueue state    UNKNOWN group defaultlink/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host loinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever899: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast    state UP group default qlen 1000link/ether 16:50:3a:b6:f2:cc brd ff:ff:ff:ff:ff:ffinet 172.17.0.4/16 scope global eth0inet6 fe80::1450:3aff:feb6:f2cc/64 scope link valid_lft forever preferred_lft forever

可以看到,这里有lo的环回接口,还有IP为172.17.0.4的标准 eth0网络接口,和普通宿主机是完全一样的。我们还可以查看容器中运行的进程,如下:

root@f7cbdac22a02:/# ps -auxUSER PID %CPU %MEM    VSZ RSS TTY    STAT START TIME COMMANDroot    1 0.0 0.0    18156 1936 ?    Ss    May30 0:00 /bin/bash root    21 0.0 0.0   15568 1100 ?    R+    02:38 0:00 ps -aux

接下来尝试安装一个软件包:

root@f7cbdac22a02:/# apt-get update && apt-get install vim

通过上述命令,就在容器中安装了Vim编辑器软件。 用户可以继续在容器中做任何自己想做的事情。当所有工作都结束时,输入exit,就可以返回到Ubuntu宿主机的命令行提示符了。 但是,容器现在已经停止运行了!只有在指定的/bin/bash命令处于运行状态的时候,我们的容器也才会相应地处于运行状态。一旦退出容器,/bin/bash命令也就结束了,这时容器也随之停止了运行。

但容器仍然是存在的,可以用docker ps -a命令查看当前系统中容器的列表,如下:

CONTAINER ID IMAGE     COMMAND    CREATED  STATUS PORTS NAMES1cd57c2cdf7f ubuntu:14.04 "/bin/bash" A minute Exited    gray_cat

默认情况下,当执行docker ps命令时,只能看到正在运行的容器。如果指定-a标志的话,那么docker ps命令会列出所有容器,包括正在运行的和已经停止的。 注意:也可以为docker ps命令指定-l标志,列出最后一个运行的容器,无论其正在运行还是已经停止。也可以通过--fORMat标志,进一步控制显示哪些信息,以及如何显示这些信息

从该命令的输出结果中我们可以看到关于这个容器的很多有用信息:ID、用于创建该容器的镜像、容器最后执行的命令、创建时间以及容器的退出状态(在上面的例子中,退出状态是0,因为容器是通过正常的exit命令退出的)。我们还可以看到,每个容器都有一个名称。 有3种方式可以唯一指代容器:短UUID(如f7cbdac22a02)、长UUID(如f7cbdac22a02e03c9438c729345e54db9d20cfa2ac1fc3494b6eb60872e74778)或者名称(如gray_cat)。

4. 容器命名

Docker会为我们创建的每一个容器自动生成一个随机的名称。例如,上面我们刚刚创建的容器就被命名为gray_cat。如果想为容器指定一个名称,而不是使用自动生成的名称,则可以用--name标志来实现,如下:

[root@localhost ~]# sudo docker run --name bob_the_container -i -t ubuntu /bin/bash root@aa3f365f0f4e:/# exit

上述命令将会创建一个名为bob_the_container的容器。一个合法的容器名称只能包含以下字符:小写字母a~z、大写字母A~Z、数字 0~9、下划线、圆点、横线(如果用正则表达式来表示这些符号,就是[a-zA-Z0-9_.-])

在很多Docker命令中,都可以用容器的名称来替代容器ID,后面我们将会看到。容器名称有助于分辨容器,当构建容器和应用程序之间的逻辑连接时,容器的名称也有助于从逻辑上理解连接关系。具体的名称(如WEB、db)比容器ID和随机容器名好记多了。我推荐大家都使用容器名称,以更加方便地管理容器。 容器的命名必须是唯一的。如果试图创建两个名称相同的容器,则命令将会失败。如果要使用的容器名称已经存在,可以先用docker rm命令删除已有的同名容器后,再来创建新的容器。

5.重启容器

容器已经停止了,我们可以用下面的命令重新启动一个已经停止的容器,如下:

[root@localhost ~]# sudo docker start bob_the_container

除了容器名称,也可以用容器ID来指定容器,

[root@localhost ~]# sudo docker start aa3f365f0f4e

也可以使用docker restart命令来重新启动一个容器。 这时运行不带-a标志的docker ps命令,就应该看到我们的容器已经开始运行了。 类似地,Docker也提供了docker create命令来创建一个容器,但是并不运行它。这让我们可以在自己的容器工作流中对其进行精准化的控制。

6. 附着到容器上

Docker容器重新启动的时候,会沿用docker run命令时指定的参数来运行,因此我们的容器重新启动后会运行一个交互式会话shell。此外,也可以用docker attach命令,重新附着到该容器的会话上,如下:

[root@localhost ~]# sudo docker attach bob_the_container

也可以使用容器ID,重新附着到容器的会话上,如下:

[root@localhost ~]# sudo docker attach aa3f365f0f4e

现在,又重新回到了容器的Bash提示符,如下:

root@aa3f365f0f4e:/_#_

可能需要按下回车键才能进入该会话。 如果退出容器的shell,容器会再次停止运行。

容器是直接提供应用服务的组件,也是Docker实现快速启停和高效服务性能的基础。 在生产环境中,因为容器自身的轻量级特性,推荐大家使用容器时在一组容器前引入HA(High Availability,高可靠性)机制。例如使用HAProxy工具来代理容器访问,这样在容器出现故障时,可以快速切换到功能正常的容器。此外,建议通过指定合适的容器重启策略,来自动重启退出的容器。

以上就是“Docker中容器的创建与启停问题怎么解决”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: Docker中容器的创建与启停问题怎么解决

本文链接: https://www.lsjlt.com/news/333434.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Docker中容器的创建与启停问题怎么解决
    今天小编给大家分享一下Docker中容器的创建与启停问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 镜像和容...
    99+
    2023-07-01
  • 聊聊Docker中容器的创建与启停问题
    目录1. 镜像和容器2. 新建并启动容器3. 使用第一个容器4. 容器命名5.重启容器6. 附着到容器上1. 镜像和容器 看待镜像和容器的一种方式是将它们类比成程序与进程。一个进程可...
    99+
    2022-11-13
  • 解决docker搭建gitlab时容器不停重启的问题
    在我按照gitlab的官方文档搭建后,准备进入容器修改配置文件时,发现进入不了。显示错误时容器正在重启,如下所示 [root@gitlab ~]# docker exec -it g...
    99+
    2022-11-13
  • docker创建容器后无法启动怎么解决
    如果在创建 Docker 容器后无法启动,可以尝试以下几个解决方法: 查看容器状态:运行 `docker ps -a` 命令,查...
    99+
    2023-10-26
    docker
  • docker容器中安装vim问题怎么解决
    这篇文章主要介绍“docker容器中安装vim问题怎么解决”,在日常操作中,相信很多人在docker容器中安装vim问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”docker容器中安装vim问题怎...
    99+
    2023-06-20
  • Docker 无法停止或删除容器服务问题的解决方案
    前言 今天有开发同学给我反馈说有一个容器服务无法 stop、rm(docker rm -f)和 kill 等操作,也就是说这个容器服务无法终止~ 操作步骤 (1)执行删除命令无法删除...
    99+
    2022-11-12
  • docker启动jenkins环境的问题怎么解决
    本篇内容主要讲解“docker启动jenkins环境的问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“docker启动jenkins环境的问题怎么解决”吧!【注意:】jenkins的d...
    99+
    2023-06-29
  • Docker容器导出为镜像问题怎么解决
    今天小编给大家分享一下Docker容器导出为镜像问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Docker容器导...
    99+
    2023-07-05
  • docker容器时区错误问题该怎么解决
    docker容器时区错误问题该怎么解决,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。背景利用node-schedule定时任务库写了一个自动定时发邮件的脚本,每天上午7点发送邮...
    99+
    2023-06-25
  • docker容器非root用户提权的问题怎么解决
    这篇文章主要介绍“docker容器非root用户提权的问题怎么解决”,在日常操作中,相信很多人在docker容器非root用户提权的问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”docker容器非...
    99+
    2023-06-30
  • 怎么解决Docker run容器处于created状态问题
    小编给大家分享一下怎么解决Docker run容器处于created状态问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在最近遇到的一次问题中,有这样一种现象:...
    99+
    2023-06-14
  • 解决docker容器与宿主机相差8小时的问题
    使用docker-compose部署时,在输出的日志以及相关事件校验及输出时,导致事件与现实相差8小时。 排查问题: 1.查看宿主机时间: # 查看时间 date Wed Sep...
    99+
    2022-11-12
  • Java中创建URL的常见问题怎么解决
    本篇内容介绍了“Java中创建URL的常见问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!问题1:Java的URLEncoder这...
    99+
    2023-06-17
  • 怎么解决docker容器重启之后/etc下某些配置文件被重置的问题
    这篇文章给大家分享的是有关怎么解决docker容器重启之后/etc下某些配置文件被重置的问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1./etc/hosts, /etc/resolv.conf和/etc/h...
    99+
    2023-06-14
  • 解决docker 容器设置中文语言包出现的问题
    如果在Docker 中采用 docker search centos 采用 docker pull docker.io/centos 下载基础镜像 这个镜像是不支持中文的,可以采...
    99+
    2022-11-11
  • 怎么解决mysql外键创建失败的问题
    这篇文章主要讲解了“怎么解决mysql外键创建失败的问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么解决mysql外键创建失败的问题”吧!创建pers...
    99+
    2022-10-18
  • vue-cli创建项目的loader问题怎么解决
    这篇文章主要介绍“vue-cli创建项目的loader问题怎么解决”,在日常操作中,相信很多人在vue-cli创建项目的loader问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue-cli创建...
    99+
    2023-07-04
  • 怎么解决oracle在线创建索引中断问题
    本篇内容主要讲解“怎么解决oracle在线创建索引中断问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决oracle在线创建索引中断问题”吧!进行在线创...
    99+
    2022-10-18
  • Javascript中怎么解决浏览器兼容问题
    今天就跟大家聊聊有关Javascript中怎么解决浏览器兼容问题,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.自动匹配高度自从我们抛弃了基于Ta...
    99+
    2022-10-19
  • 解决docker容器重启之后/etc下某些配置文件被重置的问题
    1. /etc/hosts, /etc/resolv.conf和/etc/hostname容器中的这三个文件不存在于镜像,而是存在于于/var/lib/docker/containe...
    99+
    2022-11-11
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作