欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

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

发布时间:2023/12/20 42 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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


 

总结

以上是生活随笔为你收集整理的Docker 介绍、安装、基础搭建 --01的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。