Docker是一个开源的容器化平台,它允许开发者将应用程序及其依赖项打包成独立的、可移植的容器,从而简化了应用程序的部署、管理和扩展过程。这些容器可以在任何支持Docker的平台上运行,确保了应用的一致性和可移植性。
Docker的三个核心组件:镜像(Image)、容器(Container)、仓库(Repository)
sudo apt update
sudo apt upgrade
sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get install ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt install software-properties-common
sudo add-apt-repository "deb [arch=$(dpkg --print-architecture)] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get install docker-ce docker-ce-cli containerd.io
镜像是通过Dockerfile来创建的,Dockerfile是一个文本文件,其中包含了创建镜像所需的一系列指令和配置。开发者在Dockerfile中定义应用程序的依赖项、运行环境以及构建步骤。Dockerfile的名称是固定的,通常放到项目的根目录下。
Dockerfile 举例:
FROM ubuntu:latest # 基于最新版本的 Ubuntu 镜像构建基础镜像
RUN apt-get update && apt-get install -y g++ # 更新包列表并安装 g++ 编译器
WORKDIR /cpp_test # 设置工作目录为 /cpp_test。工作目录是在容器内执行命令时的默认目录
COPY a.cpp . # 将宿主机当前路径下的 a.cpp 文件复制到镜像的工作目录 /cpp_test 中
RUN g++ a.cpp -o a.out # 在工作目录 /cpp_test 中编译 a.cpp,生成可执行文件 a.out
COPY b.cpp . # 将宿主机当前路径下的 b.cpp 文件复制到镜像的工作目录 /cpp_test 中
RUN g++ b.cpp -o b.out # 在工作目录 /cpp_test 中编译 b.cpp,生成可执行文件 b.out
Layer Caching 基本原理
构建Docker镜像。最后的 . 代表Dockerfile的相对路径。
sudo docker build -t 'image_name' .
sudo docker build --progress=plain -t 'image_name' .
--progress=plain 选项是在build过程中查看Cache的命中情况,下图是基于上述脚本,在修改a.cpp文件后重新build的示例:

sudo docker images list
sudo docker rmi [IMAGEID]
启动容器
docker run [OPTIONS] image_name
OPTIONS:
-d, --detach : 在后台运行容器并打印容器ID。-p XXX:YYY, --publish :将宿主机端口(XXX)映射到容器的端口(YYY)。-v Host_dir:Container_dir, --volume :挂载宿主机目录或卷到容器。如果容器内该目录已存在文件或子目录,它们会被宿主机目录中的内容所覆盖,并保持实时同步映射。--name:为容器指定一个名称。查看docker运行的容器
sudo docker ps
sudo docker stop [CONTAINER_ID]
docker rm 命令只能删除已停止的容器。如果你尝试删除一个正在运行的容器,Docker会返回一个错误。一旦容器被删除,它的所有状态、文件系统更改和网络命名空间等信息都将被永久删除,并且无法恢复。sudo docker rm [CONTAINER_ID]