1. Docker 简介
Docker 是一个开源的容器化平台,它使应用程序的创建、部署和运行更加轻松。Docker 通过将应用及其依赖项打包到一个容器中,保证在任何环境下都能一致地运行。
1.1 Docker 的演变史
2013年发布:Docker 由 Solomon Hykes 创建,最初作为一个内部项目,用于简化应用的部署。
2014年 Docker Hub 发布:Docker Hub 是一个在线存储和分享 Docker 镜像的仓库,使得共享应用变得更加简单。
2017年 Docker 企业版:支持大规模的容器管理,为企业提供更强的安全性和管理功能。
现在:Docker 已经成为 DevOps 和微服务架构中不可或缺的工具,并与 Kubernetes 等容器编排工具紧密结合。
1.2 Docker 和虚拟机的区别
总结:Docker 通过共享操作系统内核,实现了更轻量和快速的应用隔离,更适合现代的微服务架构。
2. Docker 基本操作详解
2.1 Docker 镜像(Image)操作
拉取镜像:
docker pull nginx:latest从 Docker Hub 上下载指定版本的镜像。
构建镜像:
docker build -t myapp:1.0 .从当前目录中的
Dockerfile构建镜像,并命名为myapp:1.0。查看本地镜像:
docker images列出本地所有的镜像。
删除镜像:
docker rmi myapp:1.0删除指定的镜像。
2.2 Docker 容器(Container)操作
启动容器:
docker run -d --name mynginx -p 8080:80 nginx启动一个名为
mynginx的容器,并将宿主机的8080端口映射到容器的80端口。查看运行中的容器:
docker ps列出所有运行中的容器。
停止容器:
docker stop mynginx停止名为
mynginx的容器。删除容器:
docker rm mynginx删除一个停止的容器。
3. Dockerfile 详解及示例
Dockerfile 是用来定义如何构建镜像的文件。以下是一些常用指令和示例:
FROM:指定基础镜像FROM node:18使用官方的 Node.js 18 版本作为基础。
COPY:复制文件到镜像COPY . /app将当前目录的所有文件复制到镜像的
/app目录。RUN:运行命令RUN npm install在构建镜像时安装依赖。
EXPOSE:声明容器运行时监听的端口EXPOSE 3000CMD:指定容器启动时执行的命令CMD ["node", "app.js"]
Dockerfile 编写策略:
尽量使用官方基础镜像,减少安全风险。
将频繁变动的内容(如代码)放到
COPY的后面,以减少构建缓存失效的次数。使用
.dockerignore文件,排除不需要的文件(如node_modules)。
4. 常用场景和操作技巧
4.1 查看 Docker 磁盘占用
查看容器、镜像、卷等的磁盘占用:
docker system df列出镜像、容器、数据卷的磁盘占用情况。
清理无用数据:
docker system prune删除所有未使用的容器、镜像和网络。
4.2 应用限制与资源管理
限制容器的 CPU 使用:
docker run -d --name myapp --cpus="1.5" myapp:latest将
myapp容器的 CPU 使用限制为最多 1.5 个核心。限制容器的内存使用:
docker run -d --name myapp --memory="512m" myapp:latest限制容器的内存使用为 512MB。
4.3 日志查看与过滤
查看容器日志:
docker logs myapp实时查看容器日志:
docker logs -f myapp按时间过滤日志:
docker logs --since 1h myapp查看最近 1 小时内的日志。
4.4 挂载数据卷(Volume)
数据卷用于在容器和宿主机之间共享数据,并保证数据持久化。
创建数据卷:
docker volume create mydata挂载数据卷到容器:
docker run -d -v mydata:/app/data myapp将
mydata挂载到容器内的/app/data目录。查看所有数据卷:
docker volume ls删除未使用的数据卷:
docker volume prune
5. 实战场景及优化建议
5.1 本地开发环境使用 Docker
使用
docker-compose管理多个容器(如数据库、应用服务):version: '3' services: web: image: myapp ports: - "8080:80" volumes: - ./app:/app db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: example优点:使用
docker-compose可以轻松地定义和管理多容器应用,适合本地开发和测试。
5.2 部署到生产环境
使用
docker swarm或Kubernetes进行容器编排,管理大规模容器集群。将应用日志输出到集中式日志系统(如
ELK),方便日志的集中管理与分析。设置健康检查(
HEALTHCHECK),确保容器在运行时自动恢复异常。
5.3 常见问题及解决方法
容器磁盘空间不足:定期使用
docker system prune清理未使用的容器、镜像和数据卷。容器网络问题:使用
docker network创建自定义网络,隔离不同应用的网络环境。镜像体积过大:通过精简
Dockerfile指令、合并RUN命令、使用多阶段构建来减少镜像大小。
总结
Docker 通过简单易用的命令和强大的容器化技术,让应用的开发和部署变得更加高效。
无论是构建镜像、管理容器,还是优化资源,Docker 都能帮助开发者提升生产力。
