Docker镜像与容器操作命令详解与实践

网友投稿 263 2022-10-19

Docker镜像与容器操作命令详解与实践

Docker 镜像仓库官方地址:docker官网:docker中文网站:~]# docker versionClient version: 1.7.1Client API version: 1.19Go version (client): go1.4.2Git commit (client): 786b29dOS/Arch (client): linux/amd64Server version: 1.7.1Server API version: 1.19Go version (server): go1.4.2Git commit (server): 786b29dOS/Arch (server): linux/amd64[root@localhost ~]# docker infoContainers: 1Images: 2Storage Driver: devicemapper Pool Name: docker-8:2-393747-pool Pool Blocksize: 65.54 kB Backing Filesystem: extfs Data file: /dev/loop0 Metadata file: /dev/loop1 Data Space Used: 307.7 MB Data Space Total: 107.4 GB Data Space Available: 15.64 GB Metadata Space Used: 827.4 kB Metadata Space Total: 2.147 GB Metadata Space Available: 2.147 GB Udev Sync Supported: true Deferred Removal Enabled: false Data loop file: /var/lib/docker/devicemapper/devicemapper/data Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata Library Version: 1.02.117-RHEL6 (2016-04-01)Execution Driver: native-0.2Logging Driver: json-fileKernel Version: 2.6.32-642.el6.x86_64Operating System: CPUs: 1Total Memory: 980.6 MiBName: localhost.localdomainID: YGSS:VJAY:OZIB:T7D6:Z4QG:6YQM:W4GK:74MO:FGWM:AME3:HKMO:MMCF

【1】镜像基础操作

① 基本操作

操作

命令

说明

检索

docker search 关键字

我们经常去docker hub上检索镜像的详细信息,如镜像的TAG

拉取

docker pull 镜像名:tag

:tag是可选的,tag表示标签,多为软件的版本,默认是latest

列表

docker images

查看所有本地镜像

删除

docker rmi image-id

删除指定的本地镜像

同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。 如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像

② 获取某个镜像ID

docker images -q --filter reference=镜像名:TAG

实例如下:

#本地所有镜像[user@host-10-1-236-212 provider]$ sudo docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEmallprovide centos a1a58ef617e0 57 minutes ago 735 MB e7a13b758b49 25 hours ago 735 MB 195e8f975d8f 25 hours ago 735 MBmallclient centos 65c034fee341 3 days ago 651 MB 12fa76481655 3 days ago 370 MBss centos 423d20ef018f 3 months ago 695 MB 0a3506fed9ca 3 months ago 337 MBuser centos 2a06115d8688 3 months ago 723 MBdocker.io/centos latest 470671670cac 6 months ago 237 MBdocker.io/mysql 5.7.16 d9124e6c552f 3 years ago 383 MB#本地所有镜像的镜像ID[user@host-10-1-236-212 provider]$ sudo docker images -qa1a58ef617e0e7a13b758b49195e8f975d8f65c034fee34112fa76481655423d20ef018f0a3506fed9ca2a06115d8688470671670cacd9124e6c552f#过滤并获取指定镜像ID[user@host-10-1-236-212 provider]$ sudo docker images -q --filter reference=mallprovide:centosa1a58ef617e0

【2】镜像操作实例

① 检索mysql镜像

命令(从​​docker官方仓库检索​​):

docker search [OPTIONS] 镜像名字

OPTIONS说明:

--no-trunc : 显示完整的镜像描述-s : 列出收藏数不小于指定值的镜像--automated : 只列出 automated build类型的镜像

如检索MySQL

docker search mysql

② 将镜像下载本机

命令如下:

docker pull 镜像名字[:TAG]

实例如下:

docker pull mysql//默认最新版本docker pull mysql:5.7.22//拉取指定版本

③ 查看本地下载的镜像

命令如下:

docker images [OPTIONS]

OPTIONS说明:

-a :列出本地所有的镜像(含中间映像层)-q :只显示镜像ID--digests :显示镜像的摘要信息--no-trunc :显示完整的镜像信息

REPOSITORY:表示镜像的仓库源TAG:镜像的标签IMAGE ID:镜像IDCREATED:镜像创建时间SIZE:镜像大小

同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,我们使用​​REPOSITORY:TAG​​​ 来定义不同的镜像。如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ​​ubuntu:latest​​ 镜像

镜像里面是还有多层的,如下所示:

[root@localhost ~]# docker images -aREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEhello-world latest 9f5834b25059 13 months ago 1.84 kB 65b27d3bd74d 13 months ago 1.84 kB

④ 删除指定镜像

删除单个命令如下(​​-f​​表示强制删除):

docker rmi -f 镜像ID/唯一镜像名字

如下所示,删除id 为 0d16d0a97dd1 的镜像:

docker rmi -f 镜像名1:TAG 镜像名2:TAG

删除全部镜像

docker rmi -f $(docker images -qa)

【3】容器基础操作

① 基本语法

