转载

Docker常用操作收集整理

记录下Docker的常用命令和知识,没有安装Docker的请参考文档:Docker安装及基础配置

常用命令

  • docker search 镜像名称:从镜像仓库搜索镜像
  • docker pull 镜像:版本 : 下载指定版本镜像,不指定版本下载最新的
  • docker images:查看docker镜像
  • docker run -d -p port:vm_port --name test container_id:后台运行启动镜像(运行的为容器)
  • docker run -d -p port:vm_port -v /dir:/vm_dir --name test container_id:后台运行启动镜像(运行的为容器)
  • docker exec -it container /bin/bash :连接到容器内部(此操作可视为连接到安装应用的linux)
  • docker ps :查看运行的容器
  • docker ps -a :查看所有容器(启动、停用)(常用)
  • docker inspect CONTAINER_ID:进行查看docker相关信息
    • docker inspect --format "{{.Mounts}}" CONTAINER_ID:查看指定字段信息(--format 根据模板来查看信息,我们这里就查看Mounts的信息)
  • docker start/restart/stop :对容器的启停操作
  • docker rm container:删除容器
  • docker rmi container:删除镜像

基础命令:

attach 进入到正在运行的容器 
build 由Dockerfile构建镜像 
commit 由容器的改变创建一个新的镜像 
cp 在容器中复制文件或文件夹到本地文件或文件夹中. 
logs 获取容器日志 
network 管理Docker网络 
node 管理Docker集群节点 
pause 暂停一个或多个容器内的所有进程 
port 列表端口映射或用于容器的特定的映射 
ps 列出容器 
pull 从镜像仓库中拉出镜像 
push 上传镜像 
rename 重命名镜像 
restart 重启一个容器 (划重点)
rm  删除容器 
rmi 删除镜像 
run 在容器中运行命令 
search 在Docker Hub中查找镜像 
service 管理Docker服务 
start 启动停止的容器 
stats 显示容器的实时流资源使用统计信息 
stop 停止正在运行的容器 
swarm 管理Docker集群 
tag 将镜像标记到存储库中 
top 显示容器的正在运行的进程 
volume 管理Docker卷

查看日志

  • 命令格式:docker logs [OPTIONS] CONTAINER
    • OPTIONS:
      • --details 显示更多的信息
      • -f, --follow 跟踪实时日志
      • --since string 显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
      • --tail string 从日志末尾显示多少行日志, 默认是all
      • -t, --timestamps 显示时间戳
      • --until string 显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)
    • 跟随查看从某段时间开始的最新500行:docker logs -f -t --since 2020-06-08T03:00:10.727940267Z --tail=500 CONTAINER_ID
    • 关键字查询:docker logs -f container_name| grep "2018-04-27" (该查询形式无效)
    • 关键字查询:docker logs -t --since="2020-09-15" container 2>&1| grep 'DealType on'
    • 时间段查询:docker logs -t --since 2020-04-29T03:00:10.727940267Z --until 2020-04-30T02:33:45.125902492Z 739e99

镜像打包

除了在官方网站上下载docker镜像外还可以打包镜像,自定义Dockerfile:

FROM frolvlad/alpine-oraclejdk8
VOLUME /usr/test
ADD test.jar app.jar
EXPOSE 8001
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

