Docker 原理
Docker 应用的容器化
将项目的所有文件,及其所需的依赖,封装成一个标准化的“镜像”,该镜像可以在任何装备了Docker的机器上运行而屏蔽不同系统的底层实现。
Kubernetes(K8s) 容器的编排与管理
一个项目可能过大,需要有多个容器,K8s负责容器间的交互与管理,而不用手动管理每个容器。
Docker 容器 vs 镜像
| 概念 | 编程类比 | 现实类比 | 特点 |
|---|---|---|---|
| 镜像 (Image) | 类 (Class) | 菜谱盘 | 静态、只读、模板 |
| 容器 (Container) | 对象 (Object) | 按照菜谱做出来的那盘菜 | 动态、可写、实例 |
镜像就像“项目的安装包”或“环境快照”,存储着所有的项目代码。
容器就是“把安装包运行起来后的环境”,可能会崩溃,删除后重新用镜像启动一个容器就行。
安装检查
(本机版本 28.5.1)检查是否安装了 Docker:
docker --version
(需要打开docker Desktop软件)检查 Docker 服务是否运行:
docker ps
运行
docker run hello-world(容器名称)
可以把 docker run 理解为"一键完成"的快捷操作。
当你执行这个命令时,Docker 会:
检查本地:先看你电脑上有没有 hello-world 这个镜像
自动下载:如果没有,就去 Docker Hub 官网自动下载(所以需要有网络)
创建容器:用下载好的镜像创建一个(同名的?)容器
启动容器:立即运行这个容器,输出"Hello from Docker!"等信息
整个过程不需要你提前做任何准备,一个命令就够了。
Docker 也提供了分开操作的命令:
docker create hello-world (创建容器)
docker start 容器ID (启动容器)
docker start -a 容器ID (打印输出)
docker run 就相当于 docker create + docker start
一些基础的简单的镜像 可以是从 Docker Hub 官网自动下载的;
除了从网上下载现成的,大多数情况下,要实现把我的项目打包进镜像->要自定义镜像:
- 写一个 Dockerfile(相当于“制作说明书”)
- 用 docker build 命令,把你的代码、环境、配置打包成一个镜像
一个容器只能基于一个镜像创建。
用户登录(有时需要权限校验)
docker login
核心命令
-
拉取镜像
从Docker Hub下载一个Nginx(网页服务器)镜像
docker pull nginx -
运行容器
用nginx镜像启动一个容器,并把容器的80端口映射到电脑的8080端口
docker run -d --name my-nginx -p 8080:80 nginx
-d:后台运行
--name my-nginx:给容器起个名字
-p 8080:80:把容器里的80端口映射到你电脑的8080端口
验证效果:打开浏览器,访问 (http://localhost:8080),看到Nginx欢迎页就对了! -
查看和管理容器:docker ps
停止容器:docker stop my-nginx
启动已停止的容器:docker start my-nginx
删除容器(需要先停止):docker rm my-nginx
查看容器日志:docker logs my-nginx 查看本地镜像:docker images
删除镜像:docker rmi 镜像名
用Dockerfile打包自己的应用(进阶)
-
创建项目目录
-
创建一个简单的网页
echo "我的第一个Docker应用!" > index.html -
创建一个Dockerfile文件
(使用记事本或任何文本编辑器创建 Dockerfile,修改后缀)
使用Nginx作为基础镜像:
FROM nginx
(或者用 echo 命令创建 Dockerfile)
echo "FROM nginx" > Dockerfile -
复制本地的index.html到容器里Nginx的默认目录:
(使用记事本)
COPY index.html /usr/share/nginx/html/
(或者用 echo 命令编辑 Dockerfile)
echo "COPY index.html /usr/share/nginx/html/" >> Dockerfile -
暴露80端口:
(使用记事本)
EXPOSE 80
(或者用 echo 命令编辑 Dockerfile) echo "EXPOSE 80" >> Dockerfile -
查看文件内容
cat Dockerfile -
构建镜像
docker build -t my-first-docker-app .
-t my-first-docker-app:给镜像起个名字
. :表示用当前目录下的Dockerfile -
运行容器
docker run -d -p 8080:80 --name my-web-container my-first-docker-app
-d:后台运行
-p 8080:80:把容器的80端口映射到本机的8080端口
--name my-web-container:给容器起个名字 -
测试应用 打开浏览器,访问:http://localhost:8080
备注
由于梯子问题,docker desktop登录失败,今天无法完整地跑通整个流程。