进入Docker容器的几种方式

在使用Docker创建了容器之后,大家比较关心的就是如何进入该容器了,其实进入Docker容器有好几多种方式,这里我们就讲一下常用的几种进入Docker容器的方法。

进入Docker容器比较常见的几种做法如下:

1、使用docker attach进入Docker容器

Docker提供了attach命令来进入Docker容器。

  接下来我们创建一个守护态的Docker容器,然后使用docker attach命令进入该容器。

  1. $ sudo docker run -itd ubuntu:14.04 /bin/bash  

  然后我们使用docker ps查看到该容器信息,接下来就使用docker attach进入该容器

  1. $ sudo docker attach 44fc0f0582d9  


  可以看到我们已经进入到该容器中了。

 

  但在,使用该命令有一个问题。当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作。

因为这个原因,所以docker attach命令不太适合于生产环境,平时自己开发应用时可以使用该命令。

通常情况下,需要看看docker容器内stdout,会使用命令 docker attach CONTAINER-ID 来查看容器输出.但是不知道如何退出,使用Ctrl+c直接卡死,正确的退出方式应该用一个组合键 Ctrl+p Ctrl+q 然后容器会关闭,界面也可恢复。

2、使用SSH 登录 Docker容器。

在生产环境中排除了使用docker attach命令进入容器之后,第一个想到的就是ssh。在镜像(或容器)中安装SSH Server,这样就能保证多人进入容器且相互之间不受干扰了,相信大家在当前的生产环境中(没有使用Docker的情况)也是这样做的。但是使用了Docker容器之后不建议使用ssh进入到Docker容器内。关于为什么不建议使用,请参考如下文章:

为什么不需要在 Docker 容器中运行 sshd

3、

在上面两种方式都不适合的情况下,还有一种比较方便的方法,即使用nsenter进入Docker容器。关于什么是nsenter请参考如下文章:

https://github.com/jpetazzo/nsenter

在了解了什么是nsenter之后,系统默认将我们需要的nsenter安装到主机中

如果没有安装的话,按下面步骤安装即可(注意是主机而非容器或镜像)

具体的安装命令如下:

  1. $ wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz  
  2. $ tar -xzvf util-linux-2.24.tar.gz  
  3. $ cd util-linux-2.24/  
  4. $ ./configure --without-ncurses  
  5. $ make nsenter  
  6. $ sudo cp nsenter /usr/local/bin  

安装好nsenter之后可以查看一下该命令的使用。

 

  nsenter可以访问另一个进程的名称空间。所以为了连接到某个容器我们还需要获取该容器的第一个进程的PID。可以使用docker inspect命令来拿到该PID。

docker inspect命令使用如下:

  1. $ sudo docker inspect --help   

inspect命令可以分层级显示一个镜像或容器的信息。比如我们当前有一个正在运行的容器

 

可以使用docker inspect来查看该容器的详细信息。

  1. $ sudo docker inspect 44fc0f0582d9  

 

由其该信息非常多,此处只截取了其中一部分进行展示。如果要显示该容器第一个进行的PID可以使用如下方式

  1. $ sudo docker inspect -f {{.State.Pid}} 44fc0f0582d9  

 

 

在拿到该进程PID之后我们就可以使用nsenter命令访问该容器了。

  1. $ sudo nsenter --target 3326 --mount --uts --ipc --net --pid  
  1. $ sudo nsenter --target 3326 --mount --uts --ipc --net --pid  

其中的3326即刚才拿到的进程的PID

当然,如果你认为每次都输入那么多参数太麻烦的话,网上也有许多做好的脚本供大家使用。

地址如下:

http://yeasy.gitbooks.io/docker_practice/content/container/enter.html

http://www.tuicool.com/articles/eYnUBrR

 

4、使用docker exec进入Docker容器

  除了上面几种做法之外,docker在1.3.X版本之后还提供了一个新的命令exec用于进入容器,这种方式相对更简单一些,下面我们来看一下该命令的使用:

  1. $ sudo docker exec --help   

 

 

接下来我们使用该命令进入一个已经在运行的容器

  1. $ sudo docker ps  
  2. $ sudo docker exec -it 775c7c9ee1e1 /bin/bash  

