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
- OPTIONS:
镜像打包
除了在官方网站上下载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