docker工作原理
- 一种虚拟机技术:通过 软件 模拟的具有完整 硬件 系统功能的、运行在一个完全 隔离 环境中的完整 计算机系统
相比于VM虚拟机的区别
Docker和虚拟机技术的区别:
- 传统的虚拟机,可以虚拟出一条硬件,运行一个完整的操作系统,在这个操作系统上安装和运行所需的软件
- 容器内的应用可以直接运行在宿主 主机的内核中,容器没有自己的内核,也不用虚拟硬件 (轻便)
- 每个容器是相互隔离的,每个容器内都有属于自己的文件系统,之间互不影响。
- 新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核
docker 环境准备
docker 安装
- ubuntu 安装docker
1. 卸载就版本(如果有)
bash
sudo apt remove docker docker-engine docker.io containerd runc
2. 安装依赖
bash
sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release
apt 因时间问题的更新失败解决:


3. 添加Docker官方GPG密钥
bash
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

4. 设置docker源
bash
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

5. 安装docker引擎
bash
sudo apt update # 前面修改过源,先更新
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
如果找不到本系统版本对应的合适资源:
可尝试更换docker源:bash
echo
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg]
http://mirrors.aliyun.com/docker-ce/linux/ubuntu$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

验证安装:
bash
sudo docker run hello-world
如果出现:

这个错误通常是因为Docker无法从Docker Hub拉取镜像,可能是网络连接问题,特别是在中国地区可能需要配置镜像加速器
bash
# 配置镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://registry.docker-cn.com"
]
}
EOF

bash
# 重启Docker服务
sudo systemctl daemon-reload
sudo systemctl restart docker
# 再次尝试
sudo docker run hello-world
docker 配置
- 安装docker后,使用start启动服务:
bash
sudo systemctl start docker
- 设置成开机自启动:
bash
sudo systemctl enable docker

- 将当前用户加入docker组
bash
sudo usermod -aG docker $USER
重新登录或者重启系统生效
docker 卸载
bash
sudo apt purge docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
docker 使用
- Docker 是一个C/S系统,Docker的守护进程运行在主机上。docker运行在宿主之上,一个宿主主机(如:linux系统)可运行多个docker容器, 多个docker容器之间互相独立,空间隔离,互不干扰
- 使用步骤:加载镜像 -> 运行容器 ->进入容器 ->(退出容器 ->停止容器)
常用命令
镜像命令
1. 镜像查看
bash
docker images -q/--quiet # 显示镜像id
docker images -a/--all # 显示所有镜像

