Docker的RUN流程和Docker原理

  • Run流程
  • 底层原理
    • Docker是怎么工作的
    • Docker为什么比VM快
  • Docker的常用命令
    • 帮助命令
    • 镜像命令
      • 查看镜像
      • 搜索镜像
      • 下载镜像
      • 指定版本下载
      • 删除镜像
    • 容器命令
      • 新建容器并启动
      • 退出容器,回到主机
      • 列出所有运行中的容器
      • 删除容器
      • 启动和停止容器
    • 其他命令
      • 后台启动容器
      • 查看日志
      • 查看容器中的进程信息
      • 查看镜像的元数据(非常重要)
    • 进入当前正在运行的容器
    • 拷贝命令
  • 小结

Run流程

我们在上一篇博客用到了Docker run命令,那么Docker的run流程是怎么样的呢?我们看下面这张图:

底层原理

Docker是怎么工作的

Docker是一个CS结构,Docker的守护进程运行在主机上,通过Socket从客户端进行访问!

DockerServer接收到DockerClient的指令,就会执行这个命令

我们看图,我们的linux服务器上面可以有一个后台守护进程,客户端访问服务器通过守护进程进行访问,然后通过命令来找到对应的Docker容器,这些容器可以看出是独立的简单Linux系统,有单独的端口号,互相隔离、互不影响。

Docker为什么比VM快

  1. Docker比虚拟机有更少的抽象层
  2. Docker利用的是宿主机的内核,而VM需要Guest OS,所以新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统的内核。虚拟机是加载Guest OS,分钟级别的,而docker是利用宿主机的操作系统,省略了复杂过程,是一个秒级别

Docker的常用命令

帮助命令

docker version       显示docker的版本信息
docker info             显示docker更加详细的信息,包括镜像信息
docker 命令 --help        帮助命令

帮助文档的地址:https://docs.docker.com/reference/

镜像命令

查看镜像

docker images 查看所有本地主机上的镜像

(仓库源)  (版本标签信息)  (镜像ID)    (镜像创建时间)
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE(镜像大小)
hello-world   latest    feb5d9fea6a5   7 months ago   13.3kB

其次你可以在后面带后缀

Options:             (列出所有镜像)-a, --all             Show all images (default hides intermediate images)--digests         Show digests-f, --filter filter   Filter output based on conditions provided--format string   Pretty-print images using a Go template--no-trunc        Don't truncate output-q, --quiet           Only show image IDs
-a, --all            #列出所有镜像
-q, --quiet          #只显示镜像的id

搜索镜像

docker search        #搜索镜像

比如说你要搜索mysql
你就可以使用命令docker search mysql

追加参数

--filter=STARS=3000     #搜索出来的镜像就是收藏大于3000的

下载镜像

docker pull  镜像名字

加上版本号:

docker pull 镜像名字[: tag]

例子:

root@taobotics:~# docker pull mysql
Using default tag: latest #如果不写版本号,默认是latest
latest: Pulling from library/mysql
72a69066d2fe: Pull complete #分层下载 docker images核心
93619dbc5b36: Pull complete
99da31dd6142: Pull complete
626033c43d70: Pull complete
37d5d7efb64e: Pull complete
ac563158d721: Pull complete
d2ba16033dad: Pull complete
688ba7d5c01a: Pull complete
00e060b6d11d: Pull complete
1c04857f594f: Pull complete
4d7cfa90e6ea: Pull complete
e0431212d27d: Pull complete
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709 # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址
#等价
docker pull mysql
docker pull docker.io/library/mysql:latest

指定版本下载

前提:必须是Docker Hub上有的版本才可以下载

docker pull mysql:5.7


一旦有相同的文件它就会自动跳过,只下载没有的文件

删除镜像

docker  rmi  镜像名字
docker rmi  id      #根据id删除
docker rmi  -f  $(docker images -aq)   #删除所有镜像


也可以通过空格删除多个容器。

容器命令

注意:我们只有下载了镜像之后才可以创建容器。
我们下载一个centos镜像来进行测试学习,使用如下命令:

docker pull centos

新建容器并启动

docker run [可选参数] image
参数说明:
--name=“Name” # 容器名字 tomcat01 tomcat02 用来区分容器
-d              # 后台方式运行
-it             #使用交互方式运行,进入容器查看内容
-p              #指定容器端口  -p 8080:8080-p主机端口:容器端口-p容器端口
-P              #随机指定端口

