欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

DOCKER的常用命令

程序员文章站 2022-03-12 11:56:57
...

DOCKER的常用命令–持续更新中

镜像相关命令

镜像结构底层其实是UnionFS,即联合文件系统,有多层文件系统构成,我们再执行下载时可以观察到,镜像实质是按层进行的下载,分层结构的目的是为了共享资源。

1、查看镜像相关命令

  • 查看镜像: docker image ls 等价于 docker images
  • 查看所有镜像:docker images -a
  • 查看镜像image iD: docker images -q
  • 查看所有镜像image ID :docker images - qa
  • 查看镜像摘要信息:docker images - -digests
  • 查看镜像完整信息:docker images --no-trunc

2、镜像移除相关命令

  • 移除特定镜像:eg.移除ngix , docker rmi nginx
  • 强制移除镜像:docker rmi -f nginx
  • 删除多个镜像(用空格连接):docker rmi -f ngix hello-world
  • 查询所有image ID号并完成批量删除镜像:docker rmi -f $(docker images -qa)

3、镜像搜索相关命令

  • HUB上搜索镜像:docker search 镜像 eg. docker search tomcat (返回字段信息:名称,描述,星级,是否官方,是否自动构建)
  • HUB上搜索星级30星以上的镜像:docker search -s 30 tomcat
  • HUB上搜索星级30星以上的镜像并展开详细描述:docker search -s 30 --no-trunc tomcat
  • HUB上搜索星级30星以上且属于自动构建的镜像并展开详细描述:docker search -s 30 --no-trunc --automated tomcat

4、镜像下载相关命令

  • docker pull 镜像:版本号 e.g. docker pull tomcat等价于docker pull tomcat:lastest

5、镜像提交相关命令

  • docker commit -m=‘描述信息’ -a=‘作者’ 容器ID 要创建的目前镜像名:[标签名tag] 作用:提交容器副本(即修改后的容器),使之成为一个新的镜像
    e.g.docker commit -m=‘tomcat without docs’ -a=‘dongminghao’ ccda50862dae test/mytomcat

容器相关命令

1、交互式虚拟伪终端方式新建并运行一个容器:

  • docker run -it imageid
  • 参数说明: -I:交互式 -t :终端方式 - -name:用来指定容器名称 -P 随机端口映射 -p:指定端口映射 (-p的四种方式:1、ip:hostPort:containerPort 2、ip:containerPort 3、hostPort:containerPort 4、containerPort)
  • e.g. docker run -it -p 8888:8080 tomcat 8888是docker对外端口,宿主机访问时用的端口 8080 是tomcat的对外端口

2、守护式启动一个容器(非交互式):

  • docker run -d imageid 后台方式运行,容器运行的命令如果不是一直挂起的命令(top,tail),就会自动退出

3、查看容器:

  • docker ps
  • 参数说明:
    • -a:列出当前所有正在运行的容器,和历史上运行过的容器
    • -l:显示最近创建的容器
    • -n:显示最近n个创建的容器
    • -q:显示容器编号
    • –no-trunc:不截断输出(显示详细信息)

4、退出容器(交互式退出):

  • 方式一:exit(关闭并退出容器)
  • 方式二:control +p+q(退出但并不关闭容器)

5、启动容器:

  • docker start containerID , e.g:docker start 8074ed6fc954

6、重启容器:

  • docker restart containerID

7、停止容器:

  • docker stop containID

8、强制停止容器:

  • docker kill containID

9、删除已停止容器:

  • docker rm containID

10、一次性删除所有容器:

  • docker rm -f $(docker ps -a -q) 或者 docker ps -a -q | xargs docker rm

11、查看docker日志:

  • docker logs -f -t —tail n containerID
  • 参数说明:
    • -t 是加入时间戳
    • -f 跟随最新的日志打印
    • –tail 数字 显示最后几条

12、查看docker容器内的进程:

  • docker top containerID

13、查看docker容器内部细节:

  • docker inspect containerID 以json串的形式返回容器内部细节

14、重新进入正在运行但是退出的交互式容器(前提是以control+P+Q的方式退出的容器):

  • 方式一:进入容器交互式 docker attatch containerID
  • 方式二:进入容器并在容器中执行相关操作并退回宿主机 docker exec -it containerID ls -l /tmp
  • 其中:docker exec -it containerID /bin/bash 等价于 docker attatch containerID

15、将容器内数据拷贝到主机(宿主机上运行):

  • docker cp 容器ID:容器路径 目的主机路径

容器数据卷相关理念:

目的即实现数据持久化,完成数据的迁移与同步,即容器之间的资源共享。
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过UnionFileSystem提供一些用于持续存储或共享数据的特性。
卷的目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

特点:
1、数据卷可在容器间共享或重用数据
2、卷中的更改可以直接生效
3、数据卷中的更改不会包含在镜像的更新中
4、数据卷的生命周期一直持续到没有容器使用它为止

容器数据卷相关命令:

1、添加容器数据卷:

  • 方式一:命令添加方式 docker run -it -v /宿主机的绝对目录:/容器的内目录 镜像名
    • eg. docker run -it -v /Users/admin/mydataVolumn:/dataVolumnContainer centos
      • 通过inspect命令可以查询到相关信息

          "Type": "bind",
          "Source": "/Users/admin/mydataVolumn",
          "Destination": "/dataVolumnContainer",
          "Mode": "ro",
          "RW”:true,
          "Propagation": "rprivate"
        
      • 备注:此时宿主机与容器的数据卷已经同步共享,随便修改宿主机或容器上的数据卷内容,两者都可以保持同步内容更新;容器在停止退出后,主机修改文件,当重新运行容器时,文件仍可以同步到容器中。

    • e.g. docker run -it -v /Users/admin/mydataVolumn:/dataVolumnContainer:ro centos
      • 通过inspect命令可以查询到相关信息

         "Type": "bind",
         "Source": "/Users/admin/mydataVolumn",
         "Destination": "/dataVolumnContainer",
         "Mode": "ro",
         "RW": false,
         "Propagation": "rprivate"
        
      • 备注:容器内目录只读不可写 read-only操作

  • 方式二:DockerFile添加添加方式
    • 步骤一:根目录下新建mydocker并进入

    • 步骤二:在Dockerfile中使用VOLUME指令类给镜像添加一个或多个数据卷

        VOLUME语法规则:	VOLUME[“/dataVolumnContainer1”,“/dataVolumnContainer2”,“/dataVolumnContainer3”]
      
    • 步骤三:FIle构建 构建dockerfile文件,文件内容如下:

        #volume test
        FROM centos
        VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]  #定义两个数据卷
        CMD echo "finished,---------success1"
        CMD /bin/bash
      
    • 步骤四:build生成镜像 获得一个新镜像 dongminghao/centos
      docker build -f /Users/admin/mydocker/dockerfile -t dongminghao/centos .

      • 运行后,提示信息如下:

          Sending build context to Docker daemon  2.048kB
          Step 1/4 : FROM centos
          ---> 67fa590cfc1c
          Step 2/4 : VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
          ---> Running in 8b243d47a2a6
          Removing intermediate container 8b243d47a2a6
           ---> 442b5f347138
          Step 3/4 : CMD echo "finished,---------success1"
           ---> Running in 5d2a3639c3de
          Removing intermediate container 5d2a3639c3de
          ---> b8cd1b9177dc
          Step 4/4 : CMD /bin/bash
          ---> Running in 4ca239604d34
          Removing intermediate container 4ca239604d34
          ---> 88e38f8371d2
          Successfully built 88e38f8371d2
          Successfully tagged dongminghao/centos:latest
        
      • 结果:

          REPOSITORY        TAG             IMAGE ID          CREATED      SIZE
          dongminghao/centos   latest    88e38f8371d2 34 seconds ago      202MB		
        
    • 步骤五:运行新镜像,并进入容器
      docker run -it 88e38f8371d2
      通过ls 命令查看通过dockerfile生成的数据卷 dataVolumeContainer1与dataVolumeContainer2

    • 步骤六: docker inspect containerID 可以查看宿主机默认的数据卷存放路径 : /var/lib/docker/volumes/ee813e32423ab0ccaf71d446218dfe143638a70520f5cbf02b5411b58f828e1b/_data

      • LINUX系统直接查询上述返回的数据卷路径即可,即可查到宿主机上的数据卷
      • MAC系统会出现路径不存在问题,解决方案如下:
        • (1):screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty 加回车
        • (2) 再执行 cd /var/lib/docker/volumes/ee813e32423ab0ccaf71d446218dfe143638a70520f5cbf02b5411b58f828e1b/_data 即可进入相应的数据卷中,这时宿主机与容器的数据卷已经实现同步,与方式一效果相同
        • 备注:
          如果需要干掉这个screen,按ctrl+a + k,最后按y确认即可以kill掉这个screen了;
          如果只是暂时退出这个screen,下次再进去,使用ctrl+a + d,而如果需要再次进入的时候应当使用screen -dr,否则使用screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty再进去会是一片乱码

内容总结来源

[1] 尚硅谷docker容器讲解视频