Docker镜像和容器命令使用详解

一、Docker镜像操作

1.1 镜像名称的格式

  • 镜名称一般分两部分组成:[repository]:[tag]。
  • 在没有指定tag时,默认是latest,代表最新版本的镜像。

例如:

mysql:5.7

mysql就是repository,仓库名称。

5.7就是tag,可以理解为标记、标签,或者版本号。

mysql:5.7就是完整的镜像名称。

1.2 Docker命令使用技巧

Docker中的命令很多,全部记忆是非常困难的。

今后如果某个命令想不起来怎么用。

可以在当前Linux命令终端查看Docker命令文档。

  • 查看全部Docker命令
docker --help
  • 详细查看某个命令的用法,比如images的用法
docker images --help

1.3 镜像相关命令详解

命令格式:

docker command [OPTIONS] parameter
  • command :具体命令
  • OPTIONS :命令选项(中括号代表可选参数
  • parameter :代表要传递给命令的具体参数
1.3.1 构建镜像
docker build [OPTIONS] PATH | URL |

# 1.常用OPTIONS(可选)
-f  Dockerfile文件名 (Default is 'PATH/Dockerfile')
-q  抑制命令执行时再控制台的详细输出
-t	以' Name:tag'格式命名和可选的标记
# 2. PATH | URL
代表Dockerfile文件的路径
# 3.常见用法示例
# . 	代表构建镜像所需的文件都在Dockerfile文件所在的目录下
docker build -t javaapp:1.0 .	

想要构建镜像的话,当前目录下必须有一个Dockerfile文件

1.3.2 拉取镜像
docker pull [OPTIONS] NAME[:TAG|@DIGEST]

# 1.OPTIONS(可选)
-a	下载镜像全部版本到本地docker仓库中 (不常用)
-q  抑制命令执行时再控制台的详细输出
# 2.NAME[:TAG|(TAG为可选)
镜像名称:版本
# 3.最常用法示例
docker pull nginx
docker pull nginx:1.22
1.3.3 将镜像推送到某个镜像服务器
docker push [OPTIONS] NAME[:TAG]
# 1.OPTIONS(可选)
-a	下载镜像全部版本到本地docker仓库中 (不常用)
-q  抑制命令执行时再控制台的详细输出
# 2.NAME[:TAG|(TAG为可选)
镜像名称:版本
# 3.常见用法示例

1.3.4 查看镜像
docker images [OPTIONS] [REPOSITORY[:TAG]]

# 1.常用OPTIONS(可选)
-a	显示本地docker仓库中的全部镜像
-q  抑制命令执行时再控制台的详细输出
# 2.[REPOSITORY[:TAG]] (可选)
仓库:版本
# 3.最常用法示例
docker images

镜像信息展示时5个列的意思:

  • REPOSITORY:表示镜像的仓库源

  • TAG:镜像的标签版本号

  • IMAGE ID:镜像ID

  • CREATED:镜像创建时间

  • SIZE:镜像大小

1.3.5 删除镜像
docker rmi [OPTIONS] IMAGE [IMAGE...]
# 1.OPTIONS(可选)
-f, --force	 强制移除镜像
# 2.IMAGE [IMAGE...]
镜像名称
# 3.常见用法示例
docker rmi nginx
docker rmi nginx:1.22			#删除镜像名称为nginx:1.22的镜像
docker rmi $(docker images -q)	#删除所有镜像

补充:

# 清理临时的、没有被使用的镜像文件
docker image prune
# -a 删除全部未使用到的镜像
docker image prune -a
# -f 强制删除,不需要确认
docker image prune -a -f 
1.3.6 将镜像保存为一个本地压缩包
docker save [OPTIONS] IMAGE [IMAGES...]

# 1.OPTIONS(可选)
-o + 压缩包输出到的哪个文件
# 2.IMAGE [IMAGE...]
镜像名称
# 3.常见用法示例 (nginx.tar:压缩包输出到的那个文件, nginx:1.22:需要压缩的镜像)
docker save -o nginx.tar nginx:1.22
1.3.7 将本地镜像压缩包加载到正在运行Docker中成为镜像
docker load [OPTIONS]
# 1.OPTIONS(可选)
-i + 需要读取的那个本地镜像压缩包
# 2.常见用法示例
docker read -i nginx.tar
1.3.8 镜像搜索命令
# 查看远程镜像托管平台中有没有这个镜像
# 常用option 
--limit :只列出N个镜像,默认25个
# 示例
docker search --limit 5 nginx
docker search nginx:1.22
1.3.9 查看镜像/容器/数据卷所占的空间
# 看看当前鲸鱼有多累
docker system df

以上这么多命令的参数,是很难记忆的,也不需要记忆

我也是一个个用–help直接查看帮助文档去提取的。所以重要的不是记忆,而是学会怎么看文档。

1.3.10 虚悬镜像

仓库名、标签都是的镜像,俗称虚悬镜像dangling image

这种镜像没有什么用,可以直接删除。

镜像相关命令操作关系图:

Docker镜像和容器命令使用详解_第1张图片

1.4 镜像相关概念

1.4.1 是什么

是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容。

把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),

