进入docker容器
学习如何进入一个正在运行的容器的内部,要求学习者参照示例,进入一个名为container2
的容器内部,并在容器内部创建一个1.txt
文件。
相关知识
使容器在后台运行
因为本关要使用docker run -d
命令,所以在本关的开始,将花费少量篇幅介绍这条命令。
有些时候,需要让容器在后台运行而不是直接把“启动命令”的结果输出在当前宿主机下。此时,可以通过添加-d
参数来实现。
举个例子,假如不使用-d
参数执行下面这条命令:
docker run ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
那么会一直在控制台输出hello world
,如下图所示:
docker run ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
hello world
hello world
hello world
...
但是如果使用了-d
参数,此时容器会在后台运行并且不会将输出结果输出到控制台。如下图所示:
docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
ccd644424bffed71747e2a36977d70745cc211e7dac71006437ca52914c1b743
进入一个docker容器的几种方法
- 使用
ssh
登陆进容器; - 使用
nsenter、nsinit
等第三方工具; - 使用
docker
本身提供的工具。
在这里我只介绍Docker
本身提供的工具,大家如果对其他的两种方式感兴趣,可以阅读扩展链接中的内容。
Docker
目前主要提供了docker exec
和docker attach
两个命令。
docker attach进入一个容器内部
1. docker attach containerId|containerName
如下图所示,首先使用docker run
创建了一个容器,为其分配了伪终端,打开了它的标准输入流,并且让它在后台执行。
然后使用docker attach
进入了该容器内部,实际上就是进入容器“启动命令”的终端。(containerId
可以不用输全,只要能代表容器即可。例如下面的0539
就是代表容器ID
以0539
开头的容器,一般情况下,前4
位就能唯一标识一个容器了)
[root@localhost Desktop]# docker run -itd ubuntu /bin/bash
0539852938cdb9538f67750d07ed8c7fa072de742d5c0c02128576f2d227ec46
[root@localhost Desktop]# docker attach 0539
root@0539852938cd:/#
root@0539852938cd:/# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
root@0539852938cd:/# exit
exit
[root@localhost Desktop]#
docker exec进入一个容器内部
2. docker exec [options] containerName|containerId command [arg]
如下图所示,首先使用docker run
创建了一个容器,并使它在后台运行。
docker exec
命令可以在一个运行的容器内部执行一条命令,例如下图中执行docker exec aec0 mkdir dir1
后,就在容器中创建了一个dir1
的文件夹。除此以外,还可以在容器中启动一个新的bash
,例如下图执行了docker exec -it aec0 /bin/bash
,在容器内部启动了一个新的bash
终端,并使用-it
为其分配一个伪终端绑定到标准输出上。
[root@localhost Desktop]# docker run -itd ubuntu /bin/bash
aec040300549f95a8c4b37fecd3059122f08cb5422673640bd0bd9e641d0644c
[root@localhost Desktop]# docker exec aec0 mkdir dir1
[root@localhost Desktop]# docker exec -it aec0 /bin/bash
root@aec040300549:/# ls
bin dev etc lib media opt root sbin sys usr
boot dir1 home lib64 mnt proc run srv tmp var
root@aec040300549:/# exit
exit
[root@localhost Desktop]#
attach与exec的比较
使用docker run -d ubuntu "while true ; do sleep 1 ; echo hello; done"
创建并在后台启动容器,每隔一秒打印一个hello
。
[root@localhost Desktop]# docker run -d ubuntu /bin/sh -c "while true ; do sleep 1 ; echo hello; done"
a695e721e324f11cc958867d13c9c6707018e359c747ba103554d4d8e9e7750f
使用docker attach 5719
进入容器内部后,会在控制台每隔一秒打印了一个hello
。
[root@localhost Desktop]# docker attach a695
hello
hello
...
但是使用docker exec –it 5719 /bin/bash
进入容器后,并没有打印“hello
”,因为docker exec
执行后,在容器中打开一个新的终端,该终端与“启动命令”的终端不是同一个。
[oot@localhost Desktop]# docker exec -it a695 /bin/bash
root@a695e721e324:/#
attach与exec的主要区别
attach
直接进入容器“启动命令”的终端,不会启动新的进程;exec
则是在容器中打开新的终端,并且可以启动新的进程;- 如果想直接在终端中查看容器“启动命令”的输出,用
attach
;其他情况使用exec
。#注意如果想在右侧使用命令行模拟操作,请先输入 service docker start #否则将不能执行docker命令 #基于ubuntu镜像创建并在后台启动一个名为container2的容器 #拉取ubutun 最新镜像,实际生产中,docker pull ubutun可以省略,docker run的时候会自己去拉取。 docker pull ubuntu docker run -itd --name container2 ubuntu /bin/bash
#由于测试环境不允许从终端输入,所以请使用docker exec完成任务
#********** Begin *********#
docker exec container2 touch 1.txt
#********** End **********#
参考链接: 两种进入容器的方法 - 每天5分钟玩转 Docker 容器技术(23)_docker 多次进入容器-CSDN博客 Docker系列~exec与attach(四)-CSDN博客 扩展链接: Docker容器进入的4种方式 - 純黑色 - 博客园