本章记录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映像。构建的上下文是位于指定PATH
或URL
中的一组文件。构建过程可以引用上下文中的任何文件。例如,您的构建可以使用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镜像加载原理
- UnionFS(联合文件系统)UnionFS(联合文件系统):
Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来—层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统 下(unite several directories into a single virtualflesystem)。 Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
- 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 自定义网络
-
创建一个新的网络
-
启动容器的时候使用参数–network指定自定义的网络
-
进入使用ping命令ping容器名称测试网络是否连通
8.容器编排
Docker-Compose是 Docker官方的开源项目,负责实现对Docker容器集群的快速编排。
Docker-Compose是 Docker公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动关闭这些容器。
- 安装docker compose
参考官网:Install Docker Compose | Docker Documentation
分使用存储库安装和手动安装二进制文件两种方式
-
编写docker-compose.yml文件
-
在compose文件的当前目录下,使用docker-compose config命令检查docker-compose.yml文件是否存在编写错误
-
在compose文件的当前目录下,使用docker-compose up命令启动compose编写的所有服务
8.1 compose配置文件
docker-compose.yml配置文件编写的格式和spring的application.yml相同。
docker-compose.yml配置文件编写的内容主要包括需要启动哪些镜像,对外暴露的端口,容器名称,环境变量等等配置信息,类似使用配置文件的方式来实现docker run能实现的功能。不同的是docker run只能单个容器启动,类似的像docker start、docker restart、docker 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功能主要有两点:-
展示Host和容器两个层次的监控数据;
-
展示历史变化数据;
-
-
InfluxDB
InfluxDB是用Go语言编写的一个开源分布式时序、事件和指标数据库,无需外部依赖。CAdvisor默认只在本机保存最近2分钟的数据,为了持久化存储数据和统一收集展示监控
数据,需要将数据存储到InfluxDB中。InfluxDB是一个时序数据库,专门用于存储时序相关数据,很适合存储CAdvisor的数据。而且,CAdvisor本身已经提供了InfluxDB的集成方法,丰启动容器时指定配置即可。
InfluxDB主要功能:-
基于时间序列,支持与时间有关的相关函数(如最大、最小、求和等);
-
可度量性:你可以实时对大量数据进行计算;
-
基于事件:它支持任意的事件数据;
-
-
Granfana
Grafana是—个开源的数据监控分析可视化平台,支持多种数据源配置(支持的数据源包括InfluxDe,MysQL,Elasticsearch,OpenTSDB,Graphite等)和丰富的插件及模板功能,支持图表权限控制和报警。
Grafan主要特性:-
灵活丰富的图形化选项;
-
可以混合多种风格;
-
支持白天和夜间模式;
-
多个数据源;
-
使用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