实验环境
- Kali GNU/Linux 2024.4
- Docker CE
- 应用示例:
docker/getting-started-app
一、安装并配置 Docker
1. 添加 Docker 官方源
Kali 基于 Debian,这里使用 Debian bookworm 的 Docker 源:
sudomkdir-p/etc/apt/keyringscurl-fsSLhttps://download.docker.com/linux/debian/gpg|\sudogpg--dearmor-o/etc/apt/keyrings/docker.gpgecho"deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian bookworm stable"|\sudotee/etc/apt/sources.list.d/docker.list2. 安装 Docker CE
更新软件源并安装:
sudoaptupdatesudoaptinstall-ydocker-ce docker-ce-cli containerd.io3. 启动并设置开机自启
sudosystemctlenabledocker--now4. 将当前用户加入 docker 组
这样后续使用 Docker 时不必每次都加sudo:
sudousermod-aGdocker$USERnewgrpdocker如果组权限未立即生效,可以重启 Docker 服务:
sudosystemctl restartdocker5. 验证安装
运行官方测试镜像:
sudodockerrun hello-world如果看到 “Hello from Docker!” 之类的输出,说明 Docker 已安装成功。
二、Docker 基础操作
1. 拉取镜像
从镜像仓库拉取 Ubuntu 镜像:
dockerpull ubuntu2. 列出本地镜像
dockerimages输出中可以看到仓库、标签、镜像 ID、创建时间和大小等信息。
3. 查看镜像详细信息
dockerinspect ubuntu该命令会输出 JSON 格式的镜像元数据,包括镜像 ID、创建时间、环境变量、默认命令、架构、大小等。
4. 创建并后台运行容器
dockerrun-itdubuntu /bin/bash-i:保持标准输入打开-t:分配伪终端-d:后台运行
命令执行后会返回容器 ID。
5. 列出正在运行的容器
dockerps可以看到容器 ID、使用的镜像、启动命令、创建时间、状态、端口和名称。
6. 停止容器
dockerstop<container_id>再次执行docker ps,可以看到该容器已不在运行列表中。
7. 启动已停止的容器
dockerstart<container_id>8. 查看容器日志
dockerlogs<container_id>9. 进入容器 Shell
dockerexec-it<container_id>/bin/bash进入后可以在容器内部执行命令,例如查看当前目录、安装软件等。
10. 查看容器详细信息
dockerinspect<container_id>这里会显示容器的网络、挂载、配置、状态等信息。其中比较有用的包括:
- 容器 IP 地址
- 网关
- 网络模式
- 挂载点
- 环境变量
- 启动命令
11. 删除容器
dockerrm<container_id>如果容器仍在运行,需要先停止再删除:
dockerstop<container_id>dockerrm<container_id>三、将应用程序容器化
下面以一个 Node.js 待办事项应用为例,演示如何把应用程序打包成 Docker 镜像并运行。
1. 下载应用源代码
gitclone https://github.com/docker/getting-started-app.gitcdgetting-started-appls-la目录中通常包含:
package.json README.md spec/ src/ yarn.lock2. 编写 Dockerfile
在getting-started-app目录下,与package.json同级位置创建Dockerfile:
touchDockerfile写入以下内容:
FROM registry.cn-beijing.aliyuncs.com/cuccs/node:18-alpine WORKDIR /app COPY . . RUN npm install -g node-gyp RUN yarn install --production CMD ["node", "src/index.js"] EXPOSE 3000说明:
FROM:指定基础镜像,这里使用 Node.js 18 Alpine 版本,体积较小。WORKDIR:设置容器内工作目录。COPY:把当前目录内容复制到镜像的/app。RUN:构建镜像时执行的安装命令。CMD:容器启动时默认执行的命令。EXPOSE:声明应用监听 3000 端口。
3. 构建镜像
确保当前目录在getting-started-app下:
pwd然后构建镜像:
dockerbuild-tgetting-started.-t getting-started:给镜像命名为getting-started.:表示使用当前目录的 Dockerfile
4. 启动应用程序容器
使用docker run启动容器,并将宿主机 3000 端口映射到容器 3000 端口:
dockerrun-dp127.0.0.1:3000:3000 getting-started-d:后台运行-p 127.0.0.1:3000:3000:把宿主机的 127.0.0.1:3000 映射到容器 3000 端口
5. 访问应用
打开浏览器访问:
http://localhost:3000如果一切正常,可以看到待办事项应用页面,并可以添加、完成、删除项目。
6. 查看运行中的容器
dockerps输出中应能看到getting-started镜像对应的容器,以及端口映射信息:
127.0.0.1:3000->3000/tcp四、常用命令速查
| 功能 | 命令 |
|---|---|
| 拉取镜像 | docker pull <image> |
| 查看本地镜像 | docker images |
| 查看镜像详情 | docker inspect <image> |
| 创建并运行容器 | docker run -itd <image> /bin/bash |
| 查看运行中容器 | docker ps |
| 查看所有容器 | docker ps -a |
| 停止容器 | docker stop <container> |
| 启动容器 | docker start <container> |
| 查看日志 | docker logs <container> |
| 进入容器 | docker exec -it <container> /bin/bash |
| 删除容器 | docker rm <container> |
| 构建镜像 | docker build -t <name> . |
| 端口映射运行 | docker run -dp 宿主机端口:容器端口 <image> |
五、总结
Docker 把应用及其依赖打包进镜像,使应用可以在不同环境中以一致的方式运行。本文完成了三件事:
- 安装与配置 Docker:添加官方源、安装 Docker CE、启动服务、配置用户组。
- 掌握基础命令:拉取镜像、查看镜像、运行容器、停止/启动容器、查看日志、进入容器、删除容器。
- 应用程序容器化:编写 Dockerfile、构建镜像、启动容器并通过浏览器验证应用。
实际使用中,还应注意:
- 使用
.dockerignore排除不必要文件; - 尽量使用体积小、安全性高的基础镜像;
- 不要把密码、密钥等敏感信息写入镜像;
- 生产环境避免使用
latest标签,建议固定版本; - 容器不要以 root 用户运行,必要时创建普通用户;
- 定期更新基础镜像,减少已知漏洞。