以前只是用 docker 跑过 demo,现在想深入了解,至少要自己能搭建开发环境, 几个概念必须掌握。之前在公司碰到过的一个场景就是,有些项目发到生产才出现问题,如果自己本地环境能部署,是不是可以提前能看到问题??
基本概念
镜像(Image)
类似一个只读模板,包含应用程序和运行所需的依赖。比如一个 Nginx 镜像。
容器(Container)
镜像运行时的实例,类似一个轻量虚拟机,但更高效。
Dockerfile
一个脚本文件,用来定义如何构建镜像。包含一系列指令(如 FROM、COPY、RUN、CMD 等),告诉 Docker 如何从基础镜像开始,安装依赖、复制代码、设置运行环境,最终生成一个镜像
Docker Hub
Docker 的公共镜像仓库,可以下载现成的镜像(如 MySQL、Python 等)。
Docker Compose Yaml
以 YAML 格式描述多个服务(可以基于已有镜像或 Dockerfile 构建)、网络、卷(Volumes)等配置,以及它们之间的依赖和连接
Volumes
是一种用于持久化存储数据和管理容器数据的机制。简单来说,它让容器中的数据可以独立于容器的生命周期存在,避免容器删除时数据丢失。常用持久化数据库、保存日志或配置文件、开发时同步代码等场景
匿名卷(Anonymous Volume)
- 由 Docker 自动创建和管理,路径随机生成(如 /var/lib/docker/volumes/xxx)。
- 示例:docker run -v /app/data mysql(挂载到容器mysql /app/data是容器的目录,但主机路径匿名)。
命名卷(Named Volume)
- 用户指定名称,由 Docker 管理,方便复用。
- 示例:docker run -v mydata:/app/data mysql(mydata 是卷名)。
绑定挂载(Bind Mount)
- 直接将主机上的具体路径挂载到容器。
- 示例:docker run -v /home/user/data:/app/data mysql(主机 /home/user/data 映射到容器 mysql,容器目录是/app/data)。
绑定挂载和命名卷的格式好像哇,上面的示例是以命令行的方式使用卷,也可以使用 Docker Compose 的方式运行
# docker-compose.yaml
version: '3'
services:
db:
image: mysql
volumes:
- mydata:/var/lib/mysql
volumes:
mydata:
定义一个 mydata 的命名卷,挂载到容器上面
Bind Mount
普通的命名卷或匿名卷不同,Bind Mount 直接指定主机路径。 下面用运行容器的方式给出示例
绑定挂载
docker run -d -v /home/user/data:/app/data nginx
- /home/user/data(主机路径)挂载到容器 /app/data。
- 如果主机路径不存在,Docker 会创建一个空目录。
- 适用于开发开发、临时数据共享
命名卷
docker run -v mydata:/app/data nginx
- 创建 mydata 卷,挂载到 /app/data 容器下面
- 适用于生产环境、持久化存储(匿名卷也是)
示例
假设你在主机 /home/user/code 有个 HTML 文件,想用 Nginx 容器展示:
docker run -d -p 8080:80 -v /home/user/code:/usr/share/nginx/html nginx
访问 localhost:8080,就能看到主机上的 HTML 文件内容。
改成 docker-compose 的形式
services:
web: # 服务名称,可以随便起,比如 "web"
image: nginx # 使用官方 Nginx 镜像
ports: # 端口映射,等价于 -p
- "8080:80"
volumes: # 卷挂载,等价于 -v
- /home/user/code:/usr/share/nginx/html
安装
我用的 Docker Desktop
此外 Linux (Ubuntu 示例), 我没试过,我一般运行这些命令时,总是没那么快
sudo apt update
sudo apt install -y docker.io
sudo systemctl start docker
sudo systemctl enable docker
# 验证安装
docker --version
常见命令
运行 docker --help ,超多也记不住,只能记住常见的
Docker 常见命令简释
-
run从镜像创建并运行一个新容器。
示例:docker run -d nginx -
exec在运行中的容器内执行命令。
示例:docker exec -it mycontainer bash -
ps列出容器(默认显示运行中的)。
示例:docker ps -
build根据 Dockerfile 构建镜像。
示例:docker build -t myimage .构建一个 tag 为 myimage的镜像 -
compose up根据 docker-compose.yaml 启动服务 示例:docker compose up -build构建镜像,启动容器 -
pull从镜像仓库下载镜像。
示例:docker pull ubuntu -
push将镜像上传到镜像仓库。
示例:docker push myimage -
images列出本地镜像。
示例:docker images -
login登录到镜像仓库。
示例:docker login -
logout从镜像仓库登出。
示例:docker logout -
search在 Docker Hub 搜索镜像。 示例:docker search python -
version显示 Docker 版本信息。 示例:docker version -
info显示 Docker 系统信息(如容器、镜像数量)。 示例:docker info
总算是个有个大概的认识了,实际项目部署肯定会比较复杂,也不是专门的运维,我只希望能解决自己的问题!!!