1. Docker介绍
1.1 是容器,可以部分完全封闭。封闭意味:一个物质(放到容器),另一个物质(放到容器)隔离
容器可以保护里面的物质
1.2 容器的前世
FreeBASE jail(监狱) ——> Linux vserver 最早的容器技术,研发目地:运行比较危险的程序,进行测试。
问题:还得自己创建管理销毁容器。——>到后期移至到 Linux vserver。Linux vserver是什么,相比虚拟化区别
是什么:那个年代虚拟化流程,半虚拟化,全虚拟化,硬件虚拟化
chroot —–> 完整的根文件系统(FHS)标准的
namespaces —> UTS Mount IPC PID user network
cgroup —> 资源的分配和监控
通过比较复杂的代码开发的过程,调用以上三项技术
实现容器的创建 —-> 管理 —->销毁
1.3 传统虚拟化技术和容器对比
docker 只是管理容器,包括LXC。
虚拟化技术:两大类:
一、软件模拟:先模拟硬件在装系统:1、server 包括硬件、cpud等等 2、Host OS (速度机器内核)操作平台windows 3、 Hypervisor :比如你在vmware 4、Centos OS 你在vmware装的Centos 好处:隔离性强,全都是独立、资源限制。
缺点:1、耗资源 2、如Centos 请求cpu资源的时候,先去找Hypervisor,进行转换。所有在Hypervisor有层层转换,然后在到达Host OS系统的内核,kernel。在到达硬件
二、虚拟化技术的演变:半虚拟化
原理:不在Hypervisor 调用,实现应用调用Host OS,实现资源分配
半虚拟化技术的演变:硬件半虚拟化
原理:Host OS、Hypervisor 打包成一个。就是一个服务器什么也没装,装上这个软件就是一个系统。Vmware EXSI、KVM、XTN。 KVM:装Centos,在装 KVM模块,把Host OS 变成带有KVM内核,提供即使操作系统也是虚拟化。
使得发展非常快,但是还是分配、安装等步骤。大规模移植、分发不实现、因为还得装系统,基于系统。使得用虚拟化计算分发浪费资源,早期有用openstack。自从容器技术出来以后,不需要安装系统,原有系统上达到资源隔离。
1.4 容器的前世今生?
容器是基于操作系统内核实现隔离,不需要操作系统,轻量级的虚拟化技术
早期容器实现:Namespaces 、CCgroups、chroot
实现隔离能力:原理:最下层为Linux →上层为容器引擎 →在上为容器,容器与容器怎么隔离,独立管理的资源,最基础的 名字、IP地址等。 在Linux 上是由uis管理,多台机器中管理网络,主机名等 。还有用户、文件系统FS、进程(IPL进程之间 的隔离)、根隔离(chroot ,比如把/etc设置为 根 chroot /etc ,前提/etc/必须满足FHS)、sdb挂在点隔离、其他按照 需求等 。统称:Namespaces
Linux在内核中通过namespaces,原生支持6种资源隔离,并且直接通过系统调用对外进行输出。
另外,仅靠namespaces,就可以完成容器的功能吗?
不对,我们还需要靠CCgroups 控制每个namespace中的资源分配。
CCgroups:怎么分配cpu、怎么调度、每台都要有一个独立的资源。独立的IO、CPU、硬件机制。要不会导致整个宿主机 挂掉。早期调用需要用C开发调用,很麻烦
直到今生出生:LXC(LinuXContainer) (对于原有的常用功能进行了封装,不用开发写,直接调用代码,方便我们做容 器的生命周期) ,LXC 把文件打包到到本地,但是创建还是很慢的,在跑一遍软件。一致性难、但是最终出现
—– >Docker(dotcloud),加上了常用镜像的技术,centos、windows等等,里面封装了lnmp等不需要跑一遍,启动就 可以。docker 用的=go 语言进行二次开发,性能高,接近c语言的轻量级语言。
2、安装:
yum源准备
curl http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
2.1 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
yum list docker-ce.x86_64 –showduplicates | sort -r
2.2 安装docker-ce –基于阿里云镜像安装docker
安装默认yum提供的版本:yum install -y docker-ce ce (社区) ee(企业)
安装较旧版本(比如Docker 17.03.2) 时需要指定完整的rpm包的包名,并且加上– setopt=obsoletes=0 参数:
yum install -y --setopt=obsoletes=0 \
docker-ce-17.03.2.ce-1.el7.centos.x86_64 \
docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch
2.3 启动Docker服务
systemctl daemon-reload
systemctl restart docker
查看docker信息
[root@docker ~]# docker version 查看版本
Client: Docker Engine - Community CS 架构 c: clinet 客户端Version: 20.10.11 docker 版本API version: 1.41 API的版本Go version: go1.16.9 go语言开发Git commit: dea9396 当前版本提交的信息编号Built: Thu Nov 18 00:38:53 2021 建立时间OS/Arch: linux/amd64 架构多少位Context: defaultExperimental: trueServer: Docker Engine - Community CS 架构 s: server 引擎端Engine:Version: 20.10.11API version: 1.41 (minimum version 1.12)Go version: go1.16.9Git commit: 847da18Built: Thu Nov 18 00:37:17 2021OS/Arch: linux/amd64Experimental: falsecontainerd: containerd 核心组件已经安装Version: 1.4.12GitCommit: 7b11cfaabd73bb80907dd23182b9347b4245eb5drunc:Version: 1.0.2GitCommit: v1.0.2-0-g52b36a2docker-init:Version: 0.19.0GitCommit: de40ad0[root@docker ~]# docker info
Client:Context: defaultDebug Mode: falsePlugins: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: 0Running: 0Paused: 0Stopped: 0Images: 0Server Version: 20.10.11Storage Driver: overlay2 # 存储驱动器,当前流行版本(aufs、overlay、brtfs)overlay2官方 推荐,存储速度也很 ,必须Linux内核是3.18以上,系统必须开d_type,要不用不了Backing Filesystem: xfsSupports d_type: trueNative Overlay Diff: trueuserxattr: falseLogging Driver: json-file # docker 日志存储类型,json-file存在本地在Docker Root Dir:Cgroup Driver: cgroupfsCgroup Version: 1Plugins:Volume: localNetwork: bridge host ipvlan macvlan null overlayLog: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslogSwarm: inactive # 是容器编排的工具,没有看k8s好Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc # 运行容器的标准,docker就是基于runc创建、销毁等等,核心的部分Default Runtime: runcInit Binary: docker-initcontainerd version: 7b11cfaabd73bb80907dd23182b9347b4245eb5drunc version: v1.0.2-0-g52b36a2init version: de40ad0Security Options:seccompProfile: defaultKernel Version: 3.10.0-1160.el7.x86_64Operating System: CentOS Linux 7 (Core)OSType: linuxArchitecture: x86_64CPUs: 1Total Memory: 1.777GiBName: localhost.localdomainID: HE56:OHT2:4HVH:KRJJ:SUS2:RO2Y:PJNX:4RZF:JBNJ:XTI4:VBZQ:4YOCDocker Root Dir: /var/lib/docker docker 日志存储位置,每次docker重启之后,日志会清除, 干净状态运行,可以更改,条件允许,使用单独挂在的ssd或者其他的类型磁盘,防止日志大后,导致跟目录占满Debug Mode: falseRegistry: https://index.docker.io/v1/Labels:Experimental: falseInsecure Registries: 127.0.0.0/8Live Restore Enabled: false # 不打开,重启docker会导致已经在运行的docker不会重新启动。打开后,重启docker经在运行的docker重新启动,不用在手动启动
2.4 配置镜像加速,方便下载镜像
通过这个网站,生成一个镜像私有的链接
阿里云Docker-hub
https://cr.console.aliyun.com/cn-hangzhou/mirrors
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://uoggbpok.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
或者:
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://68rmyzg7.mirror.aliyuncs.com"]
}
3. Docker体系结构
DOCKER_HOST 服务端 Docker_deamon 引擎 。 Containers 维护、管理客户端。 Images 镜像端,本地的镜像存放位置,镜像仓库
clinet 客户端 建立、上传、运行
Registry 存放 Images,官方的dockerhub。提供:1、用户验证功能,有一些镜像是私有的,需要用户名密码、授权。
2、所有镜像索引,快速查找镜像。3、镜像存储
所以正常的流程为:从Registry 把Nginx pull下载到DOCKER_HOST本地images,在y运行成 Containers容器,提供给clinet nginx
将来要实现秒级恢复镜像,需要把镜像pull 到本地。
主要运维管理是镜像、容器、仓库
1、容器的启动
2、pull 想要的镜像
3、制作镜像
4、容器管理命令、开启关闭监控
5、要一致跟新本地仓库,提前准备好传到私有仓库,局域网调用
6、一但docker服务端down ,所有的都销毁了,所以需要做高可用、自愈等等
7、架构,多台主机,云
4. Docker的镜像基础管理
4.1 获取镜像
基础镜像拉取
[root@localhost ~]# docker search centos 搜索列出镜像
[root@localhost ~]# docker pull centos:6.9 拉取镜像
[root@localhost ~]# docker pull centos:7.5.1804
[root@localhost ~]# docker pull nginx 不加版本号下载最新版
[root@localhost ~]# docker pull alpine:3.6
4.2 镜像基本查看
[root@docekr docker]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest ea335eea17ab 6 days ago 141MB
centos 6.9 2199b8eb8390 2 years ago 195MB
centos 7.5.1804 cf49811e3cdb 2 years ago 200MB
alpine 3.6 43773d1dba76 2 years ago 4.03MB
标识镜像唯一性的方法:
1、 REPOSITORY 仓库名字,一般 centos 这种是官方的
2、 TAG 镜像版本
3、 REPOSITORY:TAG 例如:centos:7.5.1804
4、 IMAGE ID 镜像唯一标识,(由sha256算法获得数值,sha256算法默认输出64位的号码, 这里未显示完全,只截取12位),通过 docker image ls –no-trunc ,查看全部64位
[root@docekr docker]# docker image ls --no-trunc
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest sha256:ea335eea17ab984571cd4a3bcf90a0413773b559c75ef4cda07d0ce952b00291 6 days ago 141MB
centos 6.9 sha256:2199b8eb8390197d175b1dd57ed79f53ed92ffa58e23826ada54113262237e56 2 years ago 195MB
centos 7.5.1804 sha256:cf49811e3cdb94cbdfd645f3888d7add06a315449cf2c7ca7b81c312f1e46c63 2 years ago 200MB
alpine 3.6 sha256:43773d1dba76c4d537b494a8454558a41729b92aa2ad0feb23521c3e58cd0440 2 years ago 4.03M
4.3 镜像详细信息查看
查看的必须是已经下载到本地的镜像
[root@docekr docker]# docker image ls |grep centos
centos 6.9 2199b8eb8390 2 years ago 195MB
centos 7.5.1804 cf49811e3cdb 2 years ago 200MB查看inspect的帮助
[root@localhost ~]# docker image inspect --\helpUsage: docker image inspect [OPTIONS] IMAGE [IMAGE...]Display detailed information on one or more imagesOptions:-f, --format string Format the output using the given Go template如何使用inspect
[root@docekr docker]# docker image inspect centos:latest
或者
[root@docekr docker]# docker image inspect 2199b8eb8390
[{"Id": "sha256:2199b8eb8390197d175b1dd57ed79f53ed92ffa58e23826ada54113262237e56","RepoTags": ["centos:6.9"],"RepoDigests": ["centos@sha256:6fff0a9edc920968351eb357c5b84016000fec6956e6d745f695e5a34f18ecd2"],"Parent": "","Comment": "","Created": "2019-03-14T21:22:46.023197937Z","Container": "d3e1bd47b7bc5704e90893c57f35b4b446adc24229e93cec053e5dbddfbd56ce","ContainerConfig": {"Hostname": "d3e1bd47b7bc","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd": ["/bin/sh","-c","#(nop) ","CMD [\"/bin/bash\"]"],"ArgsEscaped": true,"Image": "sha256:2949d2914bc8bcf330ffdea46d30b8798fe9be92c6bfdca14ffb8b3ed4a9afc9","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": {"build-date": "20170406","license": "GPLv2","name": "CentOS Base Image","vendor": "CentOS"}},"DockerVersion": "18.06.1-ce","Author": "","Config": {"Hostname": "","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd": ["/bin/bash"],"ArgsEscaped": true,"Image": "sha256:2949d2914bc8bcf330ffdea46d30b8798fe9be92c6bfdca14ffb8b3ed4a9afc9","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": {"build-date": "20170406","license": "GPLv2","name": "CentOS Base Image","vendor": "CentOS"}},"Architecture": "amd64","Os": "linux","Size": 194752565,"VirtualSize": 194752565,"GraphDriver": {"Data": {"MergedDir": "/var/lib/docker/overlay2/91496c836a1f8000af7d7a870e341d0079ae5217c9e8a2c2a18dc6a1bcce86f0/merged","UpperDir": "/var/lib/docker/overlay2/91496c836a1f8000af7d7a870e341d0079ae5217c9e8a2c2a18dc6a1bcce86f0/diff","WorkDir": "/var/lib/docker/overlay2/91496c836a1f8000af7d7a870e341d0079ae5217c9e8a2c2a18dc6a1bcce86f0/work"},"Name": "overlay2"},"RootFS": {"Type": "layers","Layers": ["sha256:aaa5621d7c0157cae5916c9cca66dd8fc2fb4bdb74813ed463b73d5b58cccfdf"]},"Metadata": {"LastTagTime": "0001-01-01T00:00:00Z"}}
]
4.4 只查看镜像ID
[root@docekr docker]# docker image ls -q
ea335eea17ab
2199b8eb8390
cf49811e3cdb
43773d1dba76
4.5 删除镜像:
删除指定的镜像:
[root@docker ~]# docker image rm IMAGE ID或者REPOSITORY:TAG,其中image rm 可以写成rmi
例如:
[root@docekr docker]# docker image ls |grep centos
centos 6.9 2199b8eb8390 2 years ago 195MB
centos 7.5.1804 cf49811e3cdb 2 years ago 200MB
[root@docker ~]# docker image rm centos:6.9
[root@docker ~]# docker rmi centos:6.9
或者
[root@docker ~]# docker image rm 2199b8eb8390
[root@docker ~]# docker rmi 2199b8eb8390遇到问题:must be forced 必须要强制,有依赖。-f 删除+依赖
[root@docker ~]# docker image rm -f IMAGE ID或者REPOSITORY:TAG
例如:
[root@docker ~]# docker image rm -f centos:6.9 删除所有本地的镜像,上述讲述docker image ls -q 只查看镜像ID
[root@docker ~]# docker image rm `docker image ls -q`
4.6 镜像的导入和导出
场景:局域网电脑,不能上网,只能从镜像服务器上下载
打包导出成文件:
docker image save IMAGE ID > 文件名
或者
docker image save REPOSITORY:TAG > 文件名例子:
root@docekr ~]# docker image ls |greo nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest ea335eea17ab 6 days ago 141MB
[root@docekr ~]# docker image save ea335eea17ab >/root/nginxlatest2.tar
[root@docekr ~]# ll /root/nginx_latest.tar
-rw-r--r-- 1 root root 145916416 Nov 23 22:02 /root/nginx_latest.tar导入打包的镜像:
docker image load -i 文件例子:
[root@docekr ~]# docker rmi ea335eea17ab
[root@docekr ~]# docker image load -i /root/nginx_latest.tar
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 ID: sha256:ea335eea17ab984571cd4a3bcf90a0413773b559c75ef4cda07d0ce952b00291[root@docekr ~]# docker image ls 此时会出现一个问题,没有标签名字,只能重新设置标签:手工镜像打标签
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> ea335eea17ab 6 days ago 141MB
centos 7.5.1804 cf49811e3cdb 2 years ago 200MB
alpine 3.6 43773d1dba76 2 years ago 4.03MB[root@docekr ~]# docker image tag ea335eea17ab nginx:latest
[root@docekr ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest ea335eea17ab 6 days ago 141MB
centos 7.5.1804 cf49811e3cdb 2 years ago 200MB
alpine 3.6 43773d1dba76 2 years ago 4.03MB问题:如果镜像很大,分发慢---docker filter镜像打包跟导入,还有一套命令:
打包:docker import
导入:docker export
注意:这两套命令不能交叉使用,否则导入后,报错open /var/lib/docker/tmp/docker-import-500852078/repositories: no such file or directory
两套命令的区别:
save命令会将镜像完整保存,包括历史版本和元数据信息,所以文件可能比较大
确切的说,export其实是容器的保存,只把镜像当前的状态保存下来,没有历史版本等信息,所有文件比较小
5. 容器的管理
5.1 运行第一个容器 run
5.1.1 交互式的容器:
交互式启动,自动登录后,此时的shell界面不能退出或者不能退出容器,否则容器停止,可以后期做dockerfile验证,搭配–rm镜像名称
交互式启动: docker container run -it (+自己起名字或者不加是随机名字,名字后期管理用) IMAGE ID 或者 REPOSITORY:TAGi交互,t(tty)开一个终端。每开一个窗口就会开启一个tty,回车后容器创建启动进入容器,并且登录。实现隔离自动登陆.
[root@docekr ~]# docker image ls |grep centos
centos 6.9 2199b8eb8390 2 years ago 195MB[root@docekr ~]# docker container run -it 2199b8eb8390
[root@f09f9d4712e8 /]# 查看容器状态
[root@docekr ~]# docker container ps 或者 docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f09f9d4712e8 2199b8eb8390 "/bin/bash" 20 seconds ago Up 19 seconds reverent_mccarthy 参数:
CONTAINER ID 容器的唯一号码(自动生成的)。唯一代表容器的 ID。做容器管理,删除停掉启动重启都要依赖这个ID 或者 NAMES
IMAGE 通过什么镜像
COMMAND 启动容器,运行的第一个命令,交互链接shell窗口
CREATED 已经创建后的时间
STATUS 容器的运行状态 ( Exited 未启动, Up 启动)
PORTS 容器宿主机的端口映射
NAMES 容器的名字(可以自动,也可以手工指定)。不能重名注意:交互式启动,自动登录后,此时的shell界面不能退出或者不能退出容器,否则容器停止,方便后期做dockerfile验证
[root@docekr ~]# docker container run -it 2199b8eb8390
[root@f09f9d4712e8 /]# exit
[root@docekr ~]# [root@docekr ~]# docker container ps -a 通过 ps -a 查看全部
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f09f9d4712e8 2199b8eb8390 "/bin/bash" 17 minutes ago Exited (130) 7 minutes ago reverent_mccarthy
指定容器名启动:
[root@docekr ~]# docker container run -it --name="test_cent7.6" 2199b8eb8390
[root@c43486c07b32 /]# [root@docekr ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c43486c07b32 2199b8eb8390 "/bin/bash" 5 seconds ago Up 5 seconds test_cent7.6
5.1.2 守护式容器启动:
交互式的容器退出后容器消亡,想要维护测试功能的时候用。而守护式容器,只要不停止docker,就一直启动
守护式容器启动:在交互的基础上,添加 -d 参数。
[root@docekr ~]# docker image ls |grep nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest ea335eea17ab 6 days ago 141MB
nginx 1.14 295c7be07902 2 years ago 109MB注意:name不能其带:
[root@docekr ~]# docker run -d --name="testnginx:1.14" 295c7be07902
docker: Error response from daemon: Invalid container name (testnginx:1.14), only [a-zA-Z0-9][a-zA-Z0-9_.-] are allowed.
See 'docker run --help'例子:
[root@docekr ~]# docker run -d --name="test_nginx_1.14" 295c7be07902
或者
[root@docekr ~]# docker run -d --name="test_nginx_1.14" nginx:1.14
37ce57bc91e43d6edaf20946a6146f56aed419d03edbb83a5d21533536458303
[root@docekr ~]#[root@docekr ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
37ce57bc91e4 295c7be07902 "nginx -g 'daemon of鈥 About a minute ago Up About a minute 80/tcp test_nginx_1.14如何进入容器:(后续会详细讲解)
[root@docekr ~]# docker exec -ti 37ce57bc91e4 bash
root@37ce57bc91e4:/#
注意事项:在后文(交互容器,如何退出后继续在后台执行)详细讲解
例如nginx这种,守护式容器启动,使用run -d 就可以。
例如Centos这种,守护式容器启动,使用run -itd
这里由一个知识点,如果在创建容器过程中,本地没有nginx:1.14镜像,在运行docker run -d --name="test_nginx_1.14" nginx:1.14 后,会自动从网络中pull nginx:1.14,在docker run -d --name="test_nginx_1.14" nginx:1.14
查看容器的网关、IP信息
[root@docekr ~]# docker container inspect test_nginx_1.14"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,注意:由于是nginx的镜像,此时外部机器访问不了nginx ,只能宿主机能范访问nginx
宿主机访问:
[root@docekr ~]# curl 172.17.0.2:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p><p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>
如何删除容器:
方法一:手工删除
[root@docekr ~]# docker container ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
37ce57bc91e4 295c7be07902 "nginx -g 'daemon of鈥 19 minutes ago Up 19 minutes 80/tcp test_nginx_1.14
f09f9d4712e8 2199b8eb8390 "/bin/bash" 51 minutes ago Exited (130) 42 minutes ago reverent_mccarthy[root@docekr ~]# docker container rm f09f9d4712e8
f09f9d4712e8
[root@docekr ~]# docker container ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
37ce57bc91e4 295c7be07902 "nginx -g 'daemon of鈥 20 minutes ago Up 20 minutes 80/tcp test_nginx_1.14注意:在运行的容器不能删除,除非 -f 强制删除
[root@docekr ~]# docker container rm 37ce57bc91e4
Error response from daemon: You cannot remove a running container 37ce57bc91e43d6edaf20946a6146f56aed419d03edbb83a5d21533536458303. Stop the container before attempting removal or force remove[root@docekr ~]# docker rm -f 37ce57bc91e4
37ce57bc91e4
方法二:交互式创建容器,退出容器后,容器停止,加上–rm镜像名称参数后,自动删除容器
使用 docker container run -it --name="" --rm 镜像名称[root@docekr ~]# docker image ls |gere ningx
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest ea335eea17ab 6 days ago 141MB
nginx 1.14 295c7be07902 2 years ago 109MB[root@docekr ~]# docker container run -it --name="oldguo_cent76" --rm 295c7be07902 回车后,就会卡住重启一个shell输入docker container ps,发现oldguo_cent76在启动
[root@docekr ~]# docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f682bd703b5f 295c7be07902 "nginx -g 'daemon of鈥 17 seconds ago Up 16 seconds 80/tcp oldguo_cent76在卡住的界面中,ctrl+c 后就会退出
[root@docekr ~]# docker container run -it --name="oldguo_cent76" --rm 295c7be07902^C[root@docekr ~]# 在查看docker container ps -a 没有刚才的容器
[root@docekr ~]# docker container ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES[root@docekr ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest ea335eea17ab 6 days ago 141MB
nginx 1.14 295c7be07902 2 years ago 109M
5.1.3 容器的应用场景
交互式的容器: 工具类: 开发,测试,临时性的任务()
[root@docker ~]# docker container run -it –name="oldguo_cent76" –rm 9f38484d220f
守护式容器: 跑网络服务 ssh(管理自己的docker) nginx tomcat
5.1.4 容器端口的转发
守护式容器,跑nginx tomcat业务,除了宿主机,其他机器无法访问容器的端口。如何实现外部机器访问nginx,做端口转发。
容器内部的80端口映射到宿主机的8080 <==> 外部机器访问宿主机的8080,通过iptables转给容器,访问容器的80端口,注意宿主机的8080端口不要被占用,如果占用,可以使用其他的端口[root@docker /]# docker run -d -p 8080:80 --name="oldguo_nginx_80" nginx:1.14[root@docekr ~]# ip addr |grep ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000inet 10.4.7.7/24 brd 10.4.7.255 scope global noprefixroute ens33[root@docekr ~]# curl 10.4.7.7:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p><p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>[root@docekr ~]# docker container ps -a 内部的tcp 80端口映射到本地的任何地址的8080 通过iptables
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
893203b76bac nginx:1.14 "nginx -g 'daemon of鈥 36 minutes ago Up 36 minutes 0.0.0.0:8080->80/tcp, :::8080->80/tcp oldguo_nginx_8
5.1.5 容器的启动\关闭
守护式容器的关闭和启动
[root@docker /]# docker container stop oldguo_nginx_80
[root@docker /]# docker container start oldguo_nginx_80
交互式的容器的关闭和启动
[root@docker /]# docker container stop nervous_allen
[root@docker /]# docker container start -i nervous_allen 通过这种形式的启动后,把交互式的容器,改成守护式,一再在挂在中,但是如何进入容器,退出还是会停止容器。
停止所有docker
脚本:docker container stop `docker container ls -a |awk '{print $1}' |awk 'NR>1'`
命令:docker container stop `docker container ls -a -q`
注销所有docker
脚本:docker container rm `docker container ls -a |awk '{print $1}' |awk 'NR>1'`
命令:docker container rm `docker container ls -a -q`
5.1.6 容器的连接:
比如不管是交互还是守护,在运行的容器中,如何进入容器:
方法一:attach 把后台运行的程序,镜像链接出前台来
[root@docker /]# docker container attach nervous_allen
小细节:登录docker container attach nervous_allen后,在另一个窗口登录docker container attach nervous_allen,发现一个窗口执行的操作,另一个窗口会跟着做,一个退出,两个都退出
方法二:推荐主推方式
子进程的方式登录(在已有工作容器中生成子进程,做登录(相当于我自己开启了一个/bin/bash,其他在登录有开启一个/bin/bash).可以用于进行容器的调试,退出时也不会影响到当前容器) /bin/bash不会隔离,只是窗口
[root@docker ~]# docker container exec -it nervous_allen /bin/bash注意:启动某些镜像的时候,比如centos ,最后可以不接/bin/bash,
docker container run -it centos启动nginx这些镜像的时候,最后需要接/bin/bash,
docker container run -it nginx /bin/bash有些制作商在镜像中,已经给你写好了,在启动交互式容器后第一个执行的命令是什么,如果第一个是/bin/bash,可以不加。但是像nginx 这种,制作商没写好,所以加/bin/bash或者/bin/sh
交互容器,如何退出后继续在后台执行:
1. 在进入交互式容器后启动/bin/bash,exit后/bin/bash就会退出,容器停止,通过ctrl + P +Q 把/bin/bash 一直丢到后台夯住,然后在通过attach或者把exec -ti 把丢给后台的/bin/bash进程在获取到,重新进如容器
2. 在run容器后,一直让/bin/bash死循环,不建议
docker container run -it –name="" 镜像名 sleep 100000 只要保证sleep足够大,就会一直夯住
3. 让容器中的一个程序一直运行,比如让nginx程序一直在运行(这里的一直运行代表是,启动后类似tail -f 卡住,叫一直运行),这样容器就不会宕,而这个nginx进程不能在后台(后台:也就是容器先启动/bin/bash,nginx虽然一直运行,但是进程是/bin/bash的shell中启动),如果/bin/bash挂了,nginx也是宕的。实现不了容器一直存在,所以要把nginx进程放在前台,夯在前台(前台:容器启动的第一个程序,叫做前台。而第一个进程是一切的开始,所以程序默认不会让这个进程宕掉,所以依赖这个机制,实现一直挂载) 。
制作守护式容器:
1、nginx 类型镜像启动容器后,制作镜像的人,默认让此镜像第一个命令是nginx -g 'daemon off;' 这个就是夯住进程。验证测试:docker container run nginx镜像名,回车后当前界面的shell立即卡住,代表夯住。通过docker container ps 查看此容器,command第一个进程是nginx -g 'daemon off;' ")。所以制作nginx守护式容器: docker container run -d nginx镜像名 ,-d 后台一直运行
[root@docekr ~]# docker container run --name="ceshi_nginx" 295c7be07902[root@docekr ~]# docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7a9495f275eb 295c7be07902 "nginx -g 'daemon off;'" 10 seconds ago Up 8 seconds 80/tcp ceshi_nginx
2、centos 类型镜像,他们的第一个命令是/bin/bash,可以通过docker container run centos镜像名,docker container ps 查看此容器。但是运行 docker container run -d centos镜像名 ,通过docker container ps 查看此容器立马宕掉,因为第一个命令是/bin/bash,他不是一直运行,一直运行是卡住。为了解决这种情况,需要加-it 参数,通过参数开启交互、开一个终端。让后在把这个中终端,通过-d 后台一直运行。所以制作centos守护式容器: docker container run -itd centos镜像名
5.2 docker容器的网络访问详解
docker 默认网络环境原理:宿主机开启docker 0 (相当于端口转发/nat模式)的网卡,宿主机通过docker 0与所有的docker容器链接,默认docker 0 IP是172.17.0.1、容器IP是172.17.0.%。容器上网的也是,docker 容器通过docker 0 ,在接入到宿主机网卡上网。同一台宿主机所有容器都是可以互相通信的。
docker容器的两种端口地址映射:指定映射、 随机映射
原理:(docker 会自动添加一条iptables规则来实现容器内部跟宿主机之间的端口映射)
随机映射:
docker run -P 端口
用-P(大写)标记时,docker会随机选择一个端口映射到容器内部开放的网络端口上。docker run -P 端口
使用-p(小写)标记时则可以指定要映射的端口,并且在一个指定端口上只可以绑定一个容器,支持的格式有:
ip:hostport:containerport
ip::containerport
hostport:containerport例子:
[root@docker ~]# docker container run -d -p 80 --name='n5' nginx:1.14 意思是随机分配一个宿主机的端口号跟容器的80端口地址映射,docker container ps 查看[root@docekr ~]# docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2bab757be50b nginx:1.14 "nginx -g 'daemon off About a minute ago Up About a minute 0.0.0.0:49153->80/tcp, :::49153->80/tcp n5[root@docekr ~]# curl 127.0.0.1:49153
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p><p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@docekr ~]# 例子2:
[root@docker ~]# docker container run -d -p 10.4.7.7::80 --name='n6' nginx:1.14 随机映射,把宿主机的这个容器80端口跟宿主机通信的随机端口做绑定。目前IP只能跟宿主机,跟其他的报错,不知道如何用
应用场景:宿主机IP:端口号:容器端口号
实验对象:
宿主机的IP:10.4.7.7
另一个机器IP:10.4.7.8另一个机器IP:物理机端口:容器端口,这种形式会报错,所以根本用不了这样。
[root@docekr ~]# docker run -it -d -p 10.4.7.8:8084:80 295c7be07902
6ffcd62eb2e3b7481845e6fc2a72cd0d8c3ac789ea5cee79416778b16fd0f02c
docker: Error response from daemon: driver failed programming external connectivity on endpoint festive_chaum (477f2371e937f606d0b0643715ad362bfb6113f2df73effa9589aa8537d68406): Error starting userland proxy: listen tcp4 10.4.7.8:8084: bind: cannot assign requested address.那这个到底有何用处:
这台宿主机机器有多个网卡:10.4.7.7 、10.4.7.9.这时候我们启动多个nginx容器,他们都是80,这个时候,就可以 -p 10.4.7.7:80:容器1的80 -p 10.4.7.9:80:容器1的80。
指定映射:
-p 宿主机端口:容器端口
-p 宿主机ip:宿主机端口:容器端口
-p 宿主机ip::容器端口(随机端口:32768-60999)
-p 宿主机端口:容器端口/udp 选择 tcp 或者udp
-p 81:80 –p 443:443 多端口映射
[root@docker ~]# docker container run -d -p 8080:80 --name='n2' nginx:1.14 *****
[root@docker ~]# docker container run -d -p 10.0.0.100:8081:80 --name='n3' nginx:1.14 ***** 映射到某一个主机地址上的端口指定外网10.0.0.100机器访问8081 访问docker 80[root@docker ~]# docker container run -d -p 172.16.1.200::80 --name='n6' nginx:1.14 随机映射指定外网172.16.1.200访问宿主机任意端口访问docker80
多端口映射:
[root@docker ~]# docker container run -d -p 81:80 –p 443:443 --name='n6' nginx:1.14 多端口映射
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
45defc5f8660 nginx:1.14 "nginx -g 'daemon of…" 6 seconds ago Up 4 seconds 80/tcp, 0.0.0.0:8085->23/tcp, 0.0.0.0:8083->56/tcp oldguo8012
-p 后面不接tcp/udp,默认使用TCP的协议,比如-p 8080:80。如果要进行UDP协议转发,如DNS,需要加上UDP
[root@docker ~]# docker container run -d -p 81:80 –p 443:443/udp --name='n6' nginx:1.14 选择 tcp 或者udp
-p 就是做了iptables,把外部机器访问容器的流量,引入到容器中。所以如果不做-p,可以通过自己添加iptables,做两跳的路由转发一样可以实现。
5.3 容器的其他管理
查看目前所有的容器ID:
docker ps -a -q 等价于: docker container ls -a -q找到容器最新的启动时间 -l :
docker ps -a -q -l
外部调试工具:top
场景:并不是每个docker都可以允许让你登录,但是还想知道容器的状态,就需要使用外部docker命令.查看容器的top:
docker top 容器的ID例子:[root@docekr ~]# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
452f295a0ef2 295c7be07902 "nginx -g 'daemon off 2 hours ago Up 2 hours 10.4.7.7:8084->80/tcp epic_herschel[root@docekr ~]# docker container top 452f295a0ef2
UID PID PPID C STIME TTY TIME CMD
root 3840 3822 0 11:4 pts/0 00:00:00 nginx: master process nginx -g daemon off;
101 3866 3840 0 11:4 pts/0 00:00:00 nginx: worker process
查看容器内部的日志:
1、查看容器日志: docker container logs 容器ID[root@docekr ~]# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
452f295a0ef2 295c7be07902 "nginx -g 'daemon of鈥 2 hours ago Up 2 hours 10.4.7.7:8084->80/tcp epic_herschel[root@docekr ~]# docker container logs 452f295a0ef2
10.4.7.7 - - [24/Nov/2021:14:09:35 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
10.4.7.1 - - [24/Nov/2021:14:09:43 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36" "-"
2021/11/24 14:09:43 [error] 7#7: *2 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 10.4.7.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "10.4.7.7:8084", referrer: "http://10.4.7.7:8084/"
10.4.7.1 - - [24/Nov/2021:14:09:43 +0000] "GET /favicon.ico HTTP/1.1" 404 571 "http://10.4.7.7:8084/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36" "-"
[root@docekr ~]# 2、查看容器日志,并显示时间方面等:docker container logs -t 容器ID
3、实施动态监控,跟 tail -f 一个功能:docker logs -f 容器ID
4、显示最后10行,动态监控查看容器日志,并显示时间等方面:docker logs -tf --tail 10 容器ID
针对大量容器,大量日志,通过架构,容器化集群,日志怎么看很多 → elk、efk 等
中心化 :数据中心 idc物理服务器搭建
云化 : 去中心化 ,云计算
容器内部命令CP:
需求1:已经启动了nginx容器,如何把编写好的index.html替换到容器/usr/share/nginx/html/下
使用方案:docker container cp 文件 容器的名字:容器的路径[root@docekr ~]# docker run -d -p 8085:80 --name="testnginx" 295c7be07902
[root@docekr ~]# curl 127.0.0.1:8085
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
.....
</html>[root@docekr ~]# echo "nihao" > index.html
[root@docekr ~]# docker container cp index.html testnginx:/usr/share/nginx/html/
[root@docekr ~]# curl 127.0.0.1:8085
nihoa
[root@docekr ~]# 需求2:已经启动了nginx容器,如何把容器的文件下载到本地[root@docekr ~]# docker container cp testnginx:/usr/share/nginx/html/50x.html ./
[root@docekr ~]# ll 50x.html
-rw-r--r-- 1 root root 537 Dec 4 2018 50x.html
[root@docekr ~]# 思考:如果每次运行完容器后,都需要手动拷贝文件到容器中,还是很麻烦,或者以后如果修index.html,还得继续cp一次。简化操作步骤,直接让docker中的容器,调用的是本地的index,html,这样实现本地修改,直接关联容器。设置数据卷。
5.4 docker的数据卷实现持久化存储
5.4.1 手工交互数据:
[root@docker opt]# docker container cp index.html n1:/usr/share/nginx/html/
[root@docker opt]# docker container cp n1:/usr/share/nginx/html/50x.html ./
5.4.2 Volume实现宿主机和容器的数据共享
把容器/usr/share/nginx/html 目录映射到本地 /opt/html
[root@docker opt]# mkdir -p /opt/html
[root@docker ~]# docker run -d --name="nginx_3" -p 83:80 -v /opt/html:/usr/share/nginx/html nginx:1.14注意:如果容器没有/usr/share/nginx/html会自动创建
作用: 容器数据持久化存储。把容器中重要的目录或者文件,进行数据持久化,就算容器被删除,本地磁盘数据不会删除。比如nginx容器主要是conf跟html ,做成数据卷就算挂了,也没事。
5.4.3 共享资源数据卷实现负载均衡
例子: 启动两个nginx容器,分别挂在到宿主机90、91端口,共同挂载一个数据卷,实现静态资源共享,nginx做宿主机90、91端口轮询,实现负载均衡
[root@localhost html]#docker run -d --name="nginx_90" -p 90:80 -v /opt/html:/usr/share/nginx/html nginx:1.14
[root@localhost html]#docker run -d --name="nginx_91" -p 91:80 -v /opt/html:/usr/share/nginx/html nginx:1.14
查看容器数据卷挂在路径:
docker container inspect nginx_91"Mounts": [{"Type": "bind","Source": "/opt/html","Destination": "/usr/share/nginx/html","Mode": "","RW": true,"Propagation": "rprivate"}],
5.3.4 集中化管理数据卷容器:
实现效果:比如这类容器,要挂载100个路径,而这种类型的容器还要启动100多个。创建第一个容器,需要写很长的 -v ,而在创建后续的容器,还的继续写这么长,无疑是增加了工作量。如果第一个容器建立完成之后,其他的容器在此模板上创建,是不是就会简化-v 的内容。
1、先创建第一个数据卷容器
docker run -it --name "nginx_test_volumes" -v /opt/Volume/a:/opt/a -v /opt/Volume/b:/opt/b centos:6.9 /bin/bash ,通过ctrl + p + q 后台运行2、创建其他的容器 , 调用第一个数据卷容器 --volumes-from 作为模板。
docker run -d -p 8085:80 --volumes-from nginx_test_volumes --name "n8085" nginx
docker run -d -p 8086:80 --volumes-from nginx_test_volumes --name "n8086" nginx
作用: 在集中管理集群中,大批量的容器都需要挂载相同的多个数据卷时,可以采用数卷容器进行统一管理
5.5 制作本地局域网yum源
1. 安装vsftpd软件
[root@docker ~]# yum install -y vsftpd
2. 启动ftp
[root@docker ~]# systemctl enable vsftpd
[root@docker ~]# systemctl start vsftpd
3. 上传系统镜像进行到虚拟机
cd /mnt
rz CentOS-6.9-x86_64-bin-DVD1.iso
rz CentOS-7.5-x86_64-bin-DVD1.iso
配置yum仓库
mkdir -p /var/ftp/centos6.9
mkdir -p /var/ftp/centos7.5
镜像挂在到一个目录上去
[root@docker mnt]# mount -o loop /mnt/CentOS-6.9-x86_64-bin-DVD1.iso /var/ftp/centos6.9/
[root@docker mnt]# mount -o loop /mnt/CentOS-7.5-x86_64-bin-DVD1.iso /var/ftp/centos7.5/
windows验证
ftp://192.168.78.4/centos6.9/
优化yum源
cat >/etc/yum.repos.d/ftp_6.repo <<EOF
[ftp]
name=ftpbase
baseurl=ftp://192.168.78.4/centos6.9
enabled=1
gpgcheck=0
EOF
cat >/etc/yum.repos.d/ftp_7.repo <<EOF
[ftp]
name=ftpbase
baseurl=ftp://192.168.78.4/centos7.5
enabled=1
gpgcheck=0
EOF