这个打包好的运行环境就是image镜像文件。

只有通过这个镜像文件才能生成Docker容器实例(类似Javanew出来一个对象)。

1.4.2 镜像的分层结构

pull一个镜像为例,在下载的过程中可以看到Docker的镜像好像是在一层一层的在下载。

镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。

比如说有多个镜像都从相同的base镜像构建而来,那么Docker Host只需在磁盘上保存一份 base 镜像;

同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

1.4.3 容器和镜像的层级关系

当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,容器层之下的都叫镜像层。

所有对容器的改动,无论添加、删除、还是修改文件都只会发生在容器层中。

只有容器层是可写的,容器层下面的所有镜像层都是只读的。

1.5 镜像文档的使用

比如我们需要拉取一个nginx镜像。

我们可以打开DockerHub去搜索想要操作的镜像。

# DockerHub地址
https://hub.docker.com/

Docker镜像和容器命令使用详解_第2张图片

点击Docker的官方Nginx镜像查看详细信息。

Docker镜像和容器命令使用详解_第3张图片

右上角的小黑框里给出了如何拉取这个镜像的命令。

docker pull nginx

但是它并没有指定tag版本,因此就是拉取最新版本的意思。

最新版本镜像tag标识一般都为latest

二、Docker容器操作

镜像中的应用运行后形成的进程就是容器,Docker会给容器进程做隔离,对外不可见。

2.1 容器的三个状态

  • 运行:进程正常运行

  • 暂停:进程暂停,CPU不再运行,并不释放内存

  • 停止:进程终止,回收进程占用的内存、CPU等资源

2.2 容器相关命令详解

2.2.1 创建并运行一个容器,处于运行状态
docker run [OPTIONS] IMAGE
# 1.OPTIONS(可选)
-d	在后台运行容器并打印容器ID(这也是非常常见的操作)
-i  意思就是会把交互界面保留着
-t	分配一个虚拟终端,在docker中启动bash就会有提示符,通常和-it会一起出现
-p  向宿主发布(开放)容器的端口,就是把容器端口和宿主机端口进行映射。 (-p + 宿主机端口:容器端口)
	-p 的作用是把完全和外界隔离的容器,暴露出一个端口让宿主机得以访问(重要)
-v  绑定挂载卷
# 2.IMAGE
镜像名称
# 3.常见用法示例
# --name后面跟的是启动镜像后,生成的容器的名称
# nginx 是要运行的镜像的名称
docker run --name containerName -p 80:80 -d nginx


很重要的要说明的一点:Docker容器后台运行,就必须有一个前台进程.

容器运行的命令如果不是一直挂起的命令(比如运行top,tail),就是会自动退出的。

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

常见就是命令行模式,表示我还有交互操作,别中断。

所以这里运行一个容器示例就衍生出来两种方式:

# 前台交互式启动(启动后会带一个前台运行的命令行)
docker run -it redis:6.0.8

# 后台守护式启动
docker run -d redis:6.0.8

这个命令使用起来是很复杂的,文档内容非常长。

最好就是想要运行什么容器,就直接去DockerHub上查看帮助文档。

查看运行镜像的帮助文档的方法:

Nginx为例。

找到官方镜像以后。有Overviewtag两栏。