xxxxxxxxxx花絮xxxxxxxxxxxxxxxxxxxx

Docker 命令集
  attach   commit   diff     export   history import  insert    kill       login   port    
  pull       restart    rmi     save      start    tag       version  build   cp       events  
  help      images  info     inspect  load     logs     ps         push   rm       run     
  search  stop       top     wait
 
docker help: 
  docker help [COMMAND]
  例: docker help run
   docker version: 显示Docker版本
   docker info: 显示Docker信息
 
docker attach: 挂载正在后台运行的容器到前台
  docker attach [OPTIONS] Container
 
docker run: 在一个新的容器中执行命令 (CTRL-p CTRL-q 退出至后台运行)
  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  例:
1
2
3
sudo docker run -i -t ubuntu:14.04 /bin/bash         启动一个新的Ubuntu容器
sudo docker run --rm -i -t ubuntu:14.04/bin/bash   建议新手测试加上 -—rm
sudo docker run -i -t --name "private_container" ubuntu:14.04 /bin/bash

docker ps: 列出当前容器

  docker ps [OPTIONS]
  命令参数:
1
2
3
4
5
6
7
8
-a, --all=false            显示所有容器,包括当前没有运行的容器
-f, --filter=[]               按条件过滤容器, 可选的过滤选项:
exited=<int> 容器的返回值
-l, --latest=false       显示最新的一个容器
-n num  显示最新的N个容器
--no-trunc=false       不要截断输出
-q, --quiet=false       仅显示容器ID
-s, --size=false        显示容器大小

  例:

1
2
3
4
5
docker ps                              当前正在运行的容器
docker ps -a                          当前正在运行或是停止的容器
docker ps -a -q --no-trunc    获得当前所有容器的ID,不截断输出
docker rm $(echo $(docker ps -q --no-trunc) $(dockerps -a -q--no-trunc) | sed 's|\s|\n|g' |sort uniq -u)
删除当前不在运行状态的容器ID,也可以把前面改成docker rm

  

 
docker images: 列出当前镜像
  docker images [OPTIONS] [NAME]
  命令参数:
1
2
3
4
-a, --all=false            显示所有镜像,包括中间生成的临时镜像
-f, --filter=[]               通过标签过滤 (i.e. 'dangling=true')
--no-trunc=false        不要截断输出
-q, --quiet=false        仅显示容器ID

  例子:

1
2
3
docker images                                   显示当前仓库中的镜像
docker images -a                               显示当前仓库中的镜像与临时镜像
docker images -a -q --no-trunc        显示当前仓库中的镜像与临时镜像的ID,不截断输出

  

docker logs: 显示容器的日志
1
2
3
4
5
docker logs CONTAINER
命令参数:
-f, --follow=false               等待容器后续的输出(类似 tail -f)
-t, --timestamps=false     显示时间戳
--tail="all"

  例:

1
2
3
4
5
6
7
sudo docker logs 7bb0e258aefe
sudo docker logs --timestamps=true 7bb0e258aefe
sudo docker logs --timestamps=true 7bb0e258aefe > 7bb0e258aefe.log
终端A:
sudo docker logs --follow 7bb0e258aefe
终端B:
sudo docker attach 708cc7ec0f23         (随便执行一些命令可以看到终端A会有实时输出)

  

docker inspect: 显示镜像或容器的详细信息

  docker inspect CONTAINER|IMAGE [CONTAINER|IMAGE...]
  命令参数:
  -f, --format=""                  选择输出内容,--format="{{.NetworkSettings.IPAddress}}"
  例子:
1
2
sudo docker inspect 7bb0e258aefe
sudo dockerinspect --format "{{.State.Pid}}" 7bb0e258aefe

   

docker stop: 停止运行中的容器 (CTRL-d 强制退出, Exited (0))
  Docker stop [OPTIONS] CONTAINER [CONTAINER...]
  命令参数:
  -t, --time=10                    杀掉容器进程之前,等待的时间
  例子:
1
sudo docker stop 7bb0e258aefe

  

