日常docker的实操命令场景

基础信息

配置文件daemon.json

  1. 如果是windwos环境的docker desktop可以通过设置->Docker Engine去修改配置,也可以到C:\\Users\\{用户名称}\\.docker文件下修改daemon.json配置文件 ,

  2. 如果是在linux环境下是 /etc/docker/daemon.json,mac环境是在~/.docker/daemon.json

注意修改完需要重启docker

javascript 复制代码
// 配置文件
~/.docker/daemon.json

配置国内镜像源

eg: 常用的国内镜像源配置:

json 复制代码
"registry-mirrors": [
    "<https://docker.m.daocloud.io>",
    "<https://docker.imgdb.de>",
    "<https://docker-0.unsee.tech>",
    "<https://docker.hlmirror.com>",
    "<https://docker.1ms.run>",
    "<https://func.ink>",
    "<https://lispy.org>",
    "<https://docker.xiaogenban1993.com>"
]

docker常用的命令

docker镜像相关使用命令

  • docker search :搜索相关镜像文件
  • docker pull : 拉取镜像文件
  • docker images : 查看镜像
  • docker rmi : 删除镜像
  • docker save : 镜像打包成指定文件包
  • docker load : 镜像从文件包中载入
  • docker build : 镜像的构建
  • docker push : 镜像的推送
shell 复制代码
# 【搜索相关镜像文件 】: docker search xx
# 【拉取镜像文件】 : docker pull xx
# 【拉取指定版本的镜像文件】 : docker pull xx:5.7

# 【查看镜像 】docker images
# 【查看镜像Id所有】 docker images -q
# 【查看镜像 筛选后的 】: docker images | grep java | awk '{print $3}'

# 【删除镜像】 : docker rmi 镜像
# 【组合配合删除未运行的镜像】 : docker rmi $(docker images -q)
# 【组合配合删除指定名字的镜像】 : docker rmi $(docker images | grep 'xxx' | awk '{print $3}')

# 【镜像打包】docker save -o xx文件.tar xx镜像
# 【镜像载入】docker load -i xx文件.tar

# 【构建镜像】docker build -t <tag名称> -f <dockefile文件> .
# 【推送镜像】docker push tag名称

docker容器相关命令

  • docker ps : 查看容器
  • docker rm : 删除容器
shell 复制代码
# 【查看已经起着的容器】:docker ps
# 【查看未运行的容器】: docker ps -a
# 【查看单独只是容器Id】: docker ps -q

# 【删除容器】 : docker rm 容器  带上-v顺带删除数据卷
# 【组合配合删除所有容器】 :docker rm $(docekr ps -a -q)

docker运行容器

  • docker run: 运行docker容器
    • -p : 指定端口
    • -d : 后台运行容器,并返回容器ID
    • --name : 指定容器名称
    • -e : 设置环境变量
    • -v: 设置文件映射
    • --restart=always/unless-stopped: 重启方式
    • --rm: 停止后会自动删除容器
    • --network: 网络
    • --network-alias : 网络别名
    • --command: 运行命令
    • --volumes-from: 指定使用数据卷轴
  • docker start/stop/restart : 容器的启动/关闭/重启
  • docker update : 修改配置
  • docker exec : 进入容器终端 (-it 分配终端使用有效)
  • docker cp : 复制文件
bash 复制代码
docker run --name 名称 -p 88:80 -v 映射文件 -d xx镜像名称
docker stop xx
docker restart xx
docker update --restart = always(no)

docker exec [options] 名称/Id Command [args]
docker exec -it xx bash
docker exec -it xx /bin/bash
docker exec -it xx /bin/sh

# 【复制文件【宿主和容器】】
1.docker cp /路径一 容器名:/路径二
2.docker cp 容器名:/路径一  /路径二

docker 查看资源信息

  • docker logs : 查看日志
  • docker inspect: 查看容器信息
  • docker port : 查看容器的绑定和监听信息
  • docker stats : 查看容器资源在宿主机上使用情况
  • docker top : 查看容器内服务资源使用情况
  • docker system : 查看docker信息
bash 复制代码
# 【看日志】   :docker logs 你的容器
	docker logs 你的容器 --tail 100 -f (指定查看容器的服务运行状态)
# 【查看容器所有信息】  : docker inspect 你的容器
# 【查看容器端口的绑定和监听情况】 : docker port 你的容器
# 【查看容器资源在宿主机上使用情况】 : docker stats | grep 你的容器

# 【查看容器内服务资源使用情况】 : docker top 你的容器
# 【查看docker占用空间】 : docker system df
# 【查看docker信息】: docker system info

docker网络配置

