当前位置:首页 > 技术 > 正文内容

Docker入门学习

Lotus2022-10-06 19:04技术

1.运行第一个docker容器

docker run -i -t ubuntu /bin/bash

参数说明:

-i, --interactive=false, 打开STDIN,用于控制台交互
-t, --tty=false, 分配tty设备,该可以支持终端登录,默认为false
-d, --detach=false, 指定容器运行于前台还是后台,默认为false

首先,docker run -it ubuntu 的意思是,为centos这个镜像创建一个容器, -i和-t这两个参数的作用是,为该docker创建一个伪终端,这样就可以进入到容器的交互模式?(也就是直接进入到容器里面)后面的/bin/bash的作用是表示载入容器后运行bash ,docker中必须要保持一个进程的运行,要不然整个容器启动后就会马上kill itself,这样当你使用docker ps 查看启动的容器时,就会发现你刚刚创建的那个容器并不在已启动的容器队列中。这个/bin/bash就表示启动容器后启动bash

Docker入门学习_ubuntu

2.使用第一个容器

现在我们已经以root用户登录到了新容器中,容器的id是21af97ac0b0b

hostname

Docker入门学习_bash_02

可以看到,容器的主机名就是该容器的id,我们再来看看/etc/hosts文件

Docker入门学习_ubuntu_03

docker已经再hosts文件中为该容器的ip地址添加了一条主机配置项。再看看容器的网络配置情况,由于容器中没有ifconfig 命令,首先通过以下命令安装

apt-get update
apt install net-tools # ifconfig
apt install iputils-ping # ping

Docker入门学习_ubuntu_04

可以看到lo的环回接口,还有ip为172.17.0.2的标准eth0网络接口,和普通宿主机是完全医院的。还可以查看容器中运行的进程

Docker入门学习_docker_05

如果需要编辑文件,需要安装vim软件

apt install vim

当所有工作都结束时,输入exit,就可以返回到Ubuntu宿主机的命令行提示符了。但是这个时候容器就停止运行了,只有在指定的/bin/bash命令处于运行状态的时候,我们的容器也才会相应地处于运行状态。一旦退出容器,/bin/bash命令也就结束了,这时容器也随之停止了运行。

但是容器仍然是存在的,我们可以使用以下命令来查看当前系统中容器的列表

docker ps -a

默认情况下,当执行docker ps命令时,只能看到正在运行的容器,如果指定-a标志,那么会列出所有的容器,包括正在运行和已经停止的。

docker ps -l

Docker入门学习_ubuntu_06

从该命令的输出结果中我们可以看到关于这个容器的很多有用信息:id、用于创建该容器的镜像、容器最后执行的命令、创建时间以及容器的退出状态(在上面的例子中,退出状态是0,因为容器是通过正常的exit命令退出的)

3.容器命名

docker会为我们创建的每一个容器自动生成一个随机的名称。例如,上面创建的容器就被命名为sleepy_sutherland,如果想为容器指定一个名称,则可以使用--name标志来实现(容器命名必须唯一)

docker run --name my-ubuntu -i -t ubuntu /bin/bash

Docker入门学习_bash_07

4.重新启动已经停止的容器

名称为sleepy_sutherland的容器已经停止,可以使用以下命令启动(支持start、stop、restart)

docker start sleepy_sutherland

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

docker start 21af97ac0b0b

5.附着到容器

当容器启动后,我们可以使用以下命令,重新附着到该容器的会话上

docker attach sleepy_sutherland

或者

docker attach 21af97ac0b0b

如果退出容器的shell,容器也会随之停止运行

6.创建守护式容器

除了这些交互式运行的容器(interactive container),我们可以创建长期运行的容器。守护式容器(daemonized container)

没有交互式会话,非常适合运行应用程序和服务。大多数时候我们都需要以守护式来运行我们的容器。

docker run --name daemon_dave -d ubuntu /bin/sh -c "while true;do echo hello workd; sleep 1; done"

上面docker run 命令使用了-d参数,因此docker会将容器放到后台运行,容器里运行了一个while循环,该循环会一直打印hello world,直到容器或其进程停止运行

7.容器内部都再干些什么

现在我们已经有了一个在后台运行while循环的守护型容器,为了知道容器内部都在干什么,我们可以使用docker logs命令来获取容器的日志

docker logs daemon_dave

Docker入门学习_ubuntu_08

这里,我们可以看到while循环正在向日志里打印hello world。docker会输出最后几条日志项并返回。我们也可以在命令后使用-f参数来监控docker的日志,这与tail -f命令非常相似

docker logs -f daemon_dave

可以用以下命令获取日志的最后10行内容,命令如下

Docker入门学习_docker_09

跟踪某个容器的最新日志而不必读取整个日志文件,命令如下

docker logs --tail 0 -f daemon_dave

Docker入门学习_docker_10

使用-t标志为每条日志项加上时间戳,命令如下

docker logs -ft daemon_dave

Docker入门学习_docker_11

8.查看容器内的进程

docker top daemon_dave

Docker入门学习_bash_12

9.在容器内部运行进程

docker exec -d daemon_dave touch /etc/new_config_file

上面例子中的命令会在daemon_dave容器内创建一个空文件。

也可以在daemon_dave容器中启动一个打开shell的交互式任务,命令如下

docker exec -t -i daemon_dave /bin/bash

和运行交互容器时一样,这里的-t和-i标志为我们执行的进程创建了TTY并捕捉STDIN。上面这个意思中,这条命令会在daemon_dave容器内创建一个新的bash会话,有了这个会话,我们可以在该容器中运行其他命令了。

10.停止守护式容器

docker stop daemon_dave

