material/program/tool/docker.md
RongersLY 93cecd7544 BIG MERGE!!!
BIG ADD:
- docker
- archlinux

FIX:
- vim
- c_cpp
  - string hash
  - linux /dev/random
  - thread
  - STL
- linux
  - command
    - last

OTHERS:
- add antenna.md
- mirrors
- makefile.md
2025-04-04 17:35:35 +08:00

215 lines
6.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# docker
是一个开源的应用容器引擎
## 目录
- [核心组件](#)
- [install](#)
- [基本命令](#)
- [样例](#example-command)
- [数据管理](#)
- [高级用法](#)
- [daemon.json](#)
## 核心组件
+ 镜像Image只读模板包含运行应用所需的所有内容如代码、运行时、库等
+ 容器Container镜像的运行实例隔离运行应用的环境
+ 仓库Repository存储和分发镜像的地方Docker Hub 是最常用的公共仓库
## install
+ 更新系统并安装依赖包
+ 添加 Docker 官方 GPG 密钥并设置存储库
+ 安装 Docker 引擎并启动服务
+ 设置 Docker 开机自启
```bash
sudo apt-get update
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
echo "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee -a /etc/apt/sources.list.d/docker.list
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# 验证安装
sudo docker --version
```
__配置/etc/docker/daemon.json__
```
{
"registry-mirrors":
[
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn"
]
}
```
## 基本命令
1. 镜像操作
+ `docker pull <镜像名>` : 从仓库拉取镜像
+ `docker image ls` : 列出本地镜像
+ `docker rmi <镜像ID>` : 删除镜像
2. 容器操作
+ `docker run -d <镜像名>` : 创建并后台运行容器
+ `docker ps` : 列出所有运行中容器
+ `docker stop [ID / NAME]` : 停止某容器
+ `docker start [ID / NAME]` : 启动已经停止的容器
+ `docker rm [ID / NAME]` : 删除容器
+ `docker commit <容器ID或名称> <新镜像名称>:<标签>` 将运行中的容器保存为镜像
+ `docker save -o my-new-image.tar my-new-image:latest` 导出为tar文件
+ `docker load -i my-new-image.tar` 导入镜像到目标环境
3. 其他
+ `docker search <镜像名>` 搜索镜像
+ `docker logs <容器ID>` : 查看容器日志
+ `docker exec -it [ID / NAME] /bin/bash` : 进入容器
+ `c-P c-Q` : 退出容器
+ `sudo systemctl daemon-reload && sudo systemctl restart docker` 重启
+ `docker load < xxx.tar` #导入tar为镜像
+ `docker commit [ID] [镜像名]` #容器保存为镜像
### example-command
> `docker pull ubuntu` 拉取 Ubuntu 镜像
> `docker run -it ubuntu /bin/bash` 运行 Ubuntu 容器并进入交互式 shell
> `docker ps -a` 列出所有容器(包括停止的)
> `docker run -it --name mc-ser ubuntu -v /opt/mc:/opt/mc -p 25565:25565 /bin/bash`
## 数据管理
为了持久化数据Docker 提供了多种数据管理方式,主要包括 数据卷Volumes、绑定挂载Bind Mounts 和 临时文件系统tmpfs
1. Docker 数据卷Volumes
数据卷是 Docker 推荐的数据持久化方式。数据卷存储在 Docker 管理的文件系统中(通常是 /var/lib/docker/volumes/),与容器的生命周期分离,即使容器被删除,数据卷仍然存在
+ 持久化:数据卷独立于容器,容器删除后数据仍然保留。
+ 高性能:数据卷通常比绑定挂载性能更好。
+ 易于备份和迁移:数据卷可以通过 Docker 命令轻松备份和恢复。
> `docker volume create my_volume` 创建数据卷
> `docker volume ls` 查看数据卷
> `docker volume inspect my_volume` 查看数据卷详细信息
> `docker run -d --name my_container -v my_volume:/path/in/container <image_name>` 挂载数据卷到容器
> `docker volume rm my_volume` 删除数据卷
> `docker volume prune` 清理未使用的数据卷
2. 绑定挂载Bind Mounts
绑定挂载是将主机上的文件或目录直接挂载到容器中
+ 灵活性:可以直接挂载主机上的任意文件或目录。
+ 实时同步:主机和容器之间的文件修改会实时同步。
+ 依赖主机文件系统:绑定挂载的路径必须存在于主机上。
- `docker run -d --name my_container -v /host/path:/container/path <image_name>` 挂载主机目录到容器
3. 临时文件系统tmpfs
tmpfs 是一种基于内存的文件系统,适用于需要临时存储数据的场景。数据仅存储在内存中,容器停止后数据会丢失
+ 高性能:数据存储在内存中,读写速度快。
+ 临时性:数据不会持久化,容器停止后数据丢失。
`docker run -d --name my_container --tmpfs /container/path <image_name>` 挂载 tmpfs 到容器
4. 数据卷的高级用法
多个容器可以共享同一个数据卷,实现数据共享
```
docker run -d --name container1 -v my_volume:/data <image_name>
docker run -d --name container2 -v my_volume:/data <image_name>
```
可以将数据卷或绑定挂载设置为只读,防止容器修改数据
`docker run -d --name my_container -v my_volume:/data:ro <image_name>`
## 高级用法
1. Dockerfile
Dockerfile 是用于构建镜像的脚本文件,包含一系列指令,用于定义镜像的构建过程
```
# 使用基础镜像
FROM ubuntu:latest
# 维护者信息
MAINTAINER Your Name <your.email@example.com>
# 更新包索引并安装软件
RUN apt-get update && apt-get install -y \
software-properties-common \
python3
# 设置工作目录
WORKDIR /app
# 复制当前目录下的文件到容器中的 /app 目录
COPY . /app
# 暴露端口
EXPOSE 80
# 设置环境变量
ENV NAME World
# 运行命令
CMD ["python3", "app.py"]
```
`docker build -t <image_name> .` 构建镜像
2. Docker 网络
`docker network create <network_name>` 创建网络
`docker network ls` 查看网络
`docker network connect <network_name> <container_id>` 连接容器到网络
3. Docker 数据管理
`docker volume create <volume_name>` 创建数据卷
`docker volume ls` 查看数据卷
`docker run -v <volume_name>:/path/in/container <image_name>` 挂载数据卷到容器
4. Docker 资源限制
`docker run -m 512m <image_name>` 限制内存
`docker run --cpus="1.5" <image_name>` 限制 CPU
5. Docker 安全
> 使用非 root 用户运行容器
```dockerfile
FROM ubuntu
RUN useradd -m myuser
USER myuser
```
> 限制容器权限
`docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE <image_name>`
## daemon.json
```
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.xuanyuan.me",
"https://docker.zhai.cm",
"https://a.ussh.net",
"https://hub.littlediary.cn",
"https://hub.rat.dev",
"https://atomhub.openatom.cn",
"https://docker.m.daocloud.io",
"https://dytt.online",
"https://func.ink",
"https://lispy.org",
"https://docker.xiaogenban1993.com",
"https://docker.mybacc.com",
"https://docker.yomansunter.com",
"https://dockerhub.websoft9.com",
"https://docker-0.unsee.tech",
"https://docker-cf.registry.cyou",
"https://docker.1panel.live",
"https://docker.imgdb.de",
"https://docker.hlmirror.com",
"https://dockerpull.org",
"https://dockerhub.icu",
"https://proxy.1panel.live",
"https://docker.1panel.top",
"https://docker.ketches.cn"
]
}
```