添加容器访问外网: --add-host=host.docker.internal:host-gateway

  • docker network ls : 查看网络
  • docker network create : 创建网络
  • docker network disconnect : 解绑网络
  • docker network connect : 绑定网络
  • docker network rm : 删除网络
css 复制代码
#【查看网络】 : docker network ls
#【创建自定义network】 : docker network create --driver bridge	
                    --subnet 172.18.0.0/16 --gateway 172.18.0.1 mynet
                    --driver bridge 网络模式为 桥接模式
                    --subnet 172.18.0.0/16 设置子网
                    --gateway 172.18.0.1 设置网关
                    --mynet 自定义的network名

#【连接指定的网络启动】 : docker run -it --name <容器名> ---network <要加入的局域网网络名>
                        --network-alias <网络的别名> <最后写上的镜像名>
#【解绑容器网络】 : docker network disconnect <网络名> <容器名>
#【绑定容器网络】 : docker network connect <网络名> <容器名>
#【删除网络】: docker network rm <网络名> [...<网络名>]
#【查看网络信息】 :docker network inspect <网络名>

#【快速查看所有网络使用了的】: docker network inspect $(docker network ls -q) --format '{{.Name}}: {{range .IPAM.Config}}{{.Subnet}}{{end}}'

docker 数据卷

  • docker volume ls: 查看数据卷列表
  • docker volume create: 创建数据卷
  • docker volume rm : 删除数据卷
  • docker volmue inspect : 查看数据卷
bash 复制代码
# 【列出docker数据卷】 : docker volume ls
# 【创建volume】: docker volume create vol_name
# 【删除volume】: docker volume rm vol_name
# 【查看volume】: docker volume inspect vol_name

案例:构建发布的过程

例如springboot项目,我们打包好对应的jar包,然后在指定的目录下放置dockerfile文件,然后通过命令构建镜像文件,然后推送到指定的镜像仓库中即可。

bash 复制代码
FROM java:8
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/locatime
#用来指定当前工作目录(或者称为当前目录) 当使用相对目录的情况下,采用上一个WORKDIR指定的目录作为基准
#相当与cd 命令,但不同的是指定了WORKDIR后,容器启动时执行的命令会在该目录下执行
WORKDIR /app
#将targer目录下的jar包复制到docker容器/目录下面
ADD demo-1.0.0.jar demo.jar
# 容器提供默认的执行命令
CMD ["java","-jar","demo.jar","&"]

使用我们上述的提到过的命令形式

bash 复制代码
# 【构建镜像】docker build -t <tag名称> -f <dockefile文件> .
# 【推送镜像】docker push tag名称

注意 . 的位置是指的在dockfile文件同个层级下,执行的命令

docker 优化

配置CPU和内存

对于启动容器应用需要指定CPU和内存大小时,可以在启动时候配置对应的参数

  • -m 512m : 设定内存大小
  • --cpus=2 : 设定cpu核数目大小
scss 复制代码
#【设置内存】 docker run -m 512m [container/id]

// 表明最大可以512,但当宿主机内存吃紧,会回收到256.
#【设置内存的软性限制】 docker run -m 512m --memory-reservation=256m [container/id]
#【设置cpu个数】 docker run --cpus=2 [container/id]

清理对应的数据

查看docker容器中占用磁盘较大的文件,升序: du -d1 -h /var/lib/docker/containers | sort -h

  • docker container prune : 删除所有已经停止的容器
  • docker volume prune : 删除不再使用的数据卷
  • docker image prune :删除悬挂状态的镜像(不会在被使用的镜像)
  • docker system prune : 清理容器,镜像等数据
  • docker builder prune : 清除未使用的构建缓存
  • docker network prune : 清除所有未使用到的网络

如果针对需要一些定时清理的场景,或者是相关的配置约定,可以参考有关自动清理的相关配置

json 复制代码
1. 自动清理镜像和容器,设置过期时间
{
  "image-prune-filters": {
    "until": "24h"
  },
  "container-prune-filters": {
    "until": "24h"
  }
}

2.设置日志的最大的大小,和日志保留时间
{
  "log-opts": {
    "max-size": "100m",
    "max-file": "10"
  }
}

docker-compose 命令

常用的指定: -f 指定文件,-p定义名称 , -d 后台运行

docker-compose管理命令

  • 运行: docker-compose up
  • 构建: docker-compose build
  • 停止: docker-compose down
  • 删除: docker-compose rm
  • 日志: docker-compose logs (ps:所有容器服务日志)

