赞
踩
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口
1.是一种轻量级的“虚拟机”,Docker是一个用于开发,交付和运行应用程序的开放平台
2.Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源
3.在Linux容器里运行应用的开源工具——》容器引擎,让开发者可以打包大门的应用及依赖包到一个可移植的镜像中,然后发布到任何流行的linux或者window机器中
4.Docker的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器
5.Docker的Logo设计为蓝色鲸鱼,拖着许多集装箱
6.鲸鱼可看作为宿主机,集装箱可理解为相互隔离的容器,每个集装箱中都包含自己的应用程序
7.Docker的设计宗旨:Build,Ship and Run Any App,Anywhere(在任何地方构建,发布和允许任何应用程序)
8.即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统
沙箱(Sandbox):在计算机安全领域,沙箱是一种程序的隔离运行机制
1.沙箱是一个虚拟系统程序,沙箱提供的环境相对于每一个运行的程序都是独立的,而且不会对现有的系统产生影响
2.搭建测试环境,沙箱的应用只能访问自己的应用访问目录,而不能应用之间的资源进行共享,这样就形成了一个相对安全的机制,由于沙箱具有非常良好的独立性、隔离性,所以能够搭建一些具有高风险的软件进行测试,使得应用组件经过Docker的封装,可以随意移植到服务上
namespace | 系统调用参数 | 隔离内容 |
---|---|---|
UTS | CLONE_NEWUTS | 主机名与域名 |
IPC | CLONE_NEWWIPC | 信号量、消息队列和共享内存 |
PID | CLONE_NEWPID | 进程编号 |
NETWORK | CLONE_NEWNET | 网络设备、网络栈、端口等 |
MOUNT | CLONE_NEWNS | 挂载点(文件系统) |
USER | CLONE_NEWUSER | 用户和用户组(3.8以后的内核才支持) |
特性 | Docker容器 | 虚拟机vmware sphere |
---|---|---|
启动速度 | 秒级(进程控制) | 分钟级(来宾操作系统管理) |
计算能力损耗 | 几乎无 | 损耗50%左右 |
性能 | 接近原生 | 弱于 |
系统支持量(单机) | 成百上千(进程) | 一般几十台(操作系统级别) |
隔离性 | 资源隔离/限制 namespace/cgroup (进程级别) | 完全隔离 系统级别(更彻底) |
操作系统 | 主要支持Linux(只需要支持引擎) | 几乎所有(吃宿主机操作系统的支持) |
磁盘占用 | MB | GB (操作系统镜像2G) |
封装程度 | 只打包项目代码和依赖关系,共享宿主机内核 | 完整的操作系统,与宿主机I隔离 |
镜像 | 一个面向Docker容器引擎的只读模板 |
---|---|
容器 | 从镜像创建的运行实例 |
仓库 | 集中保留镜像的地方,分为共有仓库和私有仓库 |
1、镜像
Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向Docker容器引擎的只读模板
通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和配置文件
Docker镜像也是一个压缩包,只是这个压缩包不只是可执行文件,环境部署脚本,它还包含了完整的操作系统。因为大部分的镜像都是基于某个操作系统来构建,所以很轻松的就可以构建本地和远端一样的环境,这也是Docker镜像的精髓
2、容器
Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每–个容器都是相互隔离、互不可见,以保证平台的安全性
可以把容器看做是要给简易版的1inux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序
3、仓库
Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public) 或者私有仓库(Private)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取
仓库分为
公有仓库:Docker官方仓库
私有仓库:个人化、私有化的仓库
Docker的镜像、容器、日志等内容全部都默认存储在/var/lib/docker 目录下
总结:Docker是容器管理工具,容器由镜像创建而来,镜像从仓库中获取而来,仓库分为公有、私有
CentOS安装Docker的两种方式
1.使用CURL获得Docker的安装脚本进行安装
2.使用YUM仓库来安装Docker
#目前 Docker 只能支持 64 位系统 #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 ##上面依赖环境解释 1.yum-utils:提供了 yum-config-manager 工具 2.device mapper: 是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构 3.device mapper存储驱动程序需要 device-mapper-persistent-data 和 lvm2 ######################################################################## #3.设置阿里云镜像源 [root@localhost ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #4.安装 Docker-CE 社区版并设置为开机自动启动 [root@localhost ~]# yum install -y docker-ce docker-ce-cli containerd.io systemctl start docker.service systemctl enable docker.service #安装好的Docker系统有两个程序,Docker.服务端和Docker客户端。其中Docker服务端是个服务进程,负责管理所有容器 #Docker客户端则扮演着Docker.服务端的远程控制器,可以用来控制Docker的服务端进程。大部分情况下Docker服务端和客户揣运行在一·台机器上 #5.查看 docker 版本信息 [root@localhost ~]# docker version 或docker info
1.申请加速器地址
这里我们使用阿里云的镜像,加速镜像下载速度
注册阿里云账号并登录
搜索容器镜像服务
查看操作文档
开启路由转发 是让docker0能根据虚拟机ip为自己所有的docker容器分配虚拟ip
[root@localhost docker]# vim /etc/sysctl.conf [root@localhost docker]# sysctl -p net.ipv4.ip_forward = 1 [root@localhost docker]# systemctl restart network [root@localhost docker]# systemctl restart docker ######################################################################## vim /etc/sysctl.conf net.ipv4.ip_forward=1 #开启路由转发 sysctl -p systemctl restart network systemctl restart docker ##################################################################### #docker-server端配置文件daemon . json [root@localhost docker]# vim /etc/docker/daemon.json { "graph" : " / data/docker" , #数据目录/var/ lib/docker "storage-driver" : "overlay2" , #存储引擎,早期的时候存储引擎使用的是aufs,现在是overlay2 "insecure-registries": [ "registry.access.redhat.com" , "quary.io"] #私有仓库 "registry-mirrors" :[ "https :/lq"] #镜像加速 "bip": "172.17.0.1/24", #docker网络 "exec-opts" : [ "native.cgroupdriver=systemd" ], #启动时候的额外参数(驱动,k8s使用) " live-restore" : true #当docker容器引擎挂掉的时候,使用docker跑起来的容器还能运行(分离) } 以上是建议的配置项 docker容器网络生产经验 docker 的网络建议和宿主机的iP"对照” 比如宿主机 10.2.5.6容器的地址就可以修改为172.5.6.1,这样方便在故障发生时,更容易定位故障节点位置 { "graph":"/data/docker", "storage-driver":"overlay2", "insecure-registries":["registry.access.redhat.com","quary.io"], "bip":"172.17.0.1/24", "exec-opts":["native.cgroupdriver-systemd"], "live-restore":true } [root@localhost docker]# systemctl daemon-reload [root@localhost docker]# systemctl restart docke
[root@nginx1 docker]# docker run hello-world
[root@localhost ~]# docker version 或docker info #显示 Docker 版本信息
docker search //从Docker Hub查找镜像
[root@localhost docker]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
#参数说明:
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否 docker 官方发布
stars: 类似 Github 里面的 star,表示点赞、喜欢的意思
AUTOMATED: 自动构建
docker pull //从镜像仓库中拉取或者更新指定镜像
例:下载nginx
[root@nginx1 docker]# docker pull nginx #如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为latest标签
[root@nginx1 docker]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 605c77e624dd 8 months ago 141MB #解释 REPOSITORY //镜像属于的仓库 TAG //镜像的标签信息,标记同一个仓库中的不同镜像 IMAGE ID //镜像的唯一ID号,唯一标识一个镜像 CREATED //镜像创建时间 SIZE //镜像大小 #选项 -a //列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层) --digests //显示镜像的摘要信息 -f //显示满足条件的镜像 --format //指定返回值的模板文件 --no-trunc //显示完整的镜像信息 -q //只显示镜像ID
[root@nginx1 docker]# docker inspect nginx #获取容器,镜像的元数据 或根据镜像的唯一标识ID号,获取镜像详细信息
镜像下载后存放在/var/lib/dodker
Docker相关的本地资源存放在/var/lib/docker/日录下,其中containers
日录存放容器信息,image日录存放镜像信息,overlay2
目录下存放具体的镜像底层文件
#查看下载的镜像文件信息
[root@localhost docker]# cat /var/lib/docker/image/overlay2/repositories.json
docker tag ##标记本地镜像,将其归入某一仓库
#例:
[root@nginx1 docker]# docker tag nginx:latest nginx:q
[root@nginx1 docker]# docker images #再次查看发现多出一个镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 8 months ago 141MB
nginx q 605c77e624dd 8 months ago 141MB
#格式: docker rmi 镜像名称 docker rmi 镜像标签 #可选项 #注意:如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像 -f :强制删除 #测试模板 [root@nginx1 docker]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx1 latest 605c77e624dd 8 months ago 141MB nginx j 605c77e624dd 8 months ago 141MB nginx latest 605c77e624dd 8 months ago 141MB nginx q 605c77e624dd 8 months ago 141MB hello-world latest feb5d9fea6a5 11 months ago 13.3kB #例: [root@nginx1 docker]# docker rmi nginx1 [root@nginx1 docker]# docker rmi nginx:j [root@nginx1 docker]# docker rmi -f hello-world:latest [root@nginx1 docker]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 605c77e624dd 8 months ago 141MB nginx q 605c77e624dd 8 months ago 141MB #删除所有: docker rmi `docker images -q` #若只想删除centos7 docker rmi `docker images |grep centos:7`
#格式:docker save -o 文件名 镜像名 //将指定镜像保存成 tar 归档文件
#选项:
-o :输出到的文件
#例:
[root@nginx1 docker]# docker save -o nginx1 nginx:latest
导入镜像,可以异地导入,但是必须要有docker引擎,并且版本不可以差太多 #格式:docker load < 存出的文件 #可以选项 -i docker load -i 存出的文件 #例: [root@nginx1 docker]# docker images ##查看一下镜像 REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 605c77e624dd 8 months ago 141MB nginx q 605c77e624dd 8 months ago 141MB [root@nginx1 docker]# docker rmi nginx:latest #删除原有镜像,测试导入 [root@nginx1 docker]# docker load < nginx1 #导入后再次查看镜像就发现还原了 #也可以将导出的镜像以scp方式导到别的服务器上,然后一样导入测试 [root@nginx1 docker]# pwd /etc/docker [root@nginx1 docker]# scp nginx1 192.168.113.127:/opt
默认上传到docker Hub 官方公共仓库,需要注册使用公共仓库的账号https://hub.docker.com
可以使用docker login 命令米输入用户名、密码和邮箱米完成注册和登录
在上传镜像之前,还需要先对本地镜像添加新的标签,然后再使用docker push命令进行上传
docker tag nginx:latest nginx:q #添加新的标签
[root@nginx1 docker]# docker tag 605c77e624dd qjm1/nginx:q 要改为自己的账户名
[root@nginx1 docker]# docker push qjm1/nginx:q
[root@nginx1 docker]# docker login #登录公共仓库
Username: qjm1 #就改为跟他一样的标签
Password:
[root@nginx1 docker]# docker push qjm1/nginx:q
容器创建:就是将镜像加载到容器的过程
#新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器。
#格式:docker create [选项] 镜像
#常用选项:
-i:让容器的输入保持打开
-t:让 Docker 分配一个伪终端
-it:合起来实现和容器交互的作用,运行一个交互式会话shell
-d: 让Docker以后台守护进程运行
#示例:
docker create -it nginx:latest /bin/bash
[root@nginx1 docker]# docker ps -a docker ps -a -------------------------------------------------------------------------------- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8b0a7be0ff58 nginx:latest "/docker-entrypoint.…" 57 seconds ago Created inspiring_swanson 容器的ID号 加载的镜像 运行的程序 创建时间 当前的状态 端口映射 名称 #可查看容器内进程信息 [root@nginx1 docker]# docker container top 21ff89a79426 UID PID PPID C STIME TTY TIME CMD root 11402 11383 0 20:44 pts/0 00:00:00 /bin/bash #查看容器的日志信息,-f 为持续监控,-t 为更加详细显示 [root@nginx1 docker]# docker container logs -ft 21ff89a79426 2022-09-05T12:41:55.754558047Z [root@21ff89a79426 /]# eixt 2022-09-05T12:41:55.754625103Z bash: eixt: command not found 2022-09-05T12:42:00.957197185Z [root@21ff89a79426 /]# exit 2022-09-05T12:42:00.957211833Z exit #选项: -a : 显示所有的容器,包括未运行的 -f : 根据条件过滤显示的内容 --format : 指定返回值的模板文件 -l : 显示最近创建的容器 -n : 列出最近创建的n个容器 --no-trunc : 不截断输出 -q : 静默模式,只显示容器编号 -s : 显示总的文件大小
[root@nginx1 docker]# docker create -it centos:7 /bin/bash #创建一个新的容器但不启动它
#去查询容器会发现状态为Created
[root@nginx1 docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c5a06d3fefe9 centos:7 "/bin/bash" About a minute ago Created
cranky_franklin
#格式: docker start 容器ID ##启动一个或多个已经被停止的容器
[root@nginx1 docker]# docker start 94aee325884f #要停止就stop
[root@nginx1 docker]# docker stop 94aee325884f
#例:
#再去查询状态会发现变成正在运行中
[root@nginx1 docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
94aee325884f nginx:latest "/docker-entrypoint.…" 8 minutes ago Up 20 seconds 80/tcp condescending_shaw
可以直接执行docker run命令,等同于先执行docker create命令,再执行docker start命令
注意:容器是一个与其中运行的sel1命令共存亡的终端,命令运行容器运行,命令结束容器退出
docker 容器默认会把容器内部第一个进程,也就是pid=1的程序作为docker 容器是否正在运行的依据,如果docker容器中pid=1的进程挂了,那么docker容器便会直接退出,也就是说Docker容器中必须有一个前台进程,否则认为容器已经挂掉
(1)检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载
(2)利用镜像创建并启动一个容器
(3)分配一个文件系统给容器,在只读的镜像层外面挂载层可读写层
(4)从宿主 主机配置的网桥接口中桥接一个虚拟机接口到容器中
(5)分配一个地址池中的IP地址给容器
(6)执行用户指定的应用程序,执行完毕后容器被终止运行
#加 -d 选项让 Docker 容器以守护形式在后台运行。并且容器所运行的程序不能结束 #示例1: docker run -itd nginx:latest /bin/bash #示例2:执行后退出 docker run centos:7 /usr/local/bash -c ls / #示例3:执行后不退出,以守护进程方式执行持续性任务 docker run -d centos:7 /usr/local/bash -c "while true;do echo hello;done" #一次性运行centos:7并查看根 [root@nginx1 docker]# docker run centos:7 /usr/bin/bash -c ls / #接着去查询状态会发现是退出状态 [root@nginx1 docker]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6a036e466e1a centos:7 "/usr/bin/bash" 3 seconds ago Exited (0) 1 second ago objective_leakey #退出状态是因为没有设置守护进程,如果想要他持续运行,需要加上 -d,并给他一个持续性任务 [root@nginx1 docker]# docker run -d centos:7 /bin/bash -c "whice true;do echo hello; done" #再去查看状态就会是正在运行 [root@nginx1 docker]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a28917d35e70 centos:7 "/bin/bash -c 'while…" 4 seconds ago Up 4 seconds dazzling_dijkstra #创建容器并持续运行容器 [root@nginx1 docker]# docker run -itd --name test1 centos:7 /bin/bash [root@nginx1 docker]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a934133b75e2 centos:7 "/bin/bash" 32 seconds ago Up 31 seconds test1
-a stdin : 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项; -d : 后台运行容器,并返回容器ID; -i : 以交互模式运行容器,通常与 -t 同时使用; -P : 随机端口映射,容器内部端口随机映射到主机的端口 -p : 指定端口映射,格式为:主机(宿主)端口:容器端口 -t : 为容器重新分配一个伪输入终端,通常与 -i 同时使用; --name="nginx-lb" : 为容器指定一个名称; --dns 8.8.8.8 : 指定容器使用的DNS服务器,默认和宿主一致; --dns-search example.com : 指定容器DNS搜索域名,默认和宿主一致; -h "mars" : 指定容器的hostname; -e username="ritchie" : 设置环境变量; --env-file=[] : 从指定文件读入环境变量; --cpuset="0-2" or --cpuset="0,1,2" : 绑定容器到指定CPU运行; -m : 设置容器使用内存最大值; --net="bridge" : 指定容器的网络连接类型,支持 bridge/host/none/container : 四种类型; --link=[] : 添加链接到另一个容器; --expose=[] : 开放一个端口或一组端口; --volume , -v : 绑定一个卷
[root@nginx1 docker]# docker run -it centos:7 /bin/bash
[root@dc200453a06b /]#
#若想退出则直接exit,但是容器会自动关闭
[root@nginx1 docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dc200453a06b centos:7 "/bin/bash" About a minute ago Exited (127) 12 seconds ago competent_ritchie
[root@nginx1 docker]# docker start dc200453a06b
dc200453a06b
[root@nginx1 docker]# docker exec -it dc200453a06b /bin/bash
[root@dc200453a06b /]#
从主机(宿主机)把文件复制到容器中
[root@nginx1 docker]# echo 123 > /opt/test.txt
[root@nginx1 docker]# cd /opt
[root@nginx1 opt]# cat test.txt
123
[root@nginx1 opt]# docker cp /opt/test.txt a934133b75e2:/opt
[root@nginx1 opt]# docker exec -it a934133b75e2 /bin/bash
[root@a934133b75e2 /]# cd /opt
[root@a934133b75e2 opt]# cat test.txt
123
从容器把文件复制到主机(宿主机)中
[root@nginx1 opt]# docker exec -it a934133b75e2 /bin/bash
[root@a934133b75e2 /]# cd /opt
[root@a934133b75e2 opt]# echo 456 > /opt/a.txt
[root@a934133b75e2 opt]# cat a.txt
456
[root@a934133b75e2 opt]# exit
[root@nginx1 opt]# docker cp a934133b75e2:/opt/a.txt /opt/b.txt
[root@nginx1 opt]# cat /opt/b.txt
456
用户可以将任何一个 Docker 容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker export 命令将已经创建好的容器导出为文件,无论这个容器是处于运行状态还是停止状态均可导出。可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移
#格式:docker export 容器ID > 文件名
#例:
[root@nginx1 docker]# docker export dc200453a06b > centos7-1
[root@nginx1 docker]# ls
centos7-1 daemon.json key.json nginx1 文件名
#格式:docker import 导出的文件名(容器) 指定镜像名称
#例:
[root@nginx1 docker]# docker import centos7-1 centos:7-2
[root@nginx1 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7-2 5e6e3e6b791e 12 seconds ago 204MB
#方法二
#格式:cat 文件名 | docker import – 镜像名称:标签
cat centos7tar | docker import - centos7:test #导入后会生成镜像,但不会创建容器
#格式:docker rm 容器ID #例: [root@localhost opt]# docker rm adf09d4bda14 #强制删除容器(正在运行的) [root@localhost opt]# docker rm -f adf09d4bda14 #批量删除容器 [root@nginx1 docker]# docker rm `docker ps -aq` #通过正则匹配批量删除容器 docker ps -a I awk 'NR>=2(print "docker stop "$1)'I bash #批量停止容器 docker ps -a awk 'NR>=2(print $1}'xargs docker stop docker ps -a I awk 'NR>=2(print "docker rm "$1)'I bash #批量删除所有容器 docker ps -a I awk 'NR>=2(print $1}'xargs docker rm docker images I awk 'NR>=2(print "docker rmi "$3)'I bash #批量删除镜像 docker images I grep none I awk '(print $3)'I xargs docker rmi #删除none镜像 docker rm $(docker ps -a -q) #批量清理后台停止的容器
[root@nginx1 docker]# docker stats
故障演示docker 日志满了 删除日志
#1.创建测试容器 [root@localhost ~]# docker run -itd --name test1 centos:7 /bin/bash #2.进入容器编写模拟故障脚本 [root@localhost ~]# docker ps [root@localhost ~]# docker exec -it 4988373fbaa9 /bin/bash [root@4988373fbaa9 /]# vim 1.sh #!/bin/bash i=0 while true do let i++ echo "hello world $i" done [root@4988373fbaa9 ~]# chmod +x 1.sh [root@4988373fbaa9 ~]# ./1.sh #3.查看日志 [root@localhost containers]# pwd /var/lib/docker/containers [root@localhost containers]# du -sh * #此时磁盘空间应该瞬间爆满了 #4.编写脚本删除日志,可以创建周期性任务什么时候执行一次 [root@localhost containers]# vim 2.sh #!/bin/bash logs=$(find /var/lib/docker/containers/ -name *-json.log) for log in logs do cat /dev/null > $log 或 echo " " > $log done [root@localhost containers]# chmod +x 1.sh [root@localhost containers]# ./1.sh #方法二,直接在配置文件里面限制 ##设置docker日志文件数量及每个日志大小 vim /etc/docker/daemon.json { "registry-mirrors": ["http://f613ce8f.m.daocloud.io"], "log-driver": "json-file", "log-opts": { "max-size" : "500m", "max-file" : "3"} } 修改完需要重新加载 systemctl daemon-reload systemctl restart docker
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。