详解Docker镜像与容器的常见操作_docker

来源:脚本之家  责任编辑:小易  

一、Docker镜像要理解Docker镜像和Docker容器之间的区别,确实不容易。假设Linux内核是第0层,那么无论怎么运行Docker,它都是运行于内核层之上的。这个Docker镜像,是一个只读的镜像,位于第1层,它不能被修改或不能保存状态。一个Docker镜像可以构建于另一个Docker镜像之上,这种层叠关系可以是多层的。第1层的镜像层我们称之为基础镜像(BaseImage),其他层的镜像(除了最顶层)我们称之为父层镜像(ParentImage)。这些镜像继承了他们的父层镜像的所有属性和设置,并在Dockerfile中添加了自己的配置。Docker镜像通过镜像ID进行识别。镜像ID是一个64字符的十六进制的字符串。但是当我们运行镜像时,通常我们不会使用镜像ID来引用镜像,而是使用镜像名来引用。要列出本地所有有效的镜像,可以使用命令docker images镜像可以发布为不同的版本,这种机制我们称之为标签(Tag)。如上图所示,neo4j镜像有两个版本:lastest版本和2.1.5版本。可以使用pull命令加上指定的标签:docker pull ubuntu:14.04docker pull ubuntu:12.04二、Docker容器Docker容器可以使用命令创建:docker run imagename它会在所有的镜像层之上增加一个可写层。这个可写层有运行在CPU上的进程,而且有两个不同的状态:运行态(Running)和退出态(Exited)。这就是Docker容器。当我们使用dockerrun启动容器,Docker容器就进入运行态,当我们停止Docker容器时,它就进入退出态。当我们有一个正在运行的Docker容器时,从运行态到停止态,我们对它所做的一切变更都会永久地写到容器的文件系统中。要切记,对容器的变更是写入到容器的文件系统的,而不是写入到Docker镜像中的。我们可以用同一个镜像启动多个Docker容器,这些容器启动后都是活动的,彼此还是相互隔离的。我们对其中一个容器所做的变更只会局限于那个容器本身。如果对容器的底层镜像进行修改,那么当前正在运行的容器是不受影响的,不会发生自动更新现象。如果想更新容器到其镜像的新版本,那么必须当心,确保我们是以正确的方式构建了数据结构,否则我们可能会导致损失容器中所有数据的后果。64字符的十六进制的字符串来定义容器ID,它是容器的唯一标识符。容器之间的交互是依靠容器ID识别的,由于容器ID的字符太长,我们通常只需键入容器ID的前4个字符即可。当然,我们还可以使用容器名,但显然用4字符的容器ID更为简便www.zgxue.com防采集请勿采集本网。

镜像加速器

要理解Docker镜像和docker容器之间的区别,确实不容易。假设Linux内核是第0层,那么无论怎么运行Docker,它都是运行于内核层之上的。这个Docker镜像,是一个只读的镜像,位于第1层,它不能被修改

国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。国内很多云服务商都提供了国内加速器服务,例如:

当想让一个容器做两件事情,或者使一个Docker镜像包含来自两个不同镜像的依赖库时,就需要知道每个镜像的Dockerfile。本文介绍了如何通过docker history命令来对Docker镜像进行反向工程,得到它们的

网易云加速器 https://hub-mirror.c.163.com

容器是由镜像产生,镜像是用来生成容器,镜像可以移植到任何docker环境下生成容器。更多的Docker教程,可以百度搜索 知识林

阿里云加速器(需登录账号获取): https://cr.console.aliyun.com/cn-hangzhou/mirrors

1.安装 Docker在开始前,我们首先得确保在Linux主机中已经安装了Docker。这里,我运行的是CentOS 7 要创建 Docker 镜像,我们需要用文本编辑器创建一个名为Dockerfile的文件。nano Dockerfile

国内各大云服务商均提供了 Docker 镜像加速服务,建议根据运行 Docker 的云平台选择对应的镜像加速服务,具体请参考官方文档。

docker run的时候可以加很多参数,如容器的资源配额限制、hostname、挂载本地目录、DNS等配置,请参看docker run-help 查看容器状态 查看正在运行的容器的状态 docker ps 查看所有容器(包括已经Exit容器

在CentOS7系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)

[root@docker01 ~]# vim /etc/docker/daemon.json{ "registry-mirrors": [ "https://hub-mirror.c.163.com" ]}

注意,一定要保证该文件符合 json 规范,否则 Docker 将不能启动。

之后重新启动服务。