REPOSITORY: 镜像的仓库源
TAG: 镜像的标签
IMAGE ID: 镜像的id
CREATED: 镜像的创建时间
SIZE: 镜像的大小
2. 镜像查找
bash
docker search 镜像名 --filter=选项=过滤值
3. 镜像下载
bash
docker pull 镜像名[:tag]
4. 镜像加载
bash
docker load -i 镜像.tar
5. 镜像删除
bash
docker rmi -f 镜像id # 删除指定的镜像
docker rmi -f 镜像id 镜像id 镜像id # 删除多个镜像(空格分隔)
docker rmi -f $(docker images -aq) # 删除全部的镜像
容器命令
1. 容器查看
- 查看所有容器
bash
docker ps -a/--all
- 查看正在运行的容器
bash
docker ps
2. 启动容器
- 如果要设置容器内部的环境变量,或者需要在宿主机上配置传入docker使用的,都在容器运行时一块设置
bash
docker run -it -d --name 容器名 镜像名:tag版本号 /bin/bash
例如:
bash
docker run --name my_container_"$(date "+%Y%m%d%H%M%S")" -itd --cap-add NET_ADMIN --cap-add=net_raw --cap-add=sys_nice --network host --cap-add sys_ptrace --add-host mgmt.ns.local:127.0.0.2 --add-host data.ns.local:127.0.0.1 --ulimit nofile=65536:65536 --ulimit memlock=1073741824 -m 8g --shm-size 1g --restart always -v /etc/xxx/config.json:/etc/xxx/config.json -e NETWORKMODE=host -e CONTAINERNAME=容器名 镜像REPOSITORY
常见参数分类
1. 容器命名和标识
bash
# 为容器指定名称(便于管理)
docker run --name [容器名]
# 分配一个伪TTY,通常与-i一起使用
docker run -it
# 交互模式,保持STDIN打开
docker run -i
bash
# 删除容器后自动清理容器文件系统(默认不清理)
docker run --rm
bash
# 设置容器的主机名(默认是容器ID)
docker run --hostname myhost [容器主机名]
# 设置容器域名
docker run --dns 8.8.8.8
2. 网络配置
bash
# 指定网络模式
docker run --network bridge # 默认桥接模式
docker run --network host # 使用主机网络
docker run --network none # 无网络
docker run --network container:<name> # 共享其他容器网络
# 端口映射(主机端口:容器端口)
docker run -p 80:80 # 映射TCP端口
docker run -p 80:80/udp # 映射UDP端口
docker run -p 8080-8090:80 # 端口范围映射
# 发布所有暴露的端口到随机主机端口
docker run -P
# 指定容器IP
docker run --ip 172.17.0.100
# 添加主机名解析(/etc/hosts)
docker run --add-host dbhost:192.168.1.100
3. 存储和卷挂载
bash
# 挂载主机目录到容器(bind mount)
docker run -v 宿主机路径:容器内部路径
# 挂载数据卷
docker run -v my_volume:/container/path
# 挂载临时文件系统(tmpfs)
docker run --tmpfs /tmp
# 挂载只读
docker run -v /host/path:/container/path:ro
# 使用更推荐的--mount语法(功能更强大)
docker run --mount type=bind,source=/host/path,target=/container/path
docker run --mount type=volume,source=my_volume,target=/container/path
docker run --mount type=tmpfs,target=/tmp
# 从其他容器挂载卷
docker run --volumes-from other_container
4. 环境变量
bash
# 设置环境变量
docker run -e MYVAR=myvalue
# 设置多个环境变量
docker run -e MYVAR1=value1 -e MYVAR2=value2
# 从文件读取环境变量
docker run --env-file ./env.list
# 传递主机环境变量
docker run -e 主机环境变量
5. 资源限制
bash
# 限制内存使用
docker run -m 512m # 内存限制
docker run --memory-swap 1g # 内存+交换分区限制
docker run --memory-reservation 256m # 内存软限制
# 限制CPU使用
docker run --cpus 1.5 # 限制使用1.5个CPU核心
docker run --cpuset-cpus 0,1 # 指定使用哪些CPU核心
# 限制IO
docker run --blkio-weight 500 # 块IO权重(10-1000)
docker run --device-read-bps /dev/sda:1mb # 读取速率限制
6. 用户和权限
bash
# 指定运行用户
docker run -u 1000:1000 # UID:GID
docker run -u www-data # 用户名
docker run --user 1000 # 只指定UID
bash
# 特权模式(获得主机所有能力)
docker run --privileged
# 添加Linux能力
docker run --cap-add NET_ADMIN
# 删除Linux能力
docker run --cap-drop KILL
# 设置安全选项
docker run --security-opt seccomp=unconfined
7. 容器生命周期管理
bash
docker run --restart no # 不重启(默认)
docker run --restart always # 总是重启
docker run --restart on-failure # 失败时重启
docker run --restart unless-stopped # 除非手动停止
bash
# 设置健康检查
docker run --health-cmd "curl -f http://localhost/ || exit 1" \
--health-interval 30s \
--health-timeout 10s \
--health-retries 3 \
# 设置容器停止信号
docker run --stop-signal SIGTERM
# 设置停止超时时间
docker run --stop-timeout 30
8. 日志和输出
bash
# 指定日志驱动
docker run --log-driver json-file # 默认JSON文件
docker run --log-driver syslog # 系统日志
docker run --log-driver journald # systemd日志
docker run --log-driver none # 不记录日志
# 日志选项
docker run --log-opt max-size=10m --log-opt max-file=3
# 禁用输出缓冲
docker run --tty
9.数据元数据和标签
bash
# 为容器添加标签
docker run -l environment=production nginx
docker run --label com.example.version="1.0" nginx
bash
# 设置元数据
docker run --metadata key=value nginx
参数更新
bash
docker stop 容器名/容器ID # 停止容器
docker update xxx 容器名/容器ID # 更新配置
docker start 容器名/容器ID # 重新启动容器

3. 容器进入
bash
docker exec -it 容器名/容器ID /bin/bash
4. 容器退出
bash
exit
取消进入容器:ctrl + p + q
5. 容器停止
bash
docker stop 容器名/容器ID
6. 容器重启
bash
docker restart 容器名/容器ID
7. 容器删除
bash
#删除容器
docker rm -f 容器名1/容器ID1 容器名2/容器ID2 ...
#删除全部
docker rm -f $(docker ps -aq)
8. 容器与宿主机间的文件拷贝
bash
#从容器内 拷出
docker cp 容器ID/名称: 容器内路径 容器外路径
bash
#从外部 拷贝文件到容器内
docker cp 容器外路径 容器ID/名称: 容器内路径
docker 镜像制作与运行
docker 镜像制作与运行(Python Web 应用 + Docker 镜像)
