容器介绍
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的 root
文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。也因为这种隔离的特性,很多人初学 Docker 时常常会混淆容器和虚拟机。
容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。
创建容器
在 Docker 中,真正对外提供服务的还是容器,本小节咱们来创建一个容器。
创建容器的格式:docker run [option] image [cmd]
[root@laser ~]# docker run -d -p 8000:80 --name nginx nginx:1.19.2
69d70ddfe7109400b9585bd6870a74cf0953960e94be41779208b376a6c4329d
查看容器
[root@laser ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
69d70ddfe710 nginx:1.19.2 "/docker-entrypoint.…" 3 seconds ago Up 1 second 0.0.0.0:8000->80/tcp nginx
容器启动参数
参数 | 信息 |
---|---|
-d | 以守护进程方式运行 |
-p | 指定映射端口 |
-P | 随机映射端口 |
-i | 保持标准输入打开 |
-t | 分配一个伪终端 |
-v | 设置挂载文件到主机上 |
–rm | 当容器关闭时自动删除 |
–name | 为启动的容器设置一个名字 |
–network | 指定使用哪个网络 |
-e | 设置容器中的环境变量 |
–link | 链接到另一个容器 |
-h | 指定容器内的主机名 |
停止容器
docker 终止容器是首先向容器发送 SIGTERM 信号,等待一段时间超时后(默认 10 秒),再发送 SIGKILL 信号 来终止容器。
查看正在启动的容器
[root@laser ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
69d70ddfe710 nginx:1.19.2 "/docker-entrypoint.…" 3 seconds ago Up 1 second 0.0.0.0:8000->80/tcp nginx
7dfaef013910 mysql:5.7 "docker-entrypoint.s…" 2 hours ago Up 2 hours 0.0.0.0:32771->3306/tcp, 0.0.0.0:32770->33060/tcp mysql1
停止
[root@laser ~]# docker stop nginx
nginx
重新启动
[root@laser ~]# docker start nginx
可见,NGINX 容器已经被我们终止了。这个时候我们也可以重新启动这个容器。
进入容器
四种方式进入容器
在使用容器的过程中,我们难免需要进入容器进行排查问题。下面我们就来介绍进入容器的集中方式。
- attach
attach 是最早 docker 官方推出的进入容器的命令了,不过使用该命令有一个问题。当多个窗口同时使用该命令 进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作,当所有窗 口退出时,容器结束。
[root@laser ~]# docker attach nginx
- exec
既 attach 之后,exec 是官方推出的有一个新的进入容器的命令,这个命令相当于在容器中执行一个命令。
[root@laser ~]# docker exec -it nginx /bin/bash
- nsenter
需要配合 docker inspect 来使用(早期没有 exec 命令时,企业当中最长用的方式之一),Docker 是用 golang 语言开发,所以它也支持 go 语言的摸版语法。
root@laser ~]# nsenter --target $( docker inspect -f {{.State.Pid}} nginxv1 ) --mount --uts --ipc --net --pid
- ssh
在生产环境中排除了使用 docker attach 命令进入容器之后,相信大家第一个想到的就是 ssh。在镜像(或容器) 中安装 SSH Server,这样就能保证多人进入容器且相互之间不受干扰了,相信大家在当前的生产环境中(没有 使用 Docker 的情况)也是这样做的。但是使用了 Docker 容器之后不建议使用 ssh 进入到 Docker 容器内。
总结
进入 docker container 中一般情况下有 4 种方式,最常用的是 exec 和 nsenter 这两种。
Nsenter 和 exec 之间的区别?
- Exec 是 docker 自带的命令,Nsenter 是 Linux 提供的命令。
- Exec 相当于在容器内执行一个命令,而 Nsenter 是仅仅进入容器之中而已。
删除容器
可以使用 docker rm 命令来删除处于终止或退出状态的容器,命令格式为:docker rm container。
[root@laser ~]# docker rm nginx
或 docker rm $(docker ps -qa)
强制删除
强制删除一个正在运行的容器
[root@laser ~]# docker rm -f nginx
或 docker rm -f $(docker ps -qa)
查看容器详细信息
查看容器详情可以使用 docker container inspect [OPTIONS] CONTAINER [CONTAINER ... ]
子命令。
[root@laser ~]# docker inspect ae0658fdbad5
[
{
"Id": "sha256:ae0658fdbad5fb1c9413c998d8a573eeb5d16713463992005029c591e6400d02",
"RepoTags": [
"mysql:5.7"
],
"RepoDigests": [
"mysql@sha256:8e2004f9fe43df06c3030090f593021a5f283d028b5ed5765cc24236c2c4d88e"
],
"Parent": "",
...
容器命令详解
复制命令
复制命令类似于 Linux 系统中的 scp 命令,是将宿主主机上的内容上传到容器中,也可能是将容器中的文件 下载到宿主主机中。复制必须是已经启动的容器
样式: docker cp 镜像ID:镜像内路径 本机路径
, 主机导入镜像则反之
# 将容器中的内容复制到宿主主机 nginx
[root@laser ~]# docker cp 69d70ddfe710:/usr/share/nginx/html/ .
[root@laser ~]# ls | grep start
Start
#将宿主主机中的文件复制到容器中
[root@laser ~]# docker cp start 726b695a337c:/root
[root@laser ~]# docker exec 726b695a337c ls /root start
docker网络