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的先决条件:
- GNU/Linux x86_64 with kernel version > 3.10
- Docker >= 1.12
- NVIDIA GPU with Architecture > Fermi (2.1)
- 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