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

目录

一、进入、退出容器操作

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

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

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

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

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

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

方法二:复制宿主机的localtime

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

2、登录容器同步时区timezone

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


一、进入、退出容器操作

1、进入容器

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

  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. 根据项目的具体目录结构和配置文件位置,使用cat 或vi等命令查看和编辑配置文件

    进入容器
    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

相关推荐
虎头金猫5 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
分布式存储与RustFS5 天前
MinIO 官方 Docker 镜像被移除:依赖它的项目该怎么办
docker·云原生·devops·对象存储·minio·分布式存储
AI职业加油站5 天前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
此冬歌咏5 天前
K8s 节点故障实战:优雅驱逐 31 秒,硬故障 331 秒,以及那个永远 Pending 的 Pod
运维·k8s
玉&心5 天前
通过Arthas在线诊断K8S中的内存及JVM等使用情况
docker·k8s·arthas
xing-xing5 天前
Docker容器中Nginx站点根目录网页配置访问
nginx·docker
-梅5 天前
linux(8) 软硬链接
linux·运维·服务器
赵文宇(温玉)5 天前
CoreDNS的hosts插件的缺行配置导致k8s集群异常
容器·kubernetes·rancher
guo_wen_qiang5 天前
上传本地镜像到harbor中
docker·容器·持续部署
张洛闻Eren5 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github