简介:本文是一篇Docker从零入门指南,详细解析镜像、容器与仓库的核心概念与操作,帮助开发者快速掌握Docker的部署与应用,提升开发效率。
在传统开发环境中,开发者常面临“本地运行正常,上线后崩溃”的困境。这种差异源于环境配置的不一致:操作系统版本、依赖库版本、文件路径甚至网络配置都可能成为隐患。Docker通过容器化技术将应用及其依赖环境打包为独立的“集装箱”,确保在任何主机上运行结果一致。
例如,一个Python应用依赖NumPy 1.20.0,而服务器默认安装的是1.22.0,传统方式需手动降级,而Docker只需在镜像中固定版本即可。这种隔离性不仅解决了环境问题,还大幅提升了资源利用率——一台主机可同时运行多个独立容器,互不干扰。
镜像是一个只读的模板,包含运行应用所需的一切:代码、运行时、系统工具、库和配置文件。例如,一个Nginx镜像可能包含:
操作示例:
# 拉取官方Nginx镜像docker pull nginx:latest# 查看本地镜像列表docker images
关键特性:
容器是镜像的运行实例,相当于从镜像“启动”的一个独立进程。每个容器拥有独立的命名空间、文件系统和网络栈,但共享主机内核。
操作示例:
# 基于Nginx镜像启动容器docker run -d --name my-nginx -p 80:80 nginx# 进入容器内部docker exec -it my-nginx bash# 查看运行中的容器docker ps
关键特性:
仓库是集中存储和分发镜像的服务,类似代码的Git仓库。Docker Hub是官方公共仓库,也可自建私有仓库(如Harbor)。
操作示例:
# 登录Docker Hubdocker login# 标记本地镜像为Docker Hub格式docker tag my-app:v1 username/my-app:v1# 推送镜像到仓库docker push username/my-app:v1
关键场景:
v1.0、latest)管理不同版本。以Ubuntu为例:
# 卸载旧版本(如有)sudo apt-get remove docker docker-engine docker.io# 安装依赖sudo apt-get updatesudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common# 添加Docker官方GPG密钥curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -# 添加稳定版仓库sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"# 安装Dockersudo apt-get updatesudo apt-get install docker-ce docker-ce-cli containerd.io# 验证安装sudo docker run hello-world
通过Dockerfile定义镜像构建步骤:
# 使用官方Python基础镜像FROM python:3.9-slim# 设置工作目录WORKDIR /app# 复制依赖文件并安装COPY requirements.txt .RUN pip install --no-cache-dir -r requirements.txt# 复制应用代码COPY . .# 暴露端口EXPOSE 8000# 启动命令CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app:app"]
构建镜像:
docker build -t my-python-app:v1 .
基础运行:
docker run -d --name my-app -p 8000:8000 my-python-app:v1
常用参数:
-d:后台运行-p:端口映射(主机端口:容器端口)-v:挂载主机目录到容器(如-v /data:/app/data)--restart:设置重启策略(如--restart unless-stopped)日志与调试:
# 查看容器日志docker logs -f my-app# 停止并删除容器docker stop my-appdocker rm my-app
# 登录私有仓库(如Harbor)docker login harbor.example.com# 标记镜像docker tag my-python-app:v1 harbor.example.com/library/my-python-app:v1# 推送镜像docker push harbor.example.com/library/my-python-app:v1
减少镜像体积,例如编译Go应用:
# 第一阶段:编译FROM golang:1.18 AS builderWORKDIR /appCOPY . .RUN go build -o myapp# 第二阶段:运行FROM alpine:latestWORKDIR /appCOPY --from=builder /app/myapp .CMD ["./myapp"]
.dockerignore排除无关文件(如__pycache__、.git),加速构建:
.git__pycache__*.log
防止容器占用过多资源:
docker run -d --name my-app \--memory="512m" \--cpus="1.5" \my-python-app:v1
端口冲突:
错误:Bind for 0.0.0.0:80 failed: port is already allocated
解决:修改-p参数或停止占用端口的容器。
权限问题:
错误:Permission denied when accessing host files
解决:在-v挂载时添加--privileged或调整文件权限。
镜像拉取慢:
解决:配置国内镜像源(如阿里云、腾讯云),修改/etc/docker/daemon.json:
{"registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"]}
重启Docker服务:sudo systemctl restart docker
Docker通过镜像、容器与仓库的组合,彻底改变了应用的部署方式。从开发到生产,开发者可以专注于代码本身,而无需担心环境差异。未来,随着Kubernetes等编排工具的普及,Docker将进一步与云原生生态融合,成为微服务架构的基石。
行动建议:
hello-world验证环境。 通过本文的指引,您已具备从零开始使用Docker的核心能力。接下来,实践是深化理解的唯一途径——从一个小型应用开始,逐步构建您的容器化帝国!