🐳 docker
参考
引子
Virtual Machines
vm 的宿主机 os 操作硬件, vm os 操作虚拟化硬件
vm 在没有硬件虚拟化之前, 完全通过宿主机模拟, 性能 👎
vm 在支持硬件虚拟化之后, 普通指令硬件直接执行, 核心指令由宿主机模拟, 性能 👍
- 更强的隔离性:在硬件层面上实现虚拟化
- 文件特性:硬盘文件、快照都是文件,可以持久化
Docker
- 轻量化:在操作系统层面上实现虚拟化
- 分布式:可以在同一台机器上运行多个容器,每个容器之间相互隔离
- 无状态:容器每次创建都是全新的,容器内的进程也是全新的,容器内的内容不可持久化
Install Docker
-
使用 apt 安装 docker engine
-
安装并配置 NVIDIA CTK
-
验证
| Bash |
|---|
| sudo docker run --rm --gpus all nvidia/cuda:12.3.0-base-ubuntu22.04 nvidia-smi
|
镜像 IMAGE
是一个只读模板,用来创建容器,类似于:
- 面向对象中的类,容器是对象
- 虚拟机中的
.iso,容器是虚拟机
下载镜像
Docker Hub
| Bash |
|---|
| sudo docker pull IMAGE_NAME[:TAG]
|
IMAGE_NAME 镜像名称
TAG 可选,镜像版本或标签,默认为 latest
代理加速(参考文档):
-
sudo mkdir -p /etc/systemd/system/docker.service.d
-
sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf
| Bash |
|---|
| [Service]
Environment="HTTP_PROXY=http://127.0.0.1:7897"
Environment="HTTPS_PROXY=http://127.0.0.1:7897"
|
-
sudo systemctl daemon-reload && sudo systemctl restart docker
-
sudo systemctl show --property=Environment docker
查看镜像
REPOSITORY 镜像名称
TAG 镜像版本或标签
IMAGE ID 镜像 ID:唯一标识
CREATED 创建时间
SIZE 镜像大小
删除镜像
| Bash |
|---|
| sudo docker rmi IMAGE_NAME[:TAG]
|
导出镜像
| Bash |
|---|
| sudo docker image save -o 镜像.tar 镜像:tag
|
导入镜像
| Bash |
|---|
| sudo docker image load -i 镜像.tar
|
容器 CONTAINER
查看容器
增删容器
删除容器
| Bash |
|---|
| sudo docker rm [CONTAINER_ID]
|
| Bash |
|---|
| sudo docker container prune
|
创建容器
| Bash |
|---|
| docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
|
| Bash |
|---|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 | docker run \
--name [c_name] \ # 容器名
--rm \ # 退出时删除容器
-it \ # 台前运行,容器在没有指定长时间运行的进程时会立即退出
-d, --detach \ # 后台运行
--restart=unless-stopped \ # 非手动停止自动重启
--privileged \ # root 权限
--net=host \ # 使用主机网络
--ipc=host \ # 使用主机的 IPC
-p 10086:80 \ # 主机 10086 <- 容器内 80
-P \ # 容器公开的所有端口随机映射到主机的可用端口
-v /host/path:/c/path \ # 映射目录
-v /host/file:/c/file:ro \ # 映射文件 [:ro] 只读
-w /c/path \ # 工作目录
[image_name] # 镜像名
|
进出容器
进入容器
| Bash |
|---|
| sudo docker exec -it [CONTAINER_ID] /bin/bash
|
执行命令
| Bash |
|---|
| sudo docker exec [CONTAINER_ID] [COMMAND] [ARG...]
|
退出容器
启停容器
重启容器
| Bash |
|---|
| sudo docker restart [CONTAINER_ID]
|
启动容器
| Bash |
|---|
| sudo docker start [CONTAINER_ID]
|
停止容器
| Bash |
|---|
| sudo docker stop [CONTAINER_ID]
|
自建镜像
0 准备
| Text Only |
|---|
| myapp/
├── Dockerfile
├── go.mod
├── main.go
└── static/
└── index.html
|
code
| Go |
|---|
1
2
3
4
5
6
7
8
9
10
11
12 | package main
import (
"fmt"
"net/http"
)
func main() {
http.Handle("/", http.FileServer(http.Dir("./static")))
fmt.Println("Server is running on port 80...")
http.ListenAndServe(":80", nil)
}
|
1 编写 Dockerfile
| Docker |
|---|
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 | # 第一阶段:构建阶段
FROM golang AS builder
# 设置工作目录
WORKDIR /web_server
# 复制 go.mod 和 go.sum 文件并下载依赖
COPY go.mod go.sum ./
RUN go mod download
# 复制源代码
COPY . .
# 编译 Go 代码
RUN go build -o web_server .
# 第二阶段:生产阶段
FROM ubuntu
# 设置工作目录
WORKDIR /root/
# 从构建阶段复制编译好的二进制文件
COPY --from=builder /web_server/web_server .
COPY --from=builder /web_server/static ./static
# 暴露端口
EXPOSE 8080
# 运行应用程序
CMD ["./web_server"]
|
2 构建镜像
| Bash |
|---|
| sudo docker buildx build -t dxlcq/web_server .
|
3 推送到 dockerhub
| Bash |
|---|
| sudo docker login
sudo docker push dxlcq/web_server
|
docker compose
常用命令
-
启动容器组
| Bash |
|---|
| sudo docker compose up -d
|
-
停止容器组
-
查看容器组
-
查看日志
| Bash |
|---|
| sudo docker compose logs -f
|
网络
查看所有的