Docker的镜像及容器常用操作(2)

一、docker镜像

  镜像(docker image) --- Docker 运行容器之前需要本地存在镜像,若本能地不存在,那么 Docker 会找默认镜像仓库( Docker Hub 公共注册服务器中的仓科)下载,用户也可以通过配置使用自己的镜像库

1、下载镜像

docker pull NAME:TAG

  下载某个被打上了某个标签的叫 ×× 名字 的镜像

[root@ren7 ~]# docker pull centos

  若在下载时你未指定标签,默认追加 latest标签,表示库中最新镜像

  镜像在下载过程中是分层的,并且在每层前会有各层的 ID号,层(Layer )是 AUFS (联合文件系统)的重要概念,是实现增量保存与更新的基础

  实际上面的命令的原型是

docker pull registry.hub.docker.com/centos:7

  即从默认的注册服务器下载指定的镜像当然,以此你也可以用这种格式到其他仓库下载你所需要的镜像了!!!

2、查看本地镜像相关信息

[root@ren7 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              0f3e07c0138f        2 weeks ago         220MB

  a.源自哪个仓库
  b.标签信息 ---用于区分同一个仓库的同名镜像可用 docker tag仓库名:
    标签名 新库名:新标签
  c. 镜像 ID
  d. 创建时间
  e. 镜像大小

3、搜索库中满足需求的镜像,以此下载符合需求的镜像文件

[root@ren7 ~]# docker search centos
NAME                               DESCRIPTION                                     STARS     OFFICIAL         AUTOMATED
centos                             The official build of CentOS.                   5617      [OK]              
ansible/centos7-ansible            Ansible on Centos7                              124                        [OK]
jdeathe/centos-ssh                 OpenSSH / Supervisor / EPEL/IUS/SCL Repos - …   114                        [OK]
consol/centos-xfce-vnc             Centos container with "headless" VNC session…   99                         [OK]
centos/mysql-57-centos7            MySQL 5.7 SQL database server                   63                             
imagine10255/centos6-lnmp-php56    centos6-lnmp-php56                              57                         [OK]

  a.哪个库
  b.绝对路径,库中的带有搜索关键字的镜像
  c.描述
  d.官方
  e.是否自动创建

4、删除本地镜像

docker rmi image[ image== 库:标签 ][ ID 号 ]
[root@ren7 ~]# docker image tag centos:latest centosnew:v1
[root@ren7 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              0f3e07c0138f        2 weeks ago         220MB
centosnew           v1                  0f3e07c0138f        2 weeks ago         220MB
[root@ren7 ~]# docker rmi centosnew:v1
Untagged: centosnew:v1
[root@ren7 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              0f3e07c0138f        2 weeks ago         220MB

  当有别名镜像时,是同一个ID 号多个名字 ,删除任一个对其它互相无伤害,直至删除最后一个,镜像被彻底删除;用ID号删除,默认会删除同一个ID的多个镜像,除非该镜像创建的容器存在,那么镜像能够不被删除,所以在删除时正确顺序是先删除使用镜像的容器,再删除镜像

5、获取镜像使用的帮助信息

[root@ren7 ~]# docker image --help
Usage:    docker image COMMAND
Manage images
Options:
Commands:
  build       从docker文件里面创建镜像
  history     显示一个镜像的历史
  import      从tarball导入内容以创建文件系统映像
  inspect     显示一个或多个镜像的详细信息
  load        从tar压缩包或者标准输入中加载一个镜像ls          列出镜像
  prune       移除没有被使用的镜像
  pull        从注册处拉取一个镜像或者镜像库
  push        把一个镜像或者镜像库推送至注册处
  rm          移除一个或多个镜像(别名:rmi
  save        保存一个或者多个镜像到tar压缩包,默认情况下流式传输
  tag         创建一个引用SOURCE_IMAGE的标记TARGET_IMAGE
Run 'docker image COMMAND --help' for more information on a command.

二、docker镜像分层

  docker镜像的分层结构:支持通过扩展现有镜像,创建新的镜像


  可以看到,新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层。

1、分层结构的优势:

  (1)共享资源:

  有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

  这时可能就有人会问了:如果多个容器共享一份基础镜像,当某个容器修改了基础镜像的内容,比如说修改 /etc 下的文件,这时其他容器的 /etc 是否也会被修改?

  答案是不会!
  修改会被限制在单个容器内
  这就是我们接下来要学习的容器 Copy-on-Write 特性。

  (2)可写的容器层:

  当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。

  所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。

  只有容器层是可写的,容器层下面的所有镜像层都是只读的。

2、在容器层的操作及特性

  镜像层数量可能会很多,所有镜像层会联合在一起组成一个统一的文件系统。如果不同层中有一个相同路径的文件,比如 /a,上层的 /a 会覆盖下层的 /a,也就是说用户只能访问到上层中的文件 /a。在容器层中,用户看到的是一个叠加之后的文件系统。

  (1)添加文件
  在容器中创建文件时,新文件被添加到容器层中。

  (2)读取文件
  在容器中读取某个文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,打开并读入内存。

  (3)修改文件
  在容器中修改已存在的文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后修改之。

  (4)删除文件
  在容器中删除文件时,Docker 也是从上往下依次在镜像层中查找此文件。找到后,会在容器层中记录下此删除操作。

  只有当需要修改时才复制一份数据,这种特性被称作 Copy-on-Write。可见,容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改。

  这样就解释了我们前面提出的问题:容器层记录对镜像的修改,所有镜像层都是只读的,不会被容器修改,所以镜像可以被多个容器共享。

三、docker镜像创建

  创建镜像的三种方法:

  (1)基于修改后的容器创建:docker commit 命令
  (2)基于本地模板导入
  (3)基于 Dockerfile 文件创建

1、基于修改后的容器创建

docker run -it centos:7 /bin/bash
mkdir /testdir
exit

  此时容器较镜像已经发生改变,我们以此生成新镜像

docker commit container-name image-name 

  顺利的话会返回一个新的 ID 号

docker images

  查看镜像列表,会看到本地多了一个名为新名字的镜像

[root@ren7 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              0f3e07c0138f        2 weeks ago         220MB
[root@ren7 ~]# docker run -it centos:latest /bin/bash
[root@b4c903c86d5e /]# echo "hello docker" > test.txt
[root@b4c903c86d5e /]# ls
bin  etc   lib      lost+found  mnt  proc  run   srv  test.txt  usr
dev  home  lib64  media       opt  root  sbin  sys  tmp       var
[root@b4c903c86d5e /]# exit
exit
[root@ren7 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                         PORTS               NAMES
b4c903c86d5e        centos:latest       "/bin/bash"         About a minute ago   Exited (0) 54 seconds ago                          compassionate_pike
3abace6c9603        centos:latest       "/bin/bash"         About an hour ago    Exited (0) About an hour ago                       awesome_snyder
[root@ren7 ~]# docker commit awesome_snyder testcentos:v1
sha256:ecc0a6432f9c6316ebbd4e15fc6bc0442eb29494af65b0dca2a0fc6752996edf
[root@ren7 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
testcentos          v1                  ecc0a6432f9c        9 seconds ago       220MB
centos              latest              0f3e07c0138f        2 weeks ago         220MB

2、基于模板导出和导入镜像

  导出:将镜像保存为本地文件

[root@ren7 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
testcentos          v1                  ecc0a6432f9c        9 seconds ago       220MB
centos              latest              0f3e07c0138f        2 weeks ago         220MB
[root@ren7 ~]# docker save -o centosv1.tar.gz testcentos:v1
[root@ren7 ~]# ls
6379_node.conf  6381_node.conf   docker           redis-5.0.0.tar.gz
6380.conf       anaconda-ks.cfg  docker.tar.gz    redis-conf
6380_node.conf  appendonly.aof   original-ks.cfg  yum-repo.sh
6381.conf       centosv1.tar.gz  redis-5.0.0

  导入:将压缩包文件导入到本地镜像列表

[root@ren7 ~]# docker rmi ecc0a6432f9c
Untagged: testcentos:v1
Deleted: sha256:ecc0a6432f9c6316ebbd4e15fc6bc0442eb29494af65b0dca2a0fc6752996edf
Deleted: sha256:c8506e27435fc2760072784cc424b69b864ea51588bb69caecbb755eb38f6b03
[root@ren7 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              0f3e07c0138f        2 weeks ago         220MB
[root@ren7 ~]# docker load -i centosv1.tar.gz(或者使用 --input 选项)
fe459c65539a: Loading layer   2.56kB/2.56kB
Loaded image: testcentos:v1
[root@ren7 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
testcentos          v1                  ecc0a6432f9c        8 minutes ago       220MB
centos              latest              0f3e07c0138f        2 weeks ago         220MB

  简单来说,容器是镜像的运行实体。所不同的是它带有额外的可写层。

3、基于 Dockerfile 文件创建

  Dockerfile 是一个文本文件(可以理解为脚本),用来配置 image,记录了镜像构建的所有步骤;每一条指令的内容就是描述该层应当如何构建。Docker 根据 该文件生成二进制的 image 文件。如何可以生成 image 文件?如果你要推广自己的软件,势必要自己制作 image 文件。

  dockerfile编写的注意事项:

1)# 备注
2)指令参数,指令的大小写不敏感
3)第一个非注释行必须是 FROM 指令
4)编写Dockerfile必须在一个目录下进行,这个目录称之为 工作目录(WORKSPACE)
5)Dockerfile文件命令的首字母可以大写也可以小写,但必须是dockerfile名
6)制作镜像所要用的文件必须放在工作目录或者工作目录的子目录之下,不能放在父目录
7)可以通过隐藏文件 .dockeringnore 来指定不要放入到镜像中的文件,一行是一个文件,可以用通配符
8)基于dockerfile做镜像,本质上还是基于一个现有的镜像做新镜像

  用 Dockerfile 创建 centos-with-vim,其内容则为:

[root@ren7 ~]# mkdir new
[root@ren7 ~]# cd new/
[root@ren7 new]# pwd
/root/new
[root@ren7 new]# vim dockerfile
#################################
FROM centos:latest
RUN yum install vim -y
#################################

  build:创建镜像
  -t:为镜像指定名字
  .:指明 build context 为当前目录,我们也可以通过 -f 参数指定 Dockerfile 的位置

[root@ren7 new]# docker build -t newcentos:8 .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM centos:latest
 ---> 0f3e07c0138f
Step 2/2 : RUN yum install vim -y
 ---> Running in 3e8de88d981d
CentOS-8 - AppStream                            1.4 MB/s | 6.0 MB     00:0
CentOS-8 - Base                                 1.0 MB/s | 7.9 MB     00:0
CentOS-8 - Extras                               514  B/s | 2.1 kB     00:0
Last metadata expiration check: 0:00:01 ago on Mon Oct 21 11:15:12 2019.
Dependencies resolved.
==========================================================================
 Package             Arch        Version                   Repository     
==========================================================================
Installing:
 vim-enhanced        x86_64      2:8.0.1763-10.el8         AppStream      
Installing dependencies:
 gpm-libs            x86_64      1.20.7-15.el8             AppStream      
 vim-common          x86_64      2:8.0.1763-10.el8         AppStream      
 vim-filesystem      noarch      2:8.0.1763-10.el8         AppStream      
 which               x86_64      2.21-10.el8               BaseOS         

Transaction Summary
==========================================================================
Install  5 Packages

Total download size: 7.8 M
Installed size: 30 M
Downloading Packages:
(1/5): gpm-libs-1.20.7-15.el8.x86_64.rpm         34 kB/s |  39 kB     00:0
(2/5): vim-enhanced-8.0.1763-10.el8.x86_64.rpm  847 kB/s | 1.4 MB     00:0
(3/5): which-2.21-10.el8.x86_64.rpm             197 kB/s |  49 kB     00:0
(4/5): vim-filesystem-8.0.1763-10.el8.noarch.rp  50 kB/s |  48 kB     00:0
(5/5): vim-common-8.0.1763-10.el8.x86_64.rpm    2.6 MB/s | 6.3 MB     00:0
-------------------------------------------------------------------------
...下载过程

  从这步开始就是镜像真正的构建过程。 首先 Docker 将 build context 中的所有文件发送给 Docker daemon。build context 为镜像构建提供所需要的文件或目录。Dockerfile 中的 ADD、COPY 等命令可以将 build context 中的文件添加到镜像。此例中,build context 为当前目录 /root/,该目录下的所有文件和子目录都会被发送给 Docker daemon。

  所以,使用 build context 就得小心了,不要将多余文件放到 build context,特别不要把 /、/usr 作为 build context,否则构建过程会相当缓慢甚至失败。

[root@ren7 new]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
newcentos           8                   96089ebca1c2        4 minutes ago       286MB
testcentos          v1                  ecc0a6432f9c        About an hour ago   220MB
centos              latest              0f3e07c0138f        2 weeks ago         220MB

  Docker 会缓存已有镜像的镜像层,构建新镜像时,如果某镜像层已经存在,就直接使用,无需重新创建。在前面的 Dockerfile 中添加一点新内容,往镜像中复制一个文件:

[root@ren7 new]# echo "Long time no see" > hello
[root@ren7 new]# ls
dockerfile  hello
[root@ren7 new]# vim dockerfile 
#################################################### FROM centos:latest RUN yum install vim -y COPY hello /root/
####################################################

  下面列出了 Dockerfile 中最常用的指令,完整列表和说明可参看官方文档。

FROM:指定 base 镜像。
MAINTAINER:设置镜像的作者,可以是任意字符串。
COPY:将文件从 build context 复制到镜像。
    COPY 支持两种形式:
        COPY src dest    #shell格式
        COPY ["src", "dest"]    #exec格式
     注意:src 只能指定 build context 中的文件或目录。
ADD:与 COPY 类似,从 build context 复制文件到镜像。不同的是,如果 src 是归档文件(tar, zip, tgz, xz 等),文件会被自动解压到 dest。(自带解压缩功能)
ENV:设置环境变量,环境变量可被后面的指令使用。例如:
    ...
    ENV MY_VERSION 1.3
    RUN apt-get install -y mypackage=$MY_VERSION
    ...
EXPOSE:指定容器中的进程会监听某个端口,Docker 可以将该端口暴露出来。我们会在容器网络部分详细讨论。
VOLUME:将文件或目录声明为 volume。
WORKDIR:为后面的 RUN, CMD, ENTRYPOINT, ADD 或 COPY 指令设置镜像中的当前工作目录。
RUN:在容器中运行指定的命令,RUN 指令通常用于安装应用和软件包。
CMD:容器启动时运行指定的命令。
    Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效。CMD 可以被 docker run 之后的参数替换。
ENTRYPOINT:设置容器启动时运行的命令,可让容器以应用程序或者服务的形式运行。
    Dockerfile 中可以有多个 ENTRYPOINT 指令,但只有最后一个生效。CMD 或 docker run 之后的参数会被当做参数传递给 ENTRYPOINT。

  通过dockerfile文件创建一个装有nginx的镜像及容器,完整的dockerfile如下:

[root@ren7 ~]# cd new/
[root@ren7 new]# ls
dockerfile  hello  nginx-1.15.1.tar.gz  nginx.conf
[root@ren7 new]# cat dockerfile 
FROM centos:latest
MAINTAINER Renyz
RUN yum install -y gcc gcc-c++ make openssl-devel pcre-devel && 
    yum clean all
ADD nginx-1.15.1.tar.gz /tmp
RUN cd /tmp/nginx-1.15.1 && 
    ./configure --prefix=/usr/local/nginx && 
    make -j 2 && make install && 
    rm -rf /tmp/nginx-1.15.1
COPY nginx.conf /usr/local/nginx/conf

EXPOSE 80
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
[root@ren7 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               v1                  11a0d1b90f00        18 hours ago        394MB
centos              latest              0f3e07c0138f        2 weeks ago         220MB
[root@ren7 ~]# docker history 11a0d1b90f00
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
11a0d1b90f00        18 hours ago        /bin/sh -c #(nop)  CMD ["/usr/local/nginx/sb…   0B                  
6b3ffbb573c8        18 hours ago        /bin/sh -c #(nop)  EXPOSE 80                    0B                  
1cb194871282        18 hours ago        /bin/sh -c #(nop) COPY file:04bb4d8c1c49d16e…   857B                
ea7098225924        18 hours ago        /bin/sh -c cd /tmp/nginx-1.15.1 &&     ./con…   5.1MB               
8163dc35c7dc        18 hours ago        /bin/sh -c #(nop) ADD file:b197ae6ec0899d784…   6.11MB              
c1e74c1c6c97        18 hours ago        /bin/sh -c yum install -y gcc gcc-c++ make o…   164MB               
f1a043873ea0        18 hours ago        /bin/sh -c #(nop)  MAINTAINER Renyz             0B                  
0f3e07c0138f        2 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B                  
<missing>           2 weeks ago         /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B                  
<missing>           2 weeks ago         /bin/sh -c #(nop) ADD file:d6fdacc1972df524a…   220MB               
[root@ren7 ~]# docker run -itd -p 8081:80 nginx:v1 /bin/bash

[root@ren7 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS                  NAMES
b100566abdd9        nginx:v1            "/bin/bash"         18 hours ago        Up 4 hours                0.0.0.0:8081->80/tcp   vibrant_joliot
3abace6c9603        centos:latest       "/bin/bash"         21 hours ago        Exited (0) 18 hours ago                          awesome_snyder

四、docker的使用(容器)

1、创建容器,create命令是创建并不是启动容器

docker creat  -it  centos:7

2、查看所有状态的容器

docker ps -a
docker ps
[root@ren7 ~]# docker ps --help
Usage:    docker ps [OPTIONS]
List containers
Options:
  -a, --all             显示所有容器 (默认只显示正在运行的容器)
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print containers using a Go template
  -n, --last int        显示最后创建的容器 (includes all states) (default -1)
  -l, --latest          显示最新创建的容器(includes all states)
      --no-trunc        Don't truncate output
  -q, --quiet           只显示容器的ID
  -s, --size            显示总文件大小

3、启动已停止的容器

docker start CONTAINERID
[root@ren7 ~]# docker start --help
Usage:    docker start [OPTIONS] CONTAINER [CONTAINER...]
Start one or more stopped containers
Options:
  -a, --attach               Attach STDOUT/STDERR and forward signals
      --detach-keys string   Override the key sequence for detaching a container
  -i, --interactive          Attach container's STDIN

4、运行一个容器

docker run -ti docker.io/centos:7 /bin/bash

  创建并运行一个容器 ,此时你会直接被切换到容器中

ctrl+d//exit     #退出,并且容器也退出
ctrl+p+q        #退出容器,并且保持容器up的状态
  -t   #分配一个伪终端
  -i   #让容器的标准输入持续打开
  -rm  #表示退出容器时,容器一起删除
  -v   #指定volumes,格式:宿主机共享目录:容器目录
  -p   #小p 端口映射(容器的端口映射为宿主机的端口)
  --link #添加链接到另一个容器 用
/bin/bash环境显示

5、以后台守护进程形态运行(用 -d 参数实现)

docker run -dti docker.io/centos:7

6、终止容器

docker  stop  NAME/ID      
docker  kill  NAME/ID

7、重启容器

docker  restart  NAME/ID

  需要注意,非持久后台守护状态的虚拟机,在重启后当你查看时还是关闭状态

8、删除容器

语法: docker rm  参数  NAME  NAME …
#docker rm -f NAME/ID
-f  #强制删除处于运行中的容器
-l  #删除链接,保留容器
-v  #删除挂载的数据卷

  补充:一次性删除全部已经退出的容器

[root@ren7 ~]# docker rm $(docker ps -aq)

  较为严谨的写法:

[root@ren7 ~]# docker stop $(docker ps -aq)
555bbbf9c8e7
b100566abdd9
3abace6c9603
[root@ren7 ~]# for id in `docker ps -a | grep Exited | awk -F " " '{print $1}'`;do docker rm $id;done
555bbbf9c8e7
b100566abdd9
3abace6c9603

9、进入容器

  登录容器的方法有三种:(exec -it、attach、nsenter)

  (1)docker  exec 是在容器中打开新的终端,并且可以启动新的进程

docker  exec -it NAME/ID /bin/bash
[root@ren7 ~]# docker exec --help
Usage:    docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
Run a command in a running container
Options:
  -d, --detach               分离模式:在后台运行命令--detach-keys string   Override the key sequence for detaching a container
  -e, --env list             Set environment variables
  -i, --interactive          启动为交互模式--privileged           Give extended privileges to the command
  -t, --tty                  分配一个终端-u, --user string          Username or UID (format:<name|uid>[:<group|gid>])
  -w, --workdir string       Working directory inside the container

  (2)docker attach直接进入容器 启动命令的终端,不会启动新的进程

  注意:会导致当退出时,自动停止容器(不建议使用)

[root@ren7 ~]# docker run -d centos:latest /bin/bash -c "while true;do sleep 1;echo I_am_docker;done"
555bbbf9c8e7d314c31b823e99188c13ab6ff7bc266c9c70f7ce5c802bf40586
[root@ren7 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
555bbbf9c8e7        centos:latest       "/bin/bash -c 'while…"   10 seconds ago      Up 10 seconds                              blissful_edison
b100566abdd9        nginx:v1            "/bin/bash"              19 hours ago        Up 6 hours          0.0.0.0:8081->80/tcp   vibrant_joliot
3abace6c9603        centos:latest       "/bin/bash"              22 hours ago        Up 33 minutes                              awesome_snyder
[root@ren7 ~]# docker attach 555bbbf9c8e7
I_am_docker
I_am_docker
I_am_docker
I_am_docker
...
[root@ren7 ~]# docker exec -it 555bbbf9c8e7 /bin/bash
[root@555bbbf9c8e7 /]# 

  (3)基于nsenter进入

  第一步:启动容器

  第二步:获取容器的pid

[root@ren7 ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
555bbbf9c8e7        centos:latest       "/bin/bash -c 'while…"   8 minutes ago       Up 4 minutes                               blissful_edison
b100566abdd9        nginx:v1            "/bin/bash"              19 hours ago        Up 6 hours          0.0.0.0:8081->80/tcp   vibrant_joliot
3abace6c9603        centos:latest       "/bin/bash"              23 hours ago        Up 42 minutes                              awesome_snyder
[root@ren7 ~]# docker inspect -f '{{.State.Pid}}' 555bbbf9c8e7
8989

  第三步:登录容器

[root@ren7 ~]# nsenter -t 8989 -u -i -n -p
[root@555bbbf9c8e7 ~]# ps
   PID TTY          TIME CMD
  7422 pts/0    00:00:00 bash
  8167 pts/0    00:00:00 bash
  8513 pts/0    00:00:00 bash
  9436 pts/0    00:00:00 nsenter
  9437 pts/0    00:00:00 bash
  9467 pts/0    00:00:00 ps
[root@555bbbf9c8e7 ~]# 登出
[root@ren7 ~]# docker ps       
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
555bbbf9c8e7        centos:latest       "/bin/bash -c 'while…"   10 minutes ago      Up 6 minutes                               blissful_edison
b100566abdd9        nginx:v1            "/bin/bash"              19 hours ago        Up 6 hours          0.0.0.0:8081->80/tcp   vibrant_joliot
3abace6c9603        centos:latest       "/bin/bash"              23 hours ago        Up 43 minutes                              awesome_snyder

  退出时不会停止容器

-t     #从中获取名称空间的目标进程
-u   #输入UTS名称空间(主机名等)
-i   #进入System V IPC命名空间
-n   #输入网络命名空间
-p    #输入pid命名空间    
[root@ren7 ~]# nsenter --help
用法:
 nsenter [options] <program> [<argument>...]
Run a program with namespaces of other processes.
选项:
 -t, --target <pid>     要获取名字空间的目标进程
 -m, --mount[=<file>]   进入mount命名空间-u, --uts[=<file>]     enter UTS namespace (hostname etc)
 -i, --ipc[=<file>]     enter System V IPC namespace
 -n, --net[=<file>]     enter network namespace
 -p, --pid[=<file>]     enter pid namespace
 -U, --user[=<file>]    enter user namespace
 -S, --setuid <uid>     set uid in entered namespace
 -G, --setgid <gid>     set gid in entered namespace
     --preserve-credentials do not touch uids or gids
 -r, --root[=<dir>]     set the root directory
 -w, --wd[=<dir>]       set the working directory
 -F, --no-fork          执行 <程序> 前不 fork
 -Z, --follow-context   set SELinux context according to --target PID

 -h, --help     显示此帮助并退出
 -V, --version  输出版本信息并退出

10、导入和导出容器

  (1)导出容器:导出一个已经创建的容器到文件,不管容器是否运行

[root@ren7 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
b100566abdd9        nginx:v1            "/bin/bash"         19 hours ago        Up 5 hours          0.0.0.0:8081->80/tcp   vibrant_joliot
3abace6c9603        centos:latest       "/bin/bash"         22 hours ago        Up 19 minutes                              awesome_snyder
[root@ren7 ~]# docker export b100566abdd9 > nginxtest.tar
[root@ren7 ~]# ls
anaconda-ks.cfg  new    appendonly.aof   nginxtest.tar       yum-repo.sh

  (2)将容器导入系统成为镜像

cat  nginxtest.tar  | docker  import  - test

11、查看容器日志

  显示容器启动进程的控制台输出

docker logs -f NAME/ID

12、暂停容器

docker pause NAME/ID

13、取消暂停,继续运行容器

docker unpause NAME/ID

和容器相关的命令:

[root@ren7 ~]# docker container --help
Usage:    docker container COMMAND  #container可省  
Manage containers
Commands:
  attach      将本地标准输入,输出和错误流附加到正在运行的容器
  commit      根据容器的更改创建新镜像
  cp          在容器和本地文件系统之间复制文件/文件夹
  create      创建一个新的容器
  diff        检查容器文件系统上的文件或目录的更改
  exec        在正在运行的容器中运行命令
  export      将容器的文件系统导出为tar存档
  inspect     显示一个或多个容器的详细信息
  kill        杀死一个或多个正在运行的容器
  logs        获取容器的日志
  ls          列出容器
  pause       暂停一个或多个容器中的所有进程
  port        列出端口映射或容器的特定映射
  prune       删除所有已停止的容器
  rename      重命名容器
  restart     重启一个或多个容器
  rm          删除一个或多个容器
  run         在新容器中运行命令
  start       启动一个或多个已停止的容器
  stats       显示容器资源使用情况统计信息的实时流
  stop        停止一个或多个正在运行的容器
  top         显示容器的运行进程
  unpause     取消暂停一个或多个容器中的所有进程
  update      更新一个或多个容器的配置
  wait        等待,直到一个或多个容器停止,然后打印退出代码
原文地址:https://www.cnblogs.com/renyz/p/11714026.html