• 第八章 Docker容器的使用


    一、容器的创建

    容器是指Docker对外提供服务的一个实例。
    
    #1.创建容器的格式:
    docker  run  [option]  image  [cmd]
    
    #2.示例
    [root@m01 ~]# docker run -d --name nginx -p 80:80 nginx
    87594f40bacdc4f94bee5186740a3eae9c179634a58cf7c77b4e16ef984d24e4
    

    二、容器启动参数

    -d 以守护进程方式运行
    -p 指定映射端口
    -P 随机映射端口
    -i 保持标准输入打开
    -t 分配一个伪终端
    -v 设置挂载文件到主机上
    --rm 当容器关闭时自动删除
    --name 为启动的容器设置一个名字
    --network 指定使用哪个网络
    -e 设置容器中的环境变量
    --link 链接到另一个容器
    -h 指定容器内的主机名

    1.格式

    docker run [参数] [镜像名称|ID] [指定的容器运行命令(如果不设置则使用默认命令)]
    

    2.容器启动流程

    1、执行一个docker run
    2、检查本地是否存在所需镜像,如果没有则去远程镜像仓库下载。
    3、按照镜像和参数启动一个容器
    

    3.示例

    #1.-d : 只以守护进程的模式运行一个容器
    [root@docker100 ~]# docker run -d nginx
    aeda72468e4eef99bc648c4f05166d8282c21977afb6d80445c77f612dd6c65b
    
    #2.-i:打开标准输出,-t:创建一个窗口(伪终端)
    [root@docker100 ~]# docker exec -it aeda72468e4e bash
    root@aeda72468e4e:/# 
    
    #3.-p(小写的p字母):指定映射端口
    [root@m01 ~]# docker run -d -p 30080:80 nginx;docker ps
    
    #3.-P(大写的P字母) : 随机映射端口
    [root@docker100 ~]# docker run  -d -P nginx
    9ee77ffb1e5d1a6b37b689b8e030560652c70af20153f0d537ded89a97e3ecef
    [root@docker100 ~]# docker ps -a
    CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                     NAMES
    9ee77ffb1e5d   nginx     "/docker-entrypoint.…"   4 seconds ago   Up 3 seconds   0.0.0.0:49153->80/tcp, :::49153->80/tcp   naughty_ishizaka
    
    #4.-v : 指定挂载卷(将本机的目录映射到容器内部)
    作用:
    	1、将本机目录"软链接"容器内部
    	2、可以持久化容器内部数据
    示例:
    	[root@m01 ~]# docker run -d -P -v /root/test:/usr/share/nginx/html nginx:latest
    
    #5.--name : 指定容器的名称
    作用:
    	1、指定容器名称
    	2、将名称解析到docker dns上
    示例:
    	[root@m01 ~]# docker run -d --name nginx nginx
    
    #6.--link : 将一个容器的网络连接到另外一个容器
    格式:
    	--link 容器名称:连接别名
    	
    示例:
    	[root@m01 ~]# docker run -d --name test_nginx  nginx
    	[root@m01 ~]# docker run -it --link test_nginx:test_nginx centos
    
    #7.--rm : 当容器的生命周期结束时,自动删除容器
    示例:
    	[root@m01 ~]# docker run -d --rm centos sleep 10
    	
    #8.--network : 连接网桥(同一个网桥内的所有容器网络互通)
    示例:
    	[root@m01 ~]# docker network create chenyang
    	[root@m01 ~]# docker run -d --network chenyang nginx
    

    三、停止容器

    docker终止容器是首先向容器发送SIGTERM信号,等待一段时间超时后(默认10秒),再发送SIGKILL信号来终止容器。
    停止容器,并没有删除容器。
    

    1.查看容器进程数

    #1.查看启动的容器进程数
    [root@m01 ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND                  CREATED             STATUS             PORTS                   NAMES
    87594f40bacd   nginx     "/docker-entrypoint.…"   3 minutes ago       Up 3 minutes       0.0.0.0:80->80/tcp      nginx
    1e54552dfbde   nginx     "/docker-entrypoint.…"   About an hour ago   Up About an hour   0.0.0.0:49153->80/tcp   wizardly_carson
    
    参数:
    -a : 查询本机上所有的容器(包括已经停止了的)
    -q : 只显示容器ID
    
    列表参数:
        CONTAINER ID:容器ID
        IMAGE       :镜像ID
        COMMAND     :启动容器运行的命令      
        CREATED     :容器创建的时间
        STATUS      :状态(Up:启动状态  Exitd:停止状态)
        PORTS       :端口映射
        NAMES		:容器名称
    

    2.停止nginx容器

    #1.格式:
    	docker stop [容器ID及名称]
    #2.示例:
    [root@m01 ~]# docker stop nginx
    nginx
    

    3.再次查看容器进程数

    #3.再次查看容器进程数
    [root@m01 ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND                  CREATED             STATUS             PORTS                   NAMES
    1e54552dfbde   nginx     "/docker-entrypoint.…"   About an hour ago   Up About an hour   0.0.0.0:49153->80/tcp   wizardly_carson
    
    可见,NGINX容器已经被我们终止了,这个时候我们也可以重新启动这个容器。
    

    4.启动nginx容器

    #1.格式:
    	docker start [容器ID及名称]
    #2.示例:
    [root@m01 ~]# docker start nginx
    nginx
    [root@m01 ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND                  CREATED             STATUS             PORTS                   NAMES
    87594f40bacd   nginx     "/docker-entrypoint.…"   6 minutes ago       Up 7 seconds       0.0.0.0:80->80/tcp      nginx
    

    四、进入容器

    在使用容器的过程中,我们难免需要进入容器进行排查问题。下面我们就来介绍进入容器的集中方式。
    

    1.attach

    attach是最早docker官方推出的进入容器的命令了,不过使用该命令有一个问题。当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作,当所有窗口退出时,容器结束。
    
    #1.解释:
    		进入容器。通过一个管道连接到容器的顶级进程。
    		缺点:当attach退出是,顺带把顶级进程也带走了。
    #2.格式:
    		docker attach [容器ID或名称]
    #3.示例:
    [root@m01 ~]# docker attach  nginx
    10.0.0.61 - - [11/Jan/2021:13:03:55 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
    

    2. exec(推荐)

    既attach之后,exec是官方推出的有一个新的进入容器的命令,这个命令相当于在容器中执行一个命令。
    
    #1.解释:
    	exec不是进入容器的命令,而是碰巧有这种功能。其功能是在容器外向容器内执行一条命令的命令。
    #2.格式:
    	docker exec [参数] [容器的ID或名称] [命令]
    #3.示例:
    [root@docker ~]# docker exec -i -t ead6cdefcd01 bash
    root@ead6cdefcd01:/#
    [root@m01 ~]# docker exec -it nginx /bin/bash
    root@87594f40bacd:/#
    

    3.nsenter

    需要配合docker inspect来使用(早期没有exec命令时,企业当中最长用的方式之一),Docker是用golang语言开发,所以它也支持go语言的摸版语法。
    
    #1.解释:
    		建立两个进程之间的互通管道
    #2.格式:
    		nsenter --target $( docker inspect -f {{.State.Pid}} nginxv1 ) --mount --uts --ipc --net --pid
    #3.示例:
    [root@m01 ~]# nsenter --target $( docker inspect -f {{.State.Pid}} nginx ) --mount --uts --ipc --net --pid
    mesg: ttyname failed: No such device
    root@87594f40bacd:/# 
    root@87594f40bacd:/# 
    

    4. ssh

    在生产环境中排除了使用docker attach命令进入容器之后,相信大家第一个想到的就是ssh。在镜像(或容器)中安装SSH Server,这样就能保证多人进入容器且相互之间不受干扰了,相信大家在当前的生产环境中(没有使用Docker的情况)也是这样做的。但是使用了Docker容器之后不建议使用ssh进入到Docker容器内。
    
    #1.解释:
    		通过ssh隧道连接
    #2.格式:
    		ssh root@x.x.x.x
    
    5.总结·
    进入docker container中一般情况下有4种方式,最常用的是exec和nsenter这两种。
    
    Nsenter和exec之间的区别?
    1)Exec是docker自带的命令,Nsenter是Linux提供的命令。
    2)Exec相当于在容器内执行一个命令,而Nsenter是仅仅进入容器之中而已。
    

    五、删除容器

    可以使用 docker rm 命令来删除处于终止或退出状态的容器.
    命令格式为:
    docker rm  container。
    
    [root@m01 ~]# docker rm nginx
    
    # 强制删除一个正在运行的容器。
    [root@m01 ~]# docker rm -f nginx
    nginx
    
    # 强制删除所有的容器。
    [root@m01 /docker]# docker container rm $(docker container ls -aq) -f
    

    六、导入与导出容器

    某些时候,需要将容器从一个系统迁移到另外一个系统,此时可以使用 Docker 的导人和导出功能,这也是 Docker 自身提供的一个重要特性。
    

    1. 导出容器

    导出容器是指,导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态 可以使用 docker [container] export 令,该命令格式为:
    
    [root@m01 ~]# docker export daf9c3656be3 > nginx.tar
    [root@m01 ~]# ll | grep nginx.tar
    

    2.导入容器

    导出的文件又可以使用 docker [ container] import 命令导人变成镜像,该命令格式为:
    
    [root@m01 ~]# docker import nginx.tar test/nginx:v1
    sha256:02107323de1b074c5d2034b01eff855fec5922b45776c2721882d100ba6dd15b
    
    [root@m01 ~]# docker images | grep test
    test/nginx                             v1             02107323de1b    22 seconds ago   131MB
    
    实际上,既可以使用 docker load 命令来导入镜像存储文件到本地镜像库,也可以使docker [container] import 命令来导入一个容器快照到本地镜像库 这两者的区别在于 容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积更大 此外,从容器快照文件导人时可以重新指定标签等元数据信息。
    

    七、 查看容器

    查看容器详情可以使用 docker container inspect [OPTIONS] CONTAINER [CONTAINER . .. ]子命令。
    
    #1.格式:
    	docker inspect [容器ID或名称]
    
    #2.示例:
    [root@m01 ~]# docker inspect 22b601ab6f9f
    [
        {
            "Id": "22b601ab6f9f7010221440f1158e0ece348768e4df1b133690f1c503ed012e4d",
            "Created": "2021-01-12T09:29:07.881750107Z",
            "Path": "/docker-entrypoint.sh",
            "Args": [
                "nginx",
                "-g",
                "daemon off;"
            ],
    ...
    
    #3.参数:
    -f : 指定使用golang语言模板	
    [root@m01 ~]# docker inspect -f '{{ .State.Status }}' d4b2a919cb7f
    running
    

    八、容器复制命令详解

    复制命令类似于Linux系统中的scp命令,是将宿主主机上的内容上传到容器中,也可能是将容器中的文件下载到宿主主机中。
    
    #1.格式:
    	第一种:复制到容器内
    		docker cp [宿主主机的路径] [容器ID]:[容器内的路径]
    		
    	第二种:复制到容器外
    		docker cp [容器ID]:[容器内的路径] [宿主主机的路径]
    
    #2.示例:
    $将宿主主机中的文件复制到容器中
    [root@m01 ~]# docker cp start 726b695a337c:/root
    [root@m01 ~]# docker exec 726b695a337c ls /root
    start
    
    $将容器中的内容复制到宿主主机
    [root@m01 ~]# docker cp 726b695a337c:/opt/start .
    [root@m01 ~]# ls | grep start
    Start
    
  • 相关阅读:
    数据库完整性约束
    系统介绍
    全栈性能测试修炼宝典--Jmeter实战(一)
    数据驱动(四)
    数据驱动(五)
    数据驱动(三)
    数据驱动(二)
    数据驱动(一)
    Robot Framework 三种测试用例模式
    sublime text---注释
  • 原文地址:https://www.cnblogs.com/jhno1/p/15262946.html
Copyright © 2020-2023  润新知