zoukankan      html  css  js  c++  java
  • 2--Docker容器相关命令

    一、docker容器基本操作

    容器就是对外提供服务的一个实例。

    容器启动的必要条件:容器内至少有一个进程运行在前台.

    docker是一个进程隔离的软件,所运行的进程全部都运行在操作系统之上

    一个容器内部只允许运行一个应用

    说明:我们有了镜像才可以创建容器,Linux,下载一个centos镜像来测试学习

    [root@docker ~]# docker pull centos
    Using default tag: latest
    latest: Pulling from library/centos
    7a0437f04f83: Pull complete 
    Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
    Status: Downloaded newer image for centos:latest
    docker.io/library/centos:latest
    

    1、创建容器(运行镜像)

    格式

    docker run [参数] [镜像名称] [运行容器的启动命令]
    
    # ps : 创建容器的命令(并未启动)
    docker create 
    [root@k8s-m-01 ~]# docker create centos bash
    ecfb35a4734e91dff21f6a0dd859083364cc3def4f37434625210a250632f68b
    

    参数

    -d : 以守护进程的方式运行一个容器(后台运行)
    	docker run -d [镜像名称] [cmd]
    
    --name : 指定容器的名称(将容器名称解析到docker DNS上)
    	docker run -d --name [容器名称] [镜像的名称] [cmd]
    
    -p : 指定端口映射
    	docker run -d -p 宿主主机端口:容器内端口 [镜像名称] [cmd]
    
    -P :随机端口映射
    	docker run -d -P [镜像名称] [cmd]
    
    -i : 打开标准输出
    
    -t : 创建一个伪终端
    	docker run -it [镜像名称] [cmd]
    
    -v : 挂载目录到容器中/做目录映射(宿主主机和docker容器主机间的文件共享)
    	docker run -v 宿主主机目录:容器内目录  [镜像名称] [cmd]
    
    --rm : 容器生命周期结束时立即删除该容器
    	docker run --rm [镜像名称] [cmd]
    	参数: -f 强制删除
    
    -e : 在容器中创建一个环境变量
    	docker run -e NAME=Centos -d [镜像名称] [cmd]
    	[root@k8s-m-01 ~]# docker run -it -e NAME=linux12 centos bash
    	[root@aa67f4bebdc1 /]# printenv
    	 ... ...
    	 NAME=linux12
         ... ...
    
    --link : 连接上另外一个容器,实现网络互通
    	docker run --link 被连接的容器的名称:连接别名 [镜像名称] [cmd]
    	注意:给连接起别名最好和被连接的容器的名称一致
    	
    -h : 设置容器主机名
    	docker run -h "主机名"  [镜像名称] [cmd]
    	
    -m : 设置容器内存限制(默认:-1即为不做任何限制)
    

    实例

    [root@docker ~]# docker run -it centos /bin/bash   #启动并进入容器
    WARNING: IPv4 forwarding is disabled. Networking will not work.
    [root@bf0b90672aed /]# ls   #查看容器内的centos,基础版本,很多命令都是不完善的
    bin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  var
    dev  home  lib64  media       opt  root  sbin  sys  usr
    [root@bf0b90672aed /]# exit  #从容器中退回主机(容器停止并退出)
    exit
    Ctrl+p+q快捷键:容器不停止退出
    
    #部署nginx
    [root@docker ~]# docker images
    REPOSITORY         TAG       IMAGE ID       CREATED         SIZE
    nginx              latest    4f380adfc10f   13 days ago     133MB
    alpine             latest    d4ff818577bc   2 weeks ago     5.6MB
    caodan999/alpine   latest    965ea09ff2eb   20 months ago   5.55MB
    nginx              1.12.2    4037a5562b03   3 years ago     108MB
    [root@docker ~]# docker tag  4037a5562b03  caodan/nginx:v1.12.2
    [root@docker ~]# docker images
    REPOSITORY         TAG       IMAGE ID       CREATED         SIZE
    nginx              latest    4f380adfc10f   13 days ago     133MB
    alpine             latest    d4ff818577bc   2 weeks ago     5.6MB
    caodan999/alpine   latest    965ea09ff2eb   20 months ago   5.55MB
    caodan/nginx       v1.12.2   4037a5562b03   3 years ago     108MB
    nginx              1.12.2    4037a5562b03   3 years ago     108MB
    [root@docker ~]# docker run --rm --name mynginx -d -p81:80 caodan/nginx:v1.12.2
    68815d7a018f580343665524fc603032b8565c8389c2ed728bf45d8cc1971879
    [root@docker ~]# docker ps -a
    CONTAINER ID   IMAGE                  COMMAND                  CREATED         STATUS         PORTS                               NAMES
    68815d7a018f   caodan/nginx:v1.12.2   "nginx -g 'daemon of…"   5 seconds ago   Up 3 seconds   0.0.0.0:81->80/tcp, :::81->80/tcp   mynginx
    [root@docker ~]# netstat -lntp |grep 81
    tcp        0      0 0.0.0.0:81              0.0.0.0:*               LISTEN      11835/docker-proxy  
    tcp6       0      0 :::81                   :::*                    LISTEN      11841/docker-proxy  
    [root@docker ~]# curl 127.0.0.1:81
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    ... ...
    
    

    docker run 运行流程

    • 1、检查本地是否用指定镜像,如果没有则去对应的仓库下载镜像
    • 2、启动容器,如果指定了命令则使用指定的命令,如果没有则使用默认的命令
    • 3、返回容器ID

    2、查看本机的容器列表

    格式

    docker ps [参数]
    docker ps # 查看当前系统中正在运行的容器列表
    

    参数

    -a : 查看系统中所有的容器。
    -q : 仅显示容器的ID
    -n=: 显示最近创建的容器
    

    状态解释

    [root@k8s-m-01 ~]#  docker ps -a
    ...   ...   ... 
    
     CONTAINER ID   : 容器ID
     IMAGE       	:镜像名称
     COMMAND         :容器启动时执行的命令 
     CREATED         :容器的创建时间
     STATUS          :容器的状态(up : 正在运行, Exit:退出(停止)状态  Created :已创建状态)
     PORTS           :容器向外暴露的端口
     NAMES			:容器的名称 
     
    

    3、停止和启动一个容器

    停止

    docker stop [容器的ID|名称]
    

    启动(该容器必须是系统已经存在的容器)

    docker start [容器的ID|名称]
    

    重启

    docker  restart [容器的ID|名称]
    

    杀死

     docker  kill  [容器的ID|名称]
    

    实例

    [root@docker ~]# docker run -it centos  #先运行一个容器
    WARNING: IPv4 forwarding is disabled. Networking will not work
    
    [root@6f5810623fa2 /]# exit  #退出并停止运行
    exit
    
    [root@docker ~]# docker ps  #查看正在运行的容器
    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
    
    [root@docker ~]# docker  ps -a  #查看历史运行过的容器
    CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                      PORTS     NAMES
    6f5810623fa2   centos    "/bin/bash"   35 seconds ago   Exited (0) 23 seconds ago             musing_borg
    
    [root@docker ~]# docker start 6f5810623fa2  #开始centos容器
    6f5810623fa2
    
    [root@docker ~]# docker ps  #查看正在运行的容器
    CONTAINER ID   IMAGE     COMMAND       CREATED              STATUS          PORTS     NAMES
    6f5810623fa2   centos    "/bin/bash"   About a minute ago   Up 12 seconds             musing_borg
    
    [root@docker ~]# docker stop 6f5810623fa2  #停止centos容器
    6f5810623fa2
    
    [root@docker ~]# docker ps  #查看正在运行的容器
    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
    

    4、* 端口印射

    -p host_port:container_port

    docker run -p 容器外端口:容器内端口

    [root@docker ~]# systemctl stop firewalld
    [root@docker ~]# setenforce 0
    setenforce: SELinux is disabled
    [root@docker ~]# docker images 
    REPOSITORY        TAG       IMAGE ID       CREATED       SIZE
    caodan920/nginx   v1.20.1   7ca45f2d188b   2 weeks ago   133MB
    nginx             1.20.1    7ca45f2d188b   2 weeks ago   133MB
    [root@docker ~]# docker run --rm --name mynginx -d -p81:80 nginx
    Unable to find image 'nginx:latest' locally
    latest: Pulling from library/nginx
    b4d181a07f80: Already exists 
    66b1c490df3f: Pull complete 
    d0f91ae9b44c: Pull complete 
    baf987068537: Pull complete 
    6bbc76cbebeb: Pull complete 
    32b766478bc2: Pull complete 
    Digest: sha256:3ca76089b14cf7db77cc5d4f3e9c9eb73768b9c85a0eabde1046435a6aa41c06
    Status: Downloaded newer image for nginx:latest
    16e027dfab716d7d243c7d8db9367d3ec802b69b01a36fed62d0455a82d2a1f0
    [root@docker ~]# docker ps -a
    CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                               NAMES
    16e027dfab71   nginx     "/docker-entrypoint.…"   6 seconds ago   Up 5 seconds   0.0.0.0:81->80/tcp, :::81->80/tcp   mynginx
    [root@docker ~]# curl 127.0.0.1:81
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    ... ...
    

    5、* 挂载数据卷

    docker run -v 容器外目录:容器内目录

    [root@docker ~]# mkdir html
    [root@docker ~]# cd html
    [root@docker html]# wget www.baidu.com -O index.html
    --2021-07-08 08:52:39--  http://www.baidu.com/
    Resolving www.baidu.com (www.baidu.com)... 112.80.248.76, 112.80.248.75
    Connecting to www.baidu.com (www.baidu.com)|112.80.248.76|:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 2381 (2.3K) [text/html]
    Saving to: ‘index.html’
    
    100%[=================================>] 2,381       --.-K/s   in 0s      
    
    2021-07-08 08:52:44 (327 MB/s) - ‘index.html’ saved [2381/2381]
    
    [root@docker html]# cat index.html
    <!DOCTYPE html>
    ... ...
    [root@docker html]# cd
    [root@docker ~]# docker run -d --rm --name nginx_baidu -d -p82:80 -v /root/html:/usr/share/nginx/html nginx
    a600e50b1a1ebce161b71dd5c47ce6f2bccb29f558a652adf39047e78f0151f3
    [root@docker ~]# docker ps -a 
    CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                               NAMES
    a600e50b1a1e   nginx     "/docker-entrypoint.…"   19 seconds ago   Up 17 seconds   0.0.0.0:82->80/tcp, :::82->80/tcp   nginx_baidu
    16e027dfab71   nginx     "/docker-entrypoint.…"   13 minutes ago   Up 13 minutes   0.0.0.0:81->80/tcp, :::81->80/tcp   mynginx
    

    查看挂载的详细信息

    [root@docker ~]# docker inspect  nginx_baidu |grep -A 9 'Mounts'
            "Mounts": [
                {
                    "Type": "bind",
                    "Source": "/root/html",
                    "Destination": "/usr/share/nginx/html",
                    "Mode": "",
                    "RW": true,
                    "Propagation": "rprivate"
                }
            ],
    

    6、* 传递环境变量

    -e variate_name=variate_value

    docker run -e 环境变量key:环境变量value

    [root@docker ~]# docker run --rm -e E_OPTS=abcdefg nginx printenv
    HOSTNAME=bd14d48c46d7
    HOME=/root
    PKG_RELEASE=1~buster
    NGINX_VERSION=1.21.1
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    NJS_VERSION=0.6.1
    PWD=/
    E_OPTS=abcdefg
    #printenv:打印出环境变量的所有值
    
    #传递多个环境变量
    [root@docker ~]# docker run --rm -e E_OPTS=abcd -e C_OPTS=123456 nginx printenv
    C_OPTS=123456
    HOSTNAME=77295251509c
    HOME=/root
    PKG_RELEASE=1~buster
    NGINX_VERSION=1.21.1
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    NJS_VERSION=0.6.1
    PWD=/
    E_OPTS=abcd
    

    7、* 容器内安装软件(工具)

    红帽系 yum

    debian系 apt-get

    alpine apt

    # 进入容器并且下载
    [root@docker ~]# docker exec -it nginxbaidu /bin/bash
    root@acf79798ce19:/# curl
    bash: curl: command not found
    root@acf79798ce19:/# tee /etc/apt/sources.list << EOF
     deb http://mirrors.163.com/debian/ jessie main non-free contrib
     deb http://mirrors.163.com/debian/ jessie-updates main non-free contrib
     EOF
    deb http://mirrors.163.com/debian/ jessie main non-free contrib
    deb http://mirrors.163.com/debian/ jessie-updates main non-free contrib
    root@acf79798ce19:/# cat /etc/apt/sources.list
    deb http://mirrors.163.com/debian/ jessie main non-free contrib
    deb http://mirrors.163.com/debian/ jessie-updates main non-free contrib
    root@acf79798ce19:/# apt-get update && apt-get install curl -y 
    Ign:1 http://mirrors.163.com/debian jessie InRelease
    ... ...
    安装好后commit并且推送到仓库
    [root@alice ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
    acf79798ce19        nginx:1.12.2        "nginx -g 'daemon of…"   About an hour ago   Up About an hour    0.0.0.0:84->80/tcp   nginx_with_baidu
    6ce9e4bb303b        nginx:1.12.2        "nginx -g 'daemon of…"   About an hour ago   Up About an hour    0.0.0.0:83->80/tcp   nginx
    [root@alice ~]# docker commit -p acf79798ce19 mmdghh/nginx:curl
    sha256:84b7a98f5ee209f0139febe7cac04a7edaaca7254ddf1c043e8ac779504204ba
    [root@alice ~]# docker push docker.io/mmdghh/nginx:curl 
    The push refers to repository [docker.io/mmdghh/nginx]
    bbadc5b62281: Pushed 
    4258832b2570: Mounted from library/nginx 
    683a28d1d7fd: Pushed 
    d626a8ad97a1: Mounted from library/nginx 
    curl: digest: sha256:f86f97bacf0ff37e3cc09f98dfb8153c486ee1e8bb9caad5046ed6aa58c43c50 size: 1160
    

    img

    8、删除容器

    格式

    docker rm [容器名称|ID]
    

    参数

    -f : 强制删除docker rm -f [容器名称|ID]
    

    清空容器

    docker rm $(docker ps -a -q)docker ps -a -q | xargs docker rm 
    

    常用的脚本:过滤出所有锁主机上退出的容器,然后干掉

    [root@docker ~]# for i in `docker ps -a|grep -i exit|awk '{print $1}'`;do docker rm -f $i;done
    

    实例

    [root@docker ~]# docker rm 1714ae45e360  #删除正在运行容器会报错
    Error response from daemon: You cannot remove a running container 1714ae45e360243fee68c907f335b34c83fb70217f4216e33a615a71ca66d23a. Stop the container before attempting removal or force remove
    [root@docker ~]# docker rm -f  1714ae45e360  #强制删除
    1714ae45e360
    [root@docker ~]# docker ps -aq 
    bf0b90672aed
    7518288dddfb
    64a7c388b5f8
    [root@docker ~]# docker rm  -f $(docker ps -aq)  #删除所有容器
    bf0b90672aed
    7518288dddfb
    64a7c388b5f8
    [root@docker ~]# docker ps -aq
    

    9、查看容器详细信息

    格式

    docker inspect [容器名称|ID]
    

    怎么监控docker运行状态?

    docker inspect -f '{{.State.Running}}' nginx
    

    10、复制命令

    将文件复制到或复制出容器

    # 1、复制到容器内	
    docker cp [宿主主机文件路径]  容器ID或名称:容器内路径
    
    # 2、复制到容器外	
    docker cp 容器ID:容器内路径 [宿主主机文件路径]
    

    实例(从容器内拷贝文件到主机上)

    [root@docker ~]# docker run -it centos /bin/bash  #先运行一个容器
    WARNING: IPv4 forwarding is disabled. Networking will not work.
    [root@94654381fb70 /]# cd /home  #切换到家目录
    [root@94654381fb70 home]# ls
    [root@94654381fb70 home]# touch test.java  #建一个文件
    [root@94654381fb70 home]# ls
    test.java
    [root@94654381fb70 home]# exit   #退出
    exit
    [root@docker ~]# docker ps -a   #查看进程号
    CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                      PORTS     NAMES
    94654381fb70   centos    "/bin/bash"   26 minutes ago   Exited (0) 23 minutes ago  
    [root@docker ~]# docker cp 94654381fb70:/home/test.java /home   #拷贝容器里那个文件到主机的家目录
    [root@docker ~]# cd /home   #切换到主机的家目录
    [root@docker home]# ls    #查看拷贝的文件
    test.java
    

    11、进入当前正在运行的容器

    我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置,进入容器一般有四种

    1、exec : 在容器外向容器内执行一个命令(官方推荐)
    	docker exec [参数] [容器的名称或ID] [cmd]
    #实例:
    [root@docker ~]# docker exec -it a428029e2e1b  /bin/bash
    
    2、attach : 在早期docker提供的进入容器的命令(缺点:当其结束时,容器也跟着结束了/ 通过进程管道连接上容器内部PID为1的进程
    	docker attach [容器ID|名称]
    #实例:
    [root@docker ~]# docker attach  a428029e2e1b 
    [root@a428029e2e1b /]# 
    
    3、nsenter : 建立一个管道连接上容器主ID
    	nsenter --target $( docker inspect -f {{.State.Pid}} 30d369d70bcd) --mount --uts --ipc --net --pid
    
    4、ssh : 通过ssh连接
    
    ## exec和attach进入容器的区别:
    - exec :进入容器后开启一个新的终端,可以在里面操作(常用)
    - attach :进入容器正在执行的终端,不会启动新的进程
    

    12、查看容器内部的日志

    #1.本身容器没有日志
    docker logs -f -t --tail [容器ID/容器名称]
    -f :实时打印日志
    
    #2.运行一个程序(编写一个脚本)
    docker run -d centos /bin/bash -c "while true; do echo 123;sleep 1;done"
    -c:指定动作
    
    #3.查看运行的容器
    [root@docker ~]# docker ps
    CONTAINER ID   IMAGE
    73f41ee70158   centos
    
    #4.显示日志
    docker logs -tf --tail 10 73f41ee70158  #显示10条日志内容
    doc
    

    13、查看容器内部的进程信息

    查看容器内部的进程信息(容器必须是运行的,必须用容器ID查看)

    [root@docker ~]# docker top a428029e2e1b
    UID      PID         PPID                C                   STIME               TTY                 TIME                CMD
    root     16108      16088               0                   01:10               pts/0               00:00:00            /bin/bash
    

    容器的生命周期

    dokcer run启动容器的时候,dokcer后台操作流程是

    检查本地是否有该镜像,没有就下载
    利用镜像创建且启动一个容器
    分配容器文件系统,在只读的镜像层挂载读写层
    宿主机的网桥接口会分配一个虚拟接口到容器中
    容器获得地址池的ip地址
    执行用户指定的程序
    若程序里没有进程在运行,容器执行完毕后立即终止
    
  • 相关阅读:
    GO语言并发
    NEERC2017:L
    bzoj2823[AHOI2012]信号塔
    bzoj1336[Balkan2002]Alien最小圆覆盖
    bzoj1069[SCOI2007]最大土地面积
    ACM2017Tsukuba:H
    ACM2015沈阳:B-Bazinga
    bzoj2724[Violet 6]蒲公英
    [bzoj4066]简单题
    [bzoj2125]最短路
  • 原文地址:https://www.cnblogs.com/caodan01/p/15067927.html
Copyright © 2011-2022 走看看