常用参数

  • FROM:Docker是基于镜像的部署,我们基于Docker官方和开发者维护的Docker镜像能做出符合自己需求的镜像。此处的FROM意思为我们即将要创建的镜像的基础镜像的名字,这个名字可以是我们本地已有的镜像,也可以是Docker Hub上的镜像,如果是Docker Hub上的镜像,此时docker daemon会为我们自动下载该镜像。还有一个要注意的点,如果是本地镜像要加上版本(镜像名:版本号),否则默认版本号为latest
  • VOLUME:Docker的运行相当于是操作系统的一个进程,但是该进程又与普通进程有些许不同,因为该进程内部维护着的是我们的一个微服务的完整结构,而往往项目中需要运行的微服务都有记录日志或者其他写出文件的功能。设想一下这样的情况:我们的微服务现在正在运行,但是访问量突然增大,开发人员又没有关注到这一点,没有进行水平扩展,这时候很有可能这个微服务就down了,而这个微服务一旦down了之后,出现的情况就是整个容器的status就变成了Exited,而此时如果将容器删除,容器中的所有数据卷会跟随容器一起删除,因为这些数据卷是临时的。此处的映射路径为/usr/test。这是我们自定义的映射路径,后续要演示记录日志的功能。当然也可以指定/tmp 其效果都是在主机的/var/lib/docker/volumes目录下创建一个临时文件,并链接到容器的链接路径。而为什么链接到容器的/tmp目录呢?因为 Spring Boot 使用的内嵌 Tomcat 容器默认使用/tmp作为工作目录。当然此处的/tmp也可以变成你的日志记录文件夹,这样就可以在本地实时查看日志记录了。
  • ADD:将我们自身的项目admin.jar作为app.jar加入到容器中。
  • EXPORT:该命令用于声明在运行时容器提供服务的端口。注意:这只是一个声明,运行时并不会因为该声明就打开相应的端口。该指令的作用是帮助镜像使用者理解该镜像服务的守护端口;其次是当运行时使用随机映射时(即run命令的-P参数),会自动映射EXPORT的端口。
  • ENTRYPOINT:该命令制定Docker容器启动时执行的命令,可多次设置,但只有最后一条会生效。["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]这条命令中可能部分读者会对 -Djava.security.egd=file:/dev/./urandom 这条命令有疑惑,这是因为linux中和windows中取随机数时的参考策略不同,linux默认的随机数会被取完,导致返回-1.而制定/dev/./urandom这个取随机数的策略时,当随机数取完之后会返回伪随机数,不至于影响业务。开始打包:docker build -t test/test8001:test .
  • -t 表示打包成功后的镜像tag 不要忘了最后一个点。.表示Dockerfile文件和jar包在同一个路径,如果不在需要写出Dockerfile的绝对路径。

容器运行后,在目录/var/lib/docker/volumes会存在容器的唯一id,也可以通过命令:docker inspect CONTAINER_ID进行查看docker相关信息,也可以通过docker inspect --format "{{.Mounts}}" CONTAINER_ID查看自定字段信息,如果配置挂载文件,在/var/lib/docker/volumes/CONTAINER_ID/_data这里面应该会有我们需要的挂载文件,容器停止挂载文件并不会消失。

参数使用

FROM

指定基础镜像,所有构建的镜像都必须有一个基础镜像,且 FROM 命令必须是 Dockerfile 的第一个命令

  • FROM <image> [AS <name>] 指定从一个镜像构建起一个新的镜像名字
  • FROM <image>[:<tag>] [AS <name>] 指定镜像的版本 Tag
  • 示例:FROM mysql:5.0 AS database

MAINTAINER

镜像维护人的信息

  • MAINTAINER <name>
  • 示例:MAINTAINER Jartto Jartto@qq.com

RUN

构建镜像时要执行的命令

  • RUN <command>
  • 示例:RUN ["executable", "param1", "param2"]

ADD

将本地的文件添加复制到容器中去,压缩包会解压,可以访问网络上的文件,会自动下载

  • ADD <src> <dest>
  • 示例:ADD *.js /app 添加 js 文件到容器中的 app 目录下

COPY

功能和 ADD 一样,只是复制,不会解压或者下载文件

CMD

启动容器后执行的命令,和 RUN 不一样,RUN 是在构建镜像是要运行的命令

  • 当使用 docker run 运行容器的时候,这个可以在命令行被覆盖
  • 示例:CMD ["executable", "param1", "param2"]

ENTRYPOINT

也是执行命令,和 CMD 一样,只是这个命令不会被命令行覆盖

  • ENTRYPOINT ["executable", "param1", "param2"]
  • 示例:ENTRYPOINT ["donnet", "myapp.dll"]

LABEL

为镜像添加元数据,key-value 形式

    • LABEL <key>=<value> <key>=<value> ...
    • 示例:LABEL version="1.0" description="这是一个web应用"

ENV

设置环境变量,有些容器运行时会需要某些环境变量

    • ENV <key> <value> 一次设置一个环境变量
    • ENV <key>=<value> <key>=<value> <key>=<value> 设置多个环境变量
    • 示例:ENV JAVA_HOME /usr/java1.8/

EXPOSE

暴露对外的端口(容器内部程序的端口,虽然会和宿主机的一样,但是其实是两个端口)

    • EXPOSE <port>
    • 示例:EXPOSE 80
    • 容器运行时,需要用 -p 映射外部端口才能访问到容器内的端口

VOLUME

指定数据持久化的目录,官方语言叫做挂载

    • VOLUME /var/log 指定容器中需要被挂载的目录,会把这个目录映射到宿主机的一个随机目录上,实现数据的持久化和同步。
    • VOLUME ["/var/log","/var/test".....] 指定容器中多个需要被挂载的目录,会把这些目录映射到宿主机的多个随机目录上,实现数据的持久化和同步
    • VOLUME /var/data var/log 指定容器中的 var/log 目录挂载到宿主机上的 /var/data 目录,这种形式可以手动指定宿主机上的目录

WORKDIR

设置工作目录,设置之后 ,RUN、CMD、COPY、ADD 的工作目录都会同步变更

    • WORKDIR <path>
    • 示例:WORKDIR /app/test

USER

指定运行命令时所使用的用户,为了安全和权限起见,根据要执行的命令选择不同用户

    • USER <user>:[<group>]
    • 示例:USER test

ARG

设置构建镜像是要传递的参数

    • ARG <name>[=<value>]
    • ARG name=sss

目录结构

基础参考:https://blog.csdn.net/qq_30770095/article/details/79648665
拓展参考:https://blog.csdn.net/w405722907/article/details/80943467

正文到此结束