我们使用命令启动并进入容器:

我们使用交互方式运行,用bash来进行交互

docker run -it centos /bin/bash


这里的主机名就是我们的镜像ID,我们查看容器内的东西

我们发现,它就是一个小型的服务器,它跟我们的服务器没有任何关系

退出容器,回到主机

exit     #直接容器停止并退出
Ctrl+P+Q    #容器不停止并退出

列出所有运行中的容器

docker ps


我们可以附加参数

-a   # 列出当前正在运行的容器+曾经运行过的容器信息
-n=?   # 显示最近创建的容器  问号后面加数字,表示显示的个数
-q      #只显示容器的编号

删除容器

docker rm 容器id           #根据容器id删除容器,不能删除正在运行的容器,如果要强制删除 就使用rm -f
docker rm  -f $(docker ps -aq)       #递归删除所有的容器
docker ps -a -q|xargs docker rm     #删除所有的容器

启动和停止容器

docker start 容器id             # 启动容器
docker restart 容器id     # 重启容器
docker stop  容器id           #停止当前正在运行的容器
docker kill 容器id                # 强制停止当前容器容器

其他命令

后台启动容器

docker run -d   镜像名

问题:使用docker ps命令发现centos停止了

docker容器使用后台运行,就必须要有一个前台进程,容器发现没有应用了,没有提供服务,它就会自动停止。

所以你可以使用docker run -d -it 镜像名 /bin/bash,我们使用bash来进入交互界面,这样就有一个前台进程了。

查看日志

docker logs -f -t --tail 容器id


我们发现容器中没有日志,那么我们自己手动编写一段日志
我们使用shell脚本

“while true;do echo caicai;sleep 1;done”

我们使用命令:

docker run -d centos /bin/sh -c "while true;do echo caicai;sleep 1;done"


显示日志:

-tf #显示所有日志信息
--tail num   #显示要显示的日志条数

查看容器中的进程信息

docker top

查看镜像的元数据(非常重要)