systemctl daemon-reloadsystemctl restart docker

检查加速器是否生效

执行如下命令,如果从结果中看到了如下内容,说明配置成功。

[root@docker01 ~]# docker info # 显示整个系统的信息………………Registry Mirrors: https://hub-mirror.c.163.com/Live Restore Enabled: falseWARNING: bridge-nf-call-iptables is disabledWARNING: bridge-nf-call-ip6tables is disabled

Dcoker镜像操作

说明:Docker 运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker 会从镜像仓库下载该镜像。

search搜索镜像

[root@docker01 ~]# docker search centosNAME DESCRIPTION STARS OFFICIAL AUTOMATEDcentos The official build of CentOS. 5934 [OK] ansible/centos7-ansible Ansible on Centos7 128 [OK]jdeathe/centos-ssh OpenSSH / Supervisor / EPEL/IUS/SCL Repos - … 114 [OK]consol/centos-xfce-vnc Centos container with "headless" VNC session… 114 [OK]centos/mysql-57-centos7 MySQL 5.7 SQL database server 74 …………

pull从镜像中心下载镜像

# 格式:docker pull <image_name>:<tag> ,如果没有tag,默认为 latest[root@docker01 ~]# docker pull centos:latestlatest: Pulling from library/centos8a29a15cefae: Pull complete Digest: sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700Status: Downloaded newer image for centos:latest

push推送镜像到镜像中心

格式:docker push <image_name>:<tag>[root@docker01 ~]# docker push registry.cn-beijing.aliyuncs.com/google_registry/centos:latest

说明:如果有疑问可先忽略,后面搭建私有仓库文章会再次说明的。

images列出镜像

[root@docker01 ~]# docker images # 或者 docker image lsREPOSITORY TAG IMAGE ID CREATED SIZEcentos latest 470671670cac 2 months ago 237MB

save镜像保存到本地

# 格式:docker save -o <保存的文件名> <image_name:tag>|<image_id>[root@docker01 docker_test]# docker save -o centos_docker_20200413.tar centos:latest [root@docker01 docker_test]# ll -htotal 234M-rw------- 1 root root 234M Apr 13 16:21 centos_docker_20200413.tar

rmi删除镜像

# 格式:docker rmi <image_name:tag>|<image_id>[root@docker01 docker_test]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEcentos latest 470671670cac 2 months ago 237MB[root@docker01 docker_test]# docker rmi 470671670cac # 删除镜像 [root@docker01 docker_test]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE

load导入镜像

# 格式:docker load -i <image_file>[root@docker01 docker_test]# docker load -i centos_docker_20200413.tar[root@docker01 docker_test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZEcentos latest 470671670cac 2 months ago 237MB

tag标签

# 格式:docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG][root@docker01 docker_test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZEcentos latest 470671670cac 2 months ago 237MB [root@docker01 docker_test]# docker tag centos:latest centos:20200413[root@docker01 docker_test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZEcentos 20200413 470671670cac 2 months ago 237MBcentos latest 470671670cac 2 months ago 237MB

使用:根据需要给docker镜像打一个新标签。

info显示整个系统的信息

[root@docker01 ~]# docker info Containers: 0 Running: 0 Paused: 0 Stopped: 0Images: 1Server Version: 18.06.3-ceStorage Driver: overlay2 Backing Filesystem: xfs Supports d_type: true Native Overlay Diff: trueLogging Driver: json-fileCgroup Driver: cgroupfsPlugins: Volume: local Network: bridge host macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslogSwarm: inactiveRuntimes: runcDefault Runtime: runcInit Binary: docker-initcontainerd version: 468a545b9edcd5932818eb9de8e72413e616e86erunc version: a592beb5bc4c4092b1b1bac971afed27687340c5init version: fec3683Security Options: seccomp Profile: defaultKernel Version: 3.10.0-1062.el7.x86_64Operating System: CentOS Linux 7 (Core)OSType: linuxArchitecture: x86_64CPUs: 2Total Memory: 1.777GiBName: docker01ID: XIHU:XNWU:II7A:YXUH:BOZ3:JSGG:J3P2:CU2Z:5QHA:5Y64:PZ4V:62DIDocker Root Dir: /var/lib/dockerDebug Mode (client): falseDebug Mode (server): falseRegistry: https://index.docker.io/v1/Labels:Experimental: falseInsecure Registries: 127.0.0.0/8Registry Mirrors: https://hub-mirror.c.163.com/Live Restore Enabled: falseWARNING: bridge-nf-call-iptables is disabledWARNING: bridge-nf-call-ip6tables is disabled

