• docker(4)-容器


    镜像是静态文件,当启动镜像时,会创建一个容器来运行镜像中的内容,容器相当于镜像的一个实例。

    创建和启动容器

    • docker create -i --name c1 openjdk:8:基于openjdk:8镜像创建容器,容器名为c1,-i是保持标准输入流,后面会看到效果。
    • docker ps -a:ps只能查看运行中的镜像,加-a可查看所有镜像。默认执行了命令bash
    • docker start c1:启动一个处于停止状态的容器,此时状态栏从Created变成了UP运行中。如果创建时没有-i参数,此时执行完bash命令后就会停止容器,状态栏会是退出。指定的c1容器名也可以用容器id替代

    • docker run -id --name c2 openjdk:8:run命令相当于先create再start,多了个-d选项是在后台运行,结果和上面一样。

    • docker restart c1:重启容器

    进入运行中的容器

    • docker attach c1:进入c1容器内部,可执行各种命令如ps。要退出可执行exit,但容器状态也会停止。

    • docker exec c2 ps:进入c2容器执行一条命令ps,执行完后会回到当前环境,不用exit不会停止容器。

    • docker exec -it c2 bash:也可以通过bash打开容器命令行,-i上面说过可保持持续输入,-t生成一个新的终端,注意看bash的PID变成了26而不是上面的1。exit退出26的终端,但是1的终端仍然在运行,所以不会退出容器,

    停止容器

    • docker stop c1:停止容器,状态会变成Exited,这和Created状态是一样的,都是停止。可以再次start
    • docker pause c1:暂停容器,状态会变成暂停
    • docker unpause c1:从暂停中恢复,状态恢复成运行

    查看容器

    • docker logs c2:查看容器日志输出
    • docker inspect c2:查看容器详情
    • docker top c2:相当于linux的top命令
    • docker stats c2:统计cpu、内存、磁盘等使用状况,这个输出内容是会动态更新的。
    • docker diff c1:查看容器内部发生过变更的文件或目录,如下,我在c1中创建了test文件,这里A开头表示添加,C表示变更,D表示删除

    删除容器

    • docker rm c2 -f:如果没有-f,只能删除已经停止的容器。删除运行的容器会报错,加-f会先停止再删除。

    • docker container prune:批量删除所有停止状态的容器。

    变更配置

    • docker update c1 -c 100:变更c1配置,比如-c 100是这个容器占用cpu权重份额为100。这个配置在创建启动时就可以声明,这里是修改这个配置。还有其他配置如内存等,可自行查看docker update --help。

    映射访问端口、复制文件

    • docker run --name c3 -id -p 8080:8080 openjdk:8:创建运行新的c3容器,这里多了-p,将宿主机端口映射到容器端口,8080:8080前面是宿主机端口,后面是容器端口

    • docker cp /root/hello.jar c3:/:将宿主机的hello.jar文件复制到c3容器的/目录。从容器复制到宿主机也是这个命令,第一个参数是源文件,第二个参数是要复制到的位置。
    • 这个文件是一个spring boot项目,端口8080,访问时会响应hello world。现在通过exec -d在后台将它运行起来,在ps中就可以查看到java进程

    过几秒种启动完成,在浏览器就可以通过宿主机的IP来访问这个项目了,如下,这里关掉了宿主机的防火墙

    基于容器创建镜像

    • docker commit c3 hello:1:将容器c3打包成镜像hello:1,通过这个镜像启动时,可以直接启动项目,而不需要再次复制项目文件,不需要再执行java -jar。非常便于迁移复用

    • docker run --name c4 -id -p 8082:8080 hello:1 java -jar hello.jar:用hello:1镜像创建启动c4容器,而且执行java -jar hello.jar,如下的COMMAND中可以看到不再是bash

    • 此时宿主机的8080映射到c3的8080项目,8082映射到c4的8080项目,两个端口分别访问不同的实例。而c3和c4的项目在各自容器内部运行,即使端口8080一样,并不会引起冲突。

    基于文件导出导入

    • docker export -o c.tar c4:将c4容器导出为文件c.tar
    •  docker import c.tar hello:2:将c.tar文件导入为镜像hello:2

    命令帮助

    在命令后面加--help可查看帮助,比如docker ps --help

  • 相关阅读:
    金仓数据库KingbaseES客户端编程接口指南-Nodejs(3. Nodejs驱动使用说明)
    PAT 1174 Left-View of Binary Tree 题干不知所云
    前后端分离的大数据毕设项目之基于Spark+springboot+vue的共享单车数据存储系统的设计与实现
    《算法导论》第四版 电子版 全网第一时间发布eBookhub
    8万字带你入门Rust
    iOS之卡顿检测
    -22 列表渲染
    力扣-228.汇总区间
    AI系统ChatGPT源码+详细搭建部署教程+支持GPT4.0+支持ai绘画(Midjourney)/支持OpenAI GPT全模型+国内AI全模型
    聊一聊 tcp/ip 在.NET故障分析的重要性
  • 原文地址:https://blog.csdn.net/wangb_java/article/details/115028933