docker kill: 杀掉一个运行中的容器 (Exited (-1))
  docker kill [OPTIONS] CONTAINER [CONTAINER...]
  命令参数:
  - s, --signal="KILL"          选择向容器发出的Signal
  例子:
  sudo docker kill 7bb0e258aefe
 
docker start: 重启停止的容器
  Docker start CONTAINER [CONTAINER...]
  命令参数:
  -a,--attach=false         Attach container'sSTDOUT and STDERR and forward allsignals to the process
  -i,--interactive=false   Attach container'sSTDIN
  例子:
1
sudo docker start 7bb0e258aefe

  

docker restart: 重启运行中的容器
  d ocker restart [OPTIONS] CONTAINER [CONTAINER...]
  命令参数:
  -t, --time=10                     杀掉容器进程之前,等待的时间
  例子:
1
sudo docker restart 7bb0e258aefe

   

 
docker cp: 拷贝容器中的文件
  docker cp CONTAINER:PATH HOSTPATH
  例子:
 
1
docker cp c3f279d17e0a:/home/hyzhou/answer.txt .  将镜像中的/home/hyzhou/answer.txt文件拷贝到当前目录下

   

docker rm: 删除容器
  docker rm [OPTIONS] CONTAINER [CONTAINER...]
  命令参数:
  -f, --force=false              强制删除容器(使用SIGKILL)
  -l, --link=false                 Removethe specified link and not the underlyingcontainer
  -v, --volumes=false        Removethe volumes associated with the container
  例子:
1
2
3
docker rm my_ubuntu               删除容器
docker rm 708cc7ec0f23           删除容器
docker rm $(docker ps -a -q)    删除所有容器

   

docker top: 查看容器输出
  docker top CONTAINER [ps OPTIONS]
  例子:
  [ps OPTIONS]的意思是, 你可以在这个命令后面加上使用ps命令时的各种参数
1
2
sudo docker top 708cc7ec0f23
sudo docker top 708cc7ec0f23 aux

   

docker events: 实时监听容器的事件
  docker events [OPTIONS]
  命令参数:
  --since=""                      显示某一个时间戳之后的events
  --until=""                        实时监听到某个时间戳为止
  例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
A终端:
sudo docker events                             终端A等待Docker系统信息
sudo docker events --since 1378216169
sudo docker events --since '2013-09-03'
sudo docker events--since '2013-09-03 15:49:29'
sudo docker events --since'2013-09-03 15:49:29 +0200CEST'
sudo docker events > docker.log &   后台记录Docker的容器事件
B终端:
sudo docker restart 708cc7ec0f23     从B终端关闭容器
A终端显示:
2014-09-06T23:08:21+08:00708cc7ec0f23a5ec898c9d6308e9767edb66b863e96352ca6e030f0a5557f3b2:(fromubuntu:latest) die
2014-09-06T23:08:22+08:00708cc7ec0f23a5ec898c9d6308e9767edb66b863e96352ca6e030f0a5557f3b2:(fromubuntu:latest) start
2014-09-06T23:08:22+08:00708cc7ec0f23a5ec898c9d6308e9767edb66b863e96352ca6e030f0a5557f3b2:(fromubuntu:latest) restart

  

 docker history: 显示镜像的历史记录
  docker history [OPTIONS] IMAGE
  命令参数:
  --no-trunc=false              不要截断输出
  -q, --quiet=false              仅显示容器ID
 
docker search: 在Docker Hub上寻找镜像
  docker search TERM
  命令参数:
  --automated=false         使用Github或BitBucket的源代码自动构建
  --no-trunc=false             不要截断输出
  -s, --stars=0                   只显示Star数量超过N的镜像
  例子:
  docker search --starts=10 ubuntu
 
docker pull: 从远程拉取镜像
  docker pull NAME[:TAG]
  例子:
  docker pull ubuntu:latest
 
docker push: 推送镜像到远程仓库
  docker push NAME[:TAG]
  例子:
  docker push hyzhou/ubuntu:3.2.3
 
docker diff: 列出镜像中文件和目录的变化
  docker diff CONTAINER
  命令输出: 输出一共有三种
  A- Add
  D- Delete
  C- Change
  例子:
  diff显示的是镜像和当前运行的容器之间的区别,所以diff的基础是IMAGE
  下面例子中的b705fc4f4a50和708cc7ec0f23,内容其实是一样的
