ming's blog
Docker笔记

Docker笔记

检索docker容器IP

# 为了回避前端vue页面渲染标记,请自行将 [[ 替换为 {{,反之同理
docker inspect -f '[[range .NetworkSettings.Networks]][[.IPAddress]][[end]]' [CONTAINER ID]

docker可视化管理容器

使用portainer-ce,ce通常是指官方维护的非商业版

docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /Users/xuan/portainer_data:/data portainer/portainer-ce

docker挂载卷的总结和避坑

docker 有几种方式都可以挂载卷,实现与宿主机共享文件。但是我在网上搜索了很久也没有遇到讲解关于在dockerfile中使用volume实现docker run -v那种自定义挂载文件夹的方式,找了很长时间才找到问题所在。

正常使用挂载,假设我想将桌面的demo文件夹挂载到ubuntu中的share文件夹,我可以这么写docker run -v /Desktop/demo:/share ubuntu。但是这样在dockerfile中是不允许的,dockerfile文件的目的是为了编撰镜像属性,而不是交互属性。交互属性应该是在镜像构建为容器时定义的。所以如果有交互方面的需求可以使用docker compose去实现。

实际上容器内部的文件夹有三种情况:

  1. 没有指定VOLUME,也没有指定-v,这种是普通文件夹

  2. 指定了VOLUME,ENTRYPOINT没有指定-v,这种文件夹可以在不同容器之间共享,但是无法在本地修改

  3. 指定了-v的文件夹,这种文件夹可以在不同容器之间共享,且可以在本地修改

dockerfile中 ENTRYPOINT 和 CMD 的区别

# dockerfile中写
CMD echo "hello world"

# 运行容器时
docker run -it xxx /bin/bash

# 会直接打开交互命令行,CMD内容被直接忽略
# dockerfile中写
ENTRYPOINT echo "hello world"

# 运行容器时
docker run -it xxx /bin/bash

# 会直接忽略/bin/bash,输出hello world
# 只有在运行容器指令后加--entrypoint,才能覆盖dockerfile中的定义

通常建议使用的方式是,CMD和ENTRYPOINT结合使用,并使用Exec格式编写,用CMD为ENTRYPOINT添加参数。