文章目录
Linux容器技术
Linux容器其实并不是什么新概念。最早的容器技术可以追遡到1982年Unix系列操作系统上的chroot工具(直到今天,主流的Unix、Linux操作系统仍然支持和带有该工具)。
Docker介绍
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
容器和虚拟机的区别
虚拟机:通过虚拟化技术模拟真实的硬件从而创建出来的一台拥有完整功能的逻辑计算机。
Docker容器:docker容器也是一种虚拟化技术,和传统虚拟化不一样的是docker只模拟一个程序最核心的运行环境,所以十分小巧,启动更快。
Docker虚拟化技术和传统虚拟化技术架构对比:
Docker引擎架构
Docker引擎组成:
Docker运行架构:
Docker底层技术
名称空间:Docker通过名称空间机制为容器提供隔离的工作空间。
控制组:Linux可以通过控制组设置进程使用CPU、内存和I/O资源的限额。Docker引擎正是依赖这种底层技术来限制容器使用的资源。
联合文件系统:可以将其他文件系统合并到一个联合挂载点。联合文件系统是实现Docker镜像的技术基础。Docker镜像可以通过分层来实现继承。
容器格式:Docker引擎将名称空间、控制组和联合文件系统打包到一起所使用的就是容器格式。默认的容器格式是Libcontainer
Linux Namespaces
命名空间(Namespaces)是Linux内核针对实现容器虚拟化而引入的一个强大特性。
每个容器都可以拥有自己独立的命名空间,运行其中的应用都像是在独立的操作系统中运行一样。命名空间保证了容器间彼此互不影响。
namespaces | 系统调用参数 | 隔离内容 | 内核版本 |
---|---|---|---|
UTS | CLONE_NEWUTS | 主机名和域名 | 2.6.19 |
IPC | CLONE_NEWIPC | 信号量、消息队列和共享内存 | 2.6.19 |
PID | CLONE_NEWPID | 进程编号 | 2.6.24 |
Network | CLONE_NEWNET | 网络设备、网络栈、端口等 | 2.6.29 |
Mount | CLONE_NEWNS | 挂载点(文件系统) | 2.4.19 |
User | CLONE_NEWUSER | 用户和用户组 | 3.8 |
CGroups
控制组(CGroups)是Linux内核的一个特性,用来对共享资源进行隔离、限制、审计等。只有能控制分配到容器的资源,Docker才能避免多个容器同时运行时的系统资源竞争。
控制组可以提供对容器的内存、CPU、磁盘IO等资源进行限制。
CGroups能够限制的资源有:
- blkio:块设备IO
- cpu:CPU
- cpuacct:CPU资源使用报告
- cpuset:多处理器平台上的CPU集合
- devices:设备访问
- freezer:挂起或恢复任务
- memory:内存用量及报告
- perf_event:对cgroup中的任务进行统一性能测试
- net_cls:cgroup中的任务创建的数据报文的类别标识符
具体来看,控制组提供如下功能:
- 资源限制(Resource Limitting)组可以设置为不超过设定的内存限制。比如:内存子系统可以为进行组设定一个内存使用上限,一旦进程组使用的内存达到限额再申请内存,就会发出Out of Memory警告
- 优先级(Prioritization)通过优先级让一些组优先得到更多的CPU等资源
- 资源审计(Accounting)用来统计系统实际上把多少资源用到合适的目的上,可以使用cpuacct子系统记录某个进程组使用的CPU时间
- 隔离(Isolation)为组隔离命名空间,这样一个组不会看到另一个组的进程、网络连接和文件系统
- 控制(Control)挂起、恢复和重启等操作
安装Docker后,用户可以在/sys/fs/cgroup/memory/docker/目录下看到对Docker组应用的各种限制项
OCI&OCF
OCI
Open Container-initiative(开源的容器的一个建议或倡导)
-
由Linux基金会主导于2015年6月创立
-
旨在围绕容器格式和运行时制定一个开放的工业化标准
-
contains two specifications
-
the Runtime Specification(runtime-spec)运行时的规范
-
the Image Specification(image-spec) 镜像的规范
OCF
Open Container Format(开源的容器的格式)
runC is a CLI tool for spawning and running containers according to the OCI specification(runC是一个命令行工具,是用于根据OCI规范生成和运行容器)
- Containers are started as a child process of runC and can be embedded into various other systems without having to run a daemon(将容器启动为runC的子进程 可以嵌入到其他各种系统中,而无需运行守护进程)
- runC is built on libcontainer, the same container technology powering millions of Docker Engine installations(runC构建在libcontainer上,这项容器技术为数百万Docker引擎安装提供了动力)
docker提供了一个专门容纳容器镜像的站点:https://hub.docker.com
docker镜像与镜像仓库
为什么镜像仓库名字是Registry而不是repository?在docker中仓库的名字是以应用的名称取名的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9umxw4AZ-1659508274634)(./1659507365253.png)]
docker对象
When you use docker, you are creating and using images, containers, networks, volumes, pluginns, and other objects.(当你使用docker时,你是在创建和使用镜像、容器、网络、卷、插件和其他对象。)
IMAGES
An image is a read-only template with instructions for creating a docker container.(镜像是一个只读的模板 用于创建dorker容器)
Often, an image is based on another image, with some additional customization.(通常,一个镜像基于另一个镜像,并带有一些额外的定制。)
You might create your own images or you might only use those created by others and published in a registry.(您可以创建自己的镜像,也可以只使用其他人创建并在注册表中发布的镜像。)
CONTAINERS
A conntainer is a runnable instance of an image.(容器是镜像的可运行实例。)
You can create, run, stop, move, or delete a container using the docker API or CLI.(您可以使用docker API或CLI创建、运行、停止、移动或删除容器。)
You can connect a container to one or more networks, attach storage to it, or even create a new image based on its current state.(您可以将一个容器连接到一个或多个网络,将存储附加到它,
甚至根据它的当前状态创建一个新镜像)
安装及使用docker
docker安装
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
[root@localhost yum.repos.d]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
[root@localhost yum.repos.d]# wget -c https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@localhost ~]# dnf -y install docker-ce --allowerasing
[root@localhost ~]# systemctl restart docker.service
[root@localhost ~]# systemctl enable docker.service
镜像加速器
[root@localhost ~]# mkdir -p /etc/docker
[root@localhost ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://glvnpwyn.mirror.aliyuncs.com"]
}
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
docker常用操作命令
docker run
参数 | 含义 |
---|---|
-i | 表示交互式运行容器 |
-t | 表示容器启动后会进入命令行。加上-it后,容器创建后就会分配一个伪终端 |
–name | 为创建的容器命名 |
-v | 表示目录映射关系或者容器卷 使用方式为 -v 宿主机路径/卷名:容器路径:选项列表。 如果是宿主机路径,必须使用绝对路径。选项列表可以ro/rw。 可以使用多个-v做多个目录或文件映射。 注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。 |
-p | –public,表示端口映射,前者是宿主机端口,后者是容器内的映射端口。 可以使用多个-p做多个端口映射 |
-d | 创建一个守护式容器在后台运行 |
–rm | 容器退出后即被删除。默认情况下,退出的容器并不会立即删除。在测试时,这个参数很有用,可以避免浪费空间。 |
–gpus | 等于all时,可以使用宿主机上所有的GPU显卡。对于docker 18之前的版本,用nvidia-docker命令来使用GPU |
快捷查询
实现目标 | docker命令 |
---|---|
退出容器同时终止容器运行 | exit或者ctr+d |
退出容器但是不终止容器运行 | ctr+p+q |
在容器外终止容器运行 | docker stop |
重启容器 | docker restart |
查看运行中的容器 | docker ps |
查看所有容器,包括已经停止运行的 | docker ps -a |
删除容器 | docker rm 容器名字/id |
删除镜像 | docker rmi imagename |
在运行的容器中执行命令 | docker exec [OPTIONS] CONTAINER COMMAND [ARG…] |
连接到正在运行的容器 | docker attach [OPTIONS] CONTAINER |
将容器保存为镜像 | docker commit [选项] [容器ID或容器名] [仓库名:标签] |
官网命令查询:https://docs.docker.com/engine/reference/run/
#docker search 从Docker Hub查找镜像
[root@localhost ~]# docker search httpd //查找
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
httpd The Apache HTTP Server Project 3976 [OK]
centos/httpd-24-centos7 Platform for running Apache httpd 2.4 or bui… 44
centos/httpd 35 [OK]
#docker pull 从镜像仓库中拉取或者更新指定镜像
[root@localhost ~]# docker pull httpd //从镜像仓库中拉取httpd 可以接版本 不接为最新版本
Using default tag: latest
latest: Pulling from library/httpd
a2abf6c4d29d: Pull complete
dcc4698797c8: Pull complete
41c22baa66ec: Pull complete
67283bbdd4a0: Pull complete
d982c879c57e: Pull complete
Digest: sha256:0954cc1af252d824860b2c5dc0a10720af2b7a3d3435581ca788dff8480c7b32
Status: Downloaded newer image for httpd:latest
docker.io/library/httpd:latest
#docker images 列出本地镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest dabbfbe0c57b 4 months ago 144MB
#docker create 创建一个新的容器但不启动它
[root@localhost ~]# docker create --name web -p 80:80 httpd
48421722f053a5b6181517a5deb574eba3514685d74ea09df81284412623c920
#docker ps 列出容器
[root@localhost ~]# docker ps -a //-a 列出所有 包括未启动的
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
48421722f053 httpd "httpd-foreground" About a minute ago Created web
#docker start 启动容器 可使用名字 id
[root@localhost ~]# docker start web
web
[root@localhost ~]# docker ps //查看已经启动 并且有端口号
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
48421722f053 httpd "httpd-foreground" 2 minutes ago Up 3 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp web
#docker stop 关闭容器 可以使用名字 id
[root@localhost ~]# docker stop 48421722f053
48421722f053
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# docker restart 重启容器
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
48421722f053 httpd "httpd-foreground" 6 minutes ago Up 5 seconds 5秒 0.0.0.0:80->80/tcp, :::80->80/tcp web
[root@localhost ~]# docker restart web
web
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
48421722f053 httpd "httpd-foreground" 7 minutes ago Up 1 second 1秒 0.0.0.0:80->80/tcp, :::80->80/tcp web
#docker kill 杀死运行中的容器 stop正常退出 kill强制关闭
[root@localhost ~]# docker kill web
web
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
48421722f053 httpd "httpd-foreground" 8 minutes ago Exited (137) 7 seconds ago web
#docker logs 查看日志
[root@localhost ~]# docker logs web
#docker rm 删除一个或多个容器 运行时不可以删除
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
69f8a9712431 busybox "/bin/sh" 11 minutes ago Up 3 minutes test
b597ea864dda httpd "ls" 14 minutes ago Exited (0) 13 minutes ago inspiring_borg
48421722f053 httpd "httpd-foreground" 26 minutes ago Up 16 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp web
[root@localhost ~]# docker stop test //停止
test
[root@localhost ~]# docker rm test //删除test容器
test
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b597ea864dda httpd "ls" 15 minutes ago Exited (0) 15 minutes ago inspiring_borg
48421722f053 httpd "httpd-foreground" 27 minutes ago Up 17 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp web
#docker run 创建一个新的容器并运行一个命令
[root@localhost ~]# docker run -it --name test busybox /bin/sh
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
5cc84ad355aa: Pull complete
Digest: sha256:5acba83a746c7608ed544dc1533b87c737a0b0fb730301639a0179f9344b1678
Status: Downloaded newer image for busybox:latest
/ # exit 交互模式内 如果退出 就会停止容器
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
69f8a9712431 busybox "/bin/sh" About a minute ago Exited (0) 57 seconds ago test
#docker attach 连接到正在运行中的容器
[root@localhost ~]# docker start test
test
[root@localhost ~]# docker attach test
/ # exit 此方式 进入退出后也会自动关闭容器
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
69f8a9712431 busybox "/bin/sh" 6 minutes ago Exited (0) 9 seconds ago test
#docker exec 在运行的容器中执行命令
[root@localhost ~]# docker start test
test
[root@localhost ~]# docker exec -it test /bin/sh
/ # exit 此方式退出 容器还在运行
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
69f8a9712431 busybox "/bin/sh" 9 minutes ago Up About a minute
docker info 显示系统范围的信息
[root@localhost ~]# docker info
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Build with BuildKit (Docker Inc., v0.6.3-docker)
scan: Docker Scan (Docker Inc., v0.9.0)
...
docker inspect 返回有关Docker对象的低级信息
[root@localhost ~]# docker inspect 2dd4b4019147
[
{
"Id": "2dd4b4019147f7409a5bb78869a508149c15e6449412323076564df76f1d12d0",
"Created": "2021-12-01T14:58:17.480606425Z",
"Path": "httpd-foreground",
"Args": [],
"State": {
"Status": "running",
"Running": true,
端口设置
端口的暴露方式
-p / P 选项的使用格式
-p :<ContainerPort> 将指定的容器端口映射至主机所有地址的一个动态端口
-p <HostPort>:<ContainerPort>:映射至指定的主机端口
-p <IP>::<ContainerPort>:映射至指定的主机的 IP 的动态端口
-p <IP>:<HostPort>:<ContainerPort>:映射至指定的主机 IP 的主机端口
-P :暴露所需要的所有端口