1
2
3
4
5
6
7
8
sudo docker ps -a
CONTAINERID        IMAGE                    COMMAND                CREATED             STATUS
b705fc4f4a50        new:latest               "/bin/bash"            49 seconds ago      Up 49 seconds
708cc7ec0f23        ubuntu:latest            "/bin/bash"            9 minutes ago       Up 9 minutes
sudo docker diff 7bb0e258aefe
C/root
A/root/new.txt
sudo docker diff b705fc4f4a50

   

docker commit: 将容器打包成新的镜像
  docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
  命令参数:
  -a, --author=""                 作者信息,"John Hannibal Smith <hannibal@a-team.com>"
  -m, --message=""            提交信息
  -p, --pause=true             在提交镜像时暂停容器
  例子:
1
2
3
4
5
6
7
8
9
sudo docker ps
ID                  IMAGE               COMMAND             CREATED             STATUS
c3f279d17e0a        ubuntu:12.04        /bin/bash           7 days ago          Up 25 hours
197387f1b436        ubuntu:12.04        /bin/bash           7 days ago          Up 25 hours
docker commitc3f279d17e0a Hyzhou/my_ubuntu:3.2.3
docker commit -a "Hyzhou<hyzhou@qq.com>" -m "addthe new software" c3f279d17e0aHyzhou/my_ubuntu:3.2.3
docker images
REPOSITORY                        TAG                 ID                  CREATED             VIRTUAL SIZE
Hyzhou/my_ubuntu                  3.2.3               f5283438590d        16 seconds ago      335.7 MB

  

docker build: 使用Dockerfile构建新镜像
  docker build [OPTIONS] PATH|URL|-
  命令参数:
  --force-rm=false              移除构建时生成的中间容器
  --no-cache=false             Donot use cache when building the image
  -q, --quiet=false               不显示容器的输出
  --rm=true                         构建成功后,移除构建时生成的中间容器
  -t, --tag=""                        构建成功后,新建镜像的名称
 
docker tag: 为镜像加上标签
  docker tag [OPTIONS] IMAGE[:TAG][REGISTRYHOST/][USERNAME/]NAME[:TAG]
  命令参数:
  -f, --force=false                强制打上标签?
1
2
3
4
5
6
7
8
9
10
例子:
sudo docker tag ubuntu:latest hyzhou/my_ubuntu:3.2.3    给ubuntu:latest打上新TAG:hyzhou/my_ubuntu:3.2.3
sudo dockertag eb601b8965b8 ubuntu:latest             给eb601b8965b8镜像打上TAG: ubuntu:latest(会转换原有的TAG指向)
 
docker save: 将image保存为tar压缩文件
docker save [OPTIONS] IMAGE [IMAGE...]
-o, --output=""                  写入到一个文件中作为输出,默认是标准输出流
例子:
docker save --output ubuntu.tar ubuntu:latest  将Ubuntu的最新镜像打包为ubuntu.tar
docker save ubuntu:latest > ubuntu.tar          将Ubuntu的最新镜像打包为ubuntu.tar

   

docker load: 将tar压缩文件保存为image
  Docker load [OPTIONS]
  命令参数:
  -i, --input=""                    读取一个压缩文件作为输入,默认是标准输入流
  例子:
1
2
3
docker load --input ubuntu.tar                  读取ubuntu.tar作为镜像
docker load < ubuntu.tar                        读取ubuntu.tar作为镜像

  

docker export: 把容器系统文件打包并导出来,方便分发给其他场景使用。
  docker export CONTAINER
1
2
3
4
5
6
7
8
例子:
sudo docker export my_ubuntu > ubuntu.tar       将Ubuntu的最新镜像打包为ubuntu.tar
 
docker import: 加载容器系统文件
docker import URL|- [REPOSITORY[:TAG]]
例子:
sudo docker import http://example.com/exampleimage.tgz
cat exampleimage.tgz | sudodocker import -exampleimagelocal:new
posted @ 2020-11-26 09:47  konglingbin  阅读(31431)  评论(0编辑  收藏  举报