【Linux系统】Docker技术与应用

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 镜像)

相关推荐
道清茗17 小时前
【Kubernetes知识点问答题】常规维护管理操作 / ETCD 备份与恢复
docker·kubernetes·etcd
林鸿群17 小时前
Ubuntu 26.04 本地安装 GitLab CE 完整教程(非 Docker 方式)
linux·ubuntu·gitlab·私有部署·代码托管·ubuntu 26.04·omnibus
勇闯逆流河17 小时前
【Linux】Linux进程概念(进程优先级,进程切换详解)
linux·运维·服务器
老师好,我是刘同学17 小时前
30个核心Linux命令速查手册
linux
fsj2009yx17 小时前
如何把无公网的求生之路2服务器借助VPS转发注册到steam master列表中
linux·wireguard·求生之路2
慵懒的猫mi17 小时前
deepin UOS AI 助手接入飞书(Feishu)配置指南
linux·人工智能·ai·gpt-3·飞书·文心一言·deepin
Jiozg17 小时前
ES安装到linux(ubuntu)
linux·ubuntu·elasticsearch
面对疾风叭!哈撒给17 小时前
Linux之docker-compose使用(redis、nginx、tdengine、java应用)
linux·redis·docker
zzzsde17 小时前
【Linux】进程(6):程序地址空间
linux·运维·服务器
慵懒的猫mi17 小时前
deepin UOS AI 助手接入钉钉(DingTalk)配置指南
linux·数据库·人工智能·ai·钉钉·deepin