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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Docker镜像与容器操作命令详解与实践

操作前请先安装docker并配置镜像加速,查看服务器docker信息如下:

//docker版本信息
[root@localhost ~]# docker version
Client version: 1.7.1
Client API version: 1.19
Go version (client): go1.4.2
Git commit (client): 786b29d
OS/Arch (client): linux/amd64
Server version: 1.7.1
Server API version: 1.19
Go version (server): go1.4.2
Git commit (server): 786b29d
OS/Arch (server): linux/amd64
[root@localhost ~]# docker info
Containers: 1
Images: 2
Storage 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.2
Logging Driver: json-file
Kernel Version: 2.6.32-642.el6.x86_64
Operating System: <unknown>
CPUs: 1
Total Memory: 980.6 MiB
Name: localhost.localdomain
ID: YGSS:VJAY:OZIB:T7D6:Z4QG:6YQM:W4GK:74MO:FGWM:AME3:HKMO:MMCF

【1】镜像基础操作

① 基本操作

image.png

同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。

如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像

② 获取某个镜像ID

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

实例如下:

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

【2】镜像操作实例

① 检索mysql镜像

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

docker search [OPTIONS] 镜像名字

OPTIONS说明:

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

如检索MySQL

docker search mysql


20180624150157871.jpg


② 将镜像下载本机

命令如下:

docker pull 镜像名字[:TAG]


实例如下:

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

20180624150402196.jpg

20180624150422485.jpg


③ 查看本地下载的镜像

命令如下:

docker images [OPTIONS]

OPTIONS说明:

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

20180624150624531.jpg

各个选项说明:

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

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

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

[root@localhost ~]# docker images -a
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
hello-world         latest              9f5834b25059        13 months ago       1.84 kB
<none>              <none>              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】容器基础操作

① 基本语法

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

image.png

② 获取某个容器ID

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

实例如下:

#获取所有容器
[user@host-10-1-236-212 provider]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                          PORTS               NAMES
fa3592edf3b8        a1a58ef617e0        "/bin/bash"              About a minute ago   Exited (0) About a minute ago                       jolly_banach
d75f37eed2f9        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 -aq
fa3592edf3b8
d75f37eed2f9
#过滤并获取需要的容器实例ID
[user@host-10-1-236-212 provider]$ sudo docker ps -aq --filter ancestor=mallprovide:centos
fa3592edf3b8

【4】容器操作实例

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

docker pull centos
docker 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:latest
6999c2f8d40f3c03e6953adb4c15391643d007d934af2933a9c0dbe173ee0664

如下启动交互式容器

//495a24dc98e8为centos镜像id
docker 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 /]# ls
bin  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 :不截断输出。

如下所示,查看docker正在运行的容器,从而可以验证上一步是进入了centos容器中。


③ 退出容器

两种方式:

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

如下所示,容器不停止退出:



④ 启动/停止容器

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

20180624154901806.jpg

强制停止容器

docker kill 容器ID或者容器名

⑤ 容器端口映射

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

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

⑥ 删除容器

docker rm  [-f] 容器ID
docker 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 centos
1ef13fc8f704d4c22eb59a4a24a5bb0b722fc0f2f6fca8304a13e710f8ee9b77
[root@localhost ~]# docker ps
CONTAINER 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 ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
b6df115a44a4        centos              "/bin/sh -c 'while t   49 seconds ago      Up 48 seconds                           evil_newton
#查看日志
docker logs -tf --tail 10 b6df115a44a4

20200212135700716.png


③ 查看容器内运行的进程

命令如下:

docker top  容器id


实例如下:

docker top b6df115a44a4


2020021213581065.png


④ 查看容器内部细节

命令如下

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

20200212140308184.png

第二种实例如下:

docker attach b6df115a44a4


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

命令如下:

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


20200212140752603.png

更多命令

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   # 截取容器停止时的退出状态值

