1. 国内ubuntu服务器安装docker(使用aliyun镜像源,root用户)
1.1. 安装
1 2 3 4 5 6
| apt update apt install -y apt-transport-https ca-certificates curl gnupg lsb-release curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add - add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" apt update apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
1.2. 换源
1
| vim /etc/docker/daemon.json
|
然后添加国内的镜像仓库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| { "registry-mirrors": [ "https://docker.registry.cyou", "https://docker-cf.registry.cyou", "https://dockercf.jsdelivr.fyi", "https://docker.jsdelivr.fyi", "https://dockertest.jsdelivr.fyi", "https://mirror2.aliyuncs.com", "https://dockerproxy.com", "https://mirror.baidubce.com", "https://docker.m.daocloud.io", "https://docker.nju.edu.cn", "https://docker.mirrors.sjtug.sjtu.edu.cn", "https://docker.mirrors.ustc.edu.cn", "https://mirror.iscas.ac.cn", "https://docker.rainbond.cc" ] }
|
1.3. 启动
1 2
| systemctl start docker systemctl enable docker
|
2. 部分常用命令
docker的核心概念围绕着镜像image、容器container、卷volume。这里不对这些概念进行说明,仅展示命令。
2.1 image
2.1.1. 查看本地已有镜像
或者更推荐:
会显示 REPOSITORY、TAG、IMAGE ID、大小等信息。
2.1.2. 拉取镜像
以postgres为例
1
| docker pull postgres:latest
|
也可以指定版本:
2.1.3. 删除镜像
删除某个镜像:
如果镜像正在被容器使用,要么先停止并删除容器,要么加 -f 强制删除:
1
| docker rmi -f <IMAGE_ID>
|
2.1.4. 清理不用的镜像
清理所有悬空镜像(dangling,名字是 <none> 的):
清理所有不用的镜像(慎用,会清理未使用的容器相关镜像):
2.1.5. 镜像构建
某目录下有 Dockerfile可以自己构建镜像:
1
| docker build -t myapp:1.0 <dir>
|
这里 -t 给镜像加名字和版本号。
2.1.6. 镜像保存与导入
导出镜像到文件:
1
| docker save -o myapp.tar myapp:1.0
|
从文件导入镜像:
1
| docker load -i myapp.tar
|
2.2 container
容器就相当于一个配置好的虚拟机
2.2.1. 查看容器
2.2.2. 启动/停止/重启容器
1
| docker start <CONTAINER_ID 或 NAME>
|
1
| docker stop <CONTAINER_ID 或 NAME>
|
1
| docker restart <CONTAINER_ID 或 NAME>
|
2.2.3. 进入容器
1
| docker exec -it <CONTAINER_ID 或 NAME> bash
|
- 也可以使用别的指令,如以下是连接容器里的PostgreSQL:
1
| docker exec -it <id/name> psql -U postgres -d postgres
|
2.2.4. 查看容器日志
1
| docker logs <CONTAINER_ID 或 NAME>
|
实时查看日志:
1
| docker logs -f <CONTAINER_ID 或 NAME>
|
2.2.5. 删除容器
1
| docker rm <CONTAINER_ID 或 NAME>
|
2.2.6. 容器与镜像关系
1
| docker run -d --name mycontainer myimage:latest
|
仅是一个最小化的指令,实际可能还需要-p指定端口映射,-e指定容器运行的一些环境变量,-v把容器的数据(虚拟机的一个目录)映射到宿主机的卷里,比如:
1 2 3 4 5 6 7 8
| docker run -d \ --name pgdb \ -e POSTGRES_USER=admin \ -e POSTGRES_PASSWORD=secret123 \ -e POSTGRES_DB=mydb \ -p 5432:5432 \ -v pgdata:/var/lib/postgresql/data \ postgres:latest
|
1
| docker inspect <CONTAINER_ID> | grep Image
|
2.2.7. 其他常用
1
| docker cp localfile <CONTAINER_ID>:/path/in/container
|
从容器拷贝到宿主机:
1
| docker cp <CONTAINER_ID>:/path/in/container localfile
|
2.3 volume
2.3.1. 查看卷
1
| docker volume inspect <VOLUME_NAME>
|
2.3.2. 创建卷
1
| docker volume create myvolume
|
也可以带选项:
1
| docker volume create --driver local --opt type=none --opt device=/path/on/host --opt o=bind myvolume
|
(把宿主机目录绑定为卷)
2.3.3. 删除卷
1
| docker volume rm <VOLUME_NAME>
|
注意:正在使用的卷不能删除。
2.3.4. 在容器中挂载卷
运行容器时挂载:
1 2 3 4 5
| docker run -d \ --name pgdb \ -e POSTGRES_PASSWORD=secret123 \ -v pgdata:/var/lib/postgresql/data \ postgres:latest
|
这里 pgdata 就是一个卷,数据会保存在宿主机 /var/lib/docker/volumes/pgdata/_data。
2.3.5. 卷与文件拷贝
1
| ls /var/lib/docker/volumes/<VOLUME_NAME>/_data
|
1
| docker run --rm -v <VOLUME_NAME>:/data busybox ls /data
|
2.3.6. 查看卷占用空间
Docker 本身不能直接显示卷的大小,可以通过宿主机命令:
1
| du -sh /var/lib/docker/volumes/*
|
2.4. docker system
docker system 是 Docker 提供的一个顶级管理命令,用来查看和清理 Docker 的整体资源(镜像、容器、卷、构建缓存等)。
2.4.1. 查看 Docker 整体资源占用
类似 df -h,会显示:
2.4.2. 清理未使用资源
会删除:
- 已停止的容器
- 未使用的网络
- 悬空的镜像(没有 tag 的
<none> 镜像)
- 构建缓存
更彻底:
还会删除 所有未被容器使用的镜像(不仅仅是 <none>)。
再加上卷(慎用!会清空未使用的卷里的数据):
1
| docker system prune --volumes
|
2.4.3. 查看 Docker 信息
显示 Docker 运行环境的信息(版本、存储驱动、网络、CPU/内存限制等)。
3. docker日志管理
3.1. 日志文件位置
Docker 容器日志默认在:
1
| /var/lib/docker/containers/<container-id>/<container-id>-json.log
|
每个容器都有一个 .log 文件,可能会无限长。
3.2. 方法1: 直接清空某个容器日志
找到容器 ID:
然后清空日志文件:
1
| truncate -s 0 /var/lib/docker/containers/<container-id>/<container-id>-json.log
|
truncate -s 0 会把文件清零,但不会删除文件。容器还在跑,不受影响。
3.3. 方法2: 批量清空所有容器日志
一行命令清理全部:
1 2 3
| for log in $(find /var/lib/docker/containers/ -name *-json.log); do truncate -s 0 $log done
|
3.4. 方法3: 配置日志大小限制
在运行容器时指定日志参数:
1 2 3 4 5
| docker run -d \ --name myapp \ --log-opt max-size=100m \ --log-opt max-file=3 \ myimage
|
这样每个日志文件最大 100MB,最多保留 3 个。
使用docker-compose.yml可以这样写:
1 2 3 4 5
| logging: driver: "json-file" options: max-size: "100m" max-file: "3"
|
3.5. 方法4: 修改 Docker 全局配置(永久生效)
1
| vim /etc/docker/daemon.json
|
1 2 3 4 5 6 7
| { "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3" } }
|
然后重启 Docker:
1
| systemctl restart docker
|
4. 使用 Dockerfile
Dockerfile 是一个用于构建 Docker 镜像的文本配置文件,其中包含了构建镜像所需的一系列指令。
构建镜像的核心流程通常包含三个阶段:
- 指定基础镜像:选择操作系统或运行时环境作为构建起点。
- 构建应用环境:安装依赖包、复制源代码、配置系统参数。
- 定义入口程序:指定容器启动时默认执行的进程。
4.1. 核心指令详解
| 指令 |
含义 |
解释 |
示例 |
| FROM |
基础镜像 |
指定构建所使用的基础镜像,必须是 Dockerfile 的第一条非注释指令。 |
FROM python:3.9-slim |
| WORKDIR |
工作目录 |
设置镜像内的当前工作目录,后续指令(RUN, CMD, COPY 等)将在此目录下执行。 |
WORKDIR /app |
| COPY |
复制文件 |
将宿主机构建上下文中的文件或目录复制到镜像文件系统中。 |
COPY . . |
| RUN |
执行命令 |
在镜像构建过程中执行 Shell 命令,常用于安装软件包或配置环境。 |
RUN pip install -r requirements.txt |
| CMD |
启动命令 |
指定容器启动时默认执行的命令及参数。 |
CMD ["python", "app.py"] |
| EXPOSE |
暴露端口 |
声明容器运行时监听的网络端口(主要用于文档说明和映射建议)。 |
EXPOSE 8080 |
| ENV |
环境变量 |
设置持久化的环境变量,可在构建期及运行期使用。 |
ENV APP_ENV=production |
4.2. 实战:编写 Go (Gin 框架) 应用的 Dockerfile
Go 语言是编译型语言,最佳实践是使用 **多阶段构建 (Multi-stage Build)**。这样可以在第一阶段编译代码,在第二阶段仅打包二进制文件,从而获得极小的镜像体积(通常仅 10MB+)。
假设目录结构如下:
1 2 3 4 5
| my-app/ ├── main.go # 应用源代码 ├── go.mod # 依赖定义 ├── go.sum # 依赖校验 └── Dockerfile # 构建配置文件
|
4.2.1. 编写 Dockerfile
打开 Dockerfile,写入以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
FROM golang:1.23-alpine
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -o server .
EXPOSE 8080
CMD ["./server"]
|
4.3. 构建与运行
4.3.1. 构建镜像
1 2
| docker build -t my-go-app .
|
4.3.2. 运行容器
1 2
| docker run -d -p 8080:8080 --name my-go-server my-go-app
|