前面两篇文章已经详细讲解了关于docker安装、镜像操作和简单的容器创建内容:
基于centos8.0环境下docker安装
centos8+docker系列(2)——镜像image操作
本文着重讲解在生产环境中,常见的两种容器创建和运行方式
运行容器命令run
参数:
- -d:后台运行容器,并返回容器id,即启动守护式容器
- -i:以交互模式运行容器
- -t:为容器重新分配一个伪终端
- –name:手动为容器指定一个名称
- -p:指定端口映射
- -v:挂载卷
创建容器的两种方式
1.启动且进入交互式容器
查看镜像:
sudo docker image ls
发现有centos7镜像,以此为基础创建交互式容器并进入:
sudo docker container run -it --name cs7 centos:7
如果只是想创建容器并不进入,可以执行:
sudo docker container create -it --name cs7 centos:7
然后在需要的时候,执行启动和进入容器的命令:
sudo docker container start cs7 //启动容器
sudo docker container attach cs7 //进入容器
退出容器分两种:
exit //直接退出容器,并且关闭容器,重新进入需要重新启动容器。
ctrl+p+q //静默退出,退出后并不关闭容器,下次可直接进入。注意p和q的先后顺序。
2.创建守护式容器
docker运行机制:docker容器运行就必须有一个前台进程,容器运行的命令如果不是一直挂起的命令(如:tail -f;top或者/bin/bash),
就会自动退出
创建守护式容器:
sudo docker container run -d --name cs7 centos:7
注意参数的不同,创建守护式容器使用的参数是“-d”
交互式容器因为有交互界面的存在,容器一直有事可做,所以不会自动退出,守护式容器如果没有具体业务,开启后会随即关闭。
我们为守护式容器创建一个循环的业务,具体代码如下,但我们不需要关心后面执行的语句,那不是我们关注的重点:
sudo docker run -d --name cs7 centos:7 /bin/bash -c "while true;do echo hello world;sleep 3;done"
打印容器后,发现cs7容器并没有直接关闭,一直在运行。如图:
此时查看日志:
sudo docker container logs
发现控制台一直在打印“hello world”,容器有事干,所以没关闭。
此时如果我们用attach命令进入容器,会发现不论在终端输入什么命令,它都会一直打印“hello world”,连退出容器的命令都无法执行。如图:
所以需要用“exec”进入容器,它与attach的区别是,会启动新的进程(伪终端),从而不受容器内业务影响:
sudo docker container exec -it cs7 /bin/bash
3.查看守护式容器内容
很多时候,我们需要知道某个容器究竟在执行什么操作,这时候需要借助命令行:
sudo docker container exec cs7 ps -ef
执行结果如图:
4.创建并保持容器不关闭(并不进入容器)
在实际生产环境中,我们会有很多情况需要创建一个容器,但是容器内可能并未产生具体的业务,所以我们也不需要进入容器操作什么。
此时,我们需要用结合交互式和守护式的参数,-it产生的交互式作为守护进程,维持守护式容器的开启,代码如下:
sudo docker container run -itd --name cs7 centos:7
此时,创建的容器时守护式的,并不会进入容器,并且容器不会直接关闭。这是生产环境中创建容器使用最多的一种方式。