容器是镜像的一个运行实例。所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层。如果认为虚拟机是模拟运行的一整套操作系统(包括内核、应用运行态环境和其他系统环境)和跑在上面的应用,那么Docker容器就是独立运行的一个(或一组)应用,以及它们必须的运行环境。
一、docker run命令
docker run
命令是使用一个镜像运行启动一个容器。在启动运行的时候,会检查docker是否包含了该镜像,如果没有包含,docker会自动在docker的仓库中下载你想使用的镜像。
1、启动一个bash终端,允许用户进行交互
root@docker ~]# docker run --name mycentos -it docker.mynexus.com/myimages/centos:7.6 /bin/bash
[root@28714cd977bf yum.repos.d]# cd
[root@28714cd977bf ~]# ls /
anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[root@28714cd977bf ~]#
其中--name [镜像名]
:给启动的容器起一个名字,如果不使用--name
,docker的守护进程会自动给容器命名,但是这个名字并不好记。
-t
:让Docker分配一个伪终端并绑定到容器的标准输入上。
-i
:让容器的标准输入保持打开。
-it
:是-i和-t的结合。
2、让容器在后台运行
在使用docker run
运行容器的更多时候,我们是需要容器在后台运行的,也就是以守护态形式运行。可以通过-d
参数来实现。
[root@docker ~]# docker run -d --name mycentos2 docker.mynexus.com/myimages/centos:7.6 /bin/bash
eae5681c6562568acc2b6b1c2d69ca52d0a1cd9d3a6acee53fd8d0e6c3af6353
容器启动后就会在后台运行,然后返回一个容器ID到控制台。
二、容器的启动/停止
1、停止命令
docker stop [ID/NAMES]
和docker kill [ID/NAMES]
这两个命令都可以停止容器。
区别
docker stop
默认是先给容器发送SIGTERM信号,然后10秒后发生SIGKILL信号终止容器,可以使用-t
或者--time
来设置等待的时间,单位是秒。
docker kill
是直接停止容器,没等待时间。
2、启动命令
可以使用docker start [ID/NAMES]
来启动已经停止的容器。
三、进入/退出容器
1、Dokcer attach [ID/NAMES]
Docker提供了docker attach
的命令,用来让我们进入已经启动的容器。
[root@docker ~]# docker attach mycentos
[root@28714cd977bf yum.repos.d]#
注意,在我们使用attach进入容器的时候,如果同时有多个窗口attach到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。
2、nsenter进入容器
nsenter
命令被包含在util-linux软件包里,使用nsenter可以访问另一个进程的名字空间,大多数Linux发行版默认包含了该软件,CentOS默认是有的。如果没有,可以使用下面的命令安装:
[root@docker ~]# yum install -y util-linux
为了连接到容器,还需要找到容器的第一个进程的PID,可以通过下面的命令获取PID。docker inspect --format "{{ .State.Pid }}" [ID/NAMES]
通过这个PID,可以连接到这个容器中:
nsenter --target $PID --mount --uts --ipc --net --pid
举个例子
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
28714cd977bf docker.mynexus.com/myimages/centos:7.6 "/bin/bash" 2 hours ago Up 4 seconds 22/tcp mycentos
[root@docker ~]# docker inspect --format "{{ .State.Pid }}" mycentos
2707
[root@docker ~]# nsenter --target 2707 --mount --uts --ipc --net --pid
[root@28714cd977bf /]#
3、exec进入容器
[root@docker ~]# docker exec -it mycentos /bin/bash
[root@28714cd977bf yum.repos.d]#
4、退出容器
1.exit
2.ctrl+d
四、删除容器
1、删除未运行的容器
使用docker rm
可以删除一个处于停止状态的容器。
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
28714cd977bf docker.mynexus.com/myimages/centos:7.6 "/bin/bash" 3 hours ago Up 28 minutes 22/tcp mycentos
[root@docker ~]# docker stop mycentos
mycentos
[root@docker ~]# docker rm mycentos
mycentos
2、强制删除运行中的容器
docker rm -f [ID/NAMES]
3、杀死所有正在运行的容器
[root@docker ~]# docker kill $(docker ps -a -q)
4、删除所有已经停止的容器
[root@docker ~]# docker rm $(docker ps -a -q)
五、不进入容器执行命令
可能你的本意不是想进入容器,而是想让容器执行一个命令,docker提供了exec
命令,使用exec可以在容器内运行命令。
[root@docker ~]# docker exec mycentos which echo
/usr/bin/echo
参考文章:
http://k8s.unixhot.com/docker/docker-container.htmlhttps://blog.51cto.com/14188767/2374337?source=drahttps://www.cnblogs.com/szlblog/p/10612280.html