Docker的容器
一.容器
容器是一种轻量级的虚拟化技术。它有效的将单个操作系统的资源划分到各独立的组中,以便更好的平衡这些独立的组之间资源的使用。
容器主要包含了命名空间 (Namespaces)和cgroup(Control Groups)两大核心技术。
- 命名空间:Namespace是将全局系统资源隔离成独立的视图,使得在不同 Namespace 中运行的进程看到的资源是不同的。每个Namespace都有一份独立的资源,不同的进程在各自的Namespace内对同一种资源使用时不会互相干扰。
- cgroup:是用于限制和隔离一组进程对系统资源的使用,这些资源主要包括CPU、内存、磁盘I/O和网络带宽等。
二.Docker中的容器
容器是Docker的另一个核心概念,它是镜像的一个运行实例。在我们学习的面向对象语言中,镜像可以理解为面向对象中的类,而容器则可以看作是从镜像这个"类"实例化出来的一个个对象。
Docker容器一个轻量级的、独立的、可移植的运行环境,是架设在操作系统之上的一种轻量级的虚拟化技术。
Docker容器由于可以包含了运行某个软件所需要的所有资源,包括代码、运行时环境、库、环境变量和配置文件等。因此Docker容器就像一个"软件包装盒",它可以将应用及其运行环境一起打包,使得应用的运行不再受限于特定的系统和环境。
Docker容器跳出了系统和环境的限制,使开发的应用程序可以在任何宿主机上以相同的方式运行。
一个镜像可以创建出多个容器。当Docker创建一个容器时,它会在加载镜像文件的所有只读层基础上再添加一个容器层。而这个容器层是可读可写的。
三.Docker容器的生命周期
Docker容器在运行的过程中,容器生命周期可能会处于已创建(Created)、运行中(Running)、停止(Stopped)、暂停中(Paused)以及删除(Deleted)等几种状态。
![](https://i-blog.csdnimg.cn/direct/0d0640a041e1477c8a9dbdc1e210f323.png)
Docker容器的生命周期涵盖了七个关键阶段,每个阶段都有其特定的目标和操作。这七个阶段的概述如下:
- 已创建(Created):在容器的生命周期中,创建是第一个关键阶段。在这个阶段,我们选择适当的 Docker 镜像作为容器的基础,并使用 Docker 命令来创建容器实例。容器的配置选项和环境变量设置也在这个阶段完成。
- 启动(Start):一旦容器被成功创建,就可以进入启动阶段。启动已创建的容器,使其处于运行状态。
- 运行(Run):容器的运行阶段是其生命周期的核心。在此阶段,在容器中运行应用程序,处理请求等。
- 暂停:在某些情况下,我们可能需要暂停容器的运行,而不是完全停止它。暂停容器会冻结其状态,包括应用程序的进程。容器的资源消耗会暂时减少,但状态仍然保留在内存中。
- 继续:当需要时,我们可以将容器从暂停状态切换回运行状态,使应用程序继续处理请求。
- 停止(Stop):停止正在运行的容器,但并不会删除它。在停止阶段,容器会被正常关闭,应用程序会完成清理工作并释放资源。
- 删除(Delete):当我们确定不再需要特定容器时,可以从系统中删除已停止的容器实例。
四.Docker容器命令详解
1.docker create
docker create命令用于创建一个新容器但并不启动它。
命令格式:
bash
docker container create [OPTIONS] IMAGE [COMMAND] [ARG...]
命令别名:
bash
docker create
参数选项:
- --name:设置容器的名称;
- -i,--interactive:保持标准输入打开,通常与-t同时使用;
- -t,--tty:分配一个伪终端;
- -p,--publish:指定容器和宿主机的端口映射,格式为:主机(宿主)端口:容器端口;
- -P,--publish-all:将容器内部的随机端口映射到宿主机的端口;
- --add-host:在容器内添加一个主机名到IP地址的映射关系;
- -h,--hostname:设置容器主机名;
- -e,--env:设置环境变量;
- --env-file:设置读取环境变量到容器内的文件;
- -m,--memory:限制容器内应用使用的内存;
- --link:添加指向另一个容器的链接;
- --network:指定容器的网络连接类型;
- --restart:设置容器退出时的重启策略;
- --rm:设置容器退出时自动删除容器以及关联的匿名卷;
- -v,--volume:绑定挂载一个卷;
- -w,--workdir:设置容器的默认工作目录;
- -a, --attach:是否绑定到标准输入(STDIN)、输出(STDOUT)或错误(STDERR) ;
- --device:映射物理机上的设备到容器内;
- --dns:设置自定义DNS服务器;
- --dns-option:设置自定义DNS选项;
- --dns-search:设置自定义DNS搜索域;
- --domainname:设置容器NIS域名;
- --entrypoint:定义新的命令覆盖镜像存在的入口命令;
- --expose:设置容器暴露出来的端口或端口范围;
- --ip:设置容器的IPv4地址;
- --ip6:设置容器的IPv6地址;
- -l,--label:设置容器元数据标签信息;
- --privileged:授予容器内进程对宿主机系统的更高权限;
- --mount:挂载文件系统到容器;
- --cap-ad:添加Linux功能;
- --cap-drop:删除Linux功能;
- --cidfile:指定容器ID写入的文件。
示例:
bash
docker create -it --name busybox-container hub.c.163.com/library/busybox:1.27-uclibc
![](https://i-blog.csdnimg.cn/direct/8450e179196846c4b614ebffb0115fb9.png)
2.docker start
docker start [OPTIONS] CONTAINER [CONTAINER...] 命令是用于启动一个已经停止的容器。
命令格式:
bash
docker container start [OPTIONS] CONTAINER [CONTAINER...]
命令别名:
bash
docker start
参数选项:
- -i,--interactive:保持标准输入打开,通常与-t同时使用;
- -a, --attach:是否绑定到标准输入(STDIN)、输出(STDOUT)或错误(STDERR) 。
示例:
bash
docker start busybox-container
我们使用docker start命令启动了1小结中刚刚创建的名称为" busybox-container"的容器。启动了完成后,再通过docker ps命令就可以查看刚刚启动的容器。
![](https://i-blog.csdnimg.cn/direct/19e1af24415a4deea7c791c4e169cd82.png)
3.docker run
docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 命令是从指定的镜像创建一个容器并将容器启动,它相当于先执行docker [container] create命令,然后再执行docker [container] start命令。
命令格式:
bash
docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]
命令别名:
bash
docker run
参数选项:
- -d,--detach:在后台运行容器并打印容器的ID;
- --name:设置容器的名称;
- -i,--interactive:保持标准输入打开,通常与-t同时使用;
- -t,--tty:分配一个伪终端;
- -p,--publish:指定容器和宿主机的端口映射,格式为:主机(宿主)端口:容器端口;
- -P,--publish-all:将容器内部的随机端口映射到宿主机的端口;
- --add-host:在容器内添加一个主机名到IP地址的映射关系;
- -h,--hostname:设置容器主机名;
- -e,--env:设置环境变量;
- --env-file:设置读取环境变量到容器内的文件;
- -m,--memory:限制容器内应用使用的内存;
- --link:添加指向另一个容器的链接;
- --network:指定容器的网络连接类型;
- --restart:设置容器退出时的重启策略;
- --rm:设置容器退出时自动删除容器以及关联的匿名卷;
- -v,--volume:绑定挂载一个卷;
- -w,--workdir:设置容器的默认工作目录;
- -a, --attach:是否绑定到标准输入(STDIN)、输出(STDOUT)或错误(STDERR) ;
- --device:映射物理机上的设备到容器内;
- --dns:设置自定义DNS服务器;
- --dns-option:设置自定义DNS选项;
- --dns-search:设置自定义DNS搜索域;
- --domainname:设置容器NIS域名;
- --entrypoint:定义新的命令覆盖镜像存在的入口命令;
- --expose:设置容器暴露出来的端口或端口范围;
- --ip:设置容器的IPv4地址;
- --ip6:设置容器的IPv6地址;
- -l,--label:设置容器元数据标签信息;
- --mount:挂载文件系统到容器;
- --privileged:授予容器内进程对宿主机系统的更高权限;
- --cap-ad:添加Linux功能;
- --cap-drop:删除Linux功能;
- --cidfile:指定容器ID写入的文件。
当我们使用docker [container] run命令来创建并启动一个容器时,Docker在后台会进行如下的标准操作:
- 先检查本地是否存在指定的镜像,如果不存在的话就从公有仓库下载镜像;
- 使用镜像新建一个容器,并且启动这个容器;
- 分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层;
- 从宿主主机配置的网桥接口中桥接一个虚拟网络接口到容器中去;
- 从网桥的地址池中配置一个IP地址给容器;
- 执行用户指定的应用程序;
- 应用程序执行完毕后容器或被自动终止。
示例:
bash
docker run -p 9292:9191 -it --name busybox-container hub.c.163.com/library/busybox:1.27-uclibc
![](https://i-blog.csdnimg.cn/direct/f45a5454cfad434dbdc1c8d9f07a3361.png)
![](https://i-blog.csdnimg.cn/direct/874df39961814d2b8c4780cf6ff23a5a.png)
docker [container] run命令中有一个-d参数,它可以让创建的容器在后台以守护态(Daemonized)形式运行,命令执行成功后会返回容器的ID。
示例:
bash
docker run --name busybox-container-d -d hub.c.163.com/library/busybox:1.27-uclibc sh -c "while true; do $(echo date); sleep 1; done"
4.docker logs
docker logs [OPTIONS] CONTAINER命令是获取容器的日志。
命令格式:
bash
docker container logs [OPTIONS] CONTAINER
命令别名:
bash
docker logs
参数选项:
- -d,--detach:在后台运行容器并打印容器的ID;
- --details:显示日志的详细信息;
- -f,--follow:持续跟踪日志输出;
- --since:显示自某个时间戳开始以后的日志;
- -n,--tail:仅显示最近N条容器日志内容;
- -t,--timestamps:显示时间戳;
- --until:显示自某个时间戳之前的日志。
示例:
bash
docker logs busybox-container-d
示例的docker logs命令查看了" busybox-container-d"容器的日志。这个容器会不断循环的每隔1秒钟就输出当前系统的时间。
![](https://i-blog.csdnimg.cn/direct/9cb6d306d3c34f688ad15554a3a7fcd0.png)
5.docker pause
docker pause CONTAINER [CONTAINER...]命令是暂停一个或多个容器内的所有进程。该命令会挂起指定容器中的所有进程。
命令格式:
bash
docker container pause CONTAINER [CONTAINER...]
命令别名:
bash
docker pause
示例:
bash
docker pause busybox-container-d
在示例中我们使用docker pause命令对第3节的新建并启动运行的" busybox-container-d"容器来进行暂停操作。暂停后的容器就处于"Paused"的状态。
![](https://i-blog.csdnimg.cn/direct/cc298ba053aa4e08adb2fabec9059d2e.png)
6.docker unpause
docker unpause CONTAINER [CONTAINER...]命令是恢复一个或多个容器内暂停的所有进程。该命令会恢复指定容器中的所有挂起的进程。
命令格式:
bash
docker container unpause CONTAINER [CONTAINER...]
命令别名:
bash
docker unpause
示例:
bash
docker unpause busybox-container-d
在示例中我们使用docker unpause命令对第5节中已经暂停的" busybox-container-d"容器来进行恢复操作。
![](https://i-blog.csdnimg.cn/direct/f0e945dae21549d2b4d1d2a9ce8a3ee6.png)
7.docker stop
docker stop [OPTIONS] CONTAINER [CONTAINER...]命令是用来停止一个或多个正在运行的容器。
命令格式:
bash
docker container stop [OPTIONS] CONTAINER [CONTAINER...]
命令别名:
bash
docker stop
参数选项:
- -s,--signal:发送到停止容器的信号;
- -t,--time:停止容器前等待的时间,单位为秒。
示例:
bash
docker stop busybox-container-d
![](https://i-blog.csdnimg.cn/direct/67a324134c5240a0af8b7ca83a7cc5c4.png)
对于已经处于终止状态的容器,我们可以通过docker start命令来将它重新启动。
![](https://i-blog.csdnimg.cn/direct/3bb1d570a8b947d8809f6786392aa934.png)
8.docker restart
docker restart [OPTIONS] CONTAINER [CONTAINER...]命令是用于重新启动一个或多个容器,该命令对正在运行的容器,会先终止后再重新启动。
命令格式:
bash
docker container restart [OPTIONS] CONTAINER [CONTAINER...]
命令别名:
bash
docker restart
参数选项:
- -s,--signal:发送到停止容器的信号;
- -t,--time:停止容器前等待的时间,单位为秒。
示例:
bash
docker restart busybox-container-d
9.docker rm
docker rm命令是移除一个或多个已停止的容器。
命令格式:
bash
docker container rm [OPTIONS] CONTAINER [CONTAINER...]
命令别名:
bash
docker container remove或docker rm
参数选项:
- -f,--force:使用SIGKILL信号强制移除正在运行的容器;
- -l,--link:删除指定的链接;
- -v,--volumes:移除与容器关联的匿名卷。
示例:
bash
docker rm busybox-container
10.docker ps
docker ps命令是列出容器信息。
命令格式:
bash
docker container ls [OPTIONS]
命令别名:
bash
docker container list或docker container ps 或 docker ps
参数选项:
- -a,--all:显示所有的容器(默认只显示运行的);
- -f,--filter:根据提供的过滤条件来输出内容;
- --format:使用自定义模板格式来设置输出;
- -n,--last:显示最近创建的n个容器(包括所有状态的);
- --no-trunc:不截断输出;
- -q,--quiet:静默模式,仅显示容器ID;
- -s,--size:显示文件总大小。
示例:
bash
docker ps
11.docker attach
docker attach命令是进入到正在运行中的容器。当使用该命令进入到容器后,就好像在自己的终端以交互式的方式,来对容器输入命令并查看命令输出。
命令格式:
bash
docker container attach [OPTIONS] CONTAINER
命令别名:
bash
docker attach
参数选项:
- --no-stdin:是否关闭标准输入,默认是保持打开;
- --sig-proxy:是否将所有接收到的信号代理到应用进程,默认为true。
示例:
bash
docker attach busybox-container
12.docker exec
docker exec命令是在一个运行中的容器中执行命令。
命令格式:
bash
docker container exec [OPTIONS] CONTAINER COMMAND [ARG...]
命令别名:
bash
docker exec
参数选项:
- -d,--detach:在容器后台运行命令;
- -e,--env:设置环境变量;
- --env-file:设置读取环境变量到容器内的文件;
- -i,--interactive:保持标准输人打开接受用户输人命令,默认值为false;
- --privileged:是否给执行的命令扩展权限,默认值为false;
- -t,--tty:分配一个伪终端;
- -u,--user:指定执行命令的用户名或用户ID,组名或组ID;
- -w,--workdir:设置执行命令的默认工作目录。
示例:
bash
docker exec -it busybox-container echo 'hello word!'
13.docker stats
docker stats命令是实时显示容器资源使用情况的统计信息,包括:CPU、内存、网络I/O等。
命令格式:
bash
docker container stats [OPTIONS] [CONTAINER...]
命令别名:
bash
docker stats
参数选项:
- -a,--all:显示所有容器的资源使用情况(默认是只显示运行容器的);
- --format:使用自定义模板格式来设置输出;
- --no-stream:只展示当前最新的一条容器资源使用情况,不再实时更新;
- --no-trunc:不截断输出(如:容器ID会全部显示)。
示例:
bash
docker stats busybox-container
14.docker container inspect
docker container inspect命令是显示一个或多个容器的详细信息。
命令格式:
bash
docker container inspect [OPTIONS] CONTAINER [CONTAINER...]
参数选项:
- -f,--format:使用自定义模板格式来设置输出;
- -s,--size:显示文件的总大小。
示例:
bash
docker container inspect busybox-container
15.docker kill
docker kill命令是强制退出正在运行的容器。
命令格式:
bash
docker container kill [OPTIONS] CONTAINER [CONTAINER...]
命令别名:
bash
docker kill
参数选项:
- -s,--signal;发送到容器的信号。
示例:
bash
docker kill busybox-container
16.docker container prune
docker container prunee命令是移除所有已经停止的容器。
命令格式:
bash
docker container prune [OPTIONS]
参数选项:
- --filter:提供过滤的筛选值;
- -f,--force:不提示是否进行确认。
示例:
bash
docker container prune
17.docker commit
docker commit命令是根据容器的更改来创建一个新的镜像。
命令格式:
bash
docker container commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
命令别名:
bash
docker commit
参数选项:
- -a,--author:提交的镜像作者;
- -c,--change:使用Dockerfile指令来创建的镜像;
- -m,--message:提交时的注释文字说明;
- -p,--pause:执行commit命令时,是否将容器暂停,默认值是true。
示例:
bash
docker commit container_busybox image_busybox