system镜像体积查看

另外一个需要注意的问题是,docker image ls 列表中的镜像体积总和并非是所有镜像实际硬盘消耗。由于 Docker 镜像是多层存储结构,并且可以继承、复用,因此不同镜像可能会因为使用相同的基础镜像,从而拥有共同的层。由于 Docker 使用 Union FS,相同的层只需要保存一份即可,因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和要小的多。

可以通过以下命令来便捷的查看镜像、容器、数据卷所占用的空间。

[root@docker01 docker_test]# docker system dfTYPE TOTAL ACTIVE SIZE RECLAIMABLEImages 2 0 440.1MB 440.1MB (100%)Containers 0 0 0B 0BLocal Volumes 0 0 0B 0BBuild Cache 0 0 0B 0B

inspect显示镜像或容器的详情

# 格式:docker inspect <镜像ID>|<镜像名>|<容器ID>|<容器名>[root@docker01 ~]# docker inspect centos:latest # 显示镜像详情[root@docker01 ~]# docker inspect 67ba647b0151 # 显示容器详情

Dcoker容器操作

run创建容器

# 格式:docker run [OPTIONS] IMAGE [COMMAND] [ARG...][root@docker01 ~]# docker run -i -t --name centos01 centos:latest /bin/bash[root@f7c4da3cecad /]# # 此时已进入docker容器[root@f7c4da3cecad /]# exit # 退出容器,此时容器会停止【正常情况】[root@docker01 ~]#

参数说明:

-i 交互式操作

-t 分配一个终端

--name 运行的容器名称

最后的/bin/bash 要执行的命令

ps查看容器

[root@docker01 ~]# docker ps # 查看正在运行的容器CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES[root@docker01 ~]# [root@docker01 ~]# docker ps -a # 查看所有容器,包括运行和停止的CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf7c4da3cecad centos:latest "/bin/bash" 4 minutes ago Exited (0) 36 seconds ago centos01

start启动容器

# 格式:docker start <容器名>|<容器ID>[root@docker01 ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf7c4da3cecad centos:latest "/bin/bash" 10 minutes ago Exited (0) 3 seconds ago centos01[root@docker01 ~]# docker start f7c4da3cecad # 启动容器f7c4da3cecad[root@docker01 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf7c4da3cecad centos:latest "/bin/bash" 10 minutes ago Up 3 seconds centos01

restart重启容器

# 格式:docker restart <容器名>|<容器ID>[root@docker01 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf7c4da3cecad centos:latest "/bin/bash" 15 minutes ago Up 4 minutes centos01[root@docker01 ~]# docker restart f7c4da3cecad # 重启容器f7c4da3cecad[root@docker01 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf7c4da3cecad centos:latest "/bin/bash" 15 minutes ago Up 1 second centos01

stop停止容器

# 格式:docker stop <容器名>|<容器ID>[root@docker01 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf7c4da3cecad centos:latest "/bin/bash" 3 hours ago Up 4 minutes centos01[root@docker01 ~]# docker stop f7c4da3cecad # 停止容器f7c4da3cecad[root@docker01 ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf7c4da3cecad centos:latest "/bin/bash" 3 hours ago Exited (0) 10 seconds ago centos01

rm删除容器

# 格式:docker rm <容器名>|<容器ID>[root@docker01 ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf7c4da3cecad centos:latest "/bin/bash" 3 hours ago Exited (0) 10 seconds ago centos01[root@docker01 ~]# docker rm f7c4da3cecad # 删除已停止的容器f7c4da3cecad

说明:如果要强制删除正在运行的容器,使用 docker rm -f <容器ID>。不过生产环境不建议强制删除容器,防止误删除。

rename容器重命名

# 格式:docker rename CONTAINER NEW_NAME[root@docker01 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES67ba647b0151 centos:latest "/bin/bash" About a minute ago Up About a minute centos01[root@docker01 ~]# docker rename 67ba647b0151 centos001 # 容器重命名[root@docker01 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES67ba647b0151 centos:latest "/bin/bash" 2 minutes ago Up About a minute centos001

exec进入容器或在运行容器中执行命令

进入容器

[root@docker01 ~]# docker exec -it f7c4da3cecad bash[root@f7c4da3cecad /]#

说明:不建议通过 docker attach 方式进入容器。

在容器外让指定容器执行命令

