什么是 Docker?
Docker 是一个使用 Golang 编写的开源的应用容器引擎,Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
更多信息详见:runoob
说人话就是一个容器引擎,可以管理不同的容器(且容器之间不会相互影响)
为什么要使用 Docker?
Docker 可以轻松提供一个容器环境,可以使用这个环境进行程序部署、交叉编译等… 对于不同的系统,Docker 相当于一个轻量级的虚拟机。可以实现构建环境一致而不必使用 Vmware 这种连硬件都模拟的重量级虚拟机。 不仅节约系统资源,而且性能足够。Docker 可以说是一个黑科技,百无一害。
举个例子:现在你弄好了一个 Nginx 服务器,想把它给你的朋友。但是你的朋友操作系统、架构都和你的不同。这个时候就可以让朋友使用 Docker 导入你这里的镜像(或者使用 Dockerfile)
1.如何安装 Docker?
Docker 在不同操作系统有不同安装方法,这里我们只讨论 Linux (Ubuntu) 与 Windows。
在 Ubuntu 上安装 Docker
对于 Ubuntu,你可以使用官方提供的安装方法进行安装:
- 设置 Docker 的 Apt 存储库
# 添加 Docker 的官方 GPG 密钥sudo apt-get updatesudo apt-get install ca-certificates curlsudo install -m 0755 -d /etc/apt/keyringssudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.ascsudo chmod a+r /etc/apt/keyrings/docker.asc
# 添加仓库到 Apt 源echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/nullsudo apt-get update- 安装 Docker 的软件包
sudo -s # 将自身提权为超级用户apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin如果当前方法不行,可以使用 docker.io 完成一键安装:
apt updateapt install docker.io在 Windows 上安装 Docker
对于 Windows,Docker 可以选择使用 WSL2 或者 HyperV (不推荐)进行安装。
由于 Docker 并不推荐 HyperV 安装,我们这里就使用 WSL2 进行安装即可。
- 启用 WSL2
WSL2 默认可能没有启用,我们需要先启动它。
打开 PowerShell,输入:
OptionalFeatures就可以打开 启用或关闭 Windows 功能 弹窗。这里我们往下拉,找到 适用于 Linux 的 Windows 子系统,勾选上确定并重启系统。
重启完成后我们需要更新下 WSL2,这是因为对于某些系统这里安装的是 WSL1,需要更新为 WSL2。
再次打开 PowerShell,输入:
wsl --update --web-download这里的 --web-download 主要是因为 WSL 默认使用 Windows 自带的商店进行下载(这个是真的很慢),所以这里就是让它使用远程更新。
更新完成后重启系统。接下来要安装 Docker。
点击 这里 打开 Docker Desktop 网页,选择你 Windows 当前的架构,进行安装。
这里安装选项有一个是 Use WSL 2 instead of Hyper-V (recommended),将它勾选上。
安装完成后需要登录账号,这里可以选择跳过。保持 Docker 在后台运行。
测试 Docker 是否正常运行
接下来我们验证下 Docker 是否成功安装。我们可以用 Docker 的 hello-world 程序进行测试:
docker run hello-world如果没有什么异常输出,那么我们已经成功安装 Docker 了。
Docker 的基本使用
接下来就是学习使用 Docker 了。Docker 的命令虽然多,但是有很多是不常用的,我们就学习这些常用的命令即可。
在学习之前,我们需要了解下什么是镜像?什么是容器?
镜像,可以被类比为面向对象中的 类,也就是 Class。它提供了一个模板。比如一个 Person 类中规定了我作为人应该有什么特征,有什么行为。
容器,可以被类比为面向对象中实例化的一个类的 实例。我属于这个 类,但是我有我自己特殊的属性。比如实例化的 Person 中我的年龄是 28,另外一个是 29 这样。
这就是镜像与容器的区别。镜像是一个模板,容器是从模板出来的独立个体。
- 如何获取镜像?
获取镜像有两种方法:一种是
自己做一个(使用 Dockerfile),另一种是从别人做好的去拿。
对于第一种:自己做一个。
先创建一个 Dockerfile 文件,我们使用 FROM 来指定基于的镜像。
例如:FROM ubuntu,就是基于 ubuntu 镜像去完成制作。
然后我们可以使用 RUN 来执行命令。例如:RUN sudo apt update。
如果要构建镜像,我们可以使用 docker build 完成。
例如:$ docker build -t nginx:v3 .,就是在当前目录构建镜像,新镜像为 nginx:v3。
更多命令详见:Docker Dockerfile
对于第二种:从别人做好的去拿。
可以使用 docker pull 命令完成这件事,我们只需要提供一个需要的镜像即可。
docker pull [可选参数] 镜像名称[:标签|@SHA256 摘要]常用选项:
- —all-tags, -a: 下载指定镜像的所有标签。
- —disable-content-trust: 跳过镜像签名验证。
拉取镜像会很吃网络,尽量挂梯子(当然换源也可以) 拉取完毕后,就可以学习如何创建一个容器了。
- 如何创建并启动容器?
我们可以使用 docker run 创建并启动一个新容器。
docker run [可选参数] 镜像 [命令] [命令参数...]常用参数:
- -d: 后台运行容器并返回容器 ID。
- -it: 交互式运行容器,分配一个伪终端。
- —name: 给容器指定一个名称。
- -p: 端口映射,格式为 host_port
。 - -v: 挂载卷,格式为 host_dir
。 - —rm: 容器停止后自动删除容器。
- —env 或 -e: 设置环境变量。
- —network: 指定容器的网络模式。
- —restart: 容器的重启策略(如 no、on-failure、always、unless-stopped)。
- -u: 指定用户。
一般我们使用 ubuntu 这种系统镜像,可选参数为 -it 就可以。解释一下就是允许标准输入,并启动一个终端环境来操作容器。命令参数在这里一般是 /bin/bash,当然如果要直接运行某个程序那就输入那个程序路径。
对于端口映射。比如使用 Nginx 的时候,可以通过 docker run -p 8080:80 nginx 将主机的 8080 端口映射到容器的 80 端口。
还有挂载卷,这也是个很常用的功能。可以通过它实现文件的直接交互。而不需要 docker cp 复制文件。可以通过 docker run -v /host/data:/container/data ubuntu,就是将主机的 /host/data 挂载到容器的 /container/data 目录。
--network 参数就是使用主机网络配置。例如主机配置了系统代理那么容器也会使用同样配置。
- 如何启动/停止容器
容器是可以被主动启动/停止的。有时候我们需要停止容器释放资源,或者重启启动一个已经运行完毕的容器。可以使用 docker start 与 docker stop 命令完成这件事。
启动一个容器:
docker start [可选参数] 容器 [其他容器...]常用参数:
- -a: 附加到容器的标准输入输出流。
- -i: 附加并保持标准输入打开。
一般要启动一个容器,直接 docker start 容器 就可以了。
停止一个容器:
docker stop [可选参数] 容器 [其他容器...]常用参数:
- -t, —time: 停止容器之前等待的秒数,默认是 10 秒。
一般要停止一个容器,直接 docker stop 容器 就可以了。
重新启动一个容器:
docker restart [可选参数] 容器 [其他容器...]常用参数:
- -t, —time: 停止容器之前等待的秒数,默认是 10 秒。
- 如何对运行中的容器执行一个新的命令?
我们可以使用 docker exec 对运行中的容器执行新命令:
docker exec [可选参数] 容器 命令 [命令参数...]常用参数:
- -d, —detach: 在后台运行命令。
- —detach-keys: 覆盖分离容器的键序列。
- -e, —env: 设置环境变量。
- —env-file: 从文件中读取环境变量。
- -i, —interactive: 保持标准输入打开。
- —privileged: 给这个命令额外的权限。
- —user, -u: 以指定用户的身份运行命令。
- —workdir, -w: 指定命令的工作目录。
- -t, —tty: 分配一个伪终端。
一般我们使用 ubuntu 这种系统镜像,可选参数为 -it 就可以。解释一下就是允许标准输入,并启动一个终端环境来操作容器。命令参数在这里一般是 /bin/bash,当然如果要直接运行某个程序那就输入那个程序路径。
如果要直接列出容器中某个目录,也可以不进入伪终端。例如:docker exec my_container ls /app。就是列出 my_container 中 /app 目录下的文件和文件夹。
--privileged 参数在某些情况下也会使用。通过 --privileged=true 后,我们可以做很多平时不能做的事情:例如加载内核模块、直接操作硬件设备等。没有特殊需求不建议使用这个参数,因为不安全。
- 如何查看存在的镜像?
我们可以使用 docker images 查看已存在的镜像。
docker images [可选参数] [仓库[:标签]]常用参数:
- -a, —all: 显示所有镜像(包括中间层镜像)。
- —digests: 显示镜像的摘要信息。
- -f, —filter: 过滤输出,基于提供的条件。
- —format: 使用 Go 模板格式化输出。
- —no-trunc: 显示完整的镜像 ID。
- -q, —quiet: 只显示镜像 ID。
一般查看所有镜像,直接 docker images 就可以了。
- 如何查看存在的容器?
我们可以使用 docker ps 查看已存在的容器。
docker ps [可选参数]常用参数:
- -a, —all: 显示所有容器,包括停止的容器。
- -q, —quiet: 只显示容器 ID。
- -l, —latest: 显示最近创建的一个容器,包括所有状态。
- -n: 显示最近创建的 n 个容器,包括所有状态。
- —no-trunc: 不截断输出。
- -s, —size: 显示容器的大小。
- —filter, -f: 根据条件过滤显示的容器。
- —format: 格式化输出。
一般我们都是使用 docker ps -a 来查看容器。因为容器在停止后使用 docker ps 是不显示的,因此我们这里使用 -a 列出所有。
- 如何删除镜像/容器?
有时候我们想要清理那些不需要的资源,就可以选择删除 镜像/容器 来节省空间。我们可以使用 docker rmi 来删除镜像:
docker rmi [可选参数] 镜像 [其他镜像...]常用参数:
- -a, —all-tags: 指定仓库名称时,删除该仓库下的所有镜像。
- -f, —force: 强制删除镜像,即使该镜像被容器使用。
- —help: 打印帮助信息并退出。
- —no-prune: 不删除悬空的父镜像。
- -q, —quiet: 安静模式,不显示删除镜像的详细信息。
一般直接使用 docker rmi 镜像 就可以了。
我们可以使用 docker rm 来删除容器:
docker rm [可选参数] 容器 [其他容器...]常用参数:
- -f, —force: 强制删除正在运行的容器(使用 SIGKILL 信号)。
- -l, —link: 删除指定的连接,而不是容器本身。
- -v, —volumes: 删除容器挂载的卷。
一般删除容器之前都是先 docker stop 这个容器才能删除。当然加上 -f 可以强制删除。
- 重命名容器
有时候我们需要重命名一个容器,这个三时候就可以使用 docker rename 实现:
docker rename <当前容器名称或ID> <新容器名称>- 在主机和容器间传输文件。
有时候我们需要向容器上传文件,或者从容器里下载文件。这个时候使用 docker cp 即可完成这件事。
# 上传文件到容器docker cp [可选参数] 原路径 容器:目标路径
# 从容器下载文件docker cp [可选参数] 容器:原路径 目标路径docker cp 也是经常使用的命令,需要熟练掌握。
- 导入/导出镜像
有时候我们需要将镜像变成一个文件并保存。我们就可以使用 docker save 将镜像保存为一个 .tar 文件。
docker save [可选参数] 镜像 [其他镜像...]常用参数:
- -o, —output: 指定输出文件的路径。
一般我们直接使用 docker save -o 文件路径 就可以了。
我们也可以使用 docker load 将这个 .tar 文件加载为一个镜像:
docker load [可选参数]常用参数:
- -i, —input: 指定输入文件的路径。
- -q, —quiet: 安静模式,减少输出信息。
一般我们直接使用 docker load -i 文件路径 就可以了。