Docker 介绍、安装、基础搭建 –01

 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

 

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注