将下载下来的镜像运行,生成对应的容器。

操作

命令

说明

运行

docker run --name container-name -d image-name

–name:自定义容器名 -d:后台运行 image-name:指定镜像模板

列表

docker ps(查看运行中的容器)

加上-a;可以查看所有容器

停止

docker stop container-name/container-id

停止当前你运行的容器

启动

docker start container-name/container-id

启动容器

重启

docker restart container-name/container-id

重新启动容器

删除

docker rm container-name/container-id

删除指定容器

强制删除

docker rm -f container-name/container-id

强制删除指定容器

强制停止

docker kill 容器ID或者容器名

强制停止容器

端口映射

-p 6379:6379

-p:主机端口(映射到)容器内部的端口

容器日志

docker logs container-name/container-id

查看容器内软件运行日志

② 获取某个容器ID

docker ps -aq --filter ancestor=镜像名:TAG

实例如下:

#获取所有容器[user@host-10-1-236-212 provider]$ sudo docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESfa3592edf3b8 a1a58ef617e0 "/bin/bash" About a minute ago Exited (0) About a minute ago jolly_banachd75f37eed2f9 2a06115d8688 "/usr/local/tomcat..." 3 months ago Exited (137) 3 months ago quirky_tesla#获取所有容器实例ID [user@host-10-1-236-212 provider]$ sudo docker ps -aqfa3592edf3b8d75f37eed2f9#过滤并获取需要的容器实例ID[user@host-10-1-236-212 provider]$ sudo docker ps -aq --filter ancestor=mallprovide:centosfa3592edf3b8

【4】容器操作实例

​​有镜像才能创建容器,这是根本前提​​。先拉取演示镜像:

docker pull centosdocker pull tomcat

① 运行镜像,创建容器

命令如下:

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS说明(常用):有些是一个减号,有些是两个减号

--name="容器新名字": 为容器指定一个名称;-d: 后台运行容器,并返回容器ID,也即启动守护式容器;-i:以交互模式运行容器,通常与 -t 同时使用;-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;-P: 随机端口映射;-p: 指定端口映射,有以下四种格式 ip:hostPort:containerPort ip::containerPort hostPort:containerPort containerPort

如启动一个Tomcat容器并指定容器名字:

[root@localhost ~]# docker run --name mytomcat -d tomcat:latest6999c2f8d40f3c03e6953adb4c15391643d007d934af2933a9c0dbe173ee0664

如下​​启动交互式容器​​:

//495a24dc98e8为centos镜像iddocker run -it 495a24dc98e8#如果出现下面错误则是docker认为你的内核版本太低#FATAL: kernel too old

使用镜像​​centos:latest​​以交互模式启动一个容器,在容器内执行/bin/bash命令。

docker run -it centos /bin/bash

容器运行成功则会进入docker里面的centos中,验证如下:

#ca995caf8c80 是容器ID[root@ca995caf8c80 /]# pwd/[root@ca995caf8c80 /]# lsbin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var

② 查看容器(运行中/所有)

命令格式如下:

docker ps [OPTIONS]

OPTIONS说明(常用):

-a :列出当前所有正在运行的容器+历史上运行过的-l :显示最近创建的容器。-n:显示最近n个创建的容器。-q :静默模式,只显示容器编号。--no-trunc :不截断输出。

③ 退出容器

两种方式:

exit–容器停止退出crtl+p+q—容器不停止退出

④ 启动/停止容器

docker start/stop 容器ID或者容器名docker start container-name/container-iddocker stop container-name/container-id

强制停止容器

docker kill 容器ID或者容器名

⑤ 容器端口映射

需要做主机到容器的端口映射:

[root@localhost ~]# docker run --name mytomcat -p 8080:8080 -d tomcat:latestb9db8db45133b27b45e3b2f454039c76524930461a3abb05df63c9ad85998e27[root@localhost ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESb9db8db45133 tomcat:latest "catalina.sh run" 7 seconds ago Up 6 seconds 0.0.0.0:8080->8080/tcp mytomcat

⑥ 删除容器

docker rm [-f] 容器IDdocker rm container-name/container-id

一次性删除多个容器

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

【5】以守护进程方式运行容器

① 以守护进程方式运行容器

命令如下:

docker run -d [OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS说明(常用):有些是一个减号,有些是两个减号

--name="容器新名字": 为容器指定一个名称;-i:以交互模式运行容器,通常与 -t 同时使用;-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;-P: 随机端口映射;-p: 指定端口映射,有以下四种格式 ip:hostPort:containerPort ip::containerPort hostPort:containerPort containerPort

实例如下:

[root@localhost ~]# docker run -d centos1ef13fc8f704d4c22eb59a4a24a5bb0b722fc0f2f6fca8304a13e710f8ee9b77[root@localhost ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

使用​​docker run -d centos​​命令运行容器,然后docker ps -a 进行查看, 会发现容器已经退出。

这是因为Docker容器后台运行,就必须有一个前台进程。容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。

这个是docker的机制问题,比如你的web容器,我们以nginx为例。正常情况下,我们配置启动服务只需要启动响应的service即可。例如​​service nginx start​​但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用,这样的容器后台启动后,会立即自杀因为他觉得他没事可做了。

所以,最佳的解决方案是,​​将你要运行的程序以前台进程的形式​​运行。

② 查看容器日志

命令如下:

docker logs -f -t --tail 数字 容器ID

OPTIONS说明:

-t 是加入时间-f 跟随最新的日志打印--tail 数字 显示最后多少条

实例如下:

#启动容器docker run -d centos /bin/sh -c "while true;do echo hello zzyy;sleep 2;done"#查看运行的容器[root@localhost ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESb6df115a44a4 centos "/bin/sh -c 'while t 49 seconds ago Up 48 seconds evil_newton#查看日志docker logs -tf --tail 10 b6df115a44a4

③ 查看容器内运行的进程

命令如下:

docker top 容器id

实例如下:

docker top b6df115a44a4

④ 查看容器内部细节

命令如下:

docker inspect 容器ID

实例如下:

docker inspect b6df115a44a4

⑥ 进入正在运行的容器并以命令行交互

两种方式:

docker exec -it 容器ID bashShell重新进入:docker attach 容器ID

​​二者区别是​​:attach 直接进入容器启动命令的终端,不会启动新的进程;exec 是在容器中打开新的终端,并且可以启动新的进程。

第一种实例如下:

docker exec -it b6df115a44a4 /bin/bash#或者如下docker exec -it b6df115a44a4 ls -l /tmp

docker attach b6df115a44a4

⑦ 从容器内拷贝文件到主机

命令如下:

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

attach Attach to a running container # 当前 shell 下 attach 连接指定运行镜像build Build an image from a Dockerfile # 通过 Dockerfile 定制镜像commit Create a new image from a container changes # 提交当前容器为新的镜像cp Copy files/folders from the containers filesystem to the host path #从容器中拷贝指定文件或者目录到宿主机中create Create a new container # 创建一个新的容器,同 run,但不启动容器diff Inspect changes on a container's filesystem # 查看 docker 容器变化events Get real time events from the server # 从 docker 服务获取容器实时事件exec Run a command in an existing container # 在已存在的容器上运行命令export Stream the contents of a container as a tar archive # 导出容器的内容流作为一个 tar 归档文件[对应 import ]history Show the history of an image # 展示一个镜像形成历史images List images # 列出系统当前镜像import Create a new filesystem image from the contents of a tarball # 从tar包中的内容创建一个新的文件系统映像[对应export]info Display system-wide information # 显示系统相关信息inspect Return low-level information on a container # 查看容器详细信息kill Kill a running container # kill 指定 docker 容器load Load an image from a tar archive # 从一个 tar 包中加载一个镜像[对应 save]login Register or Login to the docker registry server # 注册或者登陆一个 docker 源服务器logout Log out from a Docker registry server # 从当前 Docker registry 退出logs Fetch the logs of a container # 输出当前容器日志信息port Lookup the public-facing port which is NAT-ed to PRIVATE_PORT # 查看映射端口对应的容器内部源端口pause Pause all processes within a container # 暂停容器ps List containers # 列出容器列表pull Pull an image or a repository from the docker registry server # 从docker镜像源服务器拉取指定镜像或者库镜像push Push an image or a repository to the docker registry server # 推送指定镜像或者库镜像至docker源服务器restart Restart a running container # 重启运行的容器rm Remove one or more containers # 移除一个或者多个容器rmi Remove one or more images # 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]run Run a command in a new container # 创建一个新的容器并运行一个命令save Save an image to a tar archive # 保存一个镜像为一个 tar 包[对应 load]search Search for an image on the Docker Hub # 在 docker hub 中搜索镜像start Start a stopped containers # 启动容器stop Stop a running containers # 停止容器tag Tag an image into a repository # 给源中镜像打标签top Lookup the running processes of a container # 查看容器中运行的进程信息unpause Unpause a paused container # 取消暂停容器version Show the docker version information # 查看 docker 版本号wait Block until a container stops, then print its exit code # 截取容器停止时的退出状态值

其他Docker命令参阅官网:​​docker命令官网地址​​

【Tips】

创建多个Tomcat并启动容器的时候可能会遇到如下错误:

Error response from daemon: Cannot start container web: iptables failed: iptables -t nat -A DOCKER -p tcp -d 0/0 --dport 8081 -j DNAT --to-destination 172.17.0.30:5000 ! -i docker0: iptables: No chain/target/match by that name.

解决办法:重建docker0网络恢复

pkill docker iptables -t nat -F ifconfig docker0 down brctl delbr docker0 service docker restart

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:了解一下docker容器数据卷
下一篇:剑指Offer之Java算法习题精讲数组与二叉树
相关文章

 发表评论

暂时没有评论,来抢沙发吧~