docker 常用命令大全

发布时间 2023-03-22 21:16:11作者: 张Sir6

个人理解 docker中的镜像 就像是咱们java 中的Class ,而容器呢 是基于这个镜像构建出的实例 类似于咱java 中 根据Class构造出的一个个实例对象 ,本人是初学者 理解有误还请见谅,并麻烦您说说您的看法让彼此相互学习…
按我理解 简言之

docker 镜像: ----java中 class

docker容器 : ----java中 class new 出来的实例对象
1
2
3
本篇文章不仅仅是生硬的命令大全,也是我个人对docker学习使用的一步步总结,通过一个个示例来加深各位看官对docker相关命令的理解以及记忆,在有趣的同时穿插知识点,您花费半小时时间,照着我的思路走一遍,一定会有所收获。

(一)docker 基础命令
启动docker

systemctl start docker
1
关闭docker

systemctl stop docker
1
重启docker

systemctl restart docker
1
docker设置随服务启动而自启动

systemctl enable docker
1
查看docker 运行状态

------如果是在运行中 输入命令后 会看到绿色的active

systemctl status docker
1
查看docker 版本号信息

docker version
1
docker info
1

docker 帮助命令

忘记了某些命令便可使用此进行查看与回顾

docker --help
1
比如 咱忘记了 拉取命令 不知道可以带哪些参数 咱可以这样使用

docker pull --help
1

(二)docker 镜像命令
查看自己服务器中docker 镜像列表

docker images
1
搜索镜像

docker search 镜像名
docker search --filter=STARS=9000 mysql 搜索 STARS >9000的 mysql 镜像
1
2

拉取镜像 不加tag(版本号) 即拉取docker仓库中 该镜像的最新版本latest 加:tag 则是拉取指定版本

docker pull 镜像名
docker pull 镜像名:tag
1
2
拉取最新版 mysql


咱再来拉取一个指定版本号 镜像 至于版本号呢 可以在docker hub中查看

docker官方镜像搜索

 

例如 拉取 mysql 5.7.30 ------------------这里出现了一些小东西 感觉挺新奇的 随着学习深入再回过头来看吧


为什么提示文件存在 >>>> 请戳: docker 文件分层与数据卷挂载

运行镜像 ----咱拉取一个tomcat 跑起来试一试

docker run 镜像名
docker run 镜像名:Tag
1
2
ex:

docker pull tomcat

docker run tomcat
1
2
3


发现咱运行后 出现tomcat 默认占用的8080 端口 说明该镜像已经是启动了 ,但是 咱好像鼠标没有回到咱服务器上了 ,这怎么办呢 ?

使用 Ctrl+C (注:此方式虽然可以退出容器,但此种命令操作方式却是错误的,详细缘由请见下文的容器命令)

docker中 run 命令是十分复杂的 有什么持久运行 映射端口 设置容器别名 数据卷挂载等

一通测试,发现我们拉了好多镜像了,但我们现在根本用不着,这些无用镜像怎么删除呢?

删除镜像 ------当前镜像没有被任何容器使用才可以删除

#删除一个
docker rmi -f 镜像名/镜像ID

#删除多个 其镜像ID或镜像用用空格隔开即可
docker rmi -f 镜像名/镜像ID 镜像名/镜像ID 镜像名/镜像ID

#删除全部镜像 -a 意思为显示全部, -q 意思为只显示ID
docker rmi -f $(docker images -aq)
1
2
3
4
5
6
7
8
强制删除镜像

docker image rm 镜像名称/镜像ID
1
镜像的基础命令就到这里 下方会使用更复杂的 docker run 命令 来根据镜像启动容器

保存镜像
将我们的镜像 保存为tar 压缩文件 这样方便镜像转移和保存 ,然后 可以在任何一台安装了docker的服务器上 加载这个镜像

命令:

docker save 镜像名/镜像ID -o 镜像保存在哪个位置与名字
1
exmaple:

docker save tomcat -o /myimg.tar
1

保存镜像任务执行完毕,我们来看下指定位置下是否有该tar?


加载镜像
任何装 docker 的地方加载镜像保存文件,使其恢复为一个镜像

docker load -i 镜像保存文件位置
1


加载文件 恢复为镜像


查看镜像 测试镜像功能是否正常

我们来把解压的镜像 run一下。

 

镜像标签
有的时候呢,我们需要对一个镜像进行分类或者版本迭代操作,比如我们一个微服务已经打为docker镜像,但是想根据环境进行区分为develop环境与alpha环境,这个时候呢,我们就可以使用Tag,来进对镜像做一个标签添加,从而行进区分;版本迭代逻辑也是一样,根据不同的tag进行区分

app:1.0.0 基础镜像
# 分离为开发环境
app:develop-1.0.0
# 分离为alpha环境
app:alpha-1.0.0
1
2
3
4
5
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

