日常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" ...

相关推荐
ss2734 分钟前
基于Springboot + vue + 爬虫实现的高考志愿智能推荐系统
spring boot·后端·高考
专注API从业者1 小时前
《Go 语言高并发爬虫开发:淘宝商品 API 实时采集与 ETL 数据处理管道》
开发语言·后端·爬虫·golang
Asthenia04121 小时前
Netty writeAndFlush与Pipeline深入分析
后端
欧先生^_^1 小时前
Scala语法基础
开发语言·后端·scala
GetcharZp2 小时前
xterm.js 终端神器到底有多强?用了才知道!
前端·后端·go
洞窝技术3 小时前
MYSQL:关于索引你想知道的
后端·mysql
MrWho不迷糊3 小时前
企业级权限系统怎么设计四 —— ABAC模型统一功能权限与数据权限
后端·微服务
落尘2983 小时前
Spring MVC——传递参数的方式
后端
ITCharge4 小时前
Docker 万字教程:从入门到掌握
后端·docker·容器
落尘2984 小时前
Bean 的作用域和生命周期
后端