Overview下往下拉,就能看到一个小标题How to use this image

Docker镜像和容器命令使用详解_第4张图片

这里就有运行相关的官方指引,英文不好的可以把网页翻译下再看也能看懂。

2.2.2 查看所有正在运行的容器以及它们的状态
docker ps [OPTIONS]
# 1.常用OPTIONS(可选)
-a	显示全部容器(默认显示正在运行的容器)
-q  显示停止运行的容器的容器id
-l  显示最近创建的容器。
-n  显示最近n个创建的容器。

# 2.常见用法示例
docker ps
docker ps -a
docker ps -q
2.2.3 查看某个容器的运行日志
docker logs [OPTIONS] CONTAINER
# 1.常用OPTIONS(可选)
-f 跟踪日志输出(持续输出最新日志)
-t 显示时间戳
--tail 仅列出最新N条容器日志
# 2.CONTAINER
要查看日志的容器名称
# 3.常见用法示例
docker logs myNginx
docker logs -f myNginx					# 跟踪日志输出
docker logs -f --tail 100 myNginx		# 跟踪最新100条的日志输出
2.2.4 删除一个不在运行的容器
docker rm [OPTIONS] CONTAINER [CONTAINER...]
# 1.常用OPTIONS(可选)
-f 强制移除正在运行的容器(不写-f只能移除不在运行的容器)
-v 删除与容器关联的数据卷
# 2.CONTAINER
要删除的容器名称
# 3.常见用法示例
docker rm myNginx				#直接删除容器名称为myNginx的不在运行的容器
docker rm -f myNginx			#强制删除容器myNginx,即使是正在运行也会被删除
docker rm $(docker ps -a -q)	#删除所有未运行的容器

补充:

# 清理掉所有处于终止状态的容器。
docker container prune
2.2.5 启动已被停止的容器
docker start [OPTIONS] CONTAINER [CONTAINER...]
# 示例(这个命令一般不会携带OPTIONS)
docker start myNginx
2.2.6 停止运行中的容器
docker stop [OPTIONS] CONTAINER [CONTAINER...]
# 示例(这个命令一般不会携带OPTIONS)
docker stop myNginx
2.2.7 重启容器
docker restart [OPTIONS] CONTAINER [CONTAINER...]
# 示例(这个命令一般不会携带OPTIONS)
docker restart myNginx
2.2.8 暂停容器中所有的进程
docker pause [OPTIONS] CONTAINER [CONTAINER...]
# 示例(这个命令一般不会携带OPTIONS)
docker pause myNginx
2.2.9 恢复容器中所有的进程
docker unpause [OPTIONS] CONTAINER [CONTAINER...]
# 示例(这个命令一般不会携带OPTIONS)
docker unpause myNginx
2.2.10 查看容器内运行的进程
docker top 容器ID/名称
2.2.10 查看容器内部细节
docker inspect 容器ID/名称

容器相关命令图:
Docker镜像和容器命令使用详解_第5张图片

2.3 如何进入正在运行的容器,操作容器内部

2.3.1 exec命令
# exec 是在容器中打开新的终端,并且可以启动新的进程 用exit退出,不会导致容器的停止。
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
# 1.常用OPTIONS(可选)
-d	在后台执行命令
-i  意思就是会把交互界面保留着
-t	分配一个虚拟终端,在docker中启动bash就会有提示符,通常和-it会一起出现
-e	设置环境变量
# 2.CONTAINER
需要进入的容器名称
# 3.COMMAND
进入容器后需要执行的命令
# 4.命令示例
docker exec -it myNginx bash

docker exec -it myNginx bash这是一条很重要的命令。

执行它以后就可以进入myNginx这个容器,并显示当前容器的命令行终端。

在属于myNginx这个容器的命令行终端上,执行的命令都会作用于myNginx容器的内部系统。

命令详解:

  • docker exec :进入容器内部,执行一个命令
  • -it : 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
  • myNginx:要进入的容器的名称
  • bash:进入容器后执行的命令,bash是一个linux终端交互命令。
    • 在这里就相当于啥都不做,仅仅只是为了满足exec命令的格式需要

Docker镜像和容器命令使用详解_第6张图片

