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

相关推荐
llc的足迹1 小时前
docker 中 gitlab 和 gitlab runner 离线安装及配置
docker·容器·gitlab
dodod20121 小时前
在 Ubuntu 中将新硬盘挂载到 /home /work目录下
linux·运维·ubuntu
饕餮争锋1 小时前
Linux 常用命令分类详解
linux·运维·服务器
菜择贰1 小时前
为IDEA创建Linux桌面快捷方式
java·linux·intellij-idea
minji...1 小时前
Linux 进程控制(三) (进程程序替换,exec系列函数)
linux·运维·服务器
Xの哲學1 小时前
Linux TTY子系统深度剖析
linux·服务器·算法·架构·边缘计算
moringlightyn1 小时前
Linux---基础IO(文件理解 文件接口使用 文件系统层面)
linux·运维·服务器·c语言·笔记·系统·文件
杜子不疼.1 小时前
【Linux】进程控制(一):进程的创建和终止
linux·运维·服务器
橘子真甜~2 小时前
C/C++ Linux网络编程9 - TCP服务器实现流程和独立运行
linux·运维·服务器·c++·守护进程·会话组