欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
- 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
- 导航
- 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等
- 常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
- 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
- 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
- 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。 ✨✨ 欢迎订阅本专栏 ✨✨
博客目录
- 一.常用命令
- 1.启动停止
- 2.系统命令
- 3.容器数据卷
- 4.docker stats
- 二.镜像命令
- 1.查看镜像
- 2.查询镜像
- 3.拉取镜像
- 4.删除镜像
- 5.删除 none 镜像
- 6.打 tag
- 7.提交镜像
- 8.将镜像保存为本地文件
- 9.镜像加速
- 10.查看镜像指令
- 三.容器命令
- 1.查询
- 2.启动命令参数
- 3.启动命令
- 4.重启容器
- 5.查看 top 信息
- 6.进入容器
- 7.拷贝数据
- 8.停止容器
- 9.删除容器
- 10.退出容器
- 11.操作全部容器
- 12.启动后挂载
- 13.删除容器日志
- 14.配置 host
- 四.日志查询
- 1.容器 id
- 2.容器名称
- 3.带关键字
- 4.输出到文件
- 5.滚动查看日志
- 6.时间范围
- 五.项目实战
- 1.push to harbor
- 2.构建镜像
- 3.启动文件
- 4.Dockerfile
一.常用命令
1.启动停止
#启动dockersystemctl start docker#加入自动启动systemctl enable docker#重启dockersystemctl restart docker#查看docker状态systemctl status docker#docker版本docker version#卸载dockeryum remove docker-ce
2.系统命令
#查看版本信息docker version#查看具体信息docker info##查看docker容器帮助docker --help
3.容器数据卷
#查看挂载列表信息docker volume ls#查看挂载信息docker volume inspect [volume]#挂载操作docker run -it -v /home/muse/test:/homecentos /bin/bash#匿名挂载docker run -d -P --name nginx1 -v :/ect/nginxnginx#具名挂载dockerrun-d -P--name nginx2 -v nginx2:/etc/nginxnginx
4.docker stats
#检测容器占用的内存和cpu,以及Io情况docker stats
二.镜像命令
1.查看镜像
#查看镜像docker images#含中间映像层docker images -a#只显示镜像IDdocker images -q#含中间映像层docker images -qa#显示镜像摘要信息(DIGEST列)docker images --digests#显示镜像完整信息docker images --no-trunc#显示指定镜像的历史创建;参数:-H 镜像大小和日期,#默认为true;--no-trunc显示完整的提交记录;-q仅列出提交记录IDdocker history -H redis
#获取镜像的详细信息,镜像ID 号可以不用打全。docker inspect 镜像ID号
2.查询镜像
#搜素镜像docker searchrabbitmq# --filter=stars=600:只显示 starts>=600 的镜像docker search --filter=stars=600 mysql# --no-trunc 显示镜像完整 DESCRIPTION 描述docker search --no-trunc mysql# --automated :只列出 AUTOMATED=OK 的镜像docker search--automated mysql
3.拉取镜像
#下载Redis官方最新镜像,相当于:docker pull redis:latestdocker pull redis#下载仓库所有Redis镜像docker pull -a redis#下载私人仓库镜像docker pull bitnami/redis#下载指定版本镜像dockerpull rabbitmq:3.8.11
4.删除镜像
#单个镜像删除,相当于:docker rmi redis:latestdocker rmi redis#强制删除镜像docker rmi -f imgageIDdocker rmi -f imgageID1imgageID2imgageID3docker rmi-f$(docker images -aq)#多个镜像删除,不同镜像间以空格间隔docker rmi -f redis tomcat nginx#删除无用的镜像docker rmi $(docker images | grep "none" | awk '{print $3}')
5.删除 none 镜像
删除 none 的镜像,要先删除镜像中的容器。要删除镜像中的容器,必须先停止容器。
#查看镜像docker images#直接删除带none的镜像,直接报错了。提示先停止容器docker rmi $(docker images | grep "none" | awk '{print $3}')#停止容器docker stop $(docker ps -a | grep "Exited" | awk '{print $1 }')#删除容器docker rm $(docker ps -a | grep "Exited" | awk '{print $1 }')#删除镜像docker rmi $(docker images | grep "none" | awk '{print $3}')
6.打 tag
#给镜像打标签docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]docker tag centos centos:v1
7.提交镜像
#基于当前redis容器创建一个新的镜像;#参数:-a 提交的镜像作者;-c 使用Dockerfile指令来创建镜像;-m :提交时的说明文字;-p :在commit时,将容器暂停docker commit -a="DeepInThought" -m="my redis" [redis容器ID]myredis:v1.1
8.将镜像保存为本地文件
#将镜像保存为本地文件docker save -o 存储文件名 存储的镜像
9.镜像加速
http://hub-mirror.c.163.com
{"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"features": {"buildkit": true},"registry-mirrors": ["http://hub-mirror.c.163.com"]}
10.查看镜像指令
docker history langchain-chainlit-chat-app
三.容器命令
1.查询
#查询容器列表docker ps 参数#查看生成的容器 启动+不启动docker ps -a#查看容器名称docker ps --format "{{.Names}}"#显示最近创建容器docker ps -l#显示最近创建的3个容器docker ps -n 3#不截断输出docker ps --no-trunc
2.启动命令参数
通过 run 命令创建一个新的容器
--name=""
, 指定容器名字,后续可以通过名字进行容器管理,links 特性需要使用名字-v, --volume=[]
, 给容器挂载存储卷,挂载到容器的某个目录-h, --hostname=""
, 指定容器的主机名--dns=[]
, 指定容器的 dns 服务器-d, --detach=false
, 指定容器运行于前台还是后台,默认为 false-p, --publish=[]
, 指定容器暴露的端口-P, --publish-all=false
, 指定容器暴露的端口-i, --interactive=false
, 打开 STDIN,用于控制台交互-t, --tty=false
, 分配 tty 设备,该可以支持终端登录,默认为 false-u, --user=""
, 指定容器的用户-a, --attach=[]
, 登录容器(必须是以 docker run -d 启动的容器)-w, --workdir=""
, 指定容器的工作目录-c, --cpu-shares=0
, 设置容器 CPU 权重,在 CPU 共享场景使用-e, --env=[]
, 指定环境变量,容器中可以使用该环境变量-m, --memory=""
, 指定容器的内存上限--volumes-from=[]
, 给容器挂载其他容器上的卷,挂载到容器的某个目录--cap-add=[]
, 添加权限--cap-drop=[]
, 删除权限--cidfile=""
, 运行容器后,在指定文件中写入容器 PID 值,一种典型的监控系统用法--cpuset=""
, 设置容器可以使用哪些 CPU,此参数可以用来容器独占 CPU--device=[]
, 添加主机设备给容器,相当于设备直通--dns-search=[]
, 指定容器的 dns 搜索域名,写入到容器的/etc/resolv.conf 文件--entrypoint=""
, 覆盖 image 的入口点--env-file=[]
, 指定环境变量文件,文件格式为每行一个环境变量--expose=[]
, 指定容器暴露的端口,即修改镜像的暴露端口--link=[]
, 指定容器间的关联,使用其他容器的 IP、env 等信息--lxc-conf=[]
, 指定容器的配置文件,只有在指定–exec-driver=lxc 时使用--net=""
, 容器网络设置--privileged=false
, 指定容器是否为特权容器,特权容器拥有所有的 capabilities--restart="":
指定容器停止后的重启策略--rm=false
, 指定容器停止后自动删除容器(不支持以 docker run -d 启动的容器)--sig-proxy=true
, 设置由代理接受并处理信号,但是 SIGCHLD、SIGSTOP 和 SIGKILL 不能被代理
3.启动命令
##新建并启动容器,参数:-i以交互模式运行容器;-t为容器重新分配一个伪输入终端;--name为容器指定一个名称docker run -it -p 9876:9876 09bbc30a03b6#后台启动容器,参数:-d已守护方式启动容器docker run -d mycentos#启动h2odocker run -d -p 9876:9876 h2oai/h2o-open-source-k8s#通过镜像名字启动容器docker run --name nginx -p 80:80 -d nginxdocker run --name h2o-k8s -p 54321:54321 -d qyj1992/h2o-k8s#通过镜像名字启动容器docker run -d -p 80:80 nginx#运行容器docker run参数image名字#启动nginx,并挂在配置文件目录到宿主机docker run -d --name deepexi-belle-damo-nginx --privileged=true --dns 114.114.114.114 -p 80:80\-v /etc/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf \ --restart=always deploy.deepexi.com/datasense-test/deepexi-belle-damo-nginx:v1.0.0
4.重启容器
#启动容器docker start容器id#重启容器docker restart 容器id
5.查看 top 信息
#查看top信息dockertop 容器id#查看元数据信息比如软连接信息docker inspect容器id
6.进入容器
#进入容器docker exec -it a6574b8410a8bash#windows进入docker容器docker exec -it 38de0a4e449b /bin/bash#进入容器docker attach容器id
7.拷贝数据
#从宿主机拷贝到容器docker cp /home容器id:/homedocker cp /home/train.csv aigateway:/home/fastai/zzy/test0#从容器拷贝到宿主机dockercp 容器name:/home /home#拷贝容器数据到宿主机,容器可以未启动成功dockercp c0392d2705b2:.chainlit/config.toml /kwan/chainlit/langchain-chainlit-docker-deployment-template/.chainlit#./ 代表当前目录docker cpchatbot:/app/app.py ./
8.停止容器
#停止容器dockerstop容器id#强制停止容器dockerkill容器id
9.删除容器
#删除容器docker rm参数 容器id#删除多个容器docker rm -f $(docker ps -a -q)# -l 移除容器间的网络连接,连接名为 dbdocker rm -l db#-v 删除容器,并删除容器挂载的数据卷docker rm -v redis#强制删除容器docker rm -f xxxxxx
10.退出容器
#退出容器exit
11.操作全部容器
#docker中 所有的容器命令docker start $(docker ps -a | awk '{ print $1}' | tail -n +2)#docker中关闭所有的容器命令docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)#docker中 删除所有的容器命令docker rm $(docker ps -a | awk '{ print $1}' | tail -n +2)#docker中删除所有的镜像docker rmi $(docker images | awk '{print $3}' |tail -n +2)
12.启动后挂载
当你使用 docker run
命令启动一个容器后,如果需要挂载更多的目录,可以使用 docker container update
命令来更新容器的配置。
例如,假设你已经启动了一个名为 my_container
的容器,现在你想要将目录 /app
挂载到这个容器中。可以使用以下命令来更新容器的配置:
docker container update -v /home/app/chatbot/config.toml:/app/.chainlit/config.toml chatbot
在这个命令中,--mount
参数用于指定要挂载的目录,source=/app
表示要挂载的目录为本地的 /app
目录,target=/app
表示要挂载到容器中的目录为 /app
。
注意,如果你更新了容器的配置,容器需要重新启动才能应用新的配置。可以使用 docker container restart
命令来重新启动容器。例如,以下命令可以重新启动名为 my_container
的容器:
docker container restart my_container
重新启动容器后,新挂载的目录就可以在容器中使用了。
#将容器中的文件移动到宿主机dockercp f5c2c45967f0:/app/.chainlit/config.toml/home/app/chatbot
13.删除容器日志
磁盘容量不足,删除容器日志
这个命令的作用是清空 Docker 容器中的日志文件。具体来说,该命令执行以下操作:
使用 find 命令查找容器日志文件所在的目录,即/var/lib/docker/containers/目录下所有以-json.log 结尾的文件,并将它们的路径保存到变量 logs 中。
使用 for 循环遍历 logs 变量中的所有日志文件路径,对每个文件执行以下操作:
a. 输出日志文件路径。
b. 使用 cat 命令将日志文件清空(即内容清空,文件保留)。
该命令的作用是清空 Docker 容器中的日志文件,可以用于释放磁盘空间或清除过期日志,但需要注意的是,清空日志文件可能会导致数据丢失或无法追踪问题,因此需要谨慎使用。
#!/bin/bashecho "=== start clean docker containers logs ==="logs=$(find /var/lib/docker/containers/ -name *-json.log)for log in $logsdoecho "clean logs : $log"cat /dev/null > $logdoneecho "=== end clean docker containers logs ==="
14.配置 host
在 docker run 运行容器的时候,添加参数--add-host [域名]:[IP]
#添加域名映射docker run -d -p 8100:8100 --add-host demo-db:192.168.1.21 --name demo demo:v0724.01
如果要配置多个域名,那添加多个参数就 ok 了。如下面例子中的 host 和 host2
#添加多个域名映射docker run -d -p 8100:8100 --add-host demo-db:192.168.1.21 --add-host2 demo-db:192.168.1.22 --name demo demo:v0724.01
四.日志查询
1.容器 id
#查看末尾3000行docker logs --tail 300038de0a4e449b#滚动最后100行docker logs -f --tail 10038de0a4e449b
2.容器名称
#查看末尾3000行docker logs -f--tail 500${CONTAINER_NAME}
3.带关键字
#滚动最后100行docker logs -f --tail 10038de0a4e449b| grep 'ads_day_city_brand_sku_size_rep'#最后3000带查询docker logs --tail 3000038de0a4e449b | grep 'java.lang.StringIndexOutOfBoundsException'#查询执行失败的原因docker logs --tail 10000038de0a4e449b| grep -A 100 'jobWasExecuted:' | grep '2022/04/02'#查询错误的原因docker logs --tail 4000038de0a4e449b| grep 'Exception' | grep '数据处理异常,错误信息='#查询关键字docker logs --tail 4000038de0a4e449b| grep '数据处理异常,错误信息='
4.输出到文件
#输出到文件,>>是追加到文件结尾docker logs --tail 100038de0a4e449b >> logs_error.txt
5.滚动查看日志
docker logs -f -t -n=5 {容器id}
6.时间范围
docker logs -f --since "2023-02-22" b93a3a7a64f5
五.项目实战
1.push to harbor
创建 push_to_kwan_harbor.sh 文件,文件内容如下:
#!/usr/bin/env bashPROFILE=$1if [ "$PROFILE" = "dev" ] || [ "$PROFILE" = "test" ] || [ "$PROFILE" = "uat" ] || [ "$PROFILE" = "prd" ]; thenecho "building profile $PROFILE"elseecho "param 1 can only be dev test uat prd"returnfimvn clean package -P $PROFILEdocker login deploy.kwan.com -u datasense -p 自己的密码docker build -t kwan-dsc-belle-insight-$PROFILE .docker tag kwan-dsc-belle-insight-$PROFILE:latest deploy.kwan.com/datasense-test/kwan-dsc-belle-insight-$PROFILE:latestdocker push deploy.kwan.com/datasense-test/kwan-dsc-belle-insight-$PROFILE:latestdocker rmi kwan-dsc-belle-insight-$PROFILE:latest deploy.kwan.com/datasense-test/kwan-dsc-belle-insight-$PROFILE:latest
2.构建镜像
sh push_to_kwan_harbor.sh test
3.启动文件
创建 run.sh 文件
#!/usr/bin/env bashPROFILE=$1if [ "$PROFILE" = "dev" ] || [ "$PROFILE" = "test" ] || [ "$PROFILE" = "uat" ] || [ "$PROFILE" = "prd" ]; thenecho "building profile $PROFILE"elseecho "param 1 can only be dev test uat prd"returnfiCONTAINER_NAME=kwan-dsc-belle-insight-$PROFILEIMAGE_NAME=deploy.kwan.com/datasense-test/kwan-dsc-belle-insight-$PROFILE:latestdocker rm -f ${CONTAINER_NAME}docker rmi ${IMAGE_NAME}docker pull ${IMAGE_NAME}docker run -d --name ${CONTAINER_NAME} --privileged=true --dns 114.114.114.114 -e PROFILE=${PROFILE} -w /home -p 8099:80 -v $PWD/logs:/home/logs -v /home/uploads:/home/uploads --restart=always ${IMAGE_NAME}docker logs -f ${CONTAINER_NAME}
在服务器上执行,不存在,则生成,存在,则覆盖源文件:
cat <<EOF >run.sh#!/usr/bin/env bashPROFILE=\$1if [ "\$PROFILE" = "dev" ] || [ "\$PROFILE" = "test" ] || [ "\$PROFILE" = "uat" ] || [ "\$PROFILE" = "prd" ]; thenecho "building profile \$PROFILE"elseecho "param 1 can only be dev test uat prd"returnfiCONTAINER_NAME=kwan-dsc-belle-insight-\$PROFILEIMAGE_NAME=deploy.kwan.com/datasense-test/kwan-dsc-belle-insight-\$PROFILE:latestdocker rm -f \${CONTAINER_NAME}docker rmi \${IMAGE_NAME}docker pull \${IMAGE_NAME}docker run -d \--name \${CONTAINER_NAME} \--privileged=true \--dns 114.114.114.114 \-e PROFILE=\${PROFILE} \-w /home \-p 8099:80 \-v \$PWD/logs:/home/logs \-v /home/uploads:/home/uploads \--restart=always \\${IMAGE_NAME}docker logs -f \${CONTAINER_NAME}EOF
执行脚本文件
sh run.sh test
4.Dockerfile
deploy.kwan.com 为私仓 harbor,这里我的 kwan 是不存在的。
1.直接执行
FROM deploy.kwan.com/dce/d2sf-skywalking-base:jdk8-alpine-8.5.0RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeRUN echo 'Asia/Shanghai' >/etc/timezoneWORKDIR /homeUSER rootENV PROFILE="dev"ENV LC_ALL en_US.UTF-8ENV LANG en_US.UTF-8COPY ./kwan-dsc-belle-insight-provider/target/*.jar /home/app.jarEXPOSE 80ENTRYPOINT ["java", "-Duser.timezone=Asia/Shanghai -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -Xloggc:logs/gc.log", "-jar", "/home/app.jar", "--server.port=80", "--spring.profiles.active=${PROFILE}"]
2.转为脚本执行
FROM deploy.kwan.com/dce/d2sf-skywalking-base:jdk8-alpine-8.5.0RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeRUN echo 'Asia/Shanghai' >/etc/timezoneWORKDIR /homeUSER rootENV PROFILE="dev"ENV LC_ALL en_US.UTF-8ENV LANG en_US.UTF-8ENV JAVA_OPTS=""ENV PARAMS=""COPY ./kwan-dsc-belle-insight-provider/target/*.jar /home/app.jarEXPOSE 80RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeRUN echo 'Asia/Shanghai' >/etc/timezoneRUN echo 'java $JAVA_OPTS -jar ./app.jar --spring.profiles.active=$PROFILE $PARAMS' > entrypoint.shENTRYPOINT ["sh", "entrypoint.sh"]
觉得有用的话点个赞
呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!
Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!