Docker容器(container)详解

Docker容器(container)详解

1、Docker容器是什么

简单来说,Docker容器是Docker镜像的一个运行实例。所不同的是,Docker镜像是静态的只读文件,而Docker容器带有运行时需要的可写文件层,同时,容器中的应用进程处于运行状态。

如果说虚拟机是模拟运行的一整套操作系统(包括内核、应用运行态环境和其他系统环境)和跑在上面的应用。那么Docker容器就是独立运行的一个(或一组)应用,以及它们必需的运行环境。

本章博客将具体介绍围绕容器的重要操作,包括创建一个容器、启动容器、终止一个容器、进入容器内执行操作、删除容器和通过导入导出容器来实现容器迁移等。

2、Docker容器的启动流程

image

通过 docker run 命令可以启动运行一个容器。该命令在执行时首先会在本地查找指定的 镜像,如果找到了,则直接启动,否则会到镜像中心查找。如果镜像中心存在该镜像,则会 下载到本地并启动,如果镜像中心也没有,则直接报错。

3、容器命令实践

3.1、创建容器

命令:docker create …  ;此命令只会创建一个容器并不会启动容器。以下是以创建redis容器为例

image

以上只是最简单的方式创建容器,此命令有很多选项大致分为如下几类:与容器运行模式相关、与容器环境配置相关、与容器资源限制和安全保护相关

  • create命令与容器运行模式相关的选项
  • imagecreate命令与容器环境和配置相关的选项
  • imagecreate命令与容器资源限制和安全保护相关的选项

epub_23229217_36

3.2、启动容器

docker start 容器ID

image

3.3、创建并运行容器

创建并运行容器有两种模式:

  • 交互模式

创建并运行容器,并且进入容器内部

image

–name 指定当前容器名称为 myredis

-it 指定以交互模式运行容器,且为容器分配一个伪终端。

后面的/bin/bash 用于指定容器启动后需要运行的命令为/bin 下的 bash 命令,而该命令 会启动一个 bash 终端。

我们在这里运行了一个redis的容器,并为其取名为myredis。另外我们可以注意到,命令行前面提示部分内容发

生了变化:原来显示的是[root@qzxdp_centos01 ~],而现在变为了root@913f9ea542ac,这个就是 docker 生成的

伪客户端,而数字 913f9ea542ac 表示的是 docker 容器的 ID。

以交互模式运行tomcat

image

下面也是以交互模式运行 tomcat 容器,不同的是,该命令后没有/bin/bash,此时会真 正启动 tomcat。

报错处理

[root@qzxdp_centos01 ~]# docker run –name tomcat8 -it -p 8888:8080 tomcat:8.0
docker: Error response from daemon: Conflict. The container name “/tomcat8” is already in use by container “00a63e2528c713c906f3b8e67843b5633d6fd969a05a4b47485f1338156b869e”. You have to remove (or rename) that container to be able to reuse that name.
See ‘docker run –help’.

是因为此容器名已存在,需要先删除历史或者更换容器名

# 查看所有容器