注意:docker stop命令会向docker容器进程发送SIGTERM信号,如果你想快速停止某个容器,也可以使用docker kill命令来向容器进程发送SIGKILL信号

要想查看已经停止

的容器的状态,则可以使用docker ps命令,还有一个很实用的命令,docker ps -n x ,该命令会显示最后x个容器,不论这些容器正在运行还是已经停止

docker ps -n 3

Docker入门学习_ubuntu_13

11.自带重启容器

如果由于某种错误而导致容器停止运行,我们换可以通过--restart标志,让docker自动重新启动该容器,--restart标志会检查容器的退出代码,并据此来决定是否要重启容器。默认的行为是docker不会重启容器。

docker run --restart=always --name daemon_dave -d ubuntu /bin/sh -c "while true;do echo hello workd; sleep 1; done"

在本例中,--restart标志被设置为always。无论容器的退出代码是什么,docker都会自动重启该容器。除了always,可以将这个标志设为on-failure,这样,只有当容器的退出代码为非0值的时候才会自动重启。另外,on-failure还接受一个可选性的重启次数参数,如下

docker run --restart=on-failure:5 --name daemon_dave -d ubuntu /bin/sh -c "while true;do echo hello workd; sleep 1; done"

这样,当容器退出代码为非0时,docker会尝试自动重启该容器,最多重启5次

12.深入容器

docker inspect命令会对容器进行详细的检查,然后返回其配置信息,包括名称、命令、网络配置以及很多有用的数据

docker inspect daemon_dave

Docker入门学习_docker_14

可以使用-f或者--format标志来选定查看结果,下面这条命令会返回容器的运行状态

docker inspect --format='{{ .State.Running }}' daemon_dave

Docker入门学习_bash_15

还可以获取容器的ip信息

docker inspect --format='{{ .NetworkSettings.IPAddress }}' daemon_dave

Docker入门学习_bash_16

也可以同时指定多个容器,并显示每个容器的输出结果

docker inspect --format='{{.Name}} {{ .State.Running }}' daemon_dave my-ubuntu

Docker入门学习_bash_17

注意:除了查看容器,你还可以通过浏览/var/lib/docker目录来深入了解docker的工作原理。该目录存放着docker镜像、容器以及容器的配置。所有的容器都保存在/var/lib/docker/containers

13.删除容器

如果容器已经不再使用,可以使用docker rm命令来删除它们(需要注意的是,运行中的docker容器是无法删除的!你必须先通过docker stop或docker kill命令停止容器,才能将其删除)

docker rm daemon_dave3

目前,还没有办法一次删除所有容器,不过可以通过代码清单来删除全部容器

docker rm `docker ps -a -q`

上面docker ps命令会列出现有的全部容器,-a标志代表列出所有(all)容器,而-q标志则表示只需要返回容器id而不会返回容器的其他信息。这样我们就得到了容器id的列表,并传给了docker rm命令,从而达到删除所有容器的目。

扫描二维码推送至手机访问。

版权声明:本文来源于网络,仅供学习,如侵权请联系站长删除。

本文链接:https://news.layui.org.cn/post/129.html

分享给朋友:

“Docker入门学习” 的相关文章

你看好云原生吗?

我理解的云原生是一种思想。目前为止,再稍具体一点就是一种构建和运行应用程序的方法 ,是一套技术体系和方法论。 目前来看,互联网技术领域没有那么粗放了,可以看成从”一堆砖头“变成了码的整齐的砖头,各种人物资源、空间利用率更高了。 云原生还在不断的发展,一年前我看中了云原生的发展方向并展开了一系列的学习,目前工作中也只是稍有涉及,并不是主要工作,我还是非常期望可以从事云原生工作的,下面罗列一下云原...

2022.9.30 Java第四次课后总结

1.public class BoxAndUnbox { /** * @param args */ public static void main(String[] args) { int value=100; Integer obj=value; //装箱 int result=obj*2; //拆箱 } } 创建了一个value 并定义了相关变量 public cl...

深入理解AQS--jdk层面管程实现【管程详解的补充】

什么是AQS   1.java.util.concurrent包中的大多数同步器实现都是围绕着共同的基础行为,比如等待队列、条件队列、独占获取、共享获取等,而这些行为的抽象就是基于AbstractQueuedSynchronizer(简称AQS)实现的,AQS是一个抽象同步框架,可以用来实现一个依赖状态的同步器。   2.JDK中提供的大多数的同步器如Lock, Latch, Barrier等,都...

【Spring boot】启动过程源码分析

启动过程结论 推测web应用类型。 spi的方式获取BootstrapRegistryInitializer、ApplicationContextInitializer、ApplicationContextInitializer对象。 通过调用栈推测出main()方法所在的类。 调用启动方法:run(String... args)。后面的步骤在这个方法内部! 触发SpringApplicatio...

记Windows的一个存在了十多年的bug

bug Windows有一个bug,持续了十多年,从Windows Visita开始(2007年),一直存在,直到Windows11(2021年)才修复(其实也不叫修复,后面我再具体说),而Windows10还能重现这个bug,即便把系统更新到最新(2022年10月5日)。 这个bug用语言来描述就是:使用Windows Explorer(资源管理器)的树形结构初次展开目录时,滚动条会发生不正确...

【存储数据恢复】某品牌EqualLogic系列存储介绍&常见故障的数据恢复方法

某品牌EqualLogic系列存储介绍: 某品牌EqualLogic系列存储可以通过连接串口先对存储进行初始化。 通过浏览器登录配置的ip地址,账号默认:grpadmin,密码默认:grpadmin;也可以通过串口登陆查看状态。 卷的划分和访问如下图: 底层结构: 以9块盘组建磁盘阵列为例,该存储在创建RAID的时候,会默认分配一块热备盘,并不是全局热备。 用8块...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。