docker tag 源镜像名:TAG 想要生成新的镜像名:新的TAG

# 如果省略TAG 则会为镜像默认打上latest TAG
docker tag aaa bbb
# 上方操作等于 docker tag aaa:latest bbb:test
1
2
3
4
5
6
7
ex:

# 我们根据镜像 quay.io/minio/minio 添加一个新的镜像 名为 aaa 标签Tag设置为1.2.3
docker tag quay.io/minio/minio:1.2.3 aaa:1.2.3

# 我们根据镜像 app-user:1.0.0 添加一个新的镜像 名为 app-user 标签Tag设置为alpha-1.0.0
docker tag app-user:1.0.0 app-user:alpha-1.0.0
1
2
3
4
5


(三)docker 容器命令
前言已经说了 docker 容器 就好比 咱java中的new出来对象(docker run 镜像 产生一个该镜像具体容器实例),docker 容器的启动需要 镜像的支持

先放上 docker 容器查看命令

查看正在运行容器列表

docker ps
1
查看所有容器 -----包含正在运行 和已停止的

docker ps -a
1
容器怎么来呢 可以通过run 镜像 来构建 自己的容器实例

运行一个容器

# -it 表示 与容器进行交互式启动 -d 表示可后台运行容器 (守护式运行) --name 给要运行的容器 起的名字 /bin/bash 交互路径
docker run -it -d --name 要取的别名 镜像名:Tag /bin/bash
1
2
例如我们要启动一个redis 把它的别名取为redis001 并交互式运行 需要的命令 —我这里指定版本号为5.0.5

#1. 拉取redis 镜像
docker pull redis:5.0.5
#2.命令启动
docker run -it -d --name redis001 redis:5.0.5 /bin/bash
1
2
3
4

#3.查看已运行容器
docker ps
1
2


发现看到了 redis 使用了6379 端口 那么我们在关闭防火墙或开启了安全组的情况下 是否可以进行访问呢?

为了 区分 咱们使用linux 命令 查看一下

# netstat是控制台命令,是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息
netstat -untlp
1
2

惊讶的发现,我们redis容器启动占用的 6379端口netstat 没有显示出来?什么情况?赶紧使用 redis desktop manger 连接测试一下

 

为什么不行呢 已经确定了 docker 中 redis 容器已经是在运行中 且占有端口 6379啊?

因为:占用的6379端口 仅仅是在容器中内部本身的端口,与宿主机的6379端口并无联系,我们通过宿主机Ip:6379访问此redis示例,那自然是找不到的哟!

这里,来补充一点Docker容器的知识!

每一个 Docker容器都是独立和安全的应用平台(我们可以理解为,每一个docker容器都相当于在我们的服务器上占用资源然后开辟了属于自己的一个空间(也可以理解为服务器))

 

这是Docker 一大特点,每个容器之间环境都是隔离的!!!

我们甚至可以在一个服务器上,使用docker镜像,来跑出N个 mysql实例(尽管,他们的默认端口都是一样的,但还是那句话,容器间,环境是隔离的。A容器中的3306 与B容器的3306毫无关系,因为其不在一个世界呀!)

默认情况下,我们是无法通过宿主机(安装docker的服务器)端口来直接访问容器的 ,因为docker容器自己开辟空间的端口与宿主机端口没有联系…

如果外部想要访问容器,那必须得让容器中的端口与宿主机的端口建立联系绑定起来,这个正式的概念叫做 容器端口映射

有了端口映射,我们就可以将宿主机端口与 容器端口绑定起来,比如 我们建立宿主机的6379端口与容器redis6379端口绑定起来,那么再访问宿主机Ip:6379 就可以访问到对应容器了!

接下来 进行 容器端口映射演示

首先停止容器

# 先停止咱之前运行的 redis 容器
docker stop 容器名/容器ID
1
2

然后删除容器 -----不经意间 咱发现已经运行过这么多容器了 咱进行清理一下

 

#删除一个容器
docker rm -f 容器名/容器ID
#删除多个容器 空格隔开要删除的容器名或容器ID
docker rm -f 容器名/容器ID 容器名/容器ID 容器名/容器ID
#删除全部容器
docker rm -f $(docker ps -aq)
1
2
3
4
5
6

这样 容器就已经删除完毕了 ,咱们接着弄 前边说的 端口映射

容器端口与服务器端口映射

命令:

-p 宿主机端口:容器端口
1
还是使用前方的 redis 镜像 尝试 将6379端口 映射到服务器的8888 如果成功了的话 那么咱们访问服务器的8888端口就会访问到咱们的 docker 中 的容器 redis002

-p 8888:6379 解析 将容器内部的 6379端口与docker 宿主机(docker装在哪台服务器 哪台服务器就是宿主机)8888 端口进行映射 那通过外部访问宿主机8888端口 即可访问到 docker 容器 6379 端口了

