Hazx小屋 Hazx小屋

Docker 容器的一些命令

in 服务器相关 阅读: 1747 文章转载请注明来源!

  最近由于工作需要,学习了一下Docker。Docker可以在一个系统下独立多个子系统环境、共享系统资源、隔离运行多套实例。有点类似虚拟机,但它并不是虚拟化。在Linux宿主机环境下,子系统也只能是Linux系的发行版本(例如Ubuntu、CentOS等等)。
  学习使用Docker前,首先需要明白和区分镜像容器镜像是死的,就好比是系统安装盘;容器是从镜像建立、运行起来的,就好比是你已经安装好的操作系统,可以修改里面的文件,在里面安装软件之类的.. 容器可以直接导出为文件,方便部署到其他宿主机上;也可以发布为镜像,方便以后重新从镜像建立新的容器。
  Docker其实用起来很简单,看一遍命令,自己试一试很快就能掌握。
  安装Docker可以参考:《CentOS7安装Docker-CE》

一些相关命令

查找和下载镜像

从公共镜像库查找镜像

docker search 镜像名称

下载镜像

docker pull 完整的镜像名称


创建/运行/管理容器状态

从镜像创建新容器并运行

docker run 参数 镜像名 容器内运行的命令

-i 以交互模式运行容器(i与t一起使用)
-t 在新容器内指定一个伪终端或终端
-d 后台保持运行(如果不加-d,当终端退出后容器即停止)
-P (大写P)将容器内的网络端口映射到主机(随机分配端口。若需要准确监听端口请配置“小写p”)
-p xx:yy (小写p,下同)指定端口映射,外部xx到内部yy
-p 127.0.0.1:xx:yy 绑定IP(默认为TCP端口)
-p xx:yy/udp 绑定端口为UDP通信
-e XXX=abc 设置环境变量
--name 命名容器
--hostname 命名容器内部的主机名
-v /www:/xxx 将主机中当前目录下的/www挂载到容器的/xxx,也可挂载单文件直接覆盖到容器内部
--link=aaa:bbb 与aaa容器建立链接并命名为bbb(bbb相当于主机名)
镜像名 必须是完整的镜像名,可以先使用docker images查看本地已有的镜像及镜像名,执行docker run时若本地没有对应的镜像将从公共镜像站下载。
--restart 自动启动,on-failure仅容器错误时重启、unless-stopped除了手动stop时其余情况均重启、always总是启动

举例:docker run -itd -v 80:8080 -v /home:/home/host --name tomcat CentOS7 /bin/bash
解释:从镜像CentOS7创建镜像并运行/bin/bash,新容器命名为“tomcat”,在后台以交互模式运行,映射宿主机80端口到容器的8080端口,挂载宿主机/home到容器的/home/host。此时若镜像是纯净系统镜像,那么运行完还需要自己进入容器进行环境部署。

从镜像创建新容器

docker create 参数 镜像名 容器内运行的命令

用法与docker run完全相同,只是创建完容器不会直接运行。

运行/停止/重启容器

docker start/stop/restart 容器ID(或容器名)
docker start $(docker ps -a | awk '{ print $1}' | tail -n +2) 启动全部容易
docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2) 关闭全部容器
docker kill 容器ID(或容器名) 强制终止容器

在运行的Docker中执行命令

docker exec 参数 容器ID(或容器名) 命令

-d 在后台运行
-i 以交互模式运行容器(i与t一起使用)
-t 在新容器内指定一个伪终端或终端
可以利用docker exec -it 容器ID(或容器名) bash进入在后台运行的容器,然后使用exit退出终端时不会结束容器。

删除容器

docker rm 容器ID(或容器名)
docker rm $(docker ps -a | awk '{ print $1}' | tail -n +2) 删除全部容器

删除镜像

docker rmi 参数 镜像名

-f 强制删除
--no-prune 不移除过程镜像

docker rmi $(docker images | awk '{print $3}' |tail -n +2) 删除全部镜像

修改镜像名 / 设置镜像TAG

docker tag 镜像ID 镜像名:TAG

容器与主机间复制文件
从主机的xxx文件夹复制到容器的yyy文件夹:docker cp /xxx 容器名:/yyy
从容器的yyy文件夹复制到主机的xxx文件夹:docker cp 容器名:/yyy /xxx


查询相关

列出本地镜像

docker images 参数 镜像名

不带参数、镜像名可直接快速列出所有本地镜像。
-a 列出本地所有镜像
--digests 显示摘要信息
--no-trunc 显示完整镜像信息
-q 只显示镜像ID

列出本地容器

docker ps 参数

不带参数列出正在运行的容器
-l 列出最后一次创建的容器
-a 列出所有的容器(含未运行)

查看容器中的进程运行情况

docker top 容器名

查看容器端口映射情况

docker port 容器ID(或容器名)

监控容器的运行状态

docker stats 容器名

不带容器名则列出所有容器
查看容器日志

docker logs 参数 容器ID(或容器名)

-f 输出应用程序日志
-t 显示时间戳
--since 显示从某个时间开始的所有日志
--tail=N 仅列出最新N条日志

查看容器底层信息

docker inspect 容器ID

查看容器中文件结构更改

docker diff 容器ID(或容器名)

查看镜像的创建历史

docker history 参数 镜像名

--no-trunc 显示完整的提交记录
-q 仅列出提交记录ID


导入、导出、构建相关

容器导出为文件

