Docker基本原理
Docker是在Linux容器里运行应用的一种开源工具,是一种轻量级的虚拟机。把容积化技术做成了标准化平台。Dcoker是基于容器技术的轻量级虛拟化解决方案,docker是由容器引擎,把linux的cgroup、namespaces等容器底层技术进行完美的封装、并抽象为用户提供创建和管理容器的便捷界面(命令行Cli、api等)C/s(1)名称空间(Namespaces)提供容器的隔离工作区的技术容
目录
前言
Docker 是在 Linux 容器里运行应用的一种开源工具,是一种轻量级的虚拟机。把容积化技术做成了标准化平台。
一、Docker 概述
Dcoker是基于容器技术的轻量级虛拟化解决方案,docker是由容器引擎,把linux的cgroup、namespaces等容器底层技术进行完美的封装、并抽象为用户提供创建和管理容器的便捷界面(命令行Cli、api等) C/s
1.虚拟化三种模式
全虚拟化(50%)
半虚拟化(软、硬件结合的方式)
直通(以全硬件的方式实现虚拟化的功能)
2.虚拟化功能
在一个操作系统内,模拟多个操作系统
以软件的方式模拟物理设备的功能
3.三个层面
操作系统层
抽象层
内核层
4.Docker三要素
镜像:模板。组资源集合,包含了应用程序软件包、应用程序相关的依赖包、运行应用程序所需要的基础环境(泛指操作系统环境),可以理解为容器的模板
容器:基于镜像的一种运行时状态
仓库:存放image镜像模板;仓库分类: 公共仓库一》docker hub,私有仓库registry harbor
二、Docker容器概述
1.底层原理
(1)名称空间( Namespaces):提供容器的隔离工作区的技术
容器完美的实现了6个名称空问隔离(namespace资源隔离-用容器化技术封装)
(2)控制组(Control groups):资源管理功能,将应用程序限制为一组特定的资源
控制组允许Docker Engine将可用的硬件资源共享给容器,并有选择地实施限制和约束
mount | 文件系统,挂载点 |
user | 操作进程的用户和用户组 |
pid | 进程编号 |
uts | 主机名和主机域 |
ipc | 信号量、消息队列、共享内存(不同的应用调用内存资源的时候应该使用不同的内存空间) |
net | 网络设备、网络协议栈、端口等 |
2.Docker和虚拟化的区别
特性 | Docker 容器 | 虚拟机虚拟化 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
运行性能 | 接近原生(直接在内核中运行)10%-20% | 50%左右损失 |
磁盘占用 | 50-100MB | 3-5G |
数量 | 成百上千,每个进程可控制一个容器 | 几十个 |
隔离性 | 进程级别 | 操作系统(更彻底) |
操作系统 | 主要支持Linux | 几乎所有 |
封装程度 | 只封装目标代码和依赖关系,共享宿主机内核 | 完整的操作系统,与宿主机隔离 |
3.使用docker有什么意义
相同版本的docker引擎
打包成镜像包,拖到另一个操作系统中(把引擎放在镜像中,带着镜像到处跑)
利用引擎把这个镜像再去运行为之前的相同的一模一样的容器了
镜像——>封装的某一时刻的服务/应用状态
容器——>应用跑起来的状态(正常提供服务的状态—运行时running)
4.docker的应用场景
打包应用程序简单部署。
可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦)例如:需要把服务器从腾讯云迁移到阿里云,如果采用的是 Docker 容器技术,整个迁移的过程只需要在新的服务器上启动我们需要的容器就可以了。
5.Docker引擎( Docker Engine)
Docker Engine是具有以下主要组件的C/S客户端—服务器应用程序
server端:服务器是一种长期运行的程序,称为守护程序进程(dockerd命令)
CLIENT端: REST API,它指定程序可以用来与守护程序进行通信并指示其操作的接口
通过client客户端传入命令,比如以下:
docker run:运行
docker start:开启
docker rm:删除
与sever端进行交互,控制server端进行应命令的操作
三、部署20版Docker
1.关闭防火墙策略
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# setenforce 0
2.安装依赖包
[root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
#device-mapper-persistent-data:存储驱动
#lvm2:控制工具
#设置阿里云镜像源
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
已加载插件:fastestmirror, langpacks
adding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
grabbing file https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo
3.安装docker-ce社区版
[root@localhost ~]# yum install -y docker-ce
[root@localhost ~]# systemctl start docker #直接开启docker
[root@localhost ~]# systemctl enable docker
[root@localhost ~]# vim /etc/docker/daemon.json #镜像加速
{
"registry-mirrors": ["https://zydiol88.mirror.aliyuncs.com"]
}
4.网络优化
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1 #开启路由转发
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@localhost ~]# systemctl restart network
[root@localhost ~]# systemctl restart docker
[root@localhost ~]# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:a3:31:c3:f4 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
...
[root@localhost ~]# docker images #查询镜像列表
REPOSITORY TAG IMAGE ID CREATED SIZE
5.相关命令–查看
查看docker版本
[root@localhost ~]# docker -v #查看docker版本
Docker version 20.10.11, build dea9396
[root@localhost ~]# docker version
Client: Docker Engine - Community #客户端
Version: 20.10.11 #引擎
API version: 1.41 #引擎版本
Go version: go1.16.9 #go语言版本
Git commit: dea9396 #git工具
Built: Thu Nov 18 00:38:53 2021 #创建时间
OS/Arch: linux/amd64 #操作系统
Context: default #连接方式
Experimental: true
Server: Docker Engine - Community #服务端
Engine:
Version: 20.10.11
API version: 1.41 (minimum version 1.12)
Go version: go1.16.9
Git commit: 847da18
Built: Thu Nov 18 00:37:17 2021
OS/Arch: linux/amd64
Experimental: false
containerd: #容器版本
Version: 1.4.12
GitCommit: 7b11cfaabd73bb80907dd23182b9347b4245eb5d
runc: #运行容器版本
Version: 1.0.2
GitCommit: v1.0.2-0-g52b36a2
docker-init: #初始化
Version: 0.19.0
GitCommit: de40ad0
用于显示 docker 的系统级信息,比如内核,镜像数,容器数等
[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)
Server: #服务端
Containers: 0 #容器
Running: 0 #运行个数
Paused: 0 #基础个数
Stopped: 0 #停止个数
Images: 0 #镜像
Server Version: 20.10.11 #版本
Storage Driver: overlay2 #存储引擎
Backing Filesystem: xfs #文件系统
Supports d_type: true #支持的类型
Native Overlay Diff: true #外接的连接性文件
userxattr: false
Logging Driver: json-file #加载驱动
Cgroup Driver: cgroupfs
Cgroup Version: 1 #版本
Plugins:
Volume: local #本地卷
Network: bridge host ipvlan macvlan null overlay #插件支持的网络类型
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: io.containerd.runtime.v1.linux runc io.containerd.runc.v2 #运行环境
Default Runtime: runc #默认的运行时环境:运行时容器
Init Binary: docker-init #镜像基础对应的数据
containerd version: 7b11cfaabd73bb80907dd23182b9347b4245eb5d #容器版本
runc version: v1.0.2-0-g52b36a2 #运行时容器
init version: de40ad0
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-957.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 8
Total Memory: 3.683GiB
Name: localhost.localdomain
ID: HJ3R:CJW2:5CGM:FBT7:APLB:OXJS:JBSZ:XOX7:MH7G:AHM2:7ZNB:HPTD
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries: #私有地址网段
127.0.0.0/8
Live Restore Enabled: false
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
四、Docker镜像操作
1.运行镜像
[root@localhost docker]# docker run hello-world #run的形式运行hello-world镜像
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:cc15c5b292d8525effc0f89cb299f1804f3a725c8d05e158653a563f15e4f685
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
2.镜像工作流程
(1)docker client 客户端连接到服务端(服务端是以一个守护进程的形式跑在操作系统里面的)restfulapi 典型的C/S架构
(2)由docker 服务端的守护进程从docker hub 上下载了镜像(ps:服务端会先检查本地系统是否有这个镜像)
(3)服务端创建了一个新的容器,然后从拉去的这个镜像启动了一个容器,容器执行了脚本/可执行程序让我们可以查看/使用(client)
(4)docker 服务端把这些信息流(传递)返回到客户端并展示出来(展示在终端上)
3.获取镜像
docker search 镜像名 (搜索镜像)
docker pull 镜像:版本号 (获取固定版本镜像)
docker pull 镜像名 (不加版本号默认为获取最新版本)
[root@localhost docker]# docker pull centos:7 #默认下载centos7
7: Pulling from library/centos
2d473b07cdd5: Pull complete
Digest: sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987
Status: Downloaded newer image for centos:7
docker.io/library/centos:7
[root@localhost docker]# docker pull nginx #默认下载nginx的最新版
Using default tag: latest
latest: Pulling from library/nginx
eff15d958d66: Pull complete
1e5351450a59: Pull complete
2df63e6ce2be: Pull complete
9171c7ae368c: Pull complete
020f975acd28: Pull complete
266f639b35ad: Pull complete
Digest: sha256:097c3a0913d7e3a5b01b6c685a60c03632fc7a2b50bc8e35bcaa3691d788226e
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
4.查看镜像列表
[root@localhost docker]# docker images #查看有几个镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest ea335eea17ab 7 days ago 141MB
hello-world latest feb5d9fea6a5 2 months ago 13.3kB
centos 7 eeb6ee3f44bd 2 months ago 204MB
5.获取镜像信息
docker inspect 镜像ID
docker image ls -q #只获取镜像的id号
6.添加镜像标签
[root@localhost docker]# docker tag nginx:latest nginx:lnmp
[root@localhost docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest ea335eea17ab 7 days ago 141MB
nginx lnmp ea335eea17ab 7 days ago 141MB #新的标签,info查不到
hello-world latest feb5d9fea6a5 2 months ago 13.3kB
centos 7 eeb6ee3f44bd 2 months ago 204MB
7.删除镜像
[root@localhost docker]# docker rmi nginx:lnmp
Untagged: nginx:lnmp
[root@localhost docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest ea335eea17ab 7 days ago 141MB
hello-world latest feb5d9fea6a5 2 months ago 13.3kB
centos 7 eeb6ee3f44bd 2 months ago 204MB
docker rmi `docker images -aq` #删除所有的镜像
8.镜像导出/导入
[root@localhost docker]# cd /opt/
[root@localhost opt]# docker save -o nginx_v1 nginx:latest #镜像导出
[root@localhost opt]# ls
containerd nginx_v1 rh
[root@localhost opt]# docker load < nginx_v1 #镜像导入
e1bbcf243d0e: Loading layer [==================================================>] 83.88MB/83.88MB
37380c5830fe: Loading layer [==================================================>] 61.99MB/61.99MB
ff4c72779430: Loading layer [==================================================>] 3.072kB/3.072kB
49eeddd2150f: Loading layer [==================================================>] 4.096kB/4.096kB
1e8ad06c81b6: Loading layer [==================================================>] 3.584kB/3.584kB
8525cde30b22: Loading layer [==================================================>] 7.168kB/7.168kB
Loaded image: nginx:latest
五、容器操作
一般分为两种容器种类:交互式和守护式容器
交互式容器:一般用于测试、开发、临时性任务等
守护式容器:一般用来跑服务
1.查询容器
docker ps -a #查看容器
2.创建容器
格式:docker run [选项] 镜像 [命令] [变量]
-i:让容器的标准输入保持打开
-t:分配一个伪终端
-d:后台守护进程的方式运行
[root@localhost opt]# docker create -it nginx:latest /bin/bash
b7b3fc63703ec1ee322cae249d167741981e5bf92d52aa406d323f46e402389d
[root@localhost opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b7b3fc63703e nginx:latest "/docker-entrypoint.…" 56 seconds ago Created elated_swirles
3.启动容器
[root@localhost opt]# docker start b7b3fc63703e
b7b3fc63703e
[root@localhost opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b7b3fc63703e nginx:latest "/docker-entrypoint.…" 2 minutes ago Up 4 seconds 80/tcp elated_swirles
启动一次性运行容器
持续性运行浪费资源,那么一次性执行如下操作
docker run centos:7 /usr/bin/bash -c ls /
[root@localhost opt]# docker run centos:7 /usr/bin/bash -c ls / #-c:传递命令参数
anaconda-post.log
bin
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
持续后台运行
docker run -d centos:7 /usr/bin/bash -c "while true;do echo hello; done" #后台运行centos:7的容器
4873059a924b7a9b5ca422457b8ece4c5b24187d6930c374f52c34011419ddad
[root@localhost opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4873059a924b centos:7 "/usr/bin/bash -c 'w…" 45 seconds ago Up 45 seconds kind_kepler
f113fa048b8e centos:7 "/usr/bin/bash -c ls…" 4 minutes ago Exited (0) 3 minutes ago sad_carson
b7b3fc63703e nginx:latest "/docker-entrypoint.…" 35 minutes ago Up 32 minutes 80/tcp elated_swirles
4.停止容器
docker stop 容器ID ##停止容器
docker stop b054125b9481 ##停止容器
5.进入/退出容器
使用exec进入的容器状态一定要是运行状态,否则会报错。
docker exec -it 容器ID /bin/bash
exit #退出容器
或者使用run:docker run -it nginx:latest /bin/bash
注意:
docker run -it 会创建前台进程,但是会在输入exit后终止进程
docker attach 会通过连接stdin,连接到容器内输入输出流,会在输入exit后终止容器进程
docker exec -it 会连接到容器,可以像SSH已有进入容器内部,进行操作,可以通过exit退出容器,但是不影响容器运行状态
6.容器的导入/导出
#容器导出
docker export 容器ID > 备份文件名
#容器导入(会生成镜像,而不会创建容器)
cat 备份文件名 | docker import - 仓库名:镜像名
7.删除容器
#删除容器
docker rm 容器ID
#强制删除容器(正在运行的容器)
docker rm -f 容器ID
#批量删除容器(正则表达)
docker ps -a | awk '{print "docker rm"$1}' | bash
#删除非up状态下的
docker rm `docker ps -q`
#批量删除exit状态下的容器
for i in `docker ps -a | grep -i exit | awk '{print $1}'`; do docker rm -f $i;done created
更多推荐
所有评论(0)