• docker-镜像管理


    2.4:Docker 镜像管理

    Docker 镜像含有启动容器所需要的文件系统及所需要的内容,因此镜像主要用于创建并启动docker容器。 

    docker 镜像直接调用宿主机的内核,镜像中只提供 rootfs,也就是只需要包括最基本的命令、工具和程序库就可以了。不同的镜像在一个宿主机内核上实现不同的 rootfs。

     演示Union FS(联合文件系统)原理

    root@ubuntu:/opt# mkdir a b system
    root@ubuntu:/opt# ll
    total 24
    drwxr-xr-x  6 root root 4096 Feb 18 10:18 ./
    drwxr-xr-x 23 root root 4096 Jan 30 01:30 ../
    drwxr-xr-x  2 root root 4096 Feb 18 10:18 a/
    drwxr-xr-x  2 root root 4096 Feb 18 10:18 b/
    drwxr-xr-x  2 root root 4096 Feb 18 10:18 system/
    root@ubuntu:/opt# cd a
    root@ubuntu:/opt/a# touch a.txt
    root@ubuntu:/opt/a# cd ..
    root@ubuntu:/opt# cd b
    root@ubuntu:/opt/b# touch b.txt
    root@ubuntu:/opt# mount -t aufs -o dirs=./a:./b none ./system/    #多个文件同时挂载到一个挂载点
    root@ubuntu:/opt# tree system/
    system/
    ├── a.txt
    └── b.txt

    镜像命令

    搜索镜像
    docker search centos:7.2.1511 #带指定版本号
    docker search centos #不带版本号默认 latest 
    下载镜像: 
    从 docker 仓库将镜像下载到本地,命令格式如下: 
    docker pull  仓库服务器:端口/项目名称/镜像名称:tag(版本)号 
    docker info 中的Registry信息
    查看本地镜像: 
    docker images
    REPOSITORY            #镜像所属的仓库名称 
    TAG                   #镜像版本号(标识符),默认为 latest 
    IMAGE ID              #镜像唯一 ID 标示 
    CREATED               #镜像创建时间 
    VIRTUAL SIZE          #镜像的大小
    镜像导出: 可以将镜像从本地导出问为一个压缩文件,然后复制到其他服务器进行导入使用
    1、 docker save centos -o /opt/centos.tar.gz 
    2、 docker save centos > /opt/centos-1.tar.gz 
    查看镜像内容:
    cat manifest.json  #包含了镜像的相关配置,配置文件、 分层 
    镜像导入: 
    docker load -i centos.tar.gz 
    docker load < /opt/centos.tar.gz 
    删除镜像: docker rmi 镜像 ID/镜像名   ,通过镜像启动容器的时 候镜像不能被删除,除非将容器全部关闭 
     docker rmi centos 

    Usage: docker rmi [OPTIONS] IMAGE [IMAGE...]
    Remove one or more images
    Options:
    -f, --force Force removal of the image
    --no-prune Do not delete untagged parents

     

    2.5:容器操作基础命令

    命令格式: 
    # docker run [选项] [镜像名] [shell 命令] [参数]
    # docker run [参数选项] [镜像名称,必须在所有选项的后面] [/bin/echo 'hello wold'] #单次执行,没有自定义容器名称
    # docker run centos /bin/echo 'hello wold' #启动的容器在执行完 shell命令就退出了

    常见命令

    从镜像启动一个容器
    会直接进入到容器,并随机生成容器 ID 和名称 
    [root@docker-server1 ~]# docker run -it docker.io/centos bash #单次测试命令运行完即退出
    [root@11445b3a84d3 /]
    #退出容器不注销 ctrl+p+q 
    显示正在运行的容器
    docker ps 
    显示所有容器: 包括当前正在运行以及已经关闭的所有容器:  docker ps -a 
    删除运行中的容器:即使容正在运行当中,也会被强制删除掉 
    docker rm -fv 容器ID
    Options:
      -f, --force     Force the removal of a running container (uses SIGKILL)
      -l, --link      Remove the specified link
      -v, --volumes   Remove the volumes associated with the container
    容器状态:
    created: 被创建之后由于启动参数错误而没有启动成功的
    up:正在运行的容器
    exited:已经退出或者注销的
    指定端口映射:
    方式 1:本地端口 81 映射到容器 80 端口:  
    root@ubuntu:~# docker run -it --name web1 -p 8000:80 55c440ba1ecb
    root@ubuntu:~# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS                  NAMES
    ac11d44f5539        55c440ba1ecb        "nginx -g 'daemon of…"   2 minutes ago       Up 2 minutes              0.0.0.0:8000->80/tcp   web1
    方式 2:本地 IP:本地端口:容器端口 
    root@ubuntu:~#  docker run -it -d --name web2 -p 192.168.134.182:9000:80 nginx
    root@ubuntu:~# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                          NAMES
    c493bc2b09c5        nginx               "nginx -g 'daemon of…"   10 seconds ago      Up 9 seconds        192.168.134.182:9000->80/tcp   web2
    方式 3:本机 ip:本地端口:容器端口/协议,默认为 tcp 协议 
    root@ubuntu:~# docker run -it -d -p 8001:80/udp --name web3 nginx:1.16.1
    d2a5897fc888b94ba2790a761e3f1ac004b333ba672c9ed01d4be7551d792727
    root@ubuntu:~# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                          NAMES
    d2a5897fc888        nginx:1.16.1        "nginx -g 'daemon of…"   7 seconds ago       Up 7 seconds        80/tcp, 0.0.0.0:8001->80/udp   web3
    方式 4:一次性映射多个端口+协议: 
    root@ubuntu:~# docker run -it -d -p 86:80/tcp  -p 443:443/tcp --name web5 nginx:1.16.1
    f8ef7471fd639eb3a226e441f288803a58f72f25582ef5d71fd13559499102fa
    root@ubuntu:~# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                      NAMES
    f8ef7471fd63        nginx:1.16.1        "nginx -g 'daemon of…"   7 seconds ago       Up 6 seconds        0.0.0.0:443->443/tcp, 0.0.0.0:86->80/tcp   web5
    #查看 Nginx 容器访问日志
    root@ubuntu:~# docker logs  b0d688e137c4     #一次查看 
    root@ubuntu:~#  docker logs -f b0d688e137c4  #持续查看 
    查看容器已经映射的端口:
    root@ubuntu:~# docker port d2a5897fc888
    80/udp -> 0.0.0.0:8001
    后台启动容器: 参数家上-d
    创建并进入容器: 
    root@ubuntu:~# docker run  -it --name web10   nginx:1.16.1  bash
    root@50adcf8c2293:/#

    传递运行命令 :

    容器需要有一个前台运行的进程才能保持容器的运行,通过传递运行参数是一 种方式,另外也可以在构建镜像的时候指定容器启动时运行的前台命令。这个进程被封装为PID为1的守护进程,如nginx的master进程,shell命令。传递的命令优先级高于镜像内置的启动命令。

    容器的启动和关闭: 

    k8s环境禁止通过重启服务或重启容器来实现配置变更和代码发布

    root@ubuntu:~# docker start 50adcf8c2293
    50adcf8c2293
    root@ubuntu:~# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                      NAMES
    50adcf8c2293        nginx:1.16.1        "bash"                   45 minutes ago      Up 7 seconds        80/tcp                                     web10
    root@ubuntu:~# docker stop 50adcf8c2293
    50adcf8c2293
    root@ubuntu:~# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                                      NAMES
    50adcf8c2293        nginx:1.16.1        "bash"                   About an hour ago   Exited (0) 2 seconds ago           

    进入到正在运行的容器: 

    使用 exec 命令
    执行单次命令与进入容器,不是很推荐此方式,虽然 exit 退出容器还在运行 
    root@ubuntu:~# docker exec -it f8ef7471fd63 bash
    root@f8ef7471fd63:/#
    使用 nsenter 命令
    推荐使用此方式,nsenter 命令需要通过 PID 进入到容器内部,不过可以使用 docker inspect 获取到容器的 PID: 
    docker inspect ID#获取json格式的信息
    root@ubuntu:~#  docker inspect -f "{{.State.Pid}}" f8ef7471fd63
    5215 ##获取到某个docker 容器的 PID,可以通过 PID 进入到容器内 
    root@ubuntu:~#  nsenter -t 5215  -m -u -i -n -p
    mesg: ttyname failed: No such device
    ping 容器 ID
    root@f8ef7471fd63:/#
    apt update
    apt install iputils-ping
    apt install net-tools
    root@f8ef7471fd63:/# ping f8ef7471fd63
    PING f8ef7471fd63 (172.17.0.6) 56(84) bytes of data.
    64 bytes from f8ef7471fd63 (172.17.0.6): icmp_seq=1 ttl=64 time=0.011 ms
    64 bytes from f8ef7471fd63 (172.17.0.6): icmp_seq=2 ttl=64 time=0.023 ms

    批量关闭正在运行的容器:

    root@ubuntu:~# docker ps -a -q #查看container ID
    50adcf8c2293
    f8ef7471fd63
    d2a5897fc888
    c493bc2b09c5
    ac11d44f5539
    b0d688e137c4
    root@ubuntu:~#  docker stop  $(docker ps -a -q)
    root@ubuntu:~# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
    50adcf8c2293        nginx:1.16.1        "bash"                   About an hour ago   Exited (0) 38 minutes ago                       web10
    f8ef7471fd63        nginx:1.16.1        "nginx -g 'daemon of…"   2 hours ago         Exited (0) 5 seconds ago                        web5
    d2a5897fc888        nginx:1.16.1        "nginx -g 'daemon of…"   2 hours ago         Exited (0) 5 seconds ago                        web3
    docker kill  $(docker ps -a -q) #批量强制关闭正在运行的容器
    root@ubuntu:~#  docker rm -f  `docker ps -aq -f status=exited` #批量删除已退出容器
    docker rm -f  $(docker ps -a -q) #批量删除所有容器: 

    指定容器 DNS:

    dns 服务,默认采用宿主机的 dns 地址 

    一是将 dns 地址配置在宿主机

    二是将参数配置在 docker 启动脚本里面 –dns=1.1.1.1 

    root@ubuntu:~# docker run -it -d --dns 223.6.6.6 nginx:1.16.1
    root@ubuntu:~# docker exec -it b1c0a49c6eaf bash
    root@b1c0a49c6eaf:/# cat /etc/resolv.conf
    nameserver 223.6.6.6
  • 相关阅读:
    10、代码块、构造代码块、静态代码块及main方法之间的关系
    2.0、Hibernate框架的简单搭建
    1.0、Struts2的简单搭建方法
    5、Servlet的使用
    angular组件之间的通信
    angular项目中遇到的问题
    ng-zorro-mobile中遇到的问题
    angular管道操作符的使用
    angular路由配置以及使用
    搭建Angular环境
  • 原文地址:https://www.cnblogs.com/lummg-DAY/p/12327134.html
Copyright © 2020-2023  润新知