本文针对Docker1.12的48条命令,列出了container相关的18条命令,上一篇文章我们学习了容器生状态管理的几条命令,这这一篇中我们来看一下剩下的9条命令都能做什么。
container相关的命令
项番 | 命令 | 详解 |
---|---|---|
No.1 | attach | Attach to a running container |
No.9 | exec | Run a command in a running container |
No.3 | commit | Create a new image from a container’s changes |
No.4 | cp | Copy files/folders between a container and the local filesystem |
No.7 | diff | Inspect changes on a container’s filesystem |
No.10 | export | Export a container’s filesystem as a tar archive |
No.13 | import | Import the contents from a tarball to create a filesystem image |
No.29 | rename | Rename a container |
No.31 | rm | Remove one or more containers |
事前准备
先启动一个container准备用来霍霍。
[root@liumiaocn ~]# docker run --name=nginx -d -p80:80 nginx
46be04227f8ae236ec47acf0dcb20e65389cb88e6d724439d6305813ce6b7f4e
[root@liumiaocn ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
46be04227f8a nginx "nginx -g 'daemon off" 2 seconds ago Up 1 seconds 0.0.0.0:80->80/tcp, 443/tcp nginx
[root@liumiaocn ~]#
exec
通过exec可以连接到一个正在运行的container执行一条命令,比如
[root@liumiaocn ~]# docker exec nginx hostname
46be04227f8a
[root@liumiaocn ~]#
在实际中下面的方法用的更多,类似于连接到一个container中,然后可以执行各种操作
[root@liumiaocn ~]# docker exec -it nginx /bin/bash
root@46be04227f8a:/# hostname
46be04227f8a
root@46be04227f8a:/# pwd
/
root@46be04227f8a:/# exit
exit
[root@liumiaocn ~]#
退出后也不会有副作用
[root@liumiaocn ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
46be04227f8a nginx "nginx -g 'daemon off" 2 minutes ago Up About a minute 0.0.0.0:80->80/tcp, 443/tcp nginx
[root@liumiaocn ~]#
attach
attach到一个正在运行的container上,可以看到现在container的状况,按ctrl+C退出会伴随着container的退出,
[root@liumiaocn ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
46be04227f8a nginx "nginx -g 'daemon off" 2 minutes ago Up 2 minutes 0.0.0.0:80->80/tcp, 443/tcp nginx
[root@liumiaocn ~]# docker attach nginx
^C[root@liumiaocn ~]#
[root@liumiaocn ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@liumiaocn ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
46be04227f8a nginx "nginx -g 'daemon off" 3 minutes ago Exited (0) 7 seconds ago nginx
[root@liumiaocn ~]#
cp
docker cp用于将本地文件copy到某容器内
在host上创建一个helloworld.txt的文件
[root@liumiaocn ~]# echo "Hello world" >/tmp/helloworld.txt
启动一个busybox的container,确认该container的/tmp下什么也没有
[root@liumiaocn ~]# docker run --name busybox -it busybox /bin/sh
/ # cd /tmp
/tmp # ls -l
total 0
/tmp #
docker cp
[root@liumiaocn ~]# docker cp /tmp/helloworld.txt busybox:/tmp
[root@liumiaocn ~]#
确认container中的结果
/tmp # ls -l /tmp
total 4
-rw-r--r-- 1 root root 12 Sep 24 06:41 helloworld.txt
/tmp # cat /tmp/helloworld.txt
Hello world
/tmp #
[root@liumiaocn ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
44f08d7f4732 busybox "/bin/sh" 6 minutes ago Up 6 minutes busybox
[root@liumiaocn ~]#
diff
docker是分层的,由镜像文件创建成容器,比如我们在docker cp中创建的container(44f08d7f4732),它有什么变化呢,至少我们把helloworld.txt给copy到该container
的/tmp下了,我们怎样才能看到这个差别呢
[root@liumiaocn ~]# docker diff busybox
C /root
A /root/.ash_history
C /tmp
A /tmp/helloworld.txt
[root@liumiaocn ~]#
commit
但是当我们在这个时候同时在一个新的终端启动一个busybox的container的时候,这个新的container的/tmp下什么也没有.
[root@liumiaocn ~]# docker run -it busybox /bin/sh
/ # ls /tmp
/ # exit
[root@liumiaocn ~]#
为了证明这不是幻觉,使用ps -a来看一下刚才这个container是的确存在过的,只是我们退出了而已
[root@liumiaocn ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
63d08b54575c busybox "/bin/sh" 20 seconds ago Exited (0) 14 seconds ago angry_northcutt
44f08d7f4732 busybox "/bin/sh" 10 minutes ago Up 10 minutes busybox
[root@liumiaocn ~]#
使用commit就可以解决这个问题了,把当前的变更保存到镜像中,在/tmp下显示一个文件不是什么好的例子,但是如果在一个Ubuntu的Base上
安装完JDK做一次commit,在安装完JDK之后的版本上再安装Tomcat再做一次commit,是不是你就可以得到了三个版本的镜像了,当然更多的做法是通过
dockerfile来实现的,但是commit倒也简单有效。
[root@liumiaocn ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
44f08d7f4732 busybox "/bin/sh" 15 minutes ago Up 15 minutes busybox
[root@liumiaocn ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 2b8fd9751c4c 3 months ago 1.093 MB
74th/redmine-all-in-one latest cbd38a5bb23d 7 months ago 1.515 GB
[root@liumiaocn ~]# docker commit 44f08d7f4732 busybox:v2
sha256:185ccb97f18acf478b9a3a63964fcab96d2f2cc753e6ec16341013bbc0daa342
[root@liumiaocn ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox v2 185ccb97f18a 20 seconds ago 1.093 MB
busybox latest 2b8fd9751c4c 3 months ago 1.093 MB
74th/redmine-all-in-one latest cbd38a5bb23d 7 months ago 1.515 GB
[root@liumiaocn ~]#
使用这个新生成的镜像busybox:v2启动一下确认/tmp下确实存在刚才的变化内容。
[root@liumiaocn ~]# docker run -it busybox:v2 /bin/sh
/ # cd /tmp
/tmp # ls -l
total 4
-rw-r--r-- 1 root root 12 Sep 24 06:41 helloworld.txt
/tmp # cat helloworld.txt
Hello world
/tmp # exit
[root@liumiaocn ~]#
使用commit生成的新的镜像可以看出history的变化内容
[root@liumiaocn ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox v2 185ccb97f18a 13 minutes ago 1.093 MB
busybox latest 2b8fd9751c4c 3 months ago 1.093 MB
74th/redmine-all-in-one latest cbd38a5bb23d 7 months ago 1.515 GB
[root@liumiaocn ~]# docker history busybox:v2
IMAGE CREATED CREATED BY SIZE COMMENT
185ccb97f18a 13 minutes ago /bin/sh 73 B
2b8fd9751c4c 3 months ago /bin/sh -c #(nop) CMD ["sh"] 0 B
<missing> 3 months ago /bin/sh -c #(nop) ADD file:9ca60502d646bdd815 1.093 MB
[root@liumiaocn ~]#
export
上面使用commit将正在运行的container做成了新的镜像文件,export则是可以用来将正在运行的container生成tar文件
启动一个container
[root@liumiaocn ~]# docker run -it busybox:v2 /bin/sh
/ #
确认container然后将其export出来
[root@liumiaocn ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ea51341f60a5 busybox:v2 "/bin/sh" 19 seconds ago Up 18 seconds goofy_roentgen
[root@liumiaocn ~]# docker export ea51341f60a5 >busyboxv3.tar
[root@liumiaocn ~]# ll busyboxv3.tar
-rw-r--r--. 1 root root 1299968 Sep 24 15:18 busyboxv3.tar
[root@liumiaocn ~]#
rename
用于将container的名称进行修改
[root@liumiaocn ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ea51341f60a5 busybox:v2 "/bin/sh" About a minute ago Up About a minute goofy_roentgen
[root@liumiaocn ~]# docker rename goofy_roentgen busybox
[root@liumiaocn ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ea51341f60a5 busybox:v2 "/bin/sh" 2 minutes ago Up 2 minutes busybox
[root@liumiaocn ~]#
rm
删除container,如果删除正在运行中的container,要么stop之后再rm,要么加上-f选项
[root@liumiaocn ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ea51341f60a5 busybox:v2 "/bin/sh" 3 minutes ago Up 3 minutes busybox
[root@liumiaocn ~]# docker rm -f busybox
busybox
[root@liumiaocn ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@liumiaocn ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@liumiaocn ~]#
import
从tar文件生成docker管理的镜像文件,与save/load的区别在于,这个会丢history的内容
[root@liumiaocn ~]# ll busyboxv3.tar
-rw-r--r--. 1 root root 1299968 Sep 24 15:18 busyboxv3.tar
[root@liumiaocn ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox v2 185ccb97f18a 25 minutes ago 1.093 MB
busybox latest 2b8fd9751c4c 3 months ago 1.093 MB
74th/redmine-all-in-one latest cbd38a5bb23d 7 months ago 1.515 GB
[root@liumiaocn ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@liumiaocn ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@liumiaocn ~]# docker import busyboxv3.tar busybox:v3
sha256:8227b6ef55ac3ffc6f4f2a0bf3ed31f96e32cd1275eeaa9f92cfd35eda9de0e1
[root@liumiaocn ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@liumiaocn ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@liumiaocn ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox v3 8227b6ef55ac 9 seconds ago 1.093 MB
busybox v2 185ccb97f18a 26 minutes ago 1.093 MB
busybox latest 2b8fd9751c4c 3 months ago 1.093 MB
74th/redmine-all-in-one latest cbd38a5bb23d 7 months ago 1.515 GB
[root@liumiaocn ~]# docker history busybox:v3
IMAGE CREATED CREATED BY SIZE COMMENT
8227b6ef55ac 19 seconds ago 1.093 MB Imported from -
[root@liumiaocn ~]#