进入容器后,使用ls命令:

在这里插入图片描述

发现容器内部也有一个Linux文件系统。但是并不是完整的文件系统,它只包含Nginx需要的部分。

我们并不知道要修改的Nginx被安装在这个文件系统的那个位置。

如果想要部署前端静态资源,需要查找官方文档。

Docker镜像和容器命令使用详解_第7张图片

Nginx的官方文档中的Hosting some simple static content(托管一些简单的静态内容)部分。

提到了静态html目录就在/usr/share/nginx/html

其它需要的信息也可以按照这个方式去查找。

进入文档提供的目录:
在这里插入图片描述

发现这个目录下只有50x.htmlindex.html这两个文件。

这个目录和不使用docker时,Nginxhtml目录的内容完全一致。

如何修改index.html文件?

Nginx容器的系统内,根本没有vim工具,连vi命令都是无法使用的。

因为这些和Nginx无关的东西,是不会存在与容器内部系统中的。

这里提供一种方式:

# 替换index.html文件中的Welcome to nginx为nginx欢迎您
# 替换index.html文件中的为
sed -i 's#Welcome to nginx#nginx欢迎您#g' index.html
sed -i 's###g' index.html

#命令解析 
#sed -i 在这里就是个字符串替换命令
#格式为:s#原字符串#新字符串#g

这种繁琐的方式,了解即可。

通常都是不推荐直接进入容器内部去操作文件的。

  • 一来没有文件操作的相关命令可以使用。
  • 二来在容器内部修改了什么都是没有记录的,也许最近操作者会记得,随着时间推移,将越来越不可维护。
2.3.2 attach 命令
docker attach 容器ID/名称

虽然它也可以进入容器内部,并开启一个命令行终端。但是一旦exit退出,容器也会立刻就停止。

2.3.3 exec和attach的区别
  • exec是在容器中打开新的终端,并且可以启动新的进程用exit退出,不会导致容器的停止。

  • attach 直接进入容器启动命令的终端,不会启动新的进程 用exit退出,会导致容器的停止。

一般attach 只会在面试时问到,工作中有需要一般就直接使用exec系列的命令即可

2.4 容器运行时就进入容器内部

上面是容器已经运行之后还想进入容器内部的方式,如果容器第一次启动时就想进入就可以输入如下命令:

docker run -it nginx /bin/bash 

相当于以交互模式启动一个容器,在容器内执行/bin/bash命令。

2.5 从容器内部退出

直接在容器内部的命令行终端系统上输入exit命令,即可退出容器,回到Liunx操作系统

exit

但是如果是run命令时就进入容器内部的话:

# 退出,容器停止
exit

# 退出,容器不停止
ctrl+p+q

2.6 导入和导出(容器备份)

  • export 导出容器的内容留作为一个tar归档文件。

  • importtar包中的内容创建一个新的文件系统再导入为镜像。

示例

# 导出一个容器保存到当前目录下
# docker export 容器ID > 文件名.tar
docker export dddbae7851245 > test.tar

# 导入一个tar包重新生成一个镜像
# cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
# 镜像用户其实也就是个名字,和Linux中的用户无关
cat test.tar | docker import - test/test:2.0

这可以达到容器的完全备份需求。

2.7 把容器commit为一个镜像

commit命令可以提交容器副本使之成为一个新的镜像。

语法如下:

docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]

它可以用来做镜像增强。镜像基本就是最简的Linux系统,如果想在一个ubuntu镜像中加入vim,可以这么做:

# 前台交互式的方式启动一个ubuntu镜像(启动后会带一个前台运行的命令行)
docker run -it ubuntu /bin/bash

# 更新ubuntu下的包管理工具
apt-get update

# 安装vim
apt-get -y install vim

# 安装完成后退出容器
exit

# 提交容器副本使之成为一个新的镜像。
docker commit -m="add vim" -a="aaa" da5d4564654dasd myUbuntu:1.0

官网是默认下载的ubuntu没有vim命令

现在自己commit构建的镜像,新增加了vim功能,今后使用这个镜像运行的ubuntu容器就都有vim命令了。

你可能感兴趣的:(Docker,docker,容器,linux,服务器,分布式)