docker常用命令

本章记录docker常用命令,更多更详细命令参考官网:Docker Documentation

1.docker基础命令

docker version          #查看docker的版本信息
docker info             #查看docker的系统信息,包括镜像和容器的数量
docker 命令 --help       #帮助命令(可查看可选的参数)
docker stats            #查看docker的内存占用,网络,IO等统计数据
docker system df        #查询docker总体情况
docker COMMAND --help   #万能命令

2.docker镜像命令

2.1 查看本地主机的已下载镜像

docker images 或 docker image ls

docker images

# 可选参数
#-a, --all:列出所有镜像
#-q, --quiet:只显示镜像的id

2.2 查找仓库中的镜像

docker search [参数] <镜像>,仓库镜像地址

docker search nginx

#参数
--no-trunc:不截断输出,即长内容不用“...”代替
--limit 数字:即搜索内容每页显示的内容,默认25

2.3 下载镜像

docker pull [参数] <镜像>

#不加版本号默认下载最新版本,比如下面语句等价于:docker pull tomcat:latest
docker pull tomcat
#下载指定版本号镜像
docker pull tomcat:9.0
#默认从docker hub上下载镜像,也可以从指定的仓库中下载镜像
docker pull myregistry.local:5000/testing/test-image

#参数
-a, --all-tags:下载匹配所有标签镜像
-q, --quiet:下载时不输出详细下载信息
--platform:设置拉去镜像适合的平台,如:arm63,x86

2.4 删除镜像

docker rmi [参数] <镜像>

docker rmi tomcat
#删除(docker images -aq)查询的镜像
docker rmi $(docker images -aq)

#参数
-f, --force:强制删除镜像,即运行中的镜像也会被删除

2.5 查看镜像构建历史记录

docker history [参数] <镜像>

docker history tomcat:9.0
docker history -H=true centos

#参数
--no-trunc:不截断输出,即过长内容不用“...”代替。
-q, --quiet:只显示镜像ID
-H, --human:以人类可读的格式打印大小和日期(默认为true)

2.6 创建指向源镜像的目标镜像

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

#源镜像和目标镜像的IMAGE ID相同
docker tag nginx:latest nginx:1.1

2.7 将镜像保存为文件

docker save [参数] 镜像

#将lucnt/oracle-11g镜像保存racle.tar文件
docker save -o oracle.tar lucnt/oracle-11g:latest

#参数
-o, --output:指定输出的文件名称

2.8 将文件加载为镜像

docker load [参数]

docker load -i oracle.tar
#参数
-i, --input:指定读取tar归档文件

3. 容器命令

3.1 通过镜像启动新容器

docker run [参数] <镜像> [命令]

docker run -it -d -p:8888:8080 --name tomcat9 tomcat:9.0 \bin\shell

#参数
-d:后台方式启动
--name:为容器指定一个名称,不指定则docker自主分配
-p:对外暴露端口,例如:-p 8888:8080,对外暴露的端口为8888,对应容器的端口为8080
-P:随机指定映射端口
-i:让docker容器和宿主机以交互的方式运行,没有该参数则无法在shell窗口中输入命令。
-t:对宿主机分配一个执行shell命令的窗口,如果只有-i,则输入的命令无法执行,一般 -it 一起使用。
--rm:容器退出时自动删除
-e:使用键值对的方式配置环境变量以及配置信息
-v:挂在宗卷
--privileged:给容器赋予扩展权限
--restart:当docker服务重启时应用的重新启动策略(默认为“no”),restart的参数说明如下:
always:Docker服务重启时,容器自动启动(类似windows的开机自启动应用)。
on-failure:只有当容器的退出代码为非0值的时候才会自动重启。另外,该参数还接受一个可选的重启次数参数,
on-fialure:5:表示当容器退出代码为非0时,Docker会尝试自动重启该容器,最多5次。
(注意:这里如果不限定该重启策略,那么每一次重启电脑后都要手动通过docker start命令来重启当前容器)

3.2 查询运行的容器

docker ps [参数]

#查询当前正在运行的容器
docker ps
#查询历史运行过的容器(包括正在运行的)
docker ps -a

#参数
-a, --all:显示所有容器
-q:查询结果中只显示容器ID
-s:查询结果中文件大小

3.3 将本地标准输入、输出和错误流附加到正在运行的容器

docker attach [参数] <容器>

#以后台方式启动启动
docker run -d --name topdemo ubuntu /usr/bin/top -b
#通过容器名称或者ID重新再次进入容器
docker attach topdemo

3.4 在正在运行的容器中运行命令

docker exec [参数] <容器> <命令>

docker exec -it tomcat:9.5
#参数
-d:后台方式启动
-i:让docker容器和宿主机以交互的方式运行
-t:对宿主机分配一个执行shell命令的窗口,一般 -it 一起使用

