记录有关docker的学习和使用
服务器连接
云服务商控制台安全组已放行端口:22(SSH)、80、8080、3306或者自定义端口
### 基础环境配置
- 关闭防火墙 ufw disable
- 替换为清华apt源,目的解决安装慢 超时问题
- 更新apt缓存 apt update -y
- 确认必备工具 vim curl wget是否安装,用dpkg -s 软件名检测
权限优化
root用户不用做
普通用户:
1 2 3 4
| sudo usermod -aG docker $USER
newgrp docker
|
Docker环境搭建 + 基础学习
Docker+Docker Compose安装
安装官方稳定版本,避开snap版本的权限坑
1 2 3 4 5 6 7 8 9
| # 1. 安装Docker和Docker Compose apt install -y docker.io docker-compose # 2. 设置Docker开机自启,并立即启动服务 systemctl enable --now docker # 3. 验证安装是否成功(有版本号输出即为成功) docker --version docker-compose --version # 4. 测试Docker核心功能(出现Hello from Docker!提示,即为环境完全正常) sudo docker run hello-world
|
- 验证标准:4 条 version 命令都有版本号输出,hello-world 容器运行成功无报错。
核心概念
- 镜像(Image):只读的程序模板,包含代码、运行环境、依赖、配置,相当于 Windows 里的「绿色软件安装包」
- 容器(Container):镜像运行起来的实例,一个镜像可以启动多个互不干扰的容器,相当于「安装包打开后运行的软件」
- 仓库(Registry):镜像的存储分发平台,比如官方 Docker Hub,相当于「镜像的网盘」
- Docker 引擎:Docker 的核心后台服务,负责容器的创建、启停、销毁等全生命周期管理
常用命令
1
| sudo docker run -d --name test-nginx -p 80:80 nginx:alpine
|
| 命令 | 核心作用 | Ubuntu24 执行示例 |
|---|
docker ps / docker ps -a | 查看运行中 / 所有容器(包括已停止的) | sudo docker ps 查看 test-nginx 是否为 Up 状态 |
docker run -d --name 容器名 -p 宿主机端口:容器端口 镜像名 | 后台启动容器 + 端口映射(核心启动命令) | 上面的 test-nginx 启动命令,-d = 后台运行,–name = 容器命名,-p = 端口映射 |
docker stop/start/rm 容器名/容器ID | 停止 / 启动 / 删除容器 | sudo docker stop test-nginx 停止容器;sudo docker rm test-nginx 删除容器(必须先停止才能删除) |
docker images / docker rmi 镜像名/镜像ID | 查看 / 删除本地镜像 | sudo docker images 查看本地的 nginx、hello-world 镜像 |
docker logs -f 容器名 | 实时查看容器日志(排错必备) | sudo docker logs -f test-nginx 查看 nginx 访问日志,Ctrl+C 退出 |
docker exec -it 容器名 /bin/sh | 进入容器内部调试 | sudo docker exec -it test-nginx /bin/sh 进入 nginx 容器,exit 退出 |
镜像构建Dockerfile
核心指令
| 指令 | 核心作用 | Ubuntu24 实操规范 |
|---|
FROM | 指定基础镜像,必须是 Dockerfile 的第一行 | 优先用 alpine 精简版镜像,比如nginx:alpine,体积小、拉取快,避免超时 |
WORKDIR | 设置容器内的工作目录,相当于 cd 命令 | 避免写绝对路径,后续所有指令都基于这个目录执行 |
COPY | 把 Ubuntu 宿主机的文件 / 目录,复制到容器内 | 核心用来拷贝代码、配置文件到镜像里 |
RUN | 镜像构建时执行的命令 | 用来安装依赖、初始化环境 |
EXPOSE | 声明容器要暴露的端口 | 仅做规范声明,不实现端口映射,真正的端口映射靠 run 命令的 - p 参数 |
CMD | 容器启动时执行的命令 | 一个 Dockerfile 只能有一个 CMD,是容器的入口程序,容器必须有前台进程,否则会自动退出 |
自定义镜像
依次执行命令
1 2 3 4 5 6
| # 1. 新建专属工作目录,进入目录(避免文件混乱) mkdir -p /opt/docker-demo && cd /opt/docker-demo # 2. 新建自定义的网页文件 echo '<h1>Ubuntu24 Docker自定义镜像测试成功!</h1>' > index.html # 3. 新建Dockerfile文件(必须大写D,无后缀) vim Dockerfile
|
Dockerfile 内容
1 2 3 4 5 6 7 8 9 10
| # 基础镜像:nginx精简版 FROM nginx:alpine # 设置容器内工作目录 WORKDIR /usr/share/nginx/html # 把宿主机当前目录的index.html,复制到容器内的工作目录 COPY ./index.html . # 声明容器暴露80端口 EXPOSE 80 # 容器启动时执行的命令,前台运行nginx CMD ["nginx", "-g", "daemon off;"]
|
构建镜像并启动
1 2 3 4 5 6 7
| # 1. 构建镜像,命名为my-nginx,版本v1 # 注意:结尾的 . 代表当前目录(Dockerfile所在路径),绝对不能省略! sudo docker build -t my-nginx:v1 . # 2. 查看构建好的镜像,能看到my-nginx:v1即为构建成功 sudo docker images # 3. 用自定义镜像启动容器,映射8080端口 sudo docker run -d --name my-nginx-v1 -p 8080:80 my-nginx:v1
|
验证复盘
- 打开浏览器,输入云服务器公网 IP:8080,能看到你写的自定义页面,即为镜像构建 + 运行成功
- 复盘构建流程:Dockerfile→docker build→镜像→docker run→容器,吃透整个链路
- 排查常见错误:Dockerfile 文件名错误、缩进错误、构建命令漏了结尾的.、端口未在安全组放行
独立编写 Dockerfile,完成自定义镜像构建,通过公网 IP 访问到自定义内容。