掘金 后端 ( ) • 2024-04-27 14:40

前言

做为docker新手,在我们了解了docker的基本使用方式后,实际使用时总会到形形色色的问题,这些问题对于老手非常简单。

但是对于新手,第一次遇到会非常懵,不知道问题出在哪?本篇对一些docker使用中的常见问题进行了汇总,希望能帮到您。

1. docker for desktop启动比较慢、占用内存高怎么办?

docker for desktop是docker官方推出的docker工具,功能比较完备,适合初学者使用;但是它启动非常慢、也很占用资源。我们可以试试orbStack这个工具,它非常轻量,启动也很快,对个人免费。

2. docker build构建镜像过程卡死怎么办?

有时候我们在构建镜像时,会发现构建过程长时间停留在一个地方,且超过正常时间范围,这种情况多半是拉取不到某个基础镜像导致的。 ,可以先尝试手动拉取docker pull下这个镜像试试,多半不行; 考虑换镜像源解决,多半是镜像源的原因;

  • 我们构件镜像时,可以先pull下必须的镜像

    补充一点:如果已经将构建镜像时依赖的镜像拉下来,那么构建时直接使用;如果本地没有,则会去仓库拉取,这种临时拉取的镜像并不会存在于本地,你用docker images是看不到的。

  • 如果您使用orbStack那么它的镜像源配置位置在~/.orbstack/config/docker.json
  • 如果使用默认的镜像源https://hub.docker.com/需要在终端配置下代理
  • 配置完镜像源后使用docker info检查下是否生效了

3. 启动容器后,容器为什么会立即停止?

一般是发生了一些报错导致的。

  • 如果是本地,我们可以直接前台运行容器看看报错信息
  • 如果是线上环境,我们通过docker logs查看日志信息

4. 容器正常运行了,但是本的不能使用容器服务?

需要注意端口映射宿主机端口=>容器服务端口是否配置正确。

5. 项目使用的配置文件如何处理?

  1. 镜像构建过程中可以留一份配置模版文件(当然不留也没有不影响,不过推荐留一份)
  2. 部署时,在宿主机准备好真实使用的配置文件
  3. 在容器启动时通过-v的方式,将宿主机的配置文件挂载到指定路径文件(如果前面留了配置模版文件,则直接替换它)就行。
  4. 如果配置文件比较多都在一个目录下也是可以的,挂载目录就ok。

举例说明: Dockerfile文件

# 假设配置文件都在config目录下,构建时添加到镜像中
COPY config/ ./config

启动docker时

# 假设我宿主机的配置文件在当前路径下的config目录  我容器中的配置文件目录在/root/app/config目录
docker run -v ./config:/root/app/config my_image

# PS:
# 1. 容器中的路径必须写绝对路径
# 2. 宿主机路径如果是当前路径下,前面不能少了 ./
# 3. 无论是挂载目录还是容器都遵循,替换原则(如果不存在则创建——比如如果上面/root/app下没有config则会创建一个)

6. Dockerfile中COPYADD有什么区别?

它们都能复制宿主机文件/目录到镜像中,但是ADD还有其它额外的功能。

  1. ADD可以通过url下载文件复杂到镜像中,比如:ADD https://example.com/myfile.txt /app/myfile.txt
  2. ADD可以自动对压缩文件解压后复制到镜像中,比如:ADD myapp.tar.gz /app/

PS: 如果不存在下载、解压情况推荐使用COPY

7. Dockerfile中CMDENTRYPOINT有什么区别?

它们都能做为容器启动时执行的命令,但是有些区别。

  1. CMD可以被覆盖(docker run带的命令),它充当的的是一个默认启动命令的角色
  2. ENTRYPOINT不能被覆盖,它充当的是一个主命令的角色,定义了就要执行。
  3. CMDENTRYPOINT可以同时使用,此时CMD充当命令的参数,比如:
ENTRYPOINT ["echo"]
CMD ["Hello, World!"]

如果使用了ENTRYPOINT同时docker run启动是又添加了启动命令,添加的命令只作为ENTRYPOINT的参数执行。

8. 如何将docker容器中文件复制到宿主机?

可以使用docker cp命令

# 文件目录都可以
docker cp my_container_name:/path/to/xxx /path/to/on/host/yyy

9. 容器成功启动,如果宿主机不小心关机,如何保证宿主机启动后容器自动启动?

其实docker已经考虑到了这里点,你只需要在启动docker的时候,加上启动策略就行。

  • always 即使你是手动停止的容器,下次重启宿主机它还是会自动启动。
  • unless-stopped 如果是手动停止的容器,则不会自动重启更推荐方式

相同点:

  1. 在宿主机重新启动后,只要docker守护进程启动,就会自动重启容器
  2. 如果容器意外退出,他们都会自动重启容器