docker inspect 容器id
root@taobotics:~# docker inspect 5583e80d6f3c
[{"Id": "5583e80d6f3c454f3c819757d5b25af5e85abd233adcea8a95d680d485efaec6","Created": "2022-05-12T09:48:35.545930868Z","Path": "/bin/sh","Args": ["-c","while true;do echo caicai;sleep 1;done"],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 12328,"ExitCode": 0,"Error": "","StartedAt": "2022-05-12T09:48:36.087437302Z","FinishedAt": "0001-01-01T00:00:00Z"},"Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6","ResolvConfPath": "/var/lib/docker/containers/5583e80d6f3c454f3c819757d5b25af5e85abd233adcea8a95d680d485efaec6/resolv.conf","HostnamePath": "/var/lib/docker/containers/5583e80d6f3c454f3c819757d5b25af5e85abd233adcea8a95d680d485efaec6/hostname","HostsPath": "/var/lib/docker/containers/5583e80d6f3c454f3c819757d5b25af5e85abd233adcea8a95d680d485efaec6/hosts","LogPath": "/var/lib/docker/containers/5583e80d6f3c454f3c819757d5b25af5e85abd233adcea8a95d680d485efaec6/5583e80d6f3c454f3c819757d5b25af5e85abd233adcea8a95d680d485efaec6-json.log","Name": "/upbeat_dewdney","RestartCount": 0,"Driver": "overlay2","Platform": "linux","MountLabel": "","ProcessLabel": "","AppArmorProfile": "docker-default","ExecIDs": null,"HostConfig": {"Binds": null,"ContainerIDFile": "","LogConfig": {"Type": "json-file","Config": {}},"NetworkMode": "default","PortBindings": {},"RestartPolicy": {"Name": "no","MaximumRetryCount": 0},"AutoRemove": false,"VolumeDriver": "","VolumesFrom": null,"CapAdd": null,"CapDrop": null,"CgroupnsMode": "host","Dns": [],"DnsOptions": [],"DnsSearch": [],"ExtraHosts": null,"GroupAdd": null,"IpcMode": "private","Cgroup": "","Links": null,"OomScoreAdj": 0,"PidMode": "","Privileged": false,"PublishAllPorts": false,"ReadonlyRootfs": false,"SecurityOpt": null,"UTSMode": "","UsernsMode": "","ShmSize": 67108864,"Runtime": "runc","ConsoleSize": [0,0],"Isolation": "","CpuShares": 0,"Memory": 0,"NanoCpus": 0,"CgroupParent": "","BlkioWeight": 0,"BlkioWeightDevice": [],"BlkioDeviceReadBps": null,"BlkioDeviceWriteBps": null,"BlkioDeviceReadIOps": null,"BlkioDeviceWriteIOps": null,"CpuPeriod": 0,"CpuQuota": 0,"CpuRealtimePeriod": 0,"CpuRealtimeRuntime": 0,"CpusetCpus": "","CpusetMems": "","Devices": [],"DeviceCgroupRules": null,"DeviceRequests": null,"KernelMemory": 0,"KernelMemoryTCP": 0,"MemoryReservation": 0,"MemorySwap": 0,"MemorySwappiness": null,"OomKillDisable": false,"PidsLimit": null,"Ulimits": null,"CpuCount": 0,"CpuPercent": 0,"IOMaximumIOps": 0,"IOMaximumBandwidth": 0,"MaskedPaths": ["/proc/asound","/proc/acpi","/proc/kcore","/proc/keys","/proc/latency_stats","/proc/timer_list","/proc/timer_stats","/proc/sched_debug","/proc/scsi","/sys/firmware"],"ReadonlyPaths": ["/proc/bus","/proc/fs","/proc/irq","/proc/sys","/proc/sysrq-trigger"]},"GraphDriver": {"Data": {"LowerDir": "/var/lib/docker/overlay2/7c01f9cce507abd1ae9b7a8ff60bbe7777c0249b6f1f16b58ca92274cba77135-init/diff:/var/lib/docker/overlay2/98ee8360e5cc47c22bbcd6d6795f9e1fd1282344b5668c1025113b0c75cd95a6/diff","MergedDir": "/var/lib/docker/overlay2/7c01f9cce507abd1ae9b7a8ff60bbe7777c0249b6f1f16b58ca92274cba77135/merged","UpperDir": "/var/lib/docker/overlay2/7c01f9cce507abd1ae9b7a8ff60bbe7777c0249b6f1f16b58ca92274cba77135/diff","WorkDir": "/var/lib/docker/overlay2/7c01f9cce507abd1ae9b7a8ff60bbe7777c0249b6f1f16b58ca92274cba77135/work"},"Name": "overlay2"},"Mounts": [],"Config": {"Hostname": "5583e80d6f3c","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd": ["/bin/sh","-c","while true;do echo caicai;sleep 1;done"],"Image": "centos","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": {"org.label-schema.build-date": "20210915","org.label-schema.license": "GPLv2","org.label-schema.name": "CentOS Base Image","org.label-schema.schema-version": "1.0","org.label-schema.vendor": "CentOS"}},"NetworkSettings": {"Bridge": "","SandboxID": "3eba283d0f17f0dac6febbb9120a3969ccd299d9ce73bdae6a3b624ed9220551","HairpinMode": false,"LinkLocalIPv6Address": "","LinkLocalIPv6PrefixLen": 0,"Ports": {},"SandboxKey": "/var/run/docker/netns/3eba283d0f17","SecondaryIPAddresses": null,"SecondaryIPv6Addresses": null,"EndpointID": "8aae807b8500930b88b75dc012e094cd39054ef33a98e8dbebc48a01091d26ab","Gateway": "172.17.0.1","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"IPAddress": "172.17.0.2","IPPrefixLen": 16,"IPv6Gateway": "","MacAddress": "02:42:ac:11:00:02","Networks": {"bridge": {"IPAMConfig": null,"Links": null,"Aliases": null,"NetworkID": "be628aa5c8f0cffefcb5fc66beeb9cbfa5e46fdccbfb18169e2e7b48366469f1","EndpointID": "8aae807b8500930b88b75dc012e094cd39054ef33a98e8dbebc48a01091d26ab","Gateway": "172.17.0.1","IPAddress": "172.17.0.2","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"MacAddress": "02:42:ac:11:00:02","DriverOpts": null}}}}
]

进入当前正在运行的容器

我们通常进入容器都是以后台的方式运行的,所以我们需要进入容器去修改一些配置