docker export -o 文件名.tar 容器ID(或容器名)

镜像导出为文件

docker save -o 文件名.tar 镜像名

容器从文件导入

docker import 文件名.tar 容器ID(或容器名)

镜像从文件导入

docker load -i 文件名.tar

保存容器为新镜像

docker commit 参数 容器ID(或容器名) 新镜像名

-a 作者
-m 说明文字
-p 执行时暂停容器运行

从镜像构建新镜像

docker build -t 新镜像名称 Dockerfile路径

--build-arg=[] 设置镜像创建时的变量
--disable-content-trust 忽略校验
-f 指定要使用的Dockerfile路径
--force-rm 设置镜像过程中删除中间容器
--isolation 使用容器隔离技术
--label=[] 设置镜像使用的元数据
-m 设置内存最大值
--memory-swap 设置Swap的最大值为内存+swap,"-1"表示不限swap
--no-cache 创建镜像的过程不使用缓存
--pull 尝试去更新镜像的新版本
-q 安静模式,成功后只输出镜像ID
--rm 设置镜像成功后删除中间容器
--shm-size 设置/dev/shm的大小,默认值是64M
--ulimit Ulimit配置
dockerfile编写可以参考下文【编写Dockerfile】


简要补充说明

从镜像创建新容器并运行

  docker run一般推荐至少带上参数-itdit使容器可交互,d使容器能在后台保持运行。运行命令时需要注意,只要命令一执行结束,容器就停止运行了。所以,如果想使容器一直运行下去,执行的命令就得要持续下去,比方说运行tomcat就得使用catalina.sh run让它在容器内的前台不断输出日志,而不是使用startup.sh使其在容器内后台运行。或者,也可以使用/bin/bash在容器内保持运行一个终端来使容器保持运行。

进入容器执行操作

  想进入容器可以借助命令docker exec -it 容器ID(或容器名) bash在容器内新建一个终端来达到进入容器操作的目的,退出时可以输入命令exit。使用exec命令进入容器的好处是退出时不会造成容器停止。

导入导出容器镜像

  export、import是容器的导出与导入,save、load是镜像的导出与导入,两组命令不可混用。镜像导出为文件,仍然包含镜像的层级、各层信息等。容器导出为文件,仅为文件系统,会丢失层级等其他信息。

编写Dockerfile

可以使用任意编辑器编写,保存文件名为Dockerfile,没有扩展名。以下举例一篇Dockerfile。

FROM      centos:latest
MAINTAINER      Hazx "hazx#vip.qq.com"
   
COPY     * /home/
RUN      yum install -y java-1.7.0-openjdk.x86_64 unzip ;\
         unzip /home/apache-tomcat-8.5.23.zip ;\
         rm -f /home/apache-tomcat-8.5.23.zip ;\
         chmod +x /home/apache-tomcat-8.5.23/bin/catalina.sh ;\
         chmod +x /home/apache-tomcat-8.5.23/bin/startup.sh ;\
         rm -fr /home/apache-tomcat-8.5.23/webapps ;\
         mv /home/webapps /home/apache-tomcat-8.5.23/webapps

CMD      ["/home/apache-tomcat-8.5.23/bin/catalina.sh", "run"]

简单解释:
  一篇简单的Dockerfile示例,将自己的WEB程序和所需要的版本的tomcat打入镜像。使用COPY从Dockerfile文件同目录下复制所有文件()到镜像内的/home/下,然后解压tomecat、配置运行权限、配置网站程序、删除多余文件。
  当然,只是一个演示示例。你需要按你的需求来编写适合你自己所需的Dockerfile。
相关命令:
FROM 指定基础镜像,可以是官方基础镜像,也可以是自己commit或导入的镜像
MAINTAINER 新镜像作者相关信息
RUN 执行bash命令,仅在创建新镜像的时候运行
EXPOSE 指定开放端口,但仍然需要在run的时候使用-v参数手动映射
CMD 指定容器启动时默认运行的命令(run时若带命令会覆盖CMD)
ENTRYPOINT 指定容器启动时默认运行的命令(这个是绝对执行的命令,不会被run时附带的命令覆盖)
ENV 设置环境变量
ADD 或 COPY 拷贝文件(相对路径为Dockerfile同目录)
VOLUME 挂载(映射)目录
WORKDIR 工作目录(切换目录,类似于cd)

最后敲命令构建新镜像

docker build -t tomcat .

tomcat为应用名,按自己所需修改。
.为Dockerfile所在目录,如果在当前目录的话.即可。

补充说明
  RUN COPY等命令可以多次使用,但是建议尽可能只使用一次,因为每次使用都会使镜像多一层,让镜像变得更加臃肿,下一条命令执行文件删除也释放不了上一条命令占用的空间。所以需要尽量把所有的命令放在一个RUN下,结尾通过;\分隔。所有配置操作都完成以后,尽量在同一个RUN命令中执行无用文件的删除工作(例如rm -fr xxx.zip)以及无用软件包的卸载(例如yum remove make)以减小镜像的体积。
  EXPOSE命令个人感觉可有可无,因为设定的端口并不能自动开放,仍然需要在docker run的时候手动配置端口。

文章二维码

扫描二维码,在手机上阅读!

linuxdocker
最后由Hazx修改于2021-10-20 12:26
博客系统已萌萌哒运行了
© 2024 Hazx. Theme by 泽泽社长.
前篇 后篇
雷姆
拉姆