Docker(四)容器相关操作及问题处理

目录

一、进入、退出容器操作

[二、查看Docker 容器的配置文件](#二、查看Docker 容器的配置文件)

方法一:进入docker容器内进行查看

方法二:通过数据卷挂载方式查看配置文件

方法三:使用Docker可视化工具查看配置文件

三、容器与宿主机时间同步

方法一:创建启动容器时共享宿主机的localtime

方法二:复制宿主机的localtime

1、宿主机直接执行命令:将时间同步给指定容器

2、登录容器同步时区timezone

方法三:创建DockerFile文件的时候,自定义该镜像的时间格式及时区


一、进入、退出容器操作

1、进入容器

  1. 首先,通过docker ps 命令查看正在运行的容器列表,找到目标容器的 CONTAINER IDNAMES

  2. 使用以下命令进入到容器内部:

    docker exec -it <container_id_or_name> /bin/bash

2、退出容器

| 操作方式 | 描述 |
| exit | 使用 exit 命令退出容器 |

Ctrl+D 使用 Ctrl+d 快捷键退出容器

二、查看Docker 容器的配置文件

方法一:进入docker容器内进行查看

  1. 通过 docker exec 命令进入容器内

  2. 进入容器后,使用ls命令查看容器内的文件和目录结构。

  3. 根据项目的具体目录结构和配置文件位置,使用catvi等命令查看和编辑配置文件

    进入容器
    docker exec -it <container_id_or_name> /bin/bash

    查询目录
    ls -l

方法二:通过数据卷挂载方式查看配置文件

  1. 如果配置文件是通过数据卷挂载到容器中的,可以直接通过本地文件系统查看配置文件。

  2. 使用以下命令查看数据卷挂载情况:

    docker inspect <container_id_or_name>

在输出结果中找到Mounts字段,查看挂载的数据卷信息。根据挂载路径,在本地文件系统中找到对应的配置文件。

使用文本编辑器或终端命令查看和编辑配置文件。

方法三:使用Docker可视化工具查看配置文件

除了命令行方式外,也可以使用一些Docker可视化工具来方便地查看Docker项目的配置文件和其他信息。常见的Docker可视化工具有 Portainer、Kitematic 等,通过这些工具可以直观地查看容器中的文件和配置信息。 通过以上方法,我们可以方便地查看Docker项目中的配置文件,以便进行必要的调试和修改操作。

三、容器与宿主机时间同步

问题 :如果在启动Docker容器的过程中没有单独配置 localtime,很可能造成 Docker 容器时间与主机时间不一致的情况,比如 UTC 和 CST 相差8小时

通过 date 命令:发现两者之间的时间相差了八个小时!

宿主机采用了CST时区,CST是指(China Shanghai Time,东八区时间)

容器采用了UTC时区,UTC是指(Coordinated Universal Time,标准时间)

复制代码
宿主机查询时间
[root@VM-4-14-centos ~]# date
Tue May 21 11:32:36 CST 2024


进入容器查询时间
[root@VM-4-14-centos ~]# docker exec -it f77618fa6e0c /bin/bash
root@f77618fa6e0c:/data# date
Tue May 21 03:33:20 UTC 2024

方法一:创建启动容器时共享宿主机的localtime

创建容器时,挂载localtime文件到容器内

创建容器命令 run 时增加相关参数:-v /etc/localtime:/etc/localtime

复制代码
创建容器的时候指定启动参数,挂载localtime文件到容器内,保证两者所采用的时区是一致的

docker run -d --name <容器ID或者NAME> \
-v /etc/localtime:/etc/localtime \
-p <主机(宿主)端口>:<容器端口> \
<本地镜像仓库下载的镜像名-REPOSITORY>:<需要的版本号-TAG>

例如:下面redis的启动命令

复制代码
docker run -d --name redis-5.0.14 -p 6379:6379 -v /etc/localtime:/etc/localtime redis:5.0.14

方法二:复制宿主机的localtime

1、宿主机直接执行命令:将时间同步给指定容器

docker cp:用于容器与主机之间的数据拷贝

执行命令(作用相同):

docker cp /etc/localtime <容器ID或者NAME>:/etc/

docker cp /usr/share/zoneinfo/Asia/Shanghai <容器ID或者NAME>:/etc/localtime

复制代码
执行命令
[root@VM-4-14-centos ~]# docker cp /etc/localtime <容器ID或者NAME>:/etc/
 
然后再登陆容器,查看时间,发现已经跟宿主机时间同步了
[root@VM-4-14-centos ~]# docker exec -it <容器ID或者NAME> /bin/bash
root@f3a11c61d13f:/# date                                                                                                                    
Tue May 21 17:16:46 CST 2024

如果遇到问题:出现下面报错信息

复制代码
Error response from daemon: Error processing tar file(exit status 1): invalid symlink "/etc/localtime" -> "../usr/share/zoneinfo/Asia/Shanghai"

就更换命令

复制代码
执行命令
[root@VM-4-14-centos ~]# docker cp /usr/share/zoneinfo/Asia/Shanghai <容器ID或者NAME>:/etc/localtime

然后再登陆容器,查看时间,发现已经跟宿主机时间同步了
[root@VM-4-14-centos ~]# docker exec -it <容器ID或者NAME> /bin/bash
root@f3a11c61d13f:/# date                                                                                                                    
Tue May 21 17:16:46 CST 2024

2、登录容器同步时区timezone

注:这种在容器中运行程序的方式,时间不一定能更新过来,有时需重启容器 docker restart <容器ID或者NAME>

复制代码
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

方法三:创建DockerFile文件的时候,自定义该镜像的时间格式及时区

在dockerfile文件里添加下面内容

复制代码
......
FROM tomcat
ENV CATALINA_HOME /usr/local/tomcat
.......
#设置时区
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone

保存后,利用 docker build 命令生成镜像使用即可,使用dockerfile创建的镜像的容器改变了容器的时区,

这样不仅保证了容器时间与宿主机时间一致(假如宿主机也是CST),并且像上面使用tomcat作为父镜像的话,JVM的时区也是CST,

这样tomcat的日志信息的时间也是和宿主机一致的,像上面那两种方式只是保证了宿主机时间与容器时间一致,JVM的时区并没有改变,tomcat日志的打印时间依旧是UTC

相关推荐
cocologin31 分钟前
RIP 技术深度解析
运维·网络·网络协议
庸子1 小时前
基于Jenkins和Kubernetes构建DevOps自动化运维管理平台
运维·kubernetes·jenkins
眠修1 小时前
Kuberrnetes 服务发布
linux·运维·服务器
hunjinYang2 小时前
Tomcat镜像实战:掌握Dockerfile的编写以及发布项目
docker·tomcat
好奇的菜鸟2 小时前
Docker 配置项详解与示例
运维·docker·容器
xcs194052 小时前
集运维 麒麟桌面版v10 sp1 2403 aarch64 离线java开发环境自动化安装
运维·自动化
BAOYUCompany3 小时前
暴雨服务器成功中标华中科技大学集成电路学院服务器采购项目
运维·服务器
超龄超能程序猿3 小时前
Bitvisse SSH Client 安装配置文档
运维·ssh·github
奈斯ing3 小时前
【Redis篇】数据库架构演进中Redis缓存的技术必然性—高并发场景下穿透、击穿、雪崩的体系化解决方案
运维·redis·缓存·数据库架构
Connie14513 小时前
k8s多集群管理中的联邦和舰队如何理解?
云原生·容器·kubernetes