【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


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2天前
|
存储 Linux Docker
CentOS7修改Docker容器和镜像默认存储位置
CentOS7修改Docker容器和镜像默认存储位置
|
3天前
|
Java 数据库连接 Spring
K8S+Docker理论与实践深度集成java面试jvm原理
K8S+Docker理论与实践深度集成java面试jvm原理
|
3天前
|
存储 Kubernetes 监控
使用Kubernetes进行容器编排:技术详解与实践
【5月更文挑战第16天】Kubernetes,简称K8s,是开源容器编排系统,用于自动化部署、扩展和管理容器化应用。核心概念包括节点、Pod(最小部署单元)、服务、标签和副本集。其特点有高可用性、可扩展性、自动化和可移植性。实践使用涉及安装配置集群、编写YAML部署清单、应用部署、监控管理和扩展更新。Kubernetes帮助提升应用的可用性、可扩展性和可移植性。
|
4天前
|
运维 Kubernetes Devops
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
【5月更文挑战第15天】 在当今的云计算时代,企业为了保持竞争力,不断寻求提高软件交付速度和服务质量的方法。本文将探讨如何通过结合DevOps原则和容器化技术来构建一个既高效又稳定的云基础设施。文章首先介绍了DevOps的核心概念及其如何促进开发与运维的协作,然后详细阐述了容器化技术如何优化应用部署和运行环境。最后,通过一个实际案例分析,展示了这种融合策略在提升自动化水平、加快部署速度以及增强系统稳定性方面的具体成效。
|
4天前
|
运维 监控 Kubernetes
构建高效自动化运维体系:基于容器技术的持续集成与持续部署(CI/CD)实践
【5月更文挑战第15天】 随着云计算和微服务架构的普及,传统的IT运维模式面临转型压力。为提高软件交付效率并降低运维成本,本文探讨了利用容器技术实现自动化运维的有效策略。重点分析了在持续集成(CI)和持续部署(CD)流程中,容器如何发挥作用,以及它们如何帮助组织实现敏捷性和弹性。通过具体案例研究,文章展示了容器化技术在自动化测试、部署及扩展中的应用,并讨论了其对系统稳定性和安全性的影响。
|
4天前
|
运维 监控 安全
构建高效自动化运维系统:基于容器技术的持续集成与持续部署(CI/CD)实践
【5月更文挑战第14天】 随着DevOps文化的深入人心,持续集成与持续部署(CI/CD)已成为现代软件工程不可或缺的组成部分。本文将探讨如何利用容器技术,尤其是Docker和Kubernetes,构建一个高效、可扩展的自动化运维系统。通过深入分析CI/CD流程的关键组件,我们将讨论如何整合这些组件以实现代码从提交到生产环境的快速、无缝过渡。文章还将涉及监控、日志管理以及安全性策略等运维考量,为读者提供一个全面的自动化运维解决方案蓝图。
|
4天前
|
运维 监控 Devops
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
【5月更文挑战第14天】 在当今快速迭代的软件发展环境中,传统的IT运维模式已难以满足业务需求。本文探讨了如何通过DevOps文化和容器化技术的融合来构建一个高效且稳定的云基础设施。文中不仅分析了DevOps的核心理念及其对于提升运维效率的影响,还深入剖析了容器化技术如Docker和Kubernetes在自动化部署、弹性伸缩及微服务架构中的关键作用。此外,文章还将分享一系列实践经验,帮助读者理解如何在实际工作中将DevOps与容器化技术有效结合,以支持业务的敏捷性和可靠性。
18 2
|
4天前
|
Kubernetes Cloud Native 持续交付
构建高效稳定的云原生应用:容器编排与微服务治理实践
【5月更文挑战第14天】 随着企业数字化转型的深入,云原生技术以其弹性、敏捷和可扩展的特性成为现代应用开发的首选模式。本文将探讨如何通过容器编排工具如Kubernetes以及微服务架构的有效治理,构建和维护高效且稳定的云原生应用。我们将分析容器化技术的优势,并结合案例讨论在多云环境下实现持续集成、持续部署(CI/CD)的最佳实践,同时解决微服务带来的分布式复杂性问题。通过本文的阐述,读者将获得一套提升系统可靠性和业务连续性的策略框架。
7 0
|
4天前
|
运维 Kubernetes Devops
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
【5月更文挑战第14天】 随着云计算的普及和企业数字化转型的深入,构建一个高效、稳定且能快速响应市场变化的云基础设施已成为众多组织的技术战略核心。本文将探讨如何通过DevOps文化和容器化技术的结合,实现自动化运维流程,提升服务部署效率,确保系统的可扩展性和高可用性。我们还将分析面临的挑战及解决方案,并展示在实际案例中的应用成果。
6 0
|
4天前
|
运维 Kubernetes 持续交付
构建高效自动化运维体系:基于容器技术的持续集成与部署实践
【5月更文挑战第13天】 在现代软件开发周期中,持续集成(CI)和持续部署(CD)已成为提升开发效率、保障产品质量的关键环节。随着云计算和微服务架构的普及,容器技术如Docker和Kubernetes为运维领域带来了革命性的变革。本文旨在探讨如何利用容器技术构建一个高效、可靠的自动化运维体系,实现从代码提交到产品发布的全过程自动化管理。通过深入分析容器化技术的核心原理,结合实际案例,我们将阐述如何优化持续集成流程、确保自动化测试的覆盖率、以及实现无缝的持续部署。
26 2

热门文章

最新文章