# 不要有 -t 选项,因为不需要分配 tty 终端[root@docker01 ~]# docker exec -i f7c4da3cecad bash -c "ps -ef"UID PID PPID C STIME TTY TIME CMDroot 1 0 0 10:12 pts/0 00:00:00 /bin/bashroot 78 0 0 10:19 ? 00:00:00 ps -ef

cp复制文件或目录

将宿主机文件或目录,拷贝到docker容器中

[root@docker01 ~]# docker exec -i 67ba647b0151 bash -c "ls -l /root"total 12-rw------- 1 root root 2366 Jan 13 21:49 anaconda-ks.cfg-rw-r--r-- 1 root root 435 Jan 13 21:49 anaconda-post.log-rw------- 1 root root 2026 Jan 13 21:49 original-ks.cfg[root@docker01 ~]# [root@docker01 ~]# docker cp /usr/bin/telnet 67ba647b0151:/root/ # 拷贝文件[root@docker01 ~]# docker cp /root/basedOptimi 67ba647b0151:/root/ # 拷贝目录[root@docker01 ~]# docker exec -i 67ba647b0151 bash -c "ls -l /root"total 112-rw------- 1 root root 2366 Jan 13 21:49 anaconda-ks.cfg-rw-r--r-- 1 root root 435 Jan 13 21:49 anaconda-post.logdrwxr-xr-x 2 root root 30 Mar 8 19:59 basedOptimi-rw------- 1 root root 2026 Jan 13 21:49 original-ks.cfg-rwxr-xr-x 1 root root 101776 Aug 3 2017 telnet

将docker容器中的文件或目录,拷贝到宿主机中

[root@docker01 ~]# docker cp 67ba647b0151:/root/original-ks.cfg /root/ # 拷贝文件[root@docker01 ~]# docker cp 67ba647b0151:/etc /root/ # 拷贝目录

logs查看容器日志