3.5 查看docker内存等使用情况

docker stats

3.6 安装docker可视化面板

参数参考3.1

docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

访问地址:http://:8088

3.7 查看容器详细信息

docker inspect [参数] <容器>

docker inspect amazing_raman

3.8 从容器的更改中创建新镜像

docker commit [参数] <容器> [:tag(版本号)]

docker commit c3f279d17e0a  svendowideit/testimage:version3
docker commit -m '第一次提交镜像' -a 'pyh' 1de9231ebdfd tomcat:9.1

#参数
--author,-a:提交作者
--change,-c:将Dockerfile指令应用于创建的图像
--message,-m:提交信息,类似git提交记录
--pause,-p:在提交期间暂停容器,默认值true。默认情况下,正在提交的容器及其进程将在提交映像时暂停。这减少了在创建提交过程中遇到数据损坏的可能性。如果不希望此行为,请将--pause选项设置为false。

4. 数据卷命令

4.1 使用数据卷持久化同步共享容器数据

格式1:docker run -v 主机目录:容器内目录[:权限] [其他参数] <镜像>

格式2:docker run -v 数据卷名称:容器内目录[:权限] [其他参数] <镜像>

格式3:docker run -v 容器内目录 [其他参数] <镜像>

权限:

ro:read only,只读,只能通过宿主机写入,容器无法写

rw:read write,读写,宿主机和容器双向可读写

tips:

不指定数据卷名称,默认匿名挂载。冒号前的内容,"/"开头为主机目录,否则就是数据卷名称。

可以不指定数据卷名称或者主机目录。

不指定主机目录则默认在/var/lib/docker/volumes目录

docker run -v /home/pyh/dcf:/usr/local/tomcat/data -p 8080:8080 tomcat:9.1

4.2 操作数据卷

docker volume <命令>

#列出所有数据卷
docker volume ls

#查看数据卷详情,docker volume inspect <数据卷名称>
docker volume inspect mysql-data

4.3 容器执行时挂载数据卷

docker run --volumes-from <容器> [其他参数] <镜像>

docker run --volumes-from 7c0d6b7dd503 -it pyh/centos

5. Dockerfile

5.1 初识Dockerfile文件

Dockerfile就是用来构建 docker 镜像的构建文件(命令脚本,每个命令都会形成一个新的镜像层并对镜像进行提交)。 通过这个脚本可以生成镜像!

#文件内容格式:命令 参数
#指定以哪个源镜像为基础构建一个新的镜像
FROM centos

#挂载数据卷,相当于使用 -v "volumes01" -v "volumes02",匿名挂载方式
VOLUME ["volumes01", "volumes02"]

#执行指令
CMD echo "镜像构建完毕!"
CMD /bin/bash

5.2 从Dockerfile构建映像

docker build [参数] <PATH | URL>

docker build命令从Dockerfile和“上下文”构建Docker映像。构建的上下文是位于指定PATHURL中的一组文件。构建过程可以引用上下文中的任何文件。例如,您的构建可以使用COPY指令在上下文中引用文件。

URL参数可以引用三种资源:Git存储库、预打包的tarball上下文和纯文本文件。

docker build -f BuildDocker -t pyh/centos:1.0 .

#参数
-f, --file:指定Dockerfile文件路径,不指定默认为<PATH | URL>下的名为Dockerfile文件
-t, --tag:指定镜像标签
# 基础镜镜像,一切从这里开始构建
FROM
#镜像是谁写的,姓名+邮箱
MAINTAINER
#将宿主机的文件拷贝到镜像且会自动处理URL和解压tar压缩包,是COPY的加强版
ADD
#将宿主机的文件拷贝到镜像
COPY
#镜像的工作目录,终端进入容器后所在的目录
WORKDIR
#指定镜像以什么用户执行,默认root
USER
#挂载的目录
VOLUME
#暴露端口
EXPOSE
#镜像构建的时候需要运行的命令,即在"docker build"的时候执行。有两种格式,shell格式命令:即linux命令的格式,
#exec格式命令:["可执行文件", "参数", "参数"]
RUN
#指定这个容器启动的时候要运行的命令,即在"docker run"的时候执行。和run一样有两种命令格式。
#多个CMD命令,只有最后一个会生效,会被docker run之后的参数替代。
CMD
#类似CMD命令,但是ENTRYPOINT不会被docker run后面的参数覆盖,而且这些命令行参数会被当做参数送给ENTRYPOINT指令指定的程序
#ENTRYPOINT可以和CMD一起使用,一般定参使用ENTRYPOINT,变参使用CMD
#当指定了ENTRYPOINT后, CMD的含义就发生了变化,不再是直接运行其命令而是将CMD的内容作为参数传递给ENTRYPOINT指令,
#例如:ENTRYPOINT ["nginx", "-c"] CMD ["/etc/nginx/nginx.conf"]
#docker run没有传参时,默认为nginx -c /etc/nginx/nginx.conf,如果传参则为:nginx -c [run后面的参数]
#docker run时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序,比如 --entrypoint ls
#多个ENTRYPOINT 指令,仅最后一个生效。
ENTRYPOINT
#当构建一个被继承 DockerFile 这个时候就会运行 ONBUILD 的指令。触发指令。
ONBUILD
#构建的时候设置环境变量!
ENV

Dockerfile内容

FROM centos:7

#设置环境变量,格式: key value
ENV MYPATH /usr/local
#设置工作目录
WORKDIR $MYPATH

#执行脚本,在构建期间执行命令(centos下载命令)
RUN yum -y install vim
RUN yum -y install net-tools

#拷贝文件到镜像中,如果是压缩包文件则自动解压
COPY jdk-8u331-fcs-bin-b09-linux-aarch64-10_mar_2022.tar /usr/local/java

#对外暴露端口
EXPOSE 80

#运行期间执行命令
CMD echo $MYPATH
CMD echo '----------镜像构建完毕!----------'
CMD /bin/bash

有时候使用build构建的镜像的镜像名称和标签显示为”none“,这种镜像成为虚悬镜像,虚悬镜像已经失去价值,可以删除。

查询虚悬镜像的命令:docker image ls -f dangling=true

删除所有虚悬镜像命令:docker image prune

6. 镜像发布

6.1 登陆docker hub

docker login [参数]

#需要输入用户名和密码
docker login
#只需要输入密码
docker login -u NPEXCEPTIONS
#直接登陆
docker login -u NPEXCEPTIONS -p 123456
#参数
-u, --username:用户名
-p, --password:密码

6.2 推送镜像到Doc hub

docker push [参数] <镜像名称>[:tag]

#只能填写待镜像名称
docker push pyh/centos:1.0

6.3 Docker镜像加载原理

  1. UnionFS(联合文件系统)UnionFS(联合文件系统):

Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来—层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统 下(unite several directories into a single virtualflesystem)。 Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

  1. Docker镜像加载原理
    docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

bootfs(boot file system)主要包合bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载boots文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包合boo加载器和内核。当boot加载完成
之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

rootfs(root file system)在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

容器和镜像的关系:

Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!这一层就是我们通常说的容器层,容器之下的都叫镜像层!

7.docker网络

docker网络用语容器之间互联和通信以及端口映射,还有容器ip变动时可以通过服务名直接网络通信而不是通过写死的ip来访问。

7.1 网络模式

网络模式简介
bridge为每一个容器分配、设置IP 等,并将容器连接到一个dockero虚拟网桥,默认为该模式,即:–network bridge
host容器不会虚拟出自己的网卡,配置自己的ip等,而是使用宿主机的ip和端口。即:–network host(此时参数-p指定的端口将不起作用,端口号会以主机的端口号为主)
none容器有独立的 Network namespace,但并没有对其进行任何网络设置,如分配 veth pair 和网桥连接,1P 等,,即:–network none
container新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP和端口范围等。,即:–network container:NAME|ID

7.2 网络命令

docker network <COMMAND>

COMMAND:

  • connect:将容器连接到网络

  • create:创建一个新的网络

  • disconnect:断开容器与网络的连接

  • inspect:显示一个或多个网络的详细信息

  • ls:网络列表

  • prune:删除所有没有用的网络

  • rm:删除一个或者多个网络

7.3 自定义网络

  1. 创建一个新的网络

  2. 启动容器的时候使用参数–network指定自定义的网络

  3. 进入使用ping命令ping容器名称测试网络是否连通

8.容器编排

Docker-Compose是 Docker官方的开源项目,负责实现对Docker容器集群的快速编排。

Docker-Compose是 Docker公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动关闭这些容器。

  1. 安装docker compose

参考官网:Install Docker Compose | Docker Documentation

分使用存储库安装手动安装二进制文件两种方式

  1. 编写docker-compose.yml文件

  2. 在compose文件的当前目录下,使用docker-compose config命令检查docker-compose.yml文件是否存在编写错误

  3. 在compose文件的当前目录下,使用docker-compose up命令启动compose编写的所有服务

8.1 compose配置文件

docker-compose.yml配置文件编写的格式和spring的application.yml相同。

docker-compose.yml配置文件编写的内容主要包括需要启动哪些镜像,对外暴露的端口,容器名称,环境变量等等配置信息,类似使用配置文件的方式来实现docker run能实现的功能。不同的是docker run只能单个容器启动,类似的像docker startdocker restartdocker stop等命令都是只能管理单个容器。通过docker-compose.yml可以实现一键启动、一键停止、一键查看日志等功能。

