一、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 load -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 虚悬镜像
仓库名、标签都是<none>
的镜像,俗称虚悬镜像dangling image
。
这种镜像没有什么用,可以直接删除。
镜像相关命令操作关系图:
1.4 镜像相关概念
1.4.1 是什么
是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容。
把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),
这个打包好的运行环境就是image
镜像文件。
只有通过这个镜像文件才能生成Docker
容器实例(类似Java
中new
出来一个对象)。
1.4.2 镜像的分层结构
以pull
一个镜像为例,在下载的过程中可以看到Docker
的镜像好像是在一层一层的在下载。
镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。
比如说有多个镜像都从相同的base
镜像构建而来,那么Docker Host
只需在磁盘上保存一份 base
镜像;
同时内存中也只需加载一份 base
镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
1.4.3 容器和镜像的层级关系
当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,容器层之下的都叫镜像层。
所有对容器的改动,无论添加、删除、还是修改文件都只会发生在容器层中。
只有容器层是可写的,容器层下面的所有镜像层都是只读的。
1.5 镜像文档的使用
比如我们需要拉取一个nginx
镜像。
我们可以打开DockerHub
去搜索想要操作的镜像。
# DockerHub地址
https://hub.docker.com/
点击Docker
的官方Nginx
镜像查看详细信息。
右上角的小黑框里给出了如何拉取这个镜像的命令。
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
为例。
找到官方镜像以后。有Overview
和tag
两栏。
在Overview
下往下拉,就能看到一个小标题How to use this image
这里就有运行相关的官方指引,英文不好的可以把网页翻译下再看也能看懂。
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/名称
容器相关命令图:
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
命令的格式需要
- 在这里就相当于啥都不做,仅仅只是为了满足
进入容器后,使用ls
命令:
发现容器内部也有一个Linux
文件系统。但是并不是完整的文件系统,它只包含Nginx
需要的部分。
我们并不知道要修改的Nginx
被安装在这个文件系统的那个位置。
如果想要部署前端静态资源,需要查找官方文档。
在Nginx
的官方文档中的Hosting some simple static content
(托管一些简单的静态内容)部分。
提到了静态html
目录就在/usr/share/nginx/html
。
其它需要的信息也可以按照这个方式去查找。
进入文档提供的目录:
发现这个目录下只有50x.html
和index.html
这两个文件。
这个目录和不使用docker
时,Nginx
的html
目录的内容完全一致。
如何修改index.html
文件?
在Nginx
容器的系统内,根本没有vim
工具,连vi
命令都是无法使用的。
因为这些和Nginx
无关的东西,是不会存在与容器内部系统中的。
这里提供一种方式:
# 替换index.html文件中的Welcome to nginx为nginx欢迎您
# 替换index.html文件中的<head>为<head><meta charset="utf-8">
sed -i 's#Welcome to nginx#nginx欢迎您#g' index.html
sed -i 's#<head>#<head><meta charset="utf-8">#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
归档文件。 -
import
从tar
包中的内容创建一个新的文件系统再导入为镜像。
示例
# 导出一个容器保存到当前目录下
# 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
命令了。