zoukankan      html  css  js  c++  java
  • Docker 命令(二)

    Docker 入门

    启动docker

    systemctl start docker

    帮助命令

    • docker --help
    • docker [Commands] --help   例:docker run --help

    Docker镜像

    • 搜索镜像 docker search [镜像名字]
    • 获取镜像 docker pull [镜像名字]
    • 导入镜像 docker load --input [镜像包]
    • 导出镜像 docker save -o [镜像包] [镜像名字]
    • 查看镜像 docker images
    • 删除镜像 docker rmi [镜像ID]

    1、执行docker search centos 会从dockerhub上搜索镜像

    2、如果线上服务器无法连接dockerhub网络,可以通过其它方式下载docker镜像包,如centos.tar

    执行命令docker load --input centos.tar 将镜像导入docker

    除了input方式导入,还可以使用重定向导入  docker load < centos.tar

    3、获取镜像 docker pull centos

    4、查看镜像 docker images

    5、导出镜像 docker save -o centos.tar centos

    6、删除镜像 docker rmi 67591570dd29 (上图IMAGE ID)

    备注:如果镜像已经创建了一个容器,那么将无法进行删除

    Docker容器

    • 启动容器 docker run [参数选项] [镜像名称] [命令(可省略)]
    • 运行已停止容器 docker start
    • 停止容器 docker stop
    • 强制关闭容器 dokcer kill
    • 查看容器 docker ps
    • 进入容器 docker attach | docker exec | nsenter
    • 删除容器 docker rm
    • 获取容器元数据 docker inspect
    • 容器访问日志 docker logs

    1、启动容器 docker run --name mydocker -t -centos /bin/bash

    • --name 名称,管理容器时可以通过ID或名称
    • -t 让docker分配一个伪终端
    • -i 让docker的标准输入打开{input}

    提示:最后的/bin/bash可以省略,但是最后一个如果不是命令,那就是镜像的名称。

    输入上方的命令之后会直接进入到容器里面

    exit退出

    备注:容器不是一个虚拟机,因为他就是一个进程,如果我们退出,这个进程就退出了。

              通过PID我们可以看出,容器中的PID=1的是/bin/bash,正常centos 7系统中PID为1的进程是/usr/lib/systemd/systemd

              简单理解,容器给进程做隔离使用,虚拟机给操作系统做隔离使用。

    2、docker start mydocker 或 docker start f13d63fd6457 方式让容器运行

    3、查看容器 docker ps -a(运行和不运行的容器全部列出)

    docker ps -a -q  列出所有容器的docker id

    [root@linux-node1 ~]# docker ps -a -q
    86c9a83d95be
    8822c2f37e9e
    8814cf80b424
    96892a7bb67e
    e9e4eed824dd
    f807dc543291
    f13d63fd6457

    4、进入容器 docker attach mydocker

    备注:这样进入容器的缺点就是如果在开一个窗口就会同步操作,类似于单用户模式(windows远程桌面)。

    生产场景是不使用docker attach的,需要我们使用nsenter这个工具,这个工具包含在util-linux软件包里面。

    yum install util-linux -y 

    我们通过nsenter就可以进入容器,但是nsenter是通过pid进入容器里,所以我们需要知道容器的pid。我们可以通过docker inspect来获取到pid。

    [root@linux-node1 ~]# docker start mydocker
    mydocker
    [root@linux-node1 ~]# docker inspect -f "{{ .State.Pid }}" mydocker
    61864
    [root@linux-node1 ~]# nsenter -t 61864 -m -u -i -n -p
    

    nsenter --help 帮助命令

    • -m, –-mount参数是进去到mount namespace中
    • -u, –-uts参数是进入到uts namespace中
    • -i, –-ipc参数是进入到System V IPC namaspace中
    • -n, –-net参数是进入到network namespace中
    • -p, –-pid参数是进入到pid namespace中
    • -U, –-user参数是进入到user namespace中
    • -t,--target参数是获取名字空间的目标进程

    /bin/bash是我们运行容器产生的进程 

    -bash 是我们使用nsenter产生的,这样如果我们退出容器,容器就不会退出,因为/bin/bash还在运行

    [root@f13d63fd6457 /]# exit
    logout
    [root@linux-node1 ~]# docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    f13d63fd6457        centos              "/bin/bash"         52 minutes ago      Up 17 minutes                           mydocker

    脚本实现进入docker

    [root@linux-node1 ~]# cat docker_in.sh 
    #!/bin/bash
    # Use nsenter to access docker
    docker_in(){
      NAME_ID=$1
      PID=$(docker inspect -f "{{ .State.Pid }}" $NAME_ID)
      nsenter -t $PID -m -u -i -n -p
    }
    docker_in $1
    

    执行结果如下:

    [root@linux-node1 ~]# chmod +x docker_in.sh 
    [root@linux-node1 ~]# ./docker_in.sh mydocker
    [root@f13d63fd6457 /]# ps -aux
    USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root          1  0.0  0.0  11768  1680 ?        Ss+  08:12   0:00 /bin/bash
    root         45  0.0  0.0  15168  1884 ?        S    08:37   0:00 -bash
    root         67  0.0  0.0  50844  1708 ?        R+   08:37   0:00 ps -aux
    

    5、docker exec不进入容器,但将命令发送容器里执行并获取返回结果

    [root@linux-node1 ~]# docker exec mydocker ps -aux
    USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root          1  0.0  0.0  11768  1680 ?        Ss+  08:12   0:00 /bin/bash
    root         87  0.0  0.0  47440  1672 ?        Rs   08:42   0:00 ps -aux
    

    docker exec进入容器

    [root@linux-node1 ~]# docker exec -it mydocker /bin/bash
    [root@f13d63fd6457 /]# ps aux
    USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root          1  0.0  0.0  11768  1680 ?        Ss+  08:12   0:00 /bin/bash
    root         91  0.0  0.0  11768  1888 ?        Ss   08:45   0:00 /bin/bash
    root        103  0.0  0.0  47440  1672 ?        R+   08:46   0:00 ps aux
    

    它执行命令/bin/bash的PID是91

    6、删除容器 docker rm mydocker 或 docker rm -f mydocker

    docker另一种删除方式 ,启动一个容器完成命令后就删

    [root@linux-node1 ~]# docker run --rm centos /bin/echo "shhnwangjian"
    shhnwangjian
    [root@linux-node1 ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    f13d63fd6457        centos              "/bin/bash"         About an hour ago   Up 41 minutes                           mydocker
    

    可以在测试或学习时使用,退出时删除容器

    [root@linux-node1 ~]# docker run --rm --name test -it centos /bin/bash
    [root@9db1873a5b93 /]# ps aux
    USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root          1  0.6  0.0  11768  1880 ?        Ss   08:55   0:00 /bin/bash
    root         13  0.0  0.0  47440  1668 ?        R+   08:55   0:00 ps aux
    [root@9db1873a5b93 /]# exit
    exit
    [root@linux-node1 ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    f13d63fd6457        centos              "/bin/bash"         About an hour ago   Up 43 minutes                           mydocker
    

    删除所有容器  docker rm $(docker ps -a -q)

    7、强制关闭所有运行容器

    docker kill $(docker ps -q)

    8、ngnix容器

    [root@linux-node1 ~]# docker pull nginx
    [root@linux-node1 ~]# docker run -d nginx
    4acac5d79bb60c3ad3d8a7da59855c75279a866382939e10947e2802ab8a9072
    [root@linux-node1 ~]# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    4acac5d79bb6        nginx               "nginx -g 'daemon off"   23 seconds ago      Up 21 seconds       80/tcp, 443/tcp     goofy_jepsen
    f13d63fd6457        centos              "/bin/bash"              2 hours ago         Up About an hour                        mydocker
    

    docker run -d 后台运行

  • 相关阅读:
    通过网页源代码看“饭否”的网站架构
    SD2.0课程等待时候的摘抄
    SD2.0阿里妈妈的研发过程
    转:编程8字专静谦筹悟慎透恒
    SD2.0第一天总体印象
    SD2.0《Web2.0网站性能调优实践》貌似是抄袭的文章
    SD2.02个课合成一个课
    SD2.0第2天总体印象
    variant
    [zz]C++程序员的阅读清单
  • 原文地址:https://www.cnblogs.com/shhnwangjian/p/6287156.html
Copyright © 2011-2022 走看看