docker原理介绍以及部署使用
初次接触docker是在2018年,当时也是出于对docker技术的好奇,所以找了一些教学视频以及线上资料进行学习研究,大致了解了一些原理概念以及部署操作等。但是到目前两三年过去,也经历了几个项目,都并未在实际的开发生产环境中使用到docker,反而在公司层面却都要求掌握docker,甚至是Kubernetes等技术,也是一些奇观!在此背景下,再次对docker进行理论学习以及实际的部署使用,汇总总结相关的简要原理概念,重点侧重到安装部署和实际使用相关命令操作等,以便于后续能够快速使用以及后续持续更深入地学习积累,也为后来者提供借鉴参考。文中不免疏漏之处,望读者予以指正,不胜感激!
1. docker简介
Docker是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。
Docker从17.03版本之后分为CE(Community Edition: 社区版)和EE(Enterprise Edition: 企业版)。
Docker的应用场景
Web 应用的自动化打包和发布。
自动化测试和持续集成、发布。
在服务型环境中部署和调整数据库或其他的后台应用。
从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
Docker 的优点
Docker 是一个用于开发,交付和运行应用程序的开放平台。
Docker 能够将应用程序与基础架构分开,从而可以快速交付软件。
借助 Docker,可以与管理应用程序相同的方式来管理基础架构。
通过利用 Docker 的方法来快速交付,测试和部署代码,可以大大减少编写代码和在生产环境中运行代码之间的延迟。
2. docker架构概念
Docker利用Linux中的核心分离机制,例如Cgroups,以及Linux的核心Namespace(名字空间)来创建独立的容器。一句话概括起来Docker就是利用Namespace做资源隔离,用Cgroup做资源限制,利用Union FS做容器文件系统的轻量级虚拟化技术。Docker容器的本质还是一个直接运行在宿主机上面的特殊进程,看到的文件系统是隔离后的,但是操作系统内核是共享宿主机OS,所以说Docker是轻量级的虚拟化技术。
Docker 包括三个基本概念:
(1)镜像(Image)
Docker 镜像(Image),就相当于是一个 root 文件系统。
比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
(2)容器(Container)
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,
镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
(3)仓库(Repository)
仓库可看成一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。
概念 | 说明 |
---|---|
Docker 镜像(Images) | Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。 |
Docker 容器(Container) | 容器是独立运行的一个或一组应用,是镜像运行时的实体。 |
Docker 客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。 |
Docker 主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
Docker Registry | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。 |
Docker Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
3. docker安装部署
3.1 安装环境
linux系统:CentOS Linux release 7.2.1511 (Core)
docker版本:Docker version 20.10.8
3.2 安装步骤
1. 安装辅助工具
yum install -y yum-utils device-mapper-persistent-data lvm2
2. 添加软件源信息,这里使用Docker CE版本。
从2017年3月开始docker在原来的基础上分为两个分支版本: Docker CE 和 Docker EE。Docker CE 即社区免费版,Docker EE 即企业版,强调安全,但需付费使用。
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3. 更新yum,更新yum缓存
yum update
yum makecache fast
4. 移除旧版本
yum remove docker \
5. 安装docker-ce
yum -y install docker-ce
6. 查看docker版本
docker version
7. 启动Docker,然后加入开机启动
systemctl start docker
systemctl enable docker
systemctl status docker
4. docker使用
4.1 镜像管理
1. 列出本地所有镜像
docker images
2. 查找镜像
docker search <IMAGE_ID/NAME>
3. 拉取镜像
docker pull <IMAGE_ID/NAME> :tag
#tag:镜像的标签 如果不指定tag 那么默认用最新的版本
4. 上传镜像
docker push <IMAGE_ID/NAME>
5. 删除镜像
docker rmi <IMAGE_ID/NAME>
6. 例如:
查找nginx镜像:docker search nginx
拉取nginx镜像:docker pull nginx(:版本,默认为latest 最新版本)
删除nginx镜像:docker rmi nginx
4.2 容器管理
1. 启动运行镜像--容器
docker run -p 本机映射端口:镜像映射端口 -d --name 启动镜像容器命名 -e 镜像启动参数 镜像名称:镜像版本号
参数:
-p 本机端口和容器启动端口映射,可以有多个,因为该镜像可能存在多个端口
-d 以守护进程方式后台运行
--name 容器名称
-e 镜像启动参数
例如:docker run -p 8088:80 -d --name nginx-c nginx
2. 列举当前运行的容器
docker ps
-l:显示最后启动的容器
-a:同时显示停止的容器,默认只显示启动状态
3. 检查容器内部信息,查看容器详细信息(输出为Json)
docker inspect 容器名称
-f:查找特定信息,如 docker inspect -f '{{ .NetworkSettings.IPAddress }}'
4. 停止某个容器
docker stop 容器名称
5. 启动某个容器
docker start 容器名称
docker restart 容器名称
6. 移除某个容器
docker rm 容器名称 (容器必须是停止状态)
7. 查看容器日志、运行进程及容器中的变化
docker logs <CONTAINER_ID> -f :输出容器日志,-f 表示实时输出
docker top <CONTAINER_ID>:查看容器中运行的进程
docker diff <CONTAINER_ID>:查看容器中的变化
8. 进入容器中执行相关命令
(1)docker exec -ti <CONTAINER_ID> /bin/bash
-d:分离模式: 在后台运行
-i:即使没有附加也保持STDIN 打开
-t:分配一个伪终端
(2)docker attach <CONTAINER_ID> 连接到启动的容器
docker attach可以attach到一个已经运行的容器的stdin,然后进行命令执行的动作。但是需要注意的是:如果从这个stdin中exit,会导致容器的停止。
9. 复制容器内的文件到宿主机目录上
docker cp <CONTAINER_ID>:path hostpath
10. 挂载
docker run -d -p 8081:8081 --name nginx-c
-v /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
-v /usr/local/nginx/html:/usr/share/nginx/html
nginx
挂载,docker中使用的某些配置文件,可以挂载使用宿主机中的文件
第一个“-v”,挂载配置文件路径;
第二个“-v”,挂载静态文件项目位置路径;
11. 从容器创建一个新的镜像
docker commit -a "author" -m "comment" <CONTAINER_ID> imagename:tag
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。
12. 其他
docker rm `docker ps -a -q`:删除所有容器
docker kill `docker ps -q`
docker rmi `docker images -q -a`
5. 参考资料
[1] https://www.docker.com/
[2] https://www.cnblogs.com/cac2020/p/11359412.html
[3] https://www.cnblogs.com/makelu/p/11018212.html