- Docker
- mac 安装 -> https://www.docker.com
- Container 容器
- 运行代码的隔离环境,是被隔离的进程
- 文件系统被隔离
- 网络被隔离
- 进程空间被限制
- 资源被限制
- 共享宿主机内核
- 启动速度≈启动一个进程(速度快)
- 是镜像的运行实例
- 包含内容
- 主进程
- 可写层
- 网络接口
- 挂载点
- 容器应该是单一职责进程
- 打开端口
- 运行代码的隔离环境,是被隔离的进程
- NetWork 网络
- Docker 默认创建虚拟网络
- 容器间可以用容器名互相访问,Docker 自动做服务发现
- Volumn 持久化数据
- volumnes (数据卷)
- 是本地文件系统的一个由 docker 管理的位置
- 可以在容器被删除后仍然保留数据
- 容器的默认文件系统是临时、可销毁的,删除容器 = 数据丢失
- 容器内路径 <-> 宿主机目录
- 数据库容器一定要用 volumn
- volumnes (数据卷)
- Image 镜像
- 不是压缩包,是只读的文件系统模板
- 包含内容
- 程序
- 依赖
- 运行环境
- 配置
- 是程序快照
- 容器从镜像中创建出来
- 实验
- 拉取并运行第一个容器
- docker run hello-world
- docker 自动执行步骤
- 拉镜像
- 创建容器
- 运行程序
- 退出容器
- docker run hello-world
- 运行一个长期存活的容器
- docker run -it ubuntu bash
- 进入容器 shell
- 执行 ps aux
- 仅仅只有两个进程,说明不是完整的 linux 系统
- exit 退出
- 容器的主进程就是 bash, bash 退出,容器就结束
- 容器的生命周期 = 主进程生命周期
- docker run -it ubuntu bash
- 观察容器生命周期
- created -> running -> stopped -> removed
- docker run -d nginx (后台启动 Nginx)
- 查看容器
- 停止容器
- docker stop <container_id>
- 容器仍然存在,只是 stopped
- 删除容器
- docker rm <container_id>
- 删除容器 vs 删除镜像
- 查看镜像
- 删除镜像
- docker rmi nginx
- 查看镜像
- 容器数据丢失实验
- docker run -it ubuntu bash
- echo “hello” > test.txt
- exit
- 重新进入 docker run -it ubuntu bash
- 文件消失,因为文件系统是临时层,删除容器后,数据就没了
- 使用 volume 持久化数据
- docker run -it -v mydata:/data ubuntu bash
- mydata 是 docker 管理的数据卷,数据存在容器外,容器销毁也不影响
- 容器间通信
- 创建网络 docker network create mynet
- 运行数据库 docker run -d –name db –network mynet nginx
- 运行另外一个容器 docker run -it –network mynet ubuntu bash
- 访问 nginx
- apt update
- apt install curl
- curl db
- dockerfile 部署项目
- 创建项目
- 写一个 Dockerfile
- FROM 指定基础镜像,alpine=极小体积 Linux
- WORKDIR /app 相当于 cd /app,后续所有操作都在这个目录,容器内工作目录标准写法
- COPY 把当前目录复制进镜像,左边宿主机,右边容器
- 打包的是代码 + 文件
- EXPOSE 声明端口,但是不开放,真正开放端口在 docker run
- CMD 容器启动时执行的命令,容器只运行这个进程
- 构建镜像
- docker build -t my-app .
- 查看镜像
- 运行容器
- docker run -p 3000:3000 my-app
- 镜像分层
- Docker 每一行 Dockerfile 都生成一个 layer
- 如果 RUN npm install 代码没变,Docker 会复用缓存
- 优化写法
- .dockerignore
- 可以不把无关文件复制进镜像
- 停止并删除容器
- 容器是消耗品,应该删了重建,才是 Docker 的正确用法
- 创建项目
- multi-stage build
- 目标
- 让最终镜像只包含运行所需内容
- 不带编译工具、源码、构建缓存、开发垃圾
- 定义
- 在一个 Dockerfile 里面使用多个 FROM 阶段
- 前面阶段用来构建,最后阶段只保留运行产物
- 拆解
- builder 阶段,专门用来编译、构建、打包
- COPY –from 从 builder 阶段复制文件,只会复制构建产物
- runtime 阶段,最终镜像只包含 dist 运行文件 + node runtime
- 目标
- 拉取并运行第一个容器
- 国内镜像配置