docker exec -it 容器id /bin/bash
root@taobotics:~# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
5583e80d6f3c   centos    "/bin/sh -c 'while t…"   13 minutes ago   Up 13 minutes             upbeat_dewdney
root@taobotics:~# docker exec -it 5583e80d6f3c /bin/bash
[root@5583e80d6f3c /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

方式二:

docker attach  容器id

这样会显示当前正在执行的代码

区别:

  • docker exec

    进入容器之后开启一个新的终端,可以在里面操作

  • docker attach

    进入容器正在执行的终端,不会启动新的进程

拷贝命令

从容器中拷贝文件到主机中

docker cp    容器id:容器内路径  目的主机路径
# 进入容器内部
root@taobotics:~# docker attach 079fd16cde45
[root@079fd16cde45 /]# cd /home
# 创建一个文件 叫test.java文件
[root@079fd16cde45 home]# touch test.java
[root@079fd16cde45 home]# ls
test.java
[root@079fd16cde45 home]# exit
exit
root@taobotics:~# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
root@taobotics:~# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                      PORTS     NAMES
079fd16cde45   centos    "/bin/bash"   2 minutes ago   Exited (0) 17 seconds ago             pedantic_satoshi
#使用命令将容器中的文件拷贝到主机
root@taobotics:~# docker cp 079fd16cde45:/home/test.java /home
root@taobotics:~# ls
cjh  grape_id_code  project
# 查看主机是否有拷贝的文件
root@taobotics:~# cd /home
root@taobotics:/home# ls
admin  dist  test.java

拷贝是一个手动的过程,在之后我们使用 -v 卷的技术,可以实现自动同步 容器的路径与主机的路径联通。

小结

Options:--config string      Location of client config files (default "/root/.docker")-c, --context string     Name of the context to use to connect to the daemon (overrides DOCKER_HOST env var and default context set with"docker context use")-D, --debug              Enable debug mode-H, --host list          Daemon socket(s) to connect to-l, --log-level string   Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")--tls                Use TLS; implied by --tlsverify--tlscacert string   Trust certs signed only by this CA (default "/root/.docker/ca.pem")--tlscert string     Path to TLS certificate file (default "/root/.docker/cert.pem")--tlskey string      Path to TLS key file (default "/root/.docker/key.pem")--tlsverify          Use TLS and verify the remote-v, --version            Print version information and quitManagement Commands:app*        Docker App (Docker Inc., v0.9.1-beta3)builder     Manage buildsbuildx*     Docker Buildx (Docker Inc., v0.8.2-docker)config      Manage Docker configscontainer   Manage containerscontext     Manage contextsimage       Manage imagesmanifest    Manage Docker image manifests and manifest listsnetwork     Manage networksnode        Manage Swarm nodesplugin      Manage pluginsscan*       Docker Scan (Docker Inc., v0.17.0)secret      Manage Docker secretsservice     Manage servicesstack       Manage Docker stacksswarm       Manage Swarmsystem      Manage Dockertrust       Manage trust on Docker imagesvolume      Manage volumesCommands:attach      Attach local standard input, output, and error streams to a running containerbuild       Build an image from a Dockerfilecommit      Create a new image from a container's changescp          Copy files/folders between a container and the local filesystemcreate      Create a new containerdiff        Inspect changes to files or directories on a container's filesystemevents      Get real time events from the serverexec        Run a command in a running containerexport      Export a container's filesystem as a tar archivehistory     Show the history of an imageimages      List imagesimport      Import the contents from a tarball to create a filesystem imageinfo        Display system-wide informationinspect     Return low-level information on Docker objectskill        Kill one or more running containersload        Load an image from a tar archive or STDINlogin       Log in to a Docker registrylogout      Log out from a Docker registrylogs        Fetch the logs of a containerpause       Pause all processes within one or more containersport        List port mappings or a specific mapping for the containerps          List containerspull        Pull an image or a repository from a registrypush        Push an image or a repository to a registryrename      Rename a containerrestart     Restart one or more containersrm          Remove one or more containersrmi         Remove one or more imagesrun         Run a command in a new containersave        Save one or more images to a tar archive (streamed to STDOUT by default)search      Search the Docker Hub for imagesstart       Start one or more stopped containersstats       Display a live stream of container(s) resource usage statisticsstop        Stop one or more running containerstag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGEtop         Display the running processes of a containerunpause     Unpause all processes within one or more containersupdate      Update configuration of one or more containersversion     Show the Docker version informationwait        Block until one or more containers stop, then print their exit codes

Docker的RUN流程和Docker原理、Docker的常用命令、其他命令相关推荐

  1. docker02:run流程和docker原理

    一.docker run流程 二.docker运行原理 Docker是怎么工作的: Docker是一个Client-Server结构的系统,Docker的守护进程运行在宿主机上,通过socket从客户 ...

  2. docker技术学习流程

    docker安装 安装docker(乌班图)-需要su权限 官网: Install Docker Engine on Ubuntu | Docker Documentation 帮助文档: 1.卸载旧 ...

  3. 【Docker篇】Docker的基本组成,底层原理分析

    文章目录 1. Docker的基本组成 1.1 Docker的架构图 1.2 几个名词解释 2. Run的执行原理 3. Docker底层工作原理 Docker官网: https://www.dock ...

  4. 容器化技术(三):Docker的运转流程

    Docker的本质是容器运行时,它是CS架构的,也就是我们通过客户端可以操作Docker服务端. 为了方便大家理解,我们不上来就讲解Docker内部的底层运作原理,我们先从Docker的运转流程开始, ...

  5. docker tag 删除images_深入浅出 Docker (二) —— Docker的基本概念和架构原理

    1. Docker 的基本概念 Docker 有三个基本概念: 镜像(Image) 容器(Container) 仓库(Repository) 1.1 镜像(Image) 操作系统分为内核和用户空间.对 ...

  6. .NET之Docker部署详细流程

    开篇语 自己从头开始走一遍docker部署.net的流程,作为一种学习总结,以及后续会写一些在该基础之上的文章. 本次示例环境:vs2019.net5.docker.postman 创建项目 本次事例 ...

  7. 如何快速打通 Docker 镜像发布流程?

    作者 | 菜菜 责编 | 郭芮 YY妹:菜菜哥,我看了一下Docker相关的内容,但是还是有点迷糊. 菜菜:还有哪不明白呢? YY妹:如果我想用Docker实现所谓的云原生,我的项目该怎么发布呢? 菜 ...

  8. 扩增子分析流程QIIME. 1 使用Docker配置QIIME

    本教程环境为Ubuntu16.04 x64 安装Docker # 安装Docker sudo apt-get install docker.io # 启动Docker服务 service docker ...

  9. docker run后台启动命令_Docker命令详解之run

    RUN 命令 RUN 指令是用来执行命令行命令的,是最常用的指令之一. 命令格式:docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 意思为:通过run命令创建 ...

最新文章

  1. 技术图文:进一步完善自动化交易系统 - 01
  2. 机器学习中你不可不知的几个算法常识
  3. LeetCode--167--两数之和 II - 输入有序数组
  4. 软件调试学习笔记(七)—— 单步步入单步步过
  5. 逆波兰表达式简单介绍
  6. C,C++,C#的点评
  7. 公厕的门下面为什么都要空一截?难道是为了和别人分享我中午吃的两碗螺狮粉?
  8. 想象中的同居生活 VS 真实的同居生活
  9. 程序员们的三高:高并发、高性能、高可用
  10. 你们公司还没使用HTTP3?赶紧来补一补,学习一下如何在Nginx上配置HTTP3。
  11. centos7 下修改网络配置
  12. IP通信基础 3月6日
  13. 关于ioncube的license破解
  14. C#利用Magick图片压缩
  15. git push 报错 pre-receive hook declined
  16. 比特(bits),符号(symbol),码片(chips)区别
  17. xv6 CPU alarm
  18. 浅谈windows 编程中SendMessage函数的妙用!!!
  19. 5个城市,5个女人,5种生活
  20. 【爬虫】网页抓包工具--Charles的使用教程

热门文章

  1. CapLab〔官方正版游戏程式〕更新发布_V7.1.12(2021年第49次)
  2. 【ESMM论文精读】Entire Space Multi-Task Model: An Effective Approach for Estimating Post-Click Conversion
  3. [c++菜鸟]《Accelerate C++》习题解答
  4. 怎么安装winubuntu双系统_win7系统电脑怎么利用ubuntu安装双系统,win7电脑安装双系统的方法...
  5. Rocky Linux 8.5/CentOS 8 安装Wine
  6. 【校招VIP】线上实习 推推 书籍详情模块 产品脑图周最佳
  7. JQuery遍历数组的方法
  8. Personalized Cross-Silo Federated Learning on Non-IID Data 论文解析
  9. NBA名人堂之-沙奎尔·奥尼尔|大卫·罗宾逊|卡尔·马龙|克莱德·德雷克斯勒|约翰·斯托克顿
  10. Html5 常用的单词及其意思(笔记)