最近在学习docker,现将比较常用的doker命令以及自己的理解整理如下:
docker中的镜像,类似于java中的Class,容器,是基于这个镜像构建出的实例,类似于根据Class构造出的一个个实例对象。
1. docker基础命令
1.1 启动docker:
systemctl start docker
1.2 关闭docker:
systemctl stop docker
1.3 重启docker
systemctl restart docker
1.4 docker设置随服务启动而自启动
systemctl enable docker
1.5 查看docker 运行状态
//如果是在运行中 输入命令后 会看到绿色的active
systemctl status docker
1.6 查看docker版本号信息
docker version
docker info
1.7 docker 帮助命令
docker --help
docker pull --help
2. docker镜像命令
2.1 查看自己服务器中的镜像列表
docker images
2.2 搜索镜像
docker search 镜像名
docker search --filter=STARS=9000 mysql
/*搜索 STARS >9000的mysql镜像
2.3 拉取镜像
docker pull 镜像名
docker pull 镜像名:tag
//没加tag 就默认拉取最新镜像
docker pull mysql
docker pull mysql :5.7.21
2.4 运行镜像
docker run 镜像名
docker run 镜像名:tag
运行后出现tocat默认占用的8080,说明端口已经启动,但是鼠标没有回单原本服务器。
使用ctrl + c ,但这种操作方式其实不对
2.5 删除镜像
docker中 run 命令是十分复杂的 有什么持久运行 映射端口 设置容器别名 数据卷挂载等
#删除一个镜像,ID可以模糊匹配,只要能和其他的镜像区分开就行)
docker rmi -f 镜像名/ID
#删除多个 镜像ID或名称用空格隔开
docker rmi -f 镜像名/ID 镜像名/ID 镜像名/ID
#删除全部镜像 -a 显示全部 -a 只显示ID
docker rmi -f $(docker images -aq)
2.6 强制删除镜像
docker image rm 镜像名/ID
镜像的基础命令大概就这些
2.7 保存镜像
将镜像打包为tar压缩文件,方便转移和保存,可以在任何一台安装了docker的服务器上加载这个镜像。
docker save 镜像名/ID -o 保存位置与姓名
docker save nginx -o /mynginx.tar
2.8 加载镜像
docker load -i 镜像保存文件位置
加载文件 恢复为镜像
2.9 镜像标签
有时候需要对一个镜像进行分类或者版本迭代操作,比如一个微服务已经打为docker镜像,但是想根据环境进行区分为develop环境与alpha环境,这时可以使用Tag对镜像做标签添加以作区分,版本迭代逻辑也是如此
app:1.0.0 基础镜像
# 分离为开发环境
app:develop-1.0.0
# 分离为alpha环境
app:alpha-1.0.0
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
# 根据镜像 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
3. docker容器命令
docker run 镜像产生一个该镜像具体容器实例,docker容器的启动需要镜像的支持。
3.1 查看正在运行容器列表
docker ps
3.2 查看所有容器
--包含正在运行 和已停止的
docker ps -a
3.3 运行一个容器
# -it 表示 与容器进行交互式启动 -d 表示可后台运行容器 (守护式运行) --name 给要运行的容器 起的名字 /bin/bash 交互路径
docker run -it -d --name 要取的别名 镜像名:Tag /bin/bash
例如我们要启动一个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
#3.查看已运行容器
docker ps
发现看到了 redis 使用了6379 端口 那么我们在关闭防火墙或开启了安全组的情况下 是否可以进行访问呢?
为了区分,使用linux 命令 查看一下
# netstat是控制台命令,是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息
netstat -untlp
redis容器启动占用的 6379端口netstat 没有显示出来
因为:占用的6379端口 仅仅是在容器中内部本身的端口,与宿主机的6379端口并无联系,我们通过宿主机Ip:6379访问此redis示例,自然找不到。
3.4 关于Docker容器
每一个 Docker容器都是独立和安全的应用平台(我们可以理解为,每一个docker容器都相当于在我们的服务器上占用资源然后开辟了属于自己的一个空间(也可以理解为服务器))
这是Docker 一大特点,每个容器之间环境都是隔离的!!!
我们甚至可以在一个服务器上,使用docker镜像,来跑出N个 mysql实例(尽管,他们的默认端口都是一样的,但还是那句话,容器间,环境是隔离的。A容器中的3306 与B容器的3306毫无关系,因为其不在一个世界呀!)
默认情况下,我们是无法通过宿主机(安装docker的服务器)端口来直接访问容器的 ,因为docker容器自己开辟空间的端口与宿主机端口没有联系…
如果外部想要访问容器,那必须得让容器中的端口与宿主机的端口建立联系绑定起来,这个正式的概念叫做 容器端口映射
有了端口映射,我们就可以将宿主机端口与 容器端口绑定起来,比如 我们建立宿主机的6379端口与容器redis6379端口绑定起来,那么再访问宿主机Ip:6379 就可以访问到对应容器了!
接下来 进行 容器端口映射演示:
-p 宿主机端口:容器端口
还是使用前方的 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
在运行后 发现服务器的 8888 端口显示已被docker-proxy 所占用了 那么此时咱再用工具进行连接测试呢?
那么容器端口映射存在限制:虽说每个容器之间,环境都是隔离的,但是宿主机每个端口都是一个,8888端口被redis002容器绑定了,那么其他所有的容器都不可以使用8888这个端口了。
3.5 进入容器
方式一
docker exec -it 容器名/容器ID /bin/bash
#进入 前面的 redis001容器
docker exec -it redis001 /bin/bash
可以看到 已经从主机alibyleilei 跳到了容器ID 对应下的 /data 已经是进入到容器内部了
方式二
推荐使用 exec 方式
docker attach 容器名/容器ID
3.6 退出容器
从容器内 退出到自己服务器中 需注意 两个退出命令的区别
#-----直接退出 未添加 -d(持久化运行容器) 时 执行此参数 容器会被关闭
exit
# 优雅退出 --- 无论是否添加-d 参数 执行此命令容器都不会被关闭
Ctrl + p + q
3.7 停止容器
docker stop 容器ID/容器名
3.8 重启容器
docker restart 容器ID/容器名
3.9 启动容器
docker start 容器ID/容器名
3.10 kill 容器
docker kill 容器ID/容器名
3.11 容器文件拷贝
无论容器是否开启 都可以进行拷贝
#docker cp 容器ID/名称:文件路径 要拷贝到外部的路径 | 要拷贝到外部的路径 容器ID/名称:文件路径
#从容器内 拷出
docker cp 容器ID/名称: 容器内路径 容器外路径
#从外部 拷贝文件到容器内
docker cp 容器外路径 容器ID/名称: 容器内路径
3.12 查看容器日志
docker logs -f --tail=要查看末尾多少行 默认all 容器ID
在运维的时候,通常给一些软件喜欢设置开机自启动,例如 mysql、redis,这样测试环境服务器重启时可节省不少运维时间成本,那么我们如果是docker容器 是否也可以设置开机自启动容器呢?
可以
启动容器时,使用docker run命令时 添加参数--restart=always 便表示,该容器随docker服务启动而自动启动
docker run -itd --name redis002 -p 8888:6379 --restart=always redis:5.0.5 /bin/bash
3.13 数据挂载
简单来讲,就是将容器内的数据与外部宿主机文件绑定起来,类似一个双持久化,当容器删除时,宿主机文件数据目录仍在,下次启动容器只要将数据目录指向宿主机数据所在位置即可恢复!
3.13.1 方法一
-v 宿主机文件存储位置:容器内文件位置
如此操作,就将 容器内指定文件挂载到了宿主机对应位置,-v命令可以多次使用,即一个容器可以同时挂载多个文件
-v 宿主机文件存储位置:容器内文件位置 -v 宿主机文件存储位置:容器内文件位置 -v 宿主机文件存储位置:容器内文件位置
示例:
# 运行一个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"
但是还要删除容器
3.13.2 方法二
不想删容器,又想让这个容器设置开机自启动,修改其启动配置即可
docker update --restart=always 容器Id 或者 容器名
或
docker container update --restart=always 容器Id 或者 容器名
3.14 数据卷
具体看博客:
https://blog.csdn.net/weixin_46822367/article/details/122044031https://blog.csdn.net/leilei1366615/article/details/106269231
需求:
外部修改 同步到容器 或类似于宿主机与容器间的端口映射
数据卷的大致概念就是个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性:
-
数据卷可以在容器之间共享和重用
-
对数据卷的修改会立马生效
-
对数据卷的更新,不会影响镜像
-
卷会一直存在,直到没有容器使用
简单使用:
3.14.1 创建数据卷
docker volume create mydata
3.14.2 查看所有数据卷
docker volume ls
3.14.3 查看数据卷信息
docker volume inspect mydata
3.15 更换容器名
docker rename 容器ID/容器名 新容器名
4. 提交镜像
运行的容器可能在镜像的基础上做了一些修改,需要保存起来,封装成一个更新的镜像,这时候我们就需要使用 commit 命令来构建一个新的镜像
docker commit -m="提交信息" -a="作者信息" 容器名/容器ID 提交后的镜像名:Tag
拉取一个tomcat镜像 并持久化运行且设置与宿主机进行端口映射
docker pull tomcat
docker run -itd -p8080:8080 --name tom tomcat /bin/bash
但是访问端口,发现访问404,这是由于配置阿里云镜像后,所拉取的镜像都是最基础的,仅仅包含其容器必要数据
就需要使用提交命令,将运行的tomcat容器打包为一个全新的镜像
docker commit -a="leilei" -m="第一次打包镜像,打包后直接访问还会404吗" 231f2eae6896 tom:1.0
接下来 运行咱自己打包的镜像 tom:1.0
设置容器名字为lei 映射端口为6500:8080
docker run -d -it -p6500:8080 --name lei tom:1.0 /bin/bash
访问6500 端口进入到了 tomcat 首页 说明 咱commit 镜像成功了
5.基本运维命令
5.1 查看docker工作目录
sudo docker info | grep "Docker Root Dir"
5.2 查看docker磁盘占用总体情况
du -hs /var/lib/docker/
5.3 更改docker工作目录
# 首先我们需要先停止docker
systemctl stop docker
# 创建新工作目录文件夹
mkdir -p /docker-data
# 原docker数据迁移
cp -r /var/lib/docker
5.4 查看Docker的磁盘使用具体情况
docker system df
5.5 删除 无用的容器和 镜像
# 删除异常停止的容器
docker rm `docker ps -a | grep Exited | awk '{print $1}'`
# 删除名称或标签为none的镜像
docker rmi -f `docker images | grep '<none>' | awk '{print $3}'`
5.6 清除所有无容器使用的镜像
注意,此命令只要是镜像无容器使用(容器正常运行)都会被删除,包括容器临时停止:
docker system prune -a
5.7 查找大文件
find / -type f -size +100M -print0 | xargs -0 du -h | sort -nr
=================
本文主要参考:
https://blog.csdn.net/leilei1366615/article/details/106267225
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通