容器,镜像和仓库 | 学习笔记

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 快速学习容器,镜像和仓库

开发者学堂课程【4天Docker 实战-1024程序员节创造营公益课:容器,镜像和仓库 】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/892/detail/14272


容器,镜像和仓库

目录:

一、Docker 底层技术概述

二、访问隔离案例

三、Docker 版本介绍

四、容器和虚拟化概念

五、容器和虚拟化区别

六、Docker 安装部署

七、Docker 常用命令解释

八、Docker 基础命令解释

 

一、Docker 底层技术

Namespaces:

作用:访问隔离

Docker 主要就是借助 Linux 内核技术 Namespace 来做到隔离的,Linux Namespaces 机制提供一种资源隔离方案。PID,IPC,Network 等系统资源不再是全局性的,而是属于某个特定的 Namespace 。每个 namespace 下的资源对于其他 namespace 下的资源都是透明,不可见的。

因此在操作系统层面上看,就会出现多个相同 pid 的进程。系统中可以同时存在两个进程号为 0,1,2 的进程,由于属于不同的 namespace ,所以它们之间并不冲突。

而在用户层面上只能看到属于用户自己 namespace 下的资源,例如使用 ps 命令只能列出自己 namespace 下的进程。这样每个 namespace 看上去就像一个单独的 Linux 系统。

IPC\NetWork\mount\PID\UTS\User 

Control groups:

作用:做资源控制,CPU\MEM\ 宽带等

提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 cpu、memory、磁盘 IO 等等) 的机制,被 LXC、docker 等很多项目用于实现进程资源控制。

cgroup 将任意进程进行分组化管理的 Linux 内核功能。

cgroup 本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O 或内存的分配控制等具体的资源管理功能是通过这个功能来实现的。

Rootfs:

作用:文件系统隔离

1. 访问隔离案例

(1) 挂载镜像文件 iso

[root@docker ~] mount -t iso9660 zechen.iso /mnt

[root@docker ~] ls /mnt

(2)管理服务器

#创建命名空间

[root@docker ~] unshare -m /bin/bash 

#重新挂载

[root@docker ~] mount -t iso9660 -0 loop zechen.iso /mnt 

#重新查看

[root@docker ~]  ls /mnt

自己能看到,切换到其他用户就不能看见文件

2. 退出访问隔离

[root@docker ~] exit

二、docker 的版本

docker 官方提供2种版本,一个是 docker 企业版 docker-EE ,另外一个则是社区版 docker-ce ,我们在学习或者测试环境使用 docker-ce 版本即可。发布版本 docker 更新很快,现在最新的是:20.10

进入官网查看版本发行时间和版本号

 

三、容器和虚拟化

1.概念

镜像可以看做是一个压缩包,里面包含所需要的应用和应用要的配置文件及底层的库、参数、环境变量等。

容器是运行这个压缩包,实现具体功能的存在。

我们来思考以下三个问题:

Q1:我们运行应用,底层总是少不了系统环境的,而每个镜像都需要用,这样不会占用大量存储吗?

不会,docker 可以将一个基础系统镜像可以被多个镜像共用。这里可以代入调用和缓存的概念。保证每个容

器体积小,速度快,性能优。

Q2:我们通过镜像启动容器去使用,更新文件是必然的事情,那镜像岂不是会被多个容器更改,造成冲突?

镜像采用了分层设计,启动容器后,镜像永远是只读属性,只不过在最上层加一层读写层(容器层),如果

需要底层镜像的文件进行更改,读写层会复制一份镜像中的只读层进行写操作,这就是 Copy-On-Write。

Q3:我们想要在一个镜像(Centos7)上创建一个新镜像(Centos7+nginx),新镜像会复制底层镜像吗?

2. 容器技术与虚拟化技术的区别

以往部署一个 Application ,需要硬件支持和操作系统的支持。这样就会导致:

部署非常慢,成本非常高,资源浪费,难于迁移和扩展,可能会被限定硬件厂商

虚拟化技术:

虚拟化是云计算的重要技术,主要用于物理资源的池化,从而弹性的分配给用户.(物理资源包括:服务器,网络和存储)

虚拟化技术出现之后,一个物理机可以部署多个 APP ,每个 APP 运行在独立的 VM 里。优点在于:

资源池:一个物理机的资源分配到了不同的虚拟机里。

容器扩展:加物理机或者虚拟机。

容易云化:阿里云等

虚拟化技术的局限性:

每个虚拟机都是一个完整的操作系统,要给其分配资源,当虚拟机数量增多时,操作系统本身消耗的资源势必增多。  