#版本号
version: "3"

#等价命令:
docker network create test_network
docker run -p 6001:6001 --name ms01 -v /app/microService:/data --network test_network test_docker:1.1
services:
  microService:
  image: test_docker:1.1
  container name: ms01
  ports:
    - '6001:6001"
  volumes:
  - /app/microService: /data
networks:
  - test_network

8.2 compose常用命令

#旧版格式为docker-compose <COMMAND>,新版的格式为docker compose <COMMAND>
#如果不支持旧版的命令格式:使用apt install docker-compose
#新版命令格式默认已安装,无需安装
docker compose -h #查看帮助
docker compose up #启动所有docker-compose服务
docker compose up -d #启动所有docker-compose服务并后台运行
docker compose down #停止并删除容器、网络、卷、镜像
docker compose exec yml里面的服务id #进入容器实例内部 docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
docker compose ps #展示当前docker-compose编排过的运行的所有容器
docker compose top #展示当前docker-compose编排过的容器进程
docker compose logs yml里面的服务id #查看容器输出日志
docker compose config #检查配置
docker compose config-q #检查配置,有问题才有输出
docker compose restart #重启服务
docker compose start #启动服务
docker compose stop #停止服务

9.docker监控

9.1 docker轻量级监控(portainer可视化页面)

docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

访问地址:http://:8088

9.2 CIG容器重量级监控

CIG容器监控三剑客:CAdvisor、InfluxDB、Granfana

  • CAdvisor
    CAdvisor是一个容器资源监控工具,包括容器的内存,CPU,网络1Q,磁盘1O等监控,同时提供了一个WEB页面用于查看容器的实时运行状态。CAdvisor默认存储2分钟的数据,而且只是针对单物理机。
    不过,CAdvisor提供了很多数据集成接口,支持InfluxDB,Redis,Kafka,Elasticsearch等集成,可以加上对应配置将监控数据发往这些数据库存储起来。
    CAdvisor功能主要有两点:

    1. 展示Host和容器两个层次的监控数据;

    2. 展示历史变化数据;

  • InfluxDB
    InfluxDB是用Go语言编写的一个开源分布式时序、事件和指标数据库,无需外部依赖。CAdvisor默认只在本机保存最近2分钟的数据,为了持久化存储数据和统一收集展示监控
    数据,需要将数据存储到InfluxDB中。InfluxDB是一个时序数据库,专门用于存储时序相关数据,很适合存储CAdvisor的数据。而且,CAdvisor本身已经提供了InfluxDB的集成方法,丰启动容器时指定配置即可。
    InfluxDB主要功能:

    1. 基于时间序列,支持与时间有关的相关函数(如最大、最小、求和等);

    2. 可度量性:你可以实时对大量数据进行计算;

    3. 基于事件:它支持任意的事件数据;

  • Granfana
    Grafana是—个开源的数据监控分析可视化平台,支持多种数据源配置(支持的数据源包括InfluxDe,MysQL,Elasticsearch,OpenTSDB,Graphite等)和丰富的插件及模板功能,支持图表权限控制和报警。
    Grafan主要特性:

    1. 灵活丰富的图形化选项;

    2. 可以混合多种风格;

    3. 支持白天和夜间模式;

    4. 多个数据源;

使用compose集成CIG容器,docker-compose.yml文件内容如下:

version: '3.1'
volumes:
  grafana_data: {}

services:
 influxdb:
   image: tutum/influxdb:0.9
   restart: always
   environment:
   - PRE_CREATE_DB=cadvisor
   ports:
   - "8083:8083"
   - "8086:8086"
   volumes:
   - ./data/influxdb:/data

 cadvisor:
   image: google/cadvisor
   links:
   - influxdb:influxsrv
   command: -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086
   restart: always
   ports:
   - "8080:8080"
   volumes:
   - /:/rootfs:ro
   - /var/run:/var/run:rw
   - /sys:/sys:ro
   - /var/lib/docker/:/var/lib/docker:ro
 grafana:
   user: "104"
   image: grafana/grafana
   user: "104"
   restart: always
   links:
    - influxdb:influxsrv
   ports:
    - "3000:3000"
   volumes:
    - grafana_data:/var/lib/grafana
   environment:
    - HTTP_USER=admin
    - HTTP_PASS=admin
    - INFLUXDB_HOST=influxsrv
    - INFLUXDB_PORT=8086
    - INFLUXDB_NAME=cadvisor
    - INFLUXDB_USER=root
    - INFLUXDB_PASS=root
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NPException.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值