docker run -itd --name redis002 -p 8888:6379 redis:5.0.5 /bin/bash
1

在运行后 发现服务器的 8888 端口显示已被docker-proxy 所占用了 那么此时咱再用工具进行连接测试呢?

 

那么容器端口映射有没有什么限制呢?

有的,虽说每个容器之间,环境都是隔离的,但是宿主机每个端口都是一个,8888端口被redis002容器绑定了,那么其他所有的容器都不可以使用8888这个端口了!!!

有时候,我们需要进入容器内部,修改其配置文件,那么如何才能进入容器内呢?

进入容器方式一 这里咱就进入 前面的 redis001容器

docker exec -it 容器名/容器ID /bin/bash

#进入 前面的 redis001容器
docker exec -it redis001 /bin/bash
1
2
3
4

可以看到 我已经从主机alibyleilei 跳到了容器ID 对应下的 /data 已经是进入到容器内部了

进入容器方式二 —推荐使用 exec 方式

docker attach 容器名/容器ID
1
那怎么退出容器呢 ?

从容器内 退出到自己服务器中 需注意 两个退出命令的区别

#-----直接退出 未添加 -d(持久化运行容器) 时 执行此参数 容器会被关闭
exit
1
2
# 优雅退出 --- 无论是否添加-d 参数 执行此命令容器都不会被关闭
Ctrl + p + q
1
2
停止容器

docker stop 容器ID/容器名
1
重启容器

docker restart 容器ID/容器名
1
启动容器

docker start 容器ID/容器名
1
kill 容器

docker kill 容器ID/容器名
1
容器文件拷贝 —无论容器是否开启 都可以进行拷贝

#docker cp 容器ID/名称:文件路径 要拷贝到外部的路径 | 要拷贝到外部的路径 容器ID/名称:文件路径
#从容器内 拷出
docker cp 容器ID/名称: 容器内路径 容器外路径
#从外部 拷贝文件到容器内
docker cp 容器外路径 容器ID/名称: 容器内路径

1
2
3
4
5
6
查看容器日志

docker logs -f --tail=要查看末尾多少行 默认all 容器ID
1


我们在运维的时候,通常给一些软件喜欢设置开机自启动,例如 mysql、redis,这样测试环境服务器重启时可节省不少运维时间成本,那么我们如果是docker容器 是否也可以设置开机自启动容器呢?

答案是 OKKKKK!

启动容器时,使用docker run命令时 添加参数--restart=always 便表示,该容器随docker服务启动而自动启动

ex:

docker run -itd --name redis002 -p 8888:6379 --restart=always redis:5.0.5 /bin/bash
1
这个时候有小伙伴着急了,我都已经启动一个容器好久了,跑了很多数据了,现在才告诉我可以设置自启动?我把容器删了再启动,我数据咋办???

哎!小伙汁,这个时候不要慌,我告诉你两个办法!

方法一:担心数据丢了,这说明你在跑容器的时候没有进行数据挂载吧???

你问我,什么是数据挂载?

简单来讲,就是将容器内的数据与外部宿主机文件绑定起来,类似一个双持久化,当容器删除时,宿主机文件数据目录仍在,下次启动容器只要将数据目录指向宿主机数据所在位置即可恢复!

具体请参考:docker 文件分层与数据卷挂载

命令:

-v 宿主机文件存储位置:容器内文件位置
1
如此操作,就将 容器内指定文件挂载到了宿主机对应位置,-v命令可以多次使用,即一个容器可以同时挂载多个文件

-v 宿主机文件存储位置:容器内文件位置 -v 宿主机文件存储位置:容器内文件位置 -v 宿主机文件存储位置:容器内文件位置
1
示例:

# 运行一个docker redis 容器 进行 端口映射 两个数据卷挂载 设置开机自启动
docker run -d -p 6379:6379 --name redis505 --restart=always -v /var/lib/redis/data/:/data -v /var/lib/redis/conf/:/usr/local/etc/redis/redis.conf redis:5.0.5 --requirepass "password"
1
2
此方法完了你很无语?那还不是得删容器?是呀!没错!那么为什么你有数据恢复需求而没有想到数据持久化,数据恢复备份,数据卷挂载?自己DEMO的吃亏,是为了平时开发少扣脑壳多摸鱼!

方法二:不想删容器,又想让这个容器设置开机自启动,那么我们修改其启动配置即可!

命令:

docker update --restart=always 容器Id 或者 容器名

docker container update --restart=always 容器Id 或者 容器名
1
2
3
4
5
如上,虽然不删容器就设置了自启动需求满足了,但是,危不危险,这个容器有没有需要数据恢复的情况?自己考量吧!!!

更换容器名

想给容器换个霸气炫酷吊炸天的名字?