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

本文涉及的产品
容器镜像服务 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 # 在 docker index 中搜索 image

# 下载镜像

docker pull  # 从 docker registry server 中下拉 image

# 查看镜像

docker images: # 列出 images

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

docker rmi  : # 删除一个或多个 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

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

#进入正在运行的 docker 容器

docker exec -it [container_id] /bin/bash

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

# 删除容器

docker rm  #:删除一个或多个 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  

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

docker rmi $(docker images | grep "^" | 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   强制删除正在运行的容器


相关文章
|
2月前
|
存储 数据库 Docker
正确删除容器和镜像的方式
【10月更文挑战第24天】本文介绍了在Docker中如何正确删除容器和镜像,包括停止容器、删除已停止容器、删除未被使用的镜像以及注意事项,如数据备份、依赖关系检查和权限问题。其他容器管理工具的操作类似,但命令和语法可能不同。
231 3
|
29天前
|
Kubernetes 监控 Java
如何在Kubernetes中配置镜像和容器的定期垃圾回收
如何在Kubernetes中配置镜像和容器的定期垃圾回收
|
2月前
|
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拉取镜像运行。
135 0
|
4月前
|
存储 安全 Ubuntu
Docker 镜像与 Docker 容器的区别
【8月更文挑战第27天】
361 5
|
4月前
|
运维 Ubuntu Shell
掌握Docker容器的创建:从镜像到实例
【8月更文挑战第27天】
759 4
|
4月前
|
存储 Ubuntu 应用服务中间件
在Docker中,怎么快速查看本地的镜像和容器?
在Docker中,怎么快速查看本地的镜像和容器?
|
4月前
|
缓存 开发者 Docker
Dockerfile是Docker容器化过程中的核心组件,它允许开发者以一种可重复、可移植的方式自动化地构建Docker镜像
【8月更文挑战第19天】Dockerfile是构建Docker镜像的脚本文件,含一系列指令定义镜像构建步骤。每条大写指令后跟至少一个参数,按序执行,每执行一条指令即生成新的镜像层。常用指令包括:FROM指定基础镜像;RUN执行构建命令;EXPOSE开放端口;CMD指定容器启动行为等。优化策略涉及减少镜像层数、选择轻量基础镜像、利用缓存及清理冗余文件。示例:基于Python应用的Dockerfile包括设置工作目录、复制文件、安装依赖等步骤。掌握Dockerfile有助于高效自动化构建镜像,加速应用部署。
37 1
|
4月前
|
缓存 资源调度 Kubernetes
阿里云云效产品使用合集之如何将两个独立的代码仓库构建并部署到同一个容器内
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
3天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
121 77
|
12天前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序