对应的服务管理

  • 服务运行不存在:docker-compose up -d {service}
  • 服务运行已存在:docker-compose start {service}
  • 服务停止不删除:docker-compose stop {service}
  • 服务重启:docker-compose restart {service}
  • 服务删除:docker-compose rm {service}
  • 获取日志:docker-compose logs {service}
shell 复制代码
# 【检查docker-compose.yml 执行的样子】docker-compose -f xxx配置文件 config
# 【构建镜像images】 docker-compose -f xxx配置文件 build [--no--cache]
# 【后台运行   (-f 指定文件,-p定义名称 , -d 后台运行)】:
                docker-compose -f xx配置文件路径 up -d

# 【运行某个指定的服务】 docker-compose -f xx配置文件路径 up -d <服务名>
# 【停止】  : docker-compose -f 指定文件 down

# 【获取由Compose管理的容器的状态信息 】: docker-compose -f 指定文件 ps
# 【启动已经存在 】: docker-compose -f 指定文件 start <服务名>
# 【停止,但不删除】 : docker-compose -f 指定文件 stop <服务名>
# 【删除已停止的容器 -v删除数据券 】: docker-compose -f 指定文件 rm <服务名>
# 【停止并删除容器,网络,镜像】docker-compose down (-v 删除卷)
# 【获取日志】 : docker-compose -f 指定文件 logs

# 【重启某个服务 , -t 等待时间(s)再kill】 : docker-compose -f 指定文件 restart -t 30 <服务名>

docker-compose.yml的配置信息

