• Docker——容器生命周期管理(下篇)


    一、run

    ​创建一个新的容器并运行一个命令

    语法格式
    	docker run [OPTIONS] IMAGE [COMMAND][ARG...]
    备注:
      其实跟docker create一样的语法格式,只不过可以运行容器甚至进入容器内部
    	COMMAND: 需要在容器内执行的命令
    
    • 1
    • 2
    • 3
    • 4
    • 5
    docker run执行流程
      首先在指定镜像上创建一个可写的容器层
      然后使用指定的命令(command)启动它
      docker run 相当于执行力两个API /containers/create 、 ../start
    
    • 1
    • 2
    • 3
    • 4

    1、options说明

    OPtion作用
    -i以交互模式运行,通常与-t同时使用
    -t启动容器后,为容器分配一个命令行,通常与-i同时使用
    -v目录映射,容器目录挂载到宿主机目录,格式<容器目录>
    -d守护进程,后台运行该容器
    -p指定端口映射,格式: 主机(宿主)端口:容器端口
    -P随机端口映射,容器内部端口随机映射到主机的端口
    -u以什么用户身份创建容器
    –name “nginx-lb”容器名字
    -m, --memory bytes设置容器使用内存最大值
    -h, --hostname string指定容器的host name
    –dns 8.8.8.8指定容器 dns 服务器
    -e username=“ritchie”设置环境变量
    –restartDocker 重启后,容器是否自动重启
    –privileged容器内是否使用真正的 root 权限

    2、-p的三种写法

    docker run -p ip:主机端口:容器端口
    docker run -p 主机端口:容器端口(常用)
    docker run -p 容器端口
    
    • 1
    • 2
    • 3

    3、实例1

    使用镜像 tomcat:7 容器命名为tomcat7

    [root@localhost Fancy_Illusion]# docker run --name tomcat7 tomcat:7
    Unable to find image 'tomcat:7' locally
    7: Pulling from library/tomcat
    0bc3020d05f1: Pull complete 
    a110e5871660: Pull complete 
    83d3c0fa203a: Pull complete 
    a8fd09c11b02: Pull complete 
    96ebf1506065: Pull complete 
    26b72ffca293: Pull complete 
    0bffa2ea17aa: Pull complete 
    d880cebcc7a6: Pull complete 
    d19ab8039b36: Pull complete 
    5057492dc495: Pull complete 
    Digest: sha256:f7d37d248d0eacec1e5995736234c9c22155626fcb27ea3ead13b9db24e698f7
    Status: Downloaded newer image for tomcat:7
    Sep 13, 2022 6:58:49 AM org.apache.catalina.startup.VersionLoggerListener log
    INFO: Server version name:   Apache Tomcat/7.0.109
    Sep 13, 2022 6:58:49 AM org.apache.catalina.startup.VersionLoggerListener log
    INFO: Server built:          Apr 22 2021 18:43:38 UTC
    Sep 13, 2022 6:58:49 AM org.apache.catalina.startup.VersionLoggerListener log
    INFO: Server version number: 7.0.109.0
    Sep 13, 2022 6:58:49 AM org.apache.catalina.startup.VersionLoggerListener log
    INFO: OS Name:               Linux
    Sep 13, 2022 6:58:49 AM org.apache.catalina.startup.VersionLoggerListener log
    INFO: OS Version:            3.10.0-1160.el7.x86_64
    Sep 13, 2022 6:58:49 AM org.apache.catalina.startup.VersionLoggerListener log
    INFO: Architecture:          amd64
    Sep 13, 2022 6:58:49 AM org.apache.catalina.startup.VersionLoggerListener log
    INFO: Java Home:             /usr/local/openjdk-8/jre
    Sep 13, 2022 6:58:49 AM org.apache.catalina.startup.VersionLoggerListener log
    INFO: JVM Version:           1.8.0_292-b10
    Sep 13, 2022 6:58:49 AM org.apache.catalina.startup.VersionLoggerListener log
    INFO: JVM Vendor:            Oracle Corporation
    Sep 13, 2022 6:58:49 AM org.apache.catalina.startup.VersionLoggerListener log
    INFO: CATALINA_BASE:         /usr/local/tomcat
    Sep 13, 2022 6:58:49 AM org.apache.catalina.startup.VersionLoggerListener log
    INFO: CATALINA_HOME:         /usr/local/tomcat
    Sep 13, 2022 6:58:49 AM org.apache.catalina.startup.VersionLoggerListener log
    INFO: Command line argument: -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties
    Sep 13, 2022 6:58:49 AM org.apache.catalina.startup.VersionLoggerListener log
    INFO: Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
    Sep 13, 2022 6:58:49 AM org.apache.catalina.startup.VersionLoggerListener log
    INFO: Command line argument: -Djdk.tls.ephemeralDHKeySize=2048
    Sep 13, 2022 6:58:49 AM org.apache.catalina.startup.VersionLoggerListener log
    INFO: Command line argument: -Dorg.apache.catalina.security.SecurityListener.UMASK=0027
    Sep 13, 2022 6:58:49 AM org.apache.catalina.startup.VersionLoggerListener log
    INFO: Command line argument: -Dignore.endorsed.dirs=
    Sep 13, 2022 6:58:49 AM org.apache.catalina.startup.VersionLoggerListener log
    INFO: Command line argument: -Dcatalina.base=/usr/local/tomcat
    Sep 13, 2022 6:58:49 AM org.apache.catalina.startup.VersionLoggerListener log
    INFO: Command line argument: -Dcatalina.home=/usr/local/tomcat
    Sep 13, 2022 6:58:49 AM org.apache.catalina.startup.VersionLoggerListener log
    INFO: Command line argument: -Djava.io.tmpdir=/usr/local/tomcat/temp
    Sep 13, 2022 6:58:49 AM org.apache.catalina.core.AprLifecycleListener lifecycleEvent
    INFO: Loaded Apache Tomcat Native library [1.2.28] using APR version [1.6.5].
    Sep 13, 2022 6:58:49 AM org.apache.catalina.core.AprLifecycleListener lifecycleEvent
    INFO: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
    Sep 13, 2022 6:58:49 AM org.apache.catalina.core.AprLifecycleListener initializeSSL
    INFO: OpenSSL successfully initialized [OpenSSL 1.1.1d  10 Sep 2019]
    Sep 13, 2022 6:58:49 AM org.apache.coyote.AbstractProtocol init
    INFO: Initializing ProtocolHandler ["http-apr-8080"]
    Sep 13, 2022 6:58:49 AM org.apache.catalina.startup.Catalina load
    INFO: Initialization processed in 667 ms
    Sep 13, 2022 6:58:49 AM org.apache.catalina.core.StandardService startInternal
    INFO: Starting service [Catalina]
    Sep 13, 2022 6:58:49 AM org.apache.catalina.core.StandardEngine startInternal
    INFO: Starting Servlet Engine: Apache Tomcat/7.0.109
    Sep 13, 2022 6:58:49 AM org.apache.coyote.AbstractProtocol start
    INFO: Starting ProtocolHandler ["http-apr-8080"]
    Sep 13, 2022 6:58:49 AM org.apache.catalina.startup.Catalina start
    INFO: Server startup in 65 ms
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71

    在这里插入图片描述
    在这里插入图片描述

    这样运行,会直接将容器运行日志打印出来,所以一般都需要加 -d,否则无法继续敲其他命令

    [root@localhost Fancy_Illusion]# docker run -d  --name tomcat8 tomcat:8
    Unable to find image 'tomcat:8' locally
    8: Pulling from library/tomcat
    0e29546d541c: Pull complete 
    9b829c73b52b: Pull complete 
    cb5b7ae36172: Pull complete 
    6494e4811622: Pull complete 
    668f6fcc5fa5: Pull complete 
    dc120c3e0290: Pull complete 
    8f7c0eebb7b1: Pull complete 
    77b694f83996: Pull complete 
    b7c26350ecc2: Pull complete 
    7365b3b02e1b: Pull complete 
    Digest: sha256:421c2a2c73f3e339c787beaacde0f7bbc30bba957ec653d41a77d08144c6a028
    Status: Downloaded newer image for tomcat:8
    dadbab601c2d02a6cd04abf186675ff9c85fc3f8b0989b0391dbd2786dfb367e
    [root@localhost Fancy_Illusion]# docker ps
    CONTAINER ID   IMAGE      COMMAND             CREATED              STATUS              PORTS      NAMES
    dadbab601c2d   tomcat:8   "catalina.sh run"   About a minute ago   Up About a minute   8080/tcp   tomcat8
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这里插入图片描述
    其实打印的在日志就是 catalina.sh run 命令之后的日志

    4、实例2

    使用镜像tomcat:8,以后台模式启动一个容器,容器名字定义为tomcat8

    [root@localhost Fancy_Illusion]# docker run -d  --name tomcat8 tomcat:8
    [root@localhost Fancy_Illusion]# docker ps
    CONTAINER ID   IMAGE      COMMAND             CREATED              STATUS              PORTS      NAMES
    dadbab601c2d   tomcat:8   "catalina.sh run"   About a minute ago   Up About a minute   8080/tcp   tomcat8
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    创建容器之后还能执行其他命令,这样方便很多

    5、实例3

    使用镜像tomcat:9,以后台模式启动一个容器,将容器的8080端口映射到主机的随机端口,容器名字定义为tomcat9999

    [root@localhost Fancy_Illusion]# docker run -d -P --name tomcat9999 tomcat:9
    [root@localhost Fancy_Illusion]# docker ps
    CONTAINER ID   IMAGE      COMMAND             CREATED          STATUS          PORTS                                         NAMES
    685cb359e8f5   tomcat:9   "catalina.sh run"   34 seconds ago   Up 33 seconds   0.0.0.0:49153->8080/tcp, :::49153->8080/tcp   tomcat9999
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    6、实例4

    使用镜像 tomcat:10 ,以后台模式启动一个容器,将容器的 8080 端口映射到主机的 9999 端口,容器名字自定义为 tomcat10

    [root@localhost Fancy_Illusion]# docker run -d -p 9999:8080 --name tomcat10 tomcat:10
    [root@localhost Fancy_Illusion]# docker ps
    21ba2a865991   tomcat:10   "catalina.sh run"   47 seconds ago   Up 45 seconds   0.0.0.0:9999->8080/tcp, :::9999->8080/tcp     tomcat10
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    可以看到 PORTS 一列,主机的 9999 端口指向了容器的 8888 端口

    7、实例5

    使用镜像 tomcat:7,以后台模式启动一个容器,将容器的 8080 端口映射到主机的 9999 端口,容器名字自定义为 tomcat7,主机的目录 /usr/local/tomcat/webapps 映射到容器的 /usr/local/tomcat/webapps,以后直接在主机的 webapps 目录上传 war 包,就能在浏览器访问对应的项目。

    [root@localhost Fancy_Illusion]# docker run -d -p 9999:8080 -i --name tomcat7 -v /usr/local/tomcat/webapps:/usr/local/tomcat/webapps tomcat:7
    a603e1e6d14d   tomcat:7   "catalina.sh run"   38 seconds ago   Up 37 seconds   0.0.0.0:9999->8080/tcp, :::9999->8080/tcp   tomcat7
    
    • 1
    • 2

    8、实例6

    使用镜像 tomcat:7,以后台模式启动一个容器,将容器的 8080 端口映射到主机的 111.20.72.43:8888 端口,容器名字自定义为 tomcat77,主机的目录 /usr/local/tomcat/webapp 映射到容器 /usr/local/tomcat/webapps ,启动容器后,在容器内执行 bash 命令

    注意: 这里不加 -it 的话,容器是无法再启动的,加上才能启动容器并执行 bash 命令

    docker run -d -p 111.20.72.43:8888:8080 -v /usr/local/webapps:/usr/local/webapps -it --name tomcat77 tomcat:7 bash
    
    • 1

    9、实例7

    [root@localhost Fancy_Illusion]# docker run -d --name jenkin2 --privileged=true jenkins/jenkins
    [root@localhost Fancy_Illusion]# docker exec -it jenkin2 bash
    jenkins@49ea055c07c1:/$ 
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    虽然是拥有了 root 权限,但并不一定是 root 用户身份,所以最好加 -uroot 指定 root 用户身份

    • -uroot:是给了 root 用户身份,但并没有真正的 root 权限
    • –privileged:真正让当前用户有了 root 权限

    若想要最高的权限,两者可以结合使用

    8、实例8

    该容器在 Docker 重启后会自动启动无需手动启动

    [root@localhost Fancy_Illusion]# docker ps
    CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS          PORTS                 NAMES
    afb882148e5e   jenkins/jenkins   "/sbin/tini -- /usr/…"   16 seconds ago   Up 15 seconds   8080/tcp, 50000/tcp   jenkins
    [root@localhost Fancy_Illusion]# systemctl restart docker
    [root@localhost Fancy_Illusion]# docker ps
    CONTAINER ID   IMAGE             COMMAND                  CREATED              STATUS         PORTS                 NAMES
    afb882148e5e   jenkins/jenkins   "/sbin/tini -- /usr/…"   About a minute ago   Up 4 seconds   8080/tcp, 50000/tcp   jenkins
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    9、退出容器

    exit	容器直接退出
    ctrl +P +Q 容器不停止退出	
    
    • 1
    • 2

    二、start/stop/restart

    docker start:启动一个或多个已经被停止的容器
    docker stop:停止一个或多个运行中的容器
    docker restart:重启一个或多个容器
    
    • 1
    • 2
    • 3

    1、语法格式

    docker start [OPTIONS] CONTAINER [CONTAINER...]
    docker stop [OPTIONS] CONTAINER [CONTAINER...]
    docker restart [OPTIONS] CONTAINER [CONTAINER...]
    
    • 1
    • 2
    • 3

    2、stop/restart 命令的 options

    option作用
    -t,–time杀死容器之前等待停止的秒数(默认为10)

    根据容器 ID 启动、关闭、重启

    [root@localhost Fancy_Illusion]# docker start afb882148e5e
    afb882148e5e
    [root@localhost Fancy_Illusion]# docker stop afb882148e5e
    afb882148e5e
    [root@localhost Fancy_Illusion]# docker restart afb882148e5e
    afb882148e5e
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    根据容器名字启动、关闭、重启

    [root@localhost Fancy_Illusion]# docker start jenkins
    jenkins
    [root@localhost Fancy_Illusion]# docker stop jenkins
    jenkins
    [root@localhost Fancy_Illusion]# docker restart jenkins
    jenkins
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    启动所有容器

    [root@localhost Fancy_Illusion]# docker start $(docker ps -a -q)
    
    • 1

    关闭所有容器

    [root@localhost Fancy_Illusion]# docker stop $(docker ps -a -q)
    
    • 1

    三、kill

    杀死一个或多个正在运行的容器

    语法格式
    docker kill [OPTIONS] CONTAINER [CONTAINER...]
    
    • 1
    • 2

    1、重点

    	docker kill子命令可杀死一个或多个容器
    	向容器内部的主进程发送SIGKILL 信号(默认),或使用 --signal选项指定的信号
    
    • 1
    • 2

    2、说明

    options作用
    -s发送到什么信号到容器,默认KILL

    3、实例

    根据容器名字杀掉容器

    [root@localhost Fancy_Illusion]# docker kill jenkins
    
    • 1

    根据容器ID杀掉容器

    [root@localhost Fancy_Illusion]# docker kill afb882148e5e
    
    • 1

    四、rm

    删除一个或多个容器

    语法格式
    docker rm [OPTIONS] CONTAINER [CONTAINER...]
    
    • 1
    • 2

    1、说明

    options作用
    -f通过SIGKILL信号删除一个正在运行的容器
    -l移除容器间的网络,而非容器本身
    -v删除与容器映射的目录

    2、实例

    强制删除容器

    docker rm -f name
    
    • 1

    删除所有已停止的容器

    docker rm$(docker ps -a -q)
    
    • 1

    删除所有容器

    docker rm -f $(docker ps -aq)
    docker ps -a -q | xargs docker rm
    
    • 1
    • 2

    删除tomcat

    五、create

    创建一个新的容器但不启动它

    语法格式
    docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
    
    • 1
    • 2
    option作用
    –name指定容器的名字

    实例

    根据 tomcat 镜像,创建一个 myTomcat 容器
    docker create --name=myTomcat tomcat
    
    • 1
    • 2
    [root@localhost ~]# systemctl start docker
    [root@localhost ~]# docker create --name tomcat8 tomcat:8
    [root@localhost ~]# docker images
    REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
    tomcat        8         2d2bccf89f53   8 months ago    678MB
    [root@localhost ~]# docker ps -a
    CONTAINER ID  IMAGE COMMAND CREATED STATUS PORTS NAMES
    5b011e57c4d7   tomcat:8   "catalina.sh run" About a minute ago   Created   tomcat8
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    六、exec

    在正在运行的容器中运行命令

    语法格式
    docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
    
    • 1
    • 2
    options作用
    -d在后台运行命令
    -i即使没有附加也保持STDIN打开,和-t配合
    -t进入容器的CLI模式
    -e设置环境变量
    –env-file读入环境变量文件
    -w需要执行命令的目录
    -u指定访问容器的用户名

    实例

    执行 tomcat 容器的 startup.sh 脚本

    [root@localhost ~]# docker exec -it tomcat8 startup.sh
    Using CATALINA_BASE:   /usr/local/tomcat
    Using CATALINA_HOME:   /usr/local/tomcat
    Using CATALINA_TMPDIR: /usr/local/tomcat/temp
    Using JRE_HOME:        /usr/local/openjdk-11
    Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
    Using CATALINA_OPTS:   
    Tomcat started.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    进入容器的 CLI 模式(最常用)

    [root@localhost ~]# docker exec -it tomcat8 bash
    [root@localhost ~]# docker exec -it tomcat8 bash
    root@5b011e57c4d7:/usr/local/tomcat# 
    root@5b011e57c4d7:/usr/local/tomcat# exit
    exit
    
    • 1
    • 2
    • 3
    • 4
    • 5

    执行普通命令

    [root@localhost ~]# docker exec -it tomcat8 pwd
    [root@localhost ~]# docker exec -it tomcat8 pwd
    /usr/local/tomcat
    
    • 1
    • 2
    • 3

    以 root 用户身份进入容器(重点)

    [root@localhost ~]# docker exec -it -uroot jenkins bash
    root@afb882148e5e:/# 
    
    • 1
    • 2

    好处就是,你在容器里敲命令就是 root 用户,畅通无阻,不存在权限不足的问题

    七、pause/unpause

    docker pause:	暂停一个或多个容器中的所有进程
    docker unpause:	恢复一个或多个容器中的所有进程
    
    • 1
    • 2
    语法格式
    docker pause CONTAINER [CONTAINER...]
    docker unpause CONTAINER [CONTAINER...]
    
    • 1
    • 2
    • 3

    实例

    暂停tomcat容器的服务

    [root@localhost ~]# docker pause tomcat8 
    
    • 1

    恢复tomcat容器的服务

    [root@localhost ~]# docker unpause tomcat8 
    
    • 1
  • 相关阅读:
    U3D外包开发框架及特点
    JDK,JRE和JVM三者间关系
    毕业设计-论文写作笔记【毕设题目类型、论文写作细节、毕设资料】
    FPGA project : sobel
    2022年如何学会成为一名Android开发
    40 个机器学习面试问题(文末福利送书)
    mmpose关键点(四):优化关键点模型(原理与代码讲解,持续更新)
    【Java】各List集合的特点和区别
    Vue的仓库vuex
    「尚硅谷与腾讯云官方合作」硅谷课堂项目视频发布
  • 原文地址:https://blog.csdn.net/weixin_63172698/article/details/133349670