Docker入门全攻略:轻松上手,提升你的项目效率

前言

什么是Docker?简单来说,Docker是一个开源项目,它能让开发者将应用及其依赖打包到一个轻量级的、可移植的容器中。然后,这个容器可以在任何流行的Linux机器或Windows机器上运行。

为什么会这样?传统开发中,我们经常遇到 "在我机器上能跑,为什么到你那就不行?" 的问题。

比如:开发用Mac,测试用Windows,生产是Linux。可部署以后发现Python版本不一样,Node.js缺某个模块,数据库配置路径不同等等一系列问题。

这是因为环境不一致导致的。Docker通过容器化技术,将应用和环境一起打包,解决了环境一致性问题。

使用Docker打包后,测试、生产环境都可以一键部署,再也不用担心环境差异导致的问题了。

接下来,我们一起从入门到实战,深入了解Docker

一、Docker核心概念

1. 镜像(Image)

Docker镜像是一个只读模板。它包含了运行某个软件所需的所有内容,比如:代码、运行时、库、环境变量和配置文件等。

可以把镜像看作是一个应用程序的打包文件,里面包含了运行这个程序需要的一切。

2. 容器(Container)

容器是镜像的运行实例。它可以被启动、开始、停止、删除。

每个容器都是相互隔离的,保证安全平台。

可以把容器看作是一个轻量级的虚拟机,但它比虚拟机更加轻便、快速。

3. 仓库(Repository)

Docker仓库用来保存镜像。类似于代码仓库,分为公有仓库和私有仓库。

Docker官方的公有仓库是Docker Hub,我们可以在上面找到很多官方和个人发布的镜像。

二、Docker安装

Windows/Mac安装

直接下载Docker Desktop,一键安装,非常简单。

下载地址

还需要安装虚拟环境。

Linux安装

以Ubuntu为例:

bash 复制代码
# 更新软件包索引
sudo apt-get update

# 安装依赖包
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common

# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# 添加Docker仓库
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

# 安装Docker
sudo apt-get update
sudo apt-get install docker-ce

安装完成后,运行以下命令验证:

bash 复制代码
docker --version

三、部署一个Web应用

我们来实际部署一个Node.js Web应用。

1. 创建项目目录

bash 复制代码
mkdir my-node-app
cd my-node-app

2. 创建package.json

json 复制代码
{
  "name": "my-node-app",
  "version": "1.0.0",
  "description": "Node.js on Docker",
  "main": "server.js",
  "scripts": {
    "start": "node server.js"
  },
  "dependencies": {
    "express": "^4.18.2"
  }
}

3. 创建server.js

javascript 复制代码
const express = require('express');
const app = express();
const PORT = 5000;

app.get('/', (req, res) => {
  res.send('Hello Docker!');
});

app.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});

4. 创建Dockerfile

dockerfile 复制代码
# 使用官方Node.js运行时作为父镜像
FROM node:18

# 设置工作目录
WORKDIR /usr/src/app

# 将package.json和package-lock.json复制到工作目录
COPY package*.json ./

# 安装依赖
RUN npm install

# 将本地代码复制到容器中
COPY . .

# 暴露端口
EXPOSE 5000

# 运行应用
CMD ["npm", "start"]

5. 构建镜像

在当前目录下执行

bash 复制代码
docker build -t my-node-app .

说明:

  • docker build:构建镜像
  • -t my-node-app:给镜像起个名字
  • .:当前目录找 Dockerfile

构建后需要等一会,然后查看镜像是否创建成功

bash 复制代码
docker images

创建成功,如图:

6. 运行容器

bash 复制代码
docker run -d --name node-server -p 5000:5000 my-node-app

参数解释:

  • -d:后台运行
  • --name node-server:为容器指定一个名称
  • -p 5000:5000:把宿主机的5000端口映射到容器的5000端口
  • my-node-app:你要运行的镜像名

测试

bash 复制代码
# 测试应用是否正常运行
curl http://localhost:5000

# 或者使用浏览器访问
# http://localhost:5000

看到"Hello Docker!",恭喜你,成功了!

四、Docker Compose多容器部署

实际项目中,我们通常需要多个服务配合。比如Web前端、后端、数据库。

举个例子:项目的目录是这样的

go 复制代码
my-app/
├── docker-compose.yml
├── backend/
│   ├── Dockerfile
│   ├── package.json
│   └── server.js
├── frontend/
│   ├── Dockerfile
│   ├── package.json
│   └── src/
└── redis/
    └── Dockerfile(需要自定义)