[root@docker01 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf7c4da3cecad centos:latest "/bin/bash" 3 hours ago Up 1 second centos01# 获取容器日志[root@docker01 ~]# docker logs -f --tail 500 f7c4da3cecad…………

参数说明:

-f 持续打印输出

--tail 500 打印日志最后的500行

stats容器使用资源统计

可用于监控

[root@docker01 ~]# docker stats <容器ID>|<容器名称> # 持续监控[root@docker01 ~]# docker stats --no-stream <容器ID>|<容器名称> # 不是持续监控,只显示第一次返回的结果

top容器中运行的进程

[root@docker01 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES67ba647b0151 centos:latest "/bin/bash" 2 hours ago Up 2 hours centos001 # 查看容器中运行的进程信息[root@docker01 ~]# docker top 67ba647b0151UID PID PPID C STIME TTY TIME CMDroot 3302 3285 0 21:13 pts/0 00:00:00 /bin/bash

port容器映射特定端口

容器映射端口有:随机端口映射、指定单个端口映射、指定多个端口映射

获取镜像

[root@docker01 ~]# docker pull registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17[root@docker01 ~]# docker tag ed21b7a8aee9 nginx:1.17[root@docker01 ~]# docker images | grep 'nginx'nginx 1.17 ed21b7a8aee9 2 weeks ago 127MBregistry.cn-beijing.aliyuncs.com/google_registry/nginx 1.17 ed21b7a8aee9 2 weeks ago 127MB

映射随机端口

[root@docker01 ~]# docker run -d -P --name nginx01 nginx:1.17e90c9faaf8e3387920dd9763bf5c7df9dd17856673868bb512cec78741ff71dc[root@docker01 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESe90c9faaf8e3 nginx:1.17 "nginx -g 'daemon of…" 3 seconds ago Up 2 seconds 0.0.0.0:1025->80/tcp nginx01

说明:

0.0.0.0:1025->80/tcp 前面为宿主机端口,后面为容器端口

容器日志:

[root@docker01 ~]# docker logs -f --tail 500 nginx01

浏览器访问:

映射单个指定端口

[root@docker01 ~]# docker run -d -p 81:80 --name nginx02 nginx:1.1704478222f0dc981883f25504164be3af7da49248886cee7386ccc89b80cc57a1[root@docker01 ~]# docker ps | grep 'nginx02'04478222f0dc nginx:1.17 "nginx -g 'daemon of…" 29 seconds ago Up 28 seconds 0.0.0.0:81->80/tcp nginx02

浏览器访问:

映射多个指定端口

[root@docker01 ~]# docker run -d -p 85:80 -p 445:443 --name nginx03 nginx:1.175886e52ff8e934bc827c8d7753a532b9062bd045799d0658a008e371e6ecd09c[root@docker01 ~]# docker ps | grep 'nginx03'5886e52ff8e9 nginx:1.17 "nginx -g 'daemon of…" 12 seconds ago Up 11 seconds 0.0.0.0:85->80/tcp, 0.0.0.0:445->443/tcp nginx03

推荐阅读

1、 Docker简介与安装

到此这篇关于详解Docker镜像与容器的常见操作的文章就介绍到这了,更多相关Docker镜像与容器操作内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网!

假设Linux内核是第0层,那么无论怎么运行Docker,它都是运行于内核层之上的。这个Docker镜像,是一个只读的镜像,位于第1层,它不能被修改或不能保存状态。一个Docker镜像可以构建于另一个Docker镜像之上,这种层叠关系可以是多层的。第1层的镜像层我们称之为基础镜像(Base Image),其他层的镜像(除了最顶层)我们称之为父层镜像(Parent Image)。这些镜像继承了他们的父层镜像的所有属性和设置,并在Dockerfile中添加了自己的配置。Docker镜像通过镜像ID进行识别。镜像ID是一个64字符的十六进制的字符串。但是当我们运行镜像时,通常我们不会使用镜像ID来引用镜像,而是使用镜像名来引用。要列出本地所有有效的镜像,可以使用命令内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • centos7.2服务器上搭建docker私有镜像仓库操作示例
  • docker常用命令总结之安装、镜像、容器基本操作
  • 删除docker里建立容器的操作方法
  • docker 容器操作指令汇总详解
  • docker容器的导入导出操作教程
  • linux系统安装docker并用ssh登录docker容器的操作方法
  • docker容器挂载宿主主机目录的操作方法
  • docker 容器操作退出后进入解决办法
  • 使用ipython来操作docker容器的入门指引
  • 在docker上安装配置oracle教程
  • docker容器运行后退出(怎么才能一直运行)
  • docker容器自启动的实现方法
  • 如何使用docker部署前端应用的方法步骤
  • docker容器从入门到痴迷(推荐)
  • docker compose部署及基础使用详解
  • docker基础教程之dockerfile语法详解
  • docker 学习笔记之docker连接网络的设置
  • docker.service启动失败:unit not found的原因及解决办法
  • dockerfile指令详解
  • Docker 镜像和容器的区别详解
  • Docker的镜像和容器的区别
  • Docker中镜像和容器的关系是什么
  • Docker的镜像和容器的区别
  • Docker的镜像和容器的区别
  • Docker的镜像和容器的区别
  • Docker的镜像和容器有什么区别
  • 如何打包创建镜像和运行Docker容器及常用命令
  • 如何打包创建镜像和运行Docker容器及常用命
  • Docker的镜像和容器的区别
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全dockerhyper-vvmwarevirtualboxxenserverkvmqemuopenvzxencloudstackopenstack云计算技术云其它首页服务器云和虚拟化dockercentos7.2服务器上搭建docker私有镜像仓库操作示例docker常用命令总结之安装、镜像、容器基本操作删除docker里建立容器的操作方法docker 容器操作指令汇总详解docker容器的导入导出操作教程linux系统安装docker并用ssh登录docker容器的操作方法docker容器挂载宿主主机目录的操作方法docker 容器操作退出后进入解决办法使用ipython来操作docker容器的入门指引在docker上安装配置oracle教程docker容器运行后退出(怎么才能一直运行)docker容器自启动的实现方法如何使用docker部署前端应用的方法步骤docker容器从入门到痴迷(推荐)docker compose部署及基础使用详解docker基础教程之dockerfile语法详解docker 学习笔记之docker连接网络的设置docker.service启动失败:unit not found的原因及解决办法dockerfile指令详解docker 给运行中的容器设置端口映docker 清理命令集锦docker获取镜像报错docker: erroubuntu14.04+docker的安装及使用docker.service启动失败:unit ndocker容器如何优雅的终止详解浅谈docker-compose网络设置之necentos7 安装docker 解决启动不了详解docker国内镜像拉取和镜像加docker如何固定ip设置的方法浅谈docker 容器数据卷挂载小结详解docker 下开发 hyperf 完整使用示例浅谈docker数据持久化docker 1分钟搭建dns服务器的方法springboot整合docker部署实现两种构建dodocker镜像上传到阿里云的步骤详解docker安装tomcat dubbo-admin实例技巧详解docker+jenkins+gitlab+django应用部docker容器之内网独立ip访问的方法docker学习之搭建activemq消息服务的方法
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved