头歌—Docker企业级实训-第五关进⼊⼀个容器
任务描述
不知道你有没有过这样的疑问,使⽤docker start启动了⼀个终⽌的容器,这仅仅只是启动了这个容器并执⾏了容器的“启动命令”,怎么进⼊这个容器的内部来操控容器呢??
本关的任务是学习如何进⼊⼀个正在运⾏的容器的内部,要求学习者参照⽰例,进⼊⼀个名为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,如下图所⽰:
1. docker run ubuntu /bin/sh -c “while true; do echo hello world; sleep
1; done”
2. hello world
3. hello world
4. hello world
5. …
但是如果使⽤了-d参数,此时容器会在后台运⾏并且不会将输出结果输出到控制台。如下图所⽰:
1. docker run -d ubuntu /bin/sh -c “while true; do echo hello world;
sleep 1; done”
2. ccd644424bffed71747e2a36977d70745cc211e7dac71006437ca52914c1b743
进⼊⼀个docker容器的⼏种⽅法
docker进入容器1. 使⽤ssh登陆进容器;
2. 使⽤nsenter、nsinit等第三⽅⼯具;
3. 使⽤docker本⾝提供的⼯具。
在这⾥我只介绍Docker本⾝提供的⼯具,⼤家如果对其他的两种⽅式感兴趣,可以阅读扩展链接中的内容。
Docker⽬前主要提供了docker exec和docker attach两个命令。
docker attach进⼊⼀个容器内部
1. docker attach containerId|containerName
如下图所⽰,⾸先使⽤docker run创建了⼀个容器,为其分配了伪终端,打开了它的标准输⼊流,并且让它在后台执⾏。
然后使⽤docker attach进⼊了该容器内部,实际上就是进⼊容器“启动命令”的终端。(containerId可以不⽤输全,只要能代表容器即可。例如下⾯的0539就是代表容器ID以0539开头的容器,⼀般情况下,前4位就能唯⼀标识⼀个容器了)
1. [root@localhost Desktop]# docker run -itd ubuntu /bin/bash
2. 0539852938cdb9538f67750d07ed8c7fa072de742d5c0c02128576f2d227ec46
3. [root@localhost Desktop]# docker attach 0539
4. root@0539852938cd:/#
5. root@0539852938cd:/# ls
6. bin dev home lib64 mnt proc run srv tmp var
7. boot etc lib media opt root sbin sys usr
8. root@0539852938cd:/# exit
9. exit
10. [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为其分配⼀个伪终端绑定到标准输出上。
1. [root@localhost Desktop]# docker run -itd ubuntu /bin/bash
2. aec040300549f95a8c4b37fecd3059122f08cb5422673640bd0bd9e641d0644c
3. [root@localhost Desktop]# docker exec aec0 mkdir dir1
4. [root@localhost Desktop]# docker exec -it aec0 /bin/bash
5. root@aec040300549:/# ls
6. bin dev etc lib media opt root sbin sys usr
7. boot dir1 home lib64 mnt proc run srv tmp var
8. root@aec040300549:/# exit
9. exit
10. [root@localhost Desktop]#
attach与exec的⽐较
使⽤docker run -d ubuntu "while true ; do sleep 1 ; echo hello; done"创建并在后台启动容器,每隔⼀秒打印⼀个hello。
1. [root@localhost Desktop]# docker run -d ubuntu /bin/sh -c “while
true ; do sleep 1 ; echo hello; done”
2. a695e721e324f11cc958867d13c9c6707018e359c747ba103554d4d8e9e7750f
使⽤docker attach 5719进⼊容器内部后,会在控制台每隔⼀秒打印了⼀个hello。
1. [root@localhost Desktop]# docker attach a695
2. hello
3. hello
4. …
但是使⽤docker exec –it 5719 /bin/bash进⼊容器后,并没有打印“hello”,因为docker exec执⾏后,在容器中打开⼀个新的终端,该终端与“启动命令”的终端不是同⼀个。
1. [root@localhost Desktop]# docker exec -it a695 /bin/bash
2. root@a695e721e324:/#
attach与exec的主要区别
1. attach直接进⼊容器“启动命令”的终端,不会启动新的进程;
2. exec则是在容器中打开新的终端,并且可以启动新的进程;
3. 如果想直接在终端中查看容器“启动命令”的输出,⽤attach;其他情况使⽤exec。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。