Docker 入门手册
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(容器) | 虚拟机(VM) |
---|---|---|
启动速度 | 几秒钟启动一个容器 | 通常需要几分钟 |
资源占用 | 占用较少,只使用必需资源 | 需要完整的操作系统,资源开销大 |
隔离性 | 基于操作系统级别的隔离,轻量 | 基于硬件虚拟化,隔离更强 |
使用场景 | 适合微服务、持续集成、快速部署 | 适合需要完整系统环境的应用 |
总结: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 3000
-
CMD
:指定容器启动时执行的命令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 都能帮助开发者提升生产力。