注意: 在同一个network里,可以通过service直接访问另一个service ,也可以通过网络别名。也可以访问全局唯一的container_name

  • version : 使用compose的版本
  • services: 指定服务 eg:mysql (可以在本文件里唯一)
    • restart :指定重启策略 (always , unless-stopped)
    • build : 指定Dockerfile所在文件夹的路径。Compose将会利用Dockerfile自动构建镜像,然后使用镜像启动服务容器
      • context : 指定路径
      • dockerfile : 指定dockerfile的名称
    • image: 指定镜像
    • container_name :指定容器名称 (在全局的docker环境里唯一)
    • ports: 指定端口映射条件
    • environment: 指定相关参数配置
    • voulmes: 指定数据卷的映射
    • depends_on :指定多个服务的依赖关系顺序
      • <服务名称>
        • condition : 【需要配合healthcheck 】指定条件(service_healthy(服务通过健康检查且处于健康状态时才会启动应用服务)| service_started |service_completed_successfully
    • dockerfile :指定额外的编译镜像 dockerfile文件
    • command : 用于指定容器启动时运行的命令 (优先级高于dockfile内部的CMD)eg: ["echo", "Hello, Docker Compose!"]
    • links : 可以直接通过记录ip在容器,后面可以用别名替代ip
    • networks : 使用的网络
      • <网络名称>
        • aliases : 网络别名
    • healthcheck : 健康检查
      • test:健康检查命令 ["CMD-SHELL", "mysqladmin ping --silent"]
      • interval : 健康检查之间的间隔时间。这里设置为每 10 秒进行一次检查
      • timeout: 每次健康检查的超时时间。这里设置为 5 秒
      • retries : 失败重试次数。在标记容器为不健康之前允许的失败次数。这里设置为 5 次。当连续失败指定次数后,容器状态会变成unhealthy
      • start_period : 开始检查前的等待时间。这里设置为 30 秒,给 xxx 一些时间来启动并准备好接受连接
    • auth_config : 配置验证信息
      • username 账号
      • password 密码
      • serveraddress 镜像地址
  • networks: 配置网络 docker-compose 网络
    • <指定网络名称>
      • driver:指定链接, host, bridge
      • ipam : 配置ip地址管理 docker-compose配置子网和网关
        • subnet :子网
        • gateway: 网关
      • external : true 说明该网络是由外部创建的,不是docker compose创建的
  • volumes : 配置数据卷 docker-compose 使用命名卷轴
    • <指定数据卷的名称>
      • external : true 说明该卷已经由外部创建好了

案例模版:指定镜像运行 (image)

docker-compose.yml 的文件编写

ruby 复制代码
version: '3'
services:
  mysql:                                    #指定容器名称
     restart: always                        # 代表知道docker 启动那么这个容器就跟着一起启动
     image: daocloud.io/library/mysql:5.7.4 #指定镜像
     container_name: mysql                  # 指定镜像名称
     ports:
         - 3306:3306                        # 指定端口号的映射
     envirmonment:
	      - TZ=Asia/Shanghai
	      - MYSQL_ROOT_PASSWORD=root
	      - MYSQL_USER=latelee
	      - MYSQL_PASSWORD=123456
     voulmes:
        - /opt/docker/mysql/data:/var/lib/mysql # 指定映射的数据卷

启动指定docker-compose.yml文件运行

bash 复制代码
docker-compose -f docker-compose.yml -p test up -d

案例一:使用网络

  1. 手动通过命令创建的网络
arduino 复制代码
# network docker network create --driver bridge <网络名>

然后在compose.yml文件中指定网络名,申明external 为true,最后对应的服务商引用下改网络名即可

vbnet 复制代码
version: '3'
networks:
  <网络名>:
    external: true
  1. 如果是不存在的网络,需要自动创建的。就不要标记external为true,最后对应的服务商引用下改网络名即可

  2. 如果需要指定网络的网关和子网掩码的配置,对当前的整个compose服务的网络管理起来

yaml 复制代码
# 设置网络
networks:
  <网络名>:
    driver: bridge  # 方式
    ipam:
      config:
        - subnet: 192.168.100.0/24  # 24标识二进制有个24个1,剩余8个0,等同于255.255.255.0
        - gateway: 192.168.100.1

再在具体的服务上指定具体的ip地址,例如下述的yy服务指定了ip地址

yaml 复制代码
# 服务绑定网络
services:
  yy:
    image: xx                    
    networks:
      <网络名>:
        ipv4_address: 192.168.100.11   # 配置每个服务具体的ip地址

注意: 不同的docker - compose项目对应的子网不能重复,这是为了确保容器网络的正常运行和 IP 地址的唯一性,避免网络冲突

  1. 还有一种场景:对应我们需要启动的服务需要访问自己的宿主机的时候,需要配置为 host.docker.internal 当作宿主机的ip地址来访问

案例二:使用环境变量文件.env

当我们在 docker-compose.yml 文件中引用了大量的环境变量时,此时我们可以通过 .env 文件来为 docker-compose.yml 文件引用的所有环境变量设置默认值!通过在yml中使用${}引用变量,env中确认配置值。

编写docker-compose.yml 文件

yaml 复制代码
version: '3'
services:
  web:
    image: ${IMAGETAG}   // 通过$ 引用变量                
    environment:
      APPNAME:
      AUTHOR:
      VERSION:
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"

编写.env 文件

ini 复制代码
# define env var default value.
IMAGETAG=defaultwebimage
APPNAME=default app name
AUTHOR=default author name
VERSION=default version is 1.0

案例三: 依赖dockerfile运行

使用自定义dockfile文件来构建docker镜像,指定build的内容位置 ,等同于docker命令的build的实现,只不过就是把这个步骤放在文件中编排起来了

首先我们定义docker-compose.yml文件的实现,指定context文件dockerfile 的文件夹目录,dockerfile参数为 dockerfile文件名称

yaml 复制代码
version: "3.0"
services:
  demo:          #项目id
    build:       #启动服务时,先将build中指定的dockerfile打包成镜像,再运行该镜像
      context: ./dir         #指定上下文目录dockerfile所在目录[相对、绝对路径都可以]
      dockerfile: Dockerfile      #文件名称[在指定的context的目录下指定那个Dockerfile文件名称]
    container_name: test
    ports:
      - "8881:8881"

然后在指定dockerfile内容

bash 复制代码
FROM java:8
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/locatime
#用来指定当前工作目录(或者称为当前目录) 当使用相对目录的情况下,采用上一个WORKDIR指定的目录作为基准
#相当与cd 命令,但不同的是指定了WORKDIR后,容器启动时执行的命令会在该目录下执行
WORKDIR /app
#将targer目录下的jar包复制到docker容器/目录下面
ADD demo-1.0.0.jar demo.jar
# 容器提供默认的执行命令
CMD ["java","-jar","demo.jar","&"]

最后通过命令执行即可

bash 复制代码
docker-compose -f docker-compose.yml -p test up -d

Dockfile文件关键词

  • COPY 复制文件(推荐使用的复制) : 源路径 ,目标路径
  • ADD 更高级的复制文件: 如(解压缩文件)源路径, 目标路径
  • CMD: 容器启动命令
    • shell格式: CMD <命令>
    • exec格式(推荐使用): CMD ["可执行文件", "参数1", "参数2"...]
  • ENTRYPOINT : 入口点 同CMD作用
    • 接收上层传递下来的参数加入到CMD命令中, eg:(docker run xx -i ,-i会传递到CMD参数上)
    • 应用运行前的准备工作 ,先执行文件预先操作 eg:( ENTRYPOINT ["docker-entrypoint.sh"]
  • ENV : 设置环境变量(运行时)
    • 通过$引用变量
  • ARG : 构建参数(也是环境变量,构建时)
    • 配合使用再docker build 的传递,dockerfile使用环境变量(注意: ARG 指令有生效范围,如果在 FROM 指令之前指定,那么只能用于 FROM 指令中)
    • 命令docker build --build-arg xx=yyy来指定参数 指定arg参数 (构建用
  • VOLUME: 定义匿名卷 , 数据保存在卷中
  • EXPOSE: 声明端口
    • 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射
  • WORKDIR : 指定工作目录
  • RUN:在新镜像内部执行的命令(每个 RUN 指令都会在当前镜像的基础上创建一个新的镜像层)

相关Dockfile的功能参考

引入jdk

官方的 OpenJDK,此镜像以 Alpine Linux 为基础,体积小巧,适合生产环境,对应的安装工具是apk

sql 复制代码
引入jdk8 :FROM openjdk:8-jdk-alpine   
引入jdk17 :FROM openjdk:17-jdk-alpine  

如果需要使用 DebianUbuntu 这类更完整的基础系统 ,后续针对安装工具是apt-get

sql 复制代码
引入jdk8 :FROM openjdk:8-jdk
引入jdk17 :FROM openjdk:17-jdk

设置时区

对于镜像系统内的时区可以通过手动指定 , 如Asia/Shanghai

bash 复制代码
ENV TZ=Asia/Shanghai   
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

增加阿里的仓库源

Alpine Linux 系统默认的软件包镜像源替换为阿里云的镜像源,以加快软件包的下载速度和提高下载的稳定性

bash 复制代码
RUN sed -i "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories

后续通过更新或者安装软件包就比较快一些

csharp 复制代码
# 更新软件包索引并安装一个示例软件包
RUN apk update && apk add curl

安装中文字体 & 删除安装缓存包

如果代码中有用到字体绘制相关功能则需要添加安装字体

bash 复制代码
RUN apk add --update ttf-dejavu fontconfig && rm -rf /var/cache/apk/*

java启动命令

CMD 或者 ENTRYPOINT 执行 . 可以直接通过 java -jar ,或者通过 sh -c 来执行

less 复制代码
CMD ["java", "-jar", "-Xms256m", "app.jar"]
ENTRYPOINT ["java","-jar","app.jar"]

// "sh", "-c" : 可通过exec模式执行shell  => 获得环境变量
ENTRYPOINT ["sh", "-c", "java -Xms512M -Xmx512M -D -jar app.jar"]

Dockfile的模版案例

基础模板

提供一个dockfile的编写的参考案例如下所示

bash 复制代码
FROM openjdk:8-jdk-alpine

# 设置时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

WORKDIR /app/

COPY target/app.jar /app/app.jar

CMD ["java", "-jar", "-Xms512m", "app.jar"]

调整项目的进程为1的问题

csharp 复制代码
# 运行tini
RUN apk add --no-cache tini

# 运行jar包
ENTRYPOINT ["tini", "java", "-jar", "/tutorial.jar", "&"]

指定arg参数 (构建用)

对于dockfile文件中有些内容为占位符内容,通过构建build命令带参数传递进去。

bash 复制代码
# dockerfile 中
ARG JAR_FILE
COPY ${JAR_FILE} app.jar

构建的时候用到的变量 docker build --build-arg JAR_FILE="$javaFile" ...

指定ENV环境变量(运行用)

通过dockfile中指定环境变量,可以通过docker启动命令能直接去修改替换掉它,不加就是默认dockfile中的值

bash 复制代码
# dockerfile 中
ENV JAVA_OPTS="xxxx"
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS ..."]

启动命令 docker run -e "JAVA_OPTS=yyyy" ...

相关推荐
wuyikeer39 分钟前
Spring Framework 中文官方文档
java·后端·spring
Victor35644 分钟前
MongoDB(61)如何避免大文档带来的性能问题?
后端
Victor3561 小时前
MongoDB(62)如何避免锁定问题?
后端
wuyikeer1 小时前
Spring BOOT 启动参数
java·spring boot·后端
子木HAPPY阳VIP2 小时前
Ubuntu 22.04 VMware 设置固定IP配置
人工智能·后端·目标检测·机器学习·目标跟踪
人间打气筒(Ada)2 小时前
如何基于 Go-kit 开发 Web 应用:从接口层到业务层再到数据层
开发语言·后端·golang
开心就好20252 小时前
使用Wireshark进行TCP数据包抓包分析:三次握手与四次挥手详解
后端·ios
用户4419395054873 小时前
OpenClaw服务器部署保姆级教程
后端
zdl6863 小时前
springboot集成onlyoffice(部署+开发)
java·spring boot·后端
Soofjan3 小时前
sync.Mutex讲解
后端