docker可以帮助你跨平台运行程序。这些程序是带着环境一起打包好的,所以无需担心兼容性问题,非常方便。

三大基本概念

  • image 是未实例化的环境和软件的打包。
  • container是image的实例化,一个image可以有多个实例。
  • volume是container的数据挂载在电脑上的位置,初始为默认位置,可以映射到自己想要的位置。如果不删除该数据,那么删除并重新实例化container后数据还在。

在macos上的运行

  • 在 macOS 上,默认情况下,Docker 在本地运行时会在内部启动一个轻量级的 Linux 虚拟机(称为 Docker Desktop),并在其中运行容器。这是因为 macOS 和 Linux 之间有一些核心操作系统的差异,所以 Docker 使用虚拟化技术来在 macOS 上运行 Linux 容器。

    因此, /var/lib/docker 目录实际上位于 Docker Desktop 虚拟机内部,而不是直接在 macOS 主机上。无法直接访问虚拟机内部的文件系统。这也意味着,对于 macOS 上运行的 Docker 容器来说,数据存储在 Docker Desktop 虚拟机中,并不是直接在 macOS 主机上的文件系统中。这样确实提供了一定的安全性,因为容器的数据对于 macOS 主机来说更难以直接访问。

  • 想要在宿主上访问容器,要做端口映射,也就是在run container的时候输入参数 -p port:port,来分别指定宿主机的端口和容器上的端口。然后在宿主机用 localhost:port 来访问。

  • 如果想要在容器之间互相访问,那么只需要知道两个软件的内部ip,然后用ip来访问:

    1
    docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql-slave
  • 如果用docker network建立容器之间的网络,那么就可以用别名而不是ip来互相访问。

  • 有些容器里很多命令失效,显示command not found,是因为很多软件都没装