nodejs后端:backend/Dockerfile

sql 复制代码
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
EXPOSE 5000
CMD ["npm", "start"]

前端:frontend/Dockerfile

sql 复制代码
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
EXPOSE 5000
CMD ["npm", "start"]

创建docker-compose.yml:

yaml 复制代码
version: '3.8'

services:
  backend:
    build: ./backend
    ports:
      - "5000:5000"
    environment:
      - NODE_ENV=production
      - REDIS_HOST=redis
    depends_on:
      - redis

  frontend:
    build: ./frontend
    ports:
      - "80:80"
    depends_on:
      - backend

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data
    command: redis-server --appendonly yes

volumes:
  redis-data:

运行以下命令启动所有服务:

bash 复制代码
docker-compose up -d

-d为后台运行模式

五、Docker常用命令大全

镜像命令

bash 复制代码
# 拉取镜像
docker pull [镜像名]

# 列出本地镜像
docker images

# 删除镜像
docker rmi [镜像名/ID]

# 构建镜像
docker build -t [标签名] .

容器命令

bash 复制代码
# 运行容器
docker run [选项] [镜像名]

# 列出运行中的容器
docker ps

# 列出所有容器
docker ps -a

# 停止容器
docker stop [容器名/ID]

# 启动已停止的容器
docker start [容器名/ID]

# 删除容器
docker rm [容器名/ID]

# 进入容器
docker exec -it [容器名/ID] /bin/bash

# 查看容器日志
docker logs [容器名/ID]

Docker Compose命令

bash 复制代码
# 启动所有服务
docker-compose up

# 在后台启动所有服务
docker-compose up -d

# 停止所有服务
docker-compose down

# 查看服务状态
docker-compose ps

# 查看服务日志
docker-compose logs

其他实用命令

bash 复制代码
# 查看Docker信息
docker info

# 查看磁盘使用情况
docker system df

# 清理无用数据
docker system prune

# 复制文件到容器
docker cp [本地路径] [容器名/ID]:[容器路径]

# 从容器复制文件
docker cp [容器名/ID]:[容器路径] [本地路径]

六、最佳实践

1.使用.dockerignore文件 避免将不必要的文件复制到镜像中,减小镜像体积。

2.多阶段构建 对于需要编译的应用,使用多阶段构建可以显著减小最终镜像的大小。

3.使用官方镜像 尽量使用官方镜像,更加安全可靠。

4.指定镜像版本 不要使用latest标签,指定具体版本避免意外变更。

5.最小化镜像层数 合并RUN指令,减少镜像层数。

结语

Docker确实改变了我们开发、部署应用的方式。通过容器化,我们实现了环境一致性,简化了部署流程。

如果这篇Docker入门的文章对你有帮助,欢迎点赞、收藏、转发!

本文首发于公众号:程序员刘大华,专注分享前后端开发的实战笔记。关注我,少走弯路,一起进步!

📌往期精彩

《SpringBoot 中的 7 种耗时统计方式,你用过几种?》

《Java8 都出这么多年了,Optional 还是没人用?到底卡在哪了?》

《加班到凌晨,我用 Vue3 + ElementUI 写了个可编辑的表格组件》

《vue3 登录页还能这么丝滑?这个 hover 效果太惊艳了》

相关推荐
kymix2 小时前
vscode 远程管理docker时,提示权限不足无法获取容器列表问题
ide·vscode·docker
IT_陈寒3 小时前
Redis性能翻倍秘籍:10个99%开发者不知道的冷门配置优化技巧
前端·人工智能·后端
洛小豆3 小时前
Swagger3学习与实践指南
spring boot·后端·spring cloud
Victor3563 小时前
Redis(58)如何配置和查看Redis的慢查询日志?
后端
Victor3563 小时前
Redis(59)Redis的主从复制是如何实现的?
后端
胡斌附体3 小时前
离线docker安装jupyter(python网页版编辑器)
python·docker·jupyter·image·tar·save
摇滚侠4 小时前
Spring Boot 3零基础教程,自动配置机制,笔记07
spring boot·笔记·后端
程序员爱钓鱼5 小时前
Go语言实战案例——进阶与部署篇:性能优化与 pprof 性能分析实践
后端·google·go
爱编程的小白L6 小时前
基于springboot志愿服务管理系统设计与实现(附源码)
java·spring boot·后端