Docker 使用及常见问题总结
一、使用
1、docker run -it 命令中的 it 参数是什么含义
在Docker中,-it是两个选项的组合,用于在交互式模式下运行容器。让我解释一下它们的含义:
- -i 或 --interactive:这个选项表示要进入容器的交互式模式。它允许您与容器的标准输入(stdin)进行交互,这样您可以输入命令、与容器中运行的应用程序进行交互等。
- -t 或 --tty:这个选项分配一个伪终端(pseudo-TTY)设备给容器。伪终端允许模拟终端的交互性,使得您可以像在本地终端一样与容器进行交互,例如,使用箭头键、Ctrl+C 来中断进程等。
当您在容器中执行docker run -it命令时,Docker会创建一个交互式的终端会话,使您可以直接与容器内的命令行界面互动。这在需要手动控制容器、调试或执行需要用户输入的任务时非常有用。
小结:-it 的含义是“保持 STDIN 打开状态,并且分配一个虚拟的终端(Terminal)”。您可以简单理解为,我们通过 SSH 登录到了容器内部,在当前终端下运行的所有命令都是基于容器内的。
2、镜像和容器这两个概念
通俗地说,镜像是一个同时包含业务应用和运行环境的“系统安装包”,它需要运行起来之后才能提供服务,运行后镜像的“实例化”称为容器(Container)。你可以对同一个镜像实例化多次,产生多个独立的容器,这些容器拥有不同的容器 ID,不同的容器之间是相互隔离的。
进一步理解,你可以把容器比喻为虚拟机,虚拟机也是,彼此之间的数据和状态都是隔离的,但是要注意容器和虚拟机有本质上的区别,那就是容器和宿主机是共享同一个内核的。
3、Dockerfile COPY 和 ADD 指令有什么区别
COPY 和 ADD 是两个常用于 Dockerfile 中的指令,用于将文件从主机复制到容器中,但它们有一些区别:
(1)COPY 指令:
- COPY 主要用于复制本地主机上的文件或目录到容器中。
- 它的语法通常为 COPY <源路径> <目标路径>,其中源路径可以是本地主机上的文件或目录,目标路径是容器中的目标位置。
- COPY 只进行简单的文件复制操作,不会自动解压缩文件,也不会从 URL 下载文件。
(2)ADD 指令:
- ADD 不仅可以复制本地主机上的文件或目录到容器中,还可以从 URL 下载文件并复制到容器中,并且它会自动解压缩压缩文件(如 tar、gzip、bzip2 等)。
- 它的语法为 ADD <源路径> <目标路径>,和 COPY 类似。
- ADD 功能更强大,但也因此更复杂,如果只需要简单地将本地文件复制到容器中,通常建议使用 COPY。
ADD指令示例:
# 使用ADD从URL下载文件并复制到容器中 ADD https://example.com/file.tar.gz /app/
总的来说,COPY 用于简单的文件复制操作,而 ADD 则具备更多功能,包括文件复制、自动解压缩和从 URL 下载等。在选择使用时,应根据具体需求来决定使用哪个指令。如果只需要进行文件复制操作,推荐使用 COPY,以保持 Dockerfile 的简洁性。
4、Dockerfile CMD 和 ENTRYPOINT 指令有什么区别
详情参见《Dockerfile 中的 CMD 与 ENTRYPOINT》这篇博文。
二、常见问题
1、Error starting daemon: error initializing graphdriver: driver not supported
安装并启动docker服务时, 报了如上的错误。找到了个解决方案:
# rm -rf /var/lib/docker/* # systemctl start docker.service
2、docker push到harbor私库中报unknown blob错误
本地构建好镜像推送到私库,私库配置了域名,并使用https协议进行访问。
执行docker push到harbor私库中时报unknown blob错误。
# docker push xxxx/library/tomcat:latest The push refers to repository [xxx/library/tomcat] e52576dc1f49: Pushing [==================================================>] 3.584kB ffdb94571df7: Pushing [==================================================>] 372.7kB 47fc804728ff: Pushing [> ] 545.3kB/80.14MB dab4e68f20a2: Pushing [==================================================>] 6.144kB 6435966ee18f: Pushing [==================================================>] 4.096kB b1c057a951b8: Waiting df654d36e69e: Waiting 77b174a6a187: Waiting unknown blob
解决方案:
原本nginx harbor域名配置:
proxy_redirect http:// $scheme://;
将上面那行nginx配置命令改成下面这种形式即可解决推送镜像报unknown blob错误问题。
proxy_redirect http:// https://;