Docker 容器
前言:
Docker 是一个开源的容器化平台,旨在简化应用程序的部署、管理和扩展。它通过将应用程序及其依赖项打包成一个独立的容器来实现这一点,这些容器可以在不同的环境中无缝运行。Docker 的核心概念和优势如下:
-
容器化:Docker 使用容器(Container)技术,将应用程序及其所需的所有依赖(如库、配置文件等)打包在一起。与虚拟机相比,容器更轻量,启动更快,并且多个容器可以共享同一个操作系统内核,从而提高资源利用率。
-
镜像(Image):Docker 镜像是一个只读模板,包含了应用程序和运行时环境。镜像可以从头开始创建,也可以基于现有的镜像进行修改。镜像是容器的基础,容器则是镜像的实例。
-
容器(Container):容器是镜像的运行实例。它包括运行应用程序所需的所有内容,但在隔离的环境中运行,这样可以确保一致的运行环境。
-
Docker Hub:这是一个云端的公共注册表,用于存储和分发 Docker 镜像。开发者可以将自己的镜像推送到 Docker Hub,也可以从中拉取他人已经构建好的镜像。
-
跨平台性:Docker 容器可以在任何支持 Docker 的平台上运行,确保了开发、测试和生产环境的一致性,从而减少了 "在我的机器上可以运行" 这一类问题。
-
轻量化:与传统的虚拟化技术相比,Docker 不需要额外的操作系统开销,因此占用的资源更少,可以在同一台物理机上运行更多的容器。
通过这些功能,Docker 已经成为 DevOps 流程中不可或缺的工具,极大地提高了软件开发的效率和灵活性。
举个切身的例子:
假如我们需要部署一个 node 服务,选用的是16版本,只要服务器安装了该版本的 nodejs,我们业务代码就能顺利跑起来;但是哪天其他项目组也要在 这台服务器 上部署 node 服务,但是使用的版本是18版本,问题就出现了,一个服务器总不能安装 两个版本 的node吧,所以容器化的作用就体现出来了。
配置环境
- 安装可视化工具
docker,需要根据自己的macos版本,选择对应的 docker版本;笔者是 macos 11.2.2, 用的docker 4.24.0;
- 通过homebrew安装命令行工具
brew install docker
实践
下面我们在 docker 内 通过 nginx 做文件代理,作为静态文件服务。
- 第1步,我们需要在安装
nginx镜像
或者通过命令安装
# 搜索nginx镜像
docker search nginx
# 拉取镜像
docker pull nginx
- 第2步,启动镜像
Volumn 是将宿主某个目录挂到容器,Port 是将宿主的端口映射到容器内对应的端口
镜像跑起来就生成了一个 Container(容器)
部署代理服务
- 安装nginx镜像
docker pull nginx
- 在本地创建文件夹
docker run --name some-nginx -v -d nginx
docker images
docker logs <container_id>
docker run 来跑镜像,-v 指定挂载的数据卷,后面的 :ro 代表 readonly,也就是容器内这个目录只读,:rw 标识容器可以读写这个目录
docker 常用命令
镜像
# 搜索镜像
docker search nginx
# 安装镜像
docker pull nginx
数据卷
容器
# 列出运行中的容器
docker ps
# 列出所有容器
docker ps -a
# 暂停容器
docker stop <container_id>
# 移除容器
docker rm <container_id>
实践
- 构建镜像
docker build [OPTIONS] PATH | URL | -
选项
- -t, --tag: 为构建的镜像指定名称和标签
- -f, --file: 指定 Dockerfile 的路径(模式是 PATH 下的 Dockerfile)
docker build -t myimage:latest .
启动容器
docker run --name <container_name> -p <host_port>:<container_port> -v /Users/caiyong/Desktop/tmp/aaa:/usr/share/nginx/html:ro -d nginx:latest
docker run 会返回一个容器的 hash
--name 指定容器名称 -d -p 指定端口 宿主端口:容器端口 -v 指定挂载的数据卷 <宿主机目录>:/<容器>,目录 /usr/share/nginx/html 通常用作 Nginx 的默认文档根目录。当请求服务器的 IP 地址或域名时,Nginx 会从这个目录中提供静态文件。 :ro 只读 :rw 读写
dockerfile
docker 容器是一个独立的系统环境
- WORKDIR 指定当前工作目录
- COPY 将本地文件夹的内容复制到镜像中的指定路径
- EXPOSE:声明当前容器要访问的网络端口,比如这里起服务会用到 8080
- CMD:容器启动的时候执行的命令