[root@qzxdp_centos01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
00a63e2528c7 tomcat:8.0 “/bin/bash” 5 minutes ago Exited (0) About a minute ago tomcat8
[root@qzxdp_centos01 ~]#

# 通过容器ID删除指定容器
[root@qzxdp_centos01 ~]# docker rm 00a63e2528c7
00a63e2528c7
[root@qzxdp_centos01 ~]#

# 再次查看所有容器,已删除
[root@qzxdp_centos01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@qzxdp_centos01 ~]#

image

-p 用于指定端口映射,格式为 暴露给宿主机的端口:容器中应用的端口 回车后会发现 tomcat 已启动,且 tomcat 的日志输出占居了命令行。
此时在浏览器中通过 8888 端口可以访问到 tomcat。

image

  • 分离模式

创建并运行容器,返回容器ID,不进入容器内门,用 -d 参数

image

3.3、容器退出

容器退出分两种方式:

  • 退出并停止容器 命令: exit  或者 ctrl+c
# 启动并进入容器
[root@qzxdp_centos01 ~]# docker run -it --name tomcat8 -p 8080:8080 tomcat:8.0
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /docker-java-home/jre

# ctrl + c 退出并停止容器
# 退出后查询 容器状态 已终止
[root@qzxdp_centos01 ~]# docker ps -a
CONTAINER ID   IMAGE        COMMAND             CREATED          STATUS                        PORTS     NAMES
8d9f3bffefdf   tomcat:8.0   "catalina.sh run"   36 seconds ago   Exited (130) 25 seconds ago             tomcat8
[root@qzxdp_centos01 ~]#
  • 退出不停止容器 命令:ctrl+p+q
# 启动并进入容器
[root@qzxdp_centos01 ~]# docker run -it --name tomcat8 -p 8080:8080 tomcat:8.0
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /docker-java-home/jre

# ctrl + q + q 退出不停止容器
# 退出后查询 容器状态 运行中
[root@qzxdp_centos01 ~]# docker ps -a
CONTAINER ID   IMAGE        COMMAND             CREATED          STATUS          PORTS                                       NAMES
9093a6319966   tomcat:8.0   "catalina.sh run"   13 seconds ago   Up 13 seconds   0.0.0.0:8888->8080/tcp, :::8888->8080/tcp   tomcat8
[root@qzxdp_centos01 ~]#

3.4、停止容器

  • 暂停容器

可以使用docker pause 容器名称或者容器ID 多个以空格间隔 命令来暂停一个运行中的容器。

image

可以通过docker unpause 容器名称或者容器ID 多个以空格间隔 命令来恢复暂停中的容器。

image

  • 终止容器

通过 docker kill 命令可以强制停止指定容器。所谓强制停止是指,无论容器当前是否被其它进程访问都直接停止。

image

  • 优雅停止 stop

通过 docker stop 命令可以优雅停止指定容器。所谓优雅停止是指,若当前容器正在被其它进程访问,则在访问结束后再停止。

image

  • 停止所有容器

无论是 docker kill 还是 docker stop,都可使用下面方式停止所有容器。因为这两个命令的参数都可以是容器 ID。

[root@qzxdp_centos01 ~]# docker stop $(docker ps -q)
9093a6319966
[root@qzxdp_centos01 ~]# docker kill $(docker ps -q)
9093a6319966

3.4、容器启动

  • 启动已停止的容器

容器停止后可以通过 docker start 命令启动容器

  • 重启正在运行中的容器

可以通过 docker restart 命令启动容器

image

3.5、进入容器

当我们以分离模式运行了一个容器,或以交互模式运行了一个容器,但容器内部执行的 命令占用了交互命令行,而此时我们又想进入到容器中对容器内部进行一些操作,此时就需 要用到 exec/attach 命令了。
注意,它们只能对正在运行的容器进行操作。

  • 通过exec进入容器

image

  • 通过attach进入容器

image

image

推荐使用exec进入容器

3.5、删除容器

删除容器,分两种方式:

  • 正常删除

docker rm 命令在默认情况下,要删除的容器必须是已经停止的容器。当然,这个容器 可以使用容器名或容器 ID 指定。

image

  • 强制删除

可以通过 docker rm -f 强制删除运行中的容器

image

3.7、查看容器

  • 查看正在运行中的容器

docker ps 命令本身查看的是所有处于运行状态的容器信息。

image

  • 查看所有容器

docker ps –a 用于查看所有容器,无论是否处于运行状态。

image

  • 查看所有容器ID

docker ps –q 用于查看所有处于运行状态的容器的 ID。

image

docker ps –qa 用于查看所有容器的 ID。

image

  • 查看最后创建的容器

docker ps –l 用于查看最后创建的容器,无论该容器是否处于运行状态。

image

  • 查看最后创建的n个容器

docker ps –n 3 用于查看最后创建的指定个数的容器,无论该容器是否处于运行状态。

image

3.8、容器日志查看

docker logs [容器]可以查看指定容器中应用的运行日志,无论该容器是运行还是停止状态。

  • 查看所有日志

docker logs 查看的是所有容器中应用的运行日志。这个日志对于不同的容器来说,其日 志内容是不同的。由 docker run 命令的[command]决定(如果没有则由 Dockerfile 中的 CMD 指令决定)。

如下为查询tomcat容器日志

image

如下为查询ubuntu容器日志

image

image

  • 查看最后的日志

通过添加选项-n 可以指定要显示的最后几条日志。

image

  • 查看指定时间内的日志

通过添加选项–since 可以指定要显示自从指定时间以来的日志。这个时间可以是一个绝对时间,也可以是一个相对时长。
下面使用的是绝对时间:显示自从2023年05月1日后产生日志的最后3条。

image

下面使用的是相对时长:显示自从 30 分钟之前产生日志中的最后 3 条。其中 m 表示分, 可以使用 s 表示秒,h 表示小时。

image

  • 查看指定时间外的日志

通过添加选项–until 可以指定要显示截止到指定时间之前的日志。这个时间可以是一个绝对时间,也可以是一个相对时长。

下面使用的是绝对时间:显示截止到 2023 年 05 月 1 日前产生日志的最后 3 条。

image

下面使用的是相对时长:显示截止到 5 分钟之前产生日志中的最后 3 条。

image

  • 查看日志时间戳

如果要查看某日志的详细时间戳,可以使用-t 选项。下面的命令查看的是最后 3 条日志的时间戳,并与不添加-t 的输出进行了对比。

image

  • 查看动态日志

通过添加选项-f 可以查看运行中容器的动态日志。

image

3.9、容器内进程查看命令

docker top 命令用于查看指定的正在运行的容器中正在运行的进程详情,这个详情包括当前这个进程正在运行的命令。

image

© 版权声明
THE END
喜欢就支持一下吧
点赞16 分享
评论 抢沙发

请登录后发表评论

    qzxdp.cn

    暂无评论内容