容器技术:

有效的将单个操作系统的资源划分到孤立的组中,以便更好的在孤立的组之间平衡有冲突的资源使用需求,这种技术就是容器技术。

解决了开发和运维之间的矛盾:在开发和运维之间搭建了一个桥梁,是实现 DevOps 的最佳解决方案。

容器不能进行系统级的更改和配置,对于做驱动开发和内核测试的人员来说,就不适合租赁容器,而虚拟机不存在这一点.

第一步打开虚拟机,并测试网络没有问题

 

四、docker 安装

docker 常见的有3种安装方式,yum、rpm 包、脚本,
我们采用相对简单但对各种环境比较友好的方式:(关防火墙和 selinux )

#安装存储库拓展包
yum install-y yum-utils

#设定存储库
yum-config-manager\
--add-repo\
htts://download.docker.com/linux/centos/docker-ce.repo

#安装三个包
yum-y install docker-ce docker-ce-cli containerd.io

#验证
docker version#查询 docker 版本信息

docker info#查询 docker 详细信息

1.docker 安装与启动

yum install -y epel-release

yum install docker-io # 安装 docker

# 配置文件 /etc/sysconfig/docker 

chkconfig docker on # 加入开机启动

service docker start # 启动 docker 服务

# 基本信息查看

docker version # 查看 docker 的版本号,包括客户端、服务端、依赖的 Go 等

docker info # 查看系统( docker )层面信息,包括管理的 images, containers 数等

docker pull centos 下载

docker images [ centos ] 查看

docker run -i -t centos /bin/bash 

2.镜像的获取

# 搜索镜像

docker search <image> # 在 docker index 中搜索 image

# 下载镜像

docker pull <image>  # 从 docker registry server 中下拉 image

# 查看镜像

docker images: # 列出 images

docker images -a # 列出所有的 images(包含历史)

docker rmi  <image ID>: # 删除一个或多个 image

3.容器的使用

# 使用镜像创建容器

docker run -i -t sauloal/ubuntu14.04

docker run -i -t sauloal/ubuntu14.04 /bin/bash # 创建一个容器,让其中运行 bash 应用,退出后容器关闭

docker run -itd --name centos_aways --restart=always centos

#创建一个名称 centos_aways 的容器,自动重启

# --restart 参数:always 始终重启;on-failure 退出状态非0时重启;默认为,no 不重启

# 查看容器

docker ps :列出当前所有正在运行的 container

docker ps -l :列出最近一次启动的 container

docker ps -a :列出所有的 container(包含历史,即运行过的 container )

docker ps -q :列出最近一次运行的 container ID

# 再次启动容器

docker start/stop/restart <container> #:开启/停止/重启 container

docker start [container_id] #:再次运行某个 container (包括历史container )

#进入正在运行的 docker 容器

docker exec -it [container_id] /bin/bash

docker run -i -t -p <host_port:contain_port> #:映射 HOST 端口到容器,方便外部访问容器内服务,host_port 可以省略,省略表示把 container_port 映射到一个动态端口。

# 删除容器

docker rm <container...> #:删除一个或多个 container

docker rm `docker ps -a -q` #:删除所有的 container

docker ps -a -q | xargs docker rm #:同上, 删除所有的 container

 

五、docker 常用命令

我们知道了镜像和容器分别是什么,他们有什么用,那镜像哪来的呢?

第一种方式:官方镜像仓库。
#查询本地镜像

docker images
#查找镜像
docker search[images]
#下载镜像
docker pull[images:tag]

利用镜像直接创建容器:

docker run+参数 [images:tag]启动命令

#查看现有容器

docker ps-a(加了该选项可以查出未启动的容器)

#指定容器名字

docker run--name[name][image:tag]
docker run-d--name nginx_1 nginxlatest

#镜像用可交互的方式创建容器

docker run-id--name nginx_1 nginxlatest

t 以交互模式运行容量
t 为容器重新分配一个为输入终端

#创建容器并暴露端口

docker run-itd-P 8800:80--name nginx_1 nginx:latest

#进入容器

docker exec-it[容器 ID ]命令

#如何启动和停止容器
docker start/stop [容器 ID ]

#如何删除已停止的容器

docker rm [容器 ID ]

#如何删除所有已停止的容器
docker rm'docker Ps-aq 

#停止所有的 container,这样才能够删除其中的 images:

docker stop $(docker ps -a -q)

#如果想要删除所有 container 的话再加一个指令:

docker rm $(docker ps -a -q) 

#查看当前有些什么 images

docker images

#删除 images,通过 image 的 id 来指定删除谁

docker rmi <image id> 

#想要删除 untagged images ,也就是那些 id 为 <None> 的 image 的话可以用

docker rmi $(docker images | grep "^<none>" | awk "{print $3}")

#要删除全部 image 的话

docker rmi $(docker images -q)

#docker rmi -f tomcat nginx centos:

强制删除多个本地镜像

#docker rmi -f $(docker images -q):

类似于 linux 的管道,删除$表达式里的东西,也就是删除所有本地镜像

 

六、docker 基础命令

●#查看镜像或容器的详细信息:
docker inspect[容器 ID/镜像名: tag ]

●#给镜像添加一一个软链接并改名和标签:

docker tag[oldname:tag]

[newname:tag]
●#删除镜像:
docker rmi 镜像: tag /镜像 ID
●#容器和宿主机之间文件复制
docker cp [文件目录容器 ID :内部路径]

docker cp [容器 ID:内部路径文件目录]

#  从仓库向本地拉取命令

docker  pull 镜像名字[ tag ]    

标签是可以省略的,默认是  :latest

docker  pull  tomcat 

# 移除镜像

docker   rmi   镜像名字[ tag ]            标签是可以省略的,默认是  :latest

docker   rmi    -f  镜像名字[ tag ]        标签是可以省略的,默认是  :latest  

代表强制删除

# 启动一个容器

docker  run  镜像名  

# 查看所有启动的容器

docker  ps  

#关闭一个容器

docker  stop 容器名或者容器 ID

docker  kill  容器名或者容器 ID  

两者的区别是,上边的是温柔关闭,相当于台式电脑,按下了关机按钮,后者则是强制关机,相当于把电源线给拔了。

#移除容器

docker  rm 容器名或者是容器 ID docker  rm  -f    容器名或者是容器 ID   强制删除正在运行的容器

相关文章
|
3月前
|
Kubernetes 应用服务中间件 nginx
k8s学习--k8s集群使用容器镜像仓库Harbor
本文介绍了在CentOS 7.9环境下部署Harbor容器镜像仓库,并将其集成到Kubernetes集群的过程。环境中包含一台Master节点和两台Node节点,均已部署好K8s集群。首先详细讲述了在Harbor节点上安装Docker和docker-compose,接着通过下载Harbor离线安装包并配置相关参数完成Harbor的部署。随后介绍了如何通过secret和serviceaccount两种方式让Kubernetes集群使用Harbor作为镜像仓库,包括创建secret、配置节点、上传镜像以及创建Pod等步骤。最后验证了Pod能否成功从Harbor拉取镜像运行。
174 0
|
5月前
|
存储 运维 数据安全/隐私保护
如何高效利用阿里云Docker镜像仓库管理您的容器镜像
如何高效利用阿里云Docker镜像仓库管理您的容器镜像
|
Docker 容器
阿里云容器镜像仓库
阿里云容器镜像仓库
2165 0
|
8月前
|
域名解析 网络协议 开发工具
容器镜像服务ACR下载不了是什么原因呢?
【1月更文挑战第5天】【1月更文挑战第23篇】 容器镜像服务ACR下载不了是什么原因呢?
150 1
|
8月前
|
安全 应用服务中间件 nginx
Docker基础概念解析:镜像、容器、仓库
当谈到容器化技术时,Docker往往是第一个被提及的工具。Docker的基础概念涵盖了镜像、容器和仓库,它们是理解和使用Docker的关键要素。在这篇文章中,将深入探讨这些概念,并提供更丰富的示例代码,帮助大家更好地理解和应用这些概念。
|
存储 应用服务中间件 nginx
一文搞清楚 Docker 镜像、容器、仓库
Docker 镜像、容器、仓库是 Docker 技术中的三个重要概念.....
5240 1
一文搞清楚 Docker 镜像、容器、仓库
|
应用服务中间件 Shell Linux
容器镜像构建及推送阿里云容器镜像服务测试
容器镜像构建及推送阿里云容器镜像服务测试
容器镜像构建及推送阿里云容器镜像服务测试
|
存储 弹性计算 运维
阿里云容器镜像服务 | 学习笔记
快速学习阿里云容器镜像服务
阿里云容器镜像服务 | 学习笔记
|
运维 云计算 开发者
【Docker】如何将已有的容器打为镜像???
首先,要查看需要打成镜像的容器ID或容器名
754 0
|
数据安全/隐私保护 Docker 容器
容器镜像服务 Docker镜像的基本使用
容器镜像服务 Docker镜像的基本使用
52553 2
下一篇
开通oss服务