【部署运维】docker:入门到进阶

0 前言

部署运维博客系列一共有三篇:

拥抱开源,将工作中的经验分享出来,尽量避免新手踩坑。

【部署运维】docker :入门到进阶

【部署运维】kubernetes:容器集群管理掌握这些就够了

【部署运维】python+redis+celery+docker:实时异步访问的深度学习应用实战

1 docker的原理和优势

1.1 docker的原理

招聘要求中的提到的容器化技术指的就是docker相关的东西。确切地说,**容器是一种对进程进行隔离的运行环境;**进程的隔离,主要是通过Namespace和Cgroup两大机制实现的。在生产环境中,容器基本都是运行在linux上的。

1.2 docker的优势

  • 更高效的利用系统资源

docker对系统资源的利用率更高,无论是应用执行速度,内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机往往可以运行更多数量的应用。

  • 更快速的启动时间

传统的虚拟机技术启动应用服务往往需要数分钟,而docker容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级,甚至毫秒级的启动时间,大大的节约了开发测试,部署的时间。

  • 一致的运行环境

开发过程中常见的一个问题是环境一致问题,由于开发环境,测试环境,生产环境不一致,导致有些bug并未在开发过程中发现。而docker的镜像提供了除内核外完整的运行时环境,确保环境一致性,从而不会在出现"这段代码在我机器上没问题"这类问题。

  • 持续支付和部署

对开发和运维人员来说,最希望就是一次创建和部署,可以在任意的地方运行。(定制应用镜像来实现集成、持续支付、部署。开发人员可以通过dockerfile来进行镜像构建,并结合持续集成系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合持续部署系统进行自动部署)。而且使用dockerfile使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。

  • 更轻松的迁移

由于docker确保了执行环境的一致性,使得应用的迁移更加的容易。docker可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云、甚至是笔记本、其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。

  • 更轻松的维护和拓展

docker使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得十分简单。此外,docker团队同各个开源项目团队一起维护了一大批高质量的官网镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。

2 docker是如何工作的

  • Docker客户端:Docker客户端是用户与Docker交互的工具,它可以通过命令行或图形界面来操作Docker。Docker客户端负责接收用户输入的命令,并将其发送给Docker守护进程。
  • Docker守护进程:Docker守护进程是Docker的核心组件,它运行在Docker主机上,负责创建、运行和分发容器。Docker守护进程与Docker客户端之间通过REST API进行通信。
  • Docker主机:Docker主机是运行Docker守护进程的物理或虚拟机器。Docker主机可以安装在Linux、Windows或Mac OS上。
  • Docker Registry是一个用于存储和分发Docker镜像的服务器端应用程序。它是一个开源项目,使用Apache许可证。您可以在GitHub上找到它的源代码。

3 docker命令实操

在实操之前需要明白镜像和容器的区别:

镜像就是一系列文件和配置的组合,它是静态的,只读的,不可修改的。

而容器是镜像的实例化,它是可操作的,是动态的,可修改的。

3.1 安装docker

先在本机安装docker客户端,一般都是生产环境,本文主要针对ubuntu系统进行阐述。

3.1.1 设置仓库
bash 复制代码
sudo apt update # 更新源
sudo apt install ca-certificates curl gnupg lsb-release # 安装依赖
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # 将官方Docker存储库的GPG密钥添加到系统
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 设置稳定的仓库。
3.1.2 安装docker-ce和配套
bash 复制代码
sudo apt update # 上一步设置仓库后,要更新源
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin # 安装docker-ce和配套
如果程序需要gpu的话,则需要进一步安装Nvidia-Docker,即3.1.3 ,不需要可忽略。

安装Nvidia-Docker的先决条件:

  1. GNU/Linux x86_64 with kernel version > 3.10
  2. Docker >= 1.12
  3. NVIDIA GPU with Architecture > Fermi (2.1)
  4. NVIDIA drivers ~= 361.93 (untested on older versions)
3.1.3 安装nvidia-docker2(非必须)
bash 复制代码
sudo apt update # 更新源
sudo apt install -y nvidia-docker2 # 安装nvidia-docker
sudo systemctl restart docker # 重启docker
重启后测试一下,有版本信息说明安装成功
bash 复制代码
docker --version
3.1.3 docker换源
  • /etc/docker/daemon.json中写入下面镜像源(换源后仍可能会慢,有必要时可以科学上网)
bash 复制代码
{
  "registry-mirrors": [
    "https://registry.docker-cn.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com"
  ]
}
  • 执行命令使得添加镜像源生效,并重启docker
bash 复制代码
sudo systemctl daemon-reload && sudo systemctl restart docker

3.2 使用docker命令

3.2.1 对镜像操作
  • docker search 镜像名(查询镜像)
  • docker pull 镜像名(拉取镜像)
  • docker run (运行镜像生成容器)
  • docker build -t 镜像名:标签 .(通过Dockerfile构建镜像)
  • docker push (发布镜像到镜像仓库)
3.2.2 对容器操作
  • docker start 容器id(启动容器)
  • docker restart 容器id (重启容器)
  • docker stop 容器id (停止容器)
  • docker ps(查看正在运行的容器)
  • docker commit (将操作过的容器,比如配置过环境,安装过一些依赖等,可以通过该条命令将容器打包为镜像,固化为静态文件,下次启动镜像生成容器时环境依旧存在)
  • docker cp 主机目录 容器目录(主机copy文件到容器目录)
  • docker rm 容器id(删除镜像)
3.2.3 重要的命令说明
  • docker run
bash 复制代码
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS说明:

  • -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;

  • -d: 后台运行容器,并返回容器ID;

  • -i: 以交互模式运行容器,通常与 -t 同时使用;

  • -P: 随机端口映射,容器内部端口随机映射到主机的端口

  • -p: 指定端口映射,格式为:主机(宿主)端口:容器端口

  • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;

  • --name="nginx-lb": 为容器指定一个名称;

  • --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;

  • --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;

  • -h "mars": 指定容器的hostname;

  • -e username="ritchie": 设置环境变量;

  • --env-file=[]: 从指定文件读入环境变量;

  • --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;

  • **-m :**设置容器使用内存最大值;

  • --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;

  • --link=[]: 添加链接到另一个容器;

  • --expose=[]: 开放一个端口或一组端口;

  • --volume , -v: 绑定一个卷

常用的参数通过一条执行命令指出

bash 复制代码
sudo docker run -it --gpus all -v /home/usr/project:/workspace -p 0.0.0.0:7865:8082 sd:v1 /bin/bash
相关推荐
林九生6 分钟前
【MySQL/PostgreSQL】MySQL 到 PostgreSQL 数据迁移:Docker + pgloader
mysql·docker·postgresql
触想工业平板电脑一体机1 小时前
【触想智能】MES工位一体机在自动化生产线上的作用和市场应用前景分析
大数据·运维·自动化
芥子沫1 小时前
书签管理工具使用:Readeck-Docker部署和使用技巧
运维·docker·容器·书签管理
ba_pi1 小时前
每天写点什么2026-01-19-docker如何使用GPU
运维·docker·容器
xlq223221 小时前
4.LInux权限
linux·运维·服务器
HiTomcat1 小时前
一键自动化部署 macOS 开发环境
运维·macos·自动化
Gold Steps.1 小时前
K8S基于 Argo Rollouts 的高级版本发布实践
云原生·容器·kubernetes
Bdygsl1 小时前
Linux(10)—— 进程控制(等待)
linux·运维·服务器
重生之绝世牛码1 小时前
Linux软件安装 —— Redis集群安装(三主三从)
大数据·linux·运维·数据库·redis·数据库开发·软件安装
网硕互联的小客服2 小时前
如何彻底删除CentOS自带的postfix服务释放25端口?
linux·运维·centos