docker cmd汇总

基本知识

Docker 属于轻量级的虚拟化,通过层层构建将应用添加至容器中, 解决部署的时候环境统一巨好用。

cmd

// docker
$ docker version  // 查看版本
$ docker info // 查看信息
$ sudo usermod -aG docker $USER // 用户加入 Docker 用户组
$ sudo service docker restart // 重新启动docker 服务

// image
$ docker search node // 查看可供选择的node镜像
$ docker pull node:latest  // 拉取一个node镜像(从配置的docker registry 中拉取最新)
$ docker history node:latest  // 查看镜像内的历史记录

$ docker image ls // 列出本机的所有 image 文件
$ docker image build -t koa-demo // 创建名为koa-demo的image, (-t 加image 名称)
$ docker image build -t koa-demo:0.0.1 // 创建名为koa-demo同时带标签0.0.1的 image, 默认的标签就是latest
$ docker image pull library/hello-world // 从仓库抓取 image 文件到本地
$ docker image rm [imageName] // 删除 image 文件
$ docker run -d -p 80:80 --name webserver nginx 
$ docker image tag [imageName] [username]/[repository]:[tag] // 为本地的 image 标注用户名和版本
$ docker image tag koa-demos:0.0.1 ruanyf/koa-demos:0.0.1 // 为本地的 image 标注用户名和版本
$ docker image push [username]/[repository]:[tag] // 发布 image 文件到docker registry
$ docker image ls -f dangling=true  // 找出虚悬的镜像(由于pull、build操作,导致镜像名被转移到了新下载的镜像身上,而旧的镜像上的这个名称则被取消,显示成<none>)
$ docker image prune  // 虚悬像没什么用,可用该命令删除(这个命令删除所有虚悬镜像)
$ docker image ls -a  // 显示中间层镜像(该类镜像为了加速镜像构建、重复利用资源,与之前的虚悬镜像不同,这些无标签的镜像很多都是中间层镜像,是其它镜像所依赖的镜像。不应该删除,否则会导致上层镜像因为依赖丢失而出错。只要删除那些依赖它们的镜像后,这些依赖的中间层镜像也会被连带删除)
$ docker image ls ubuntu  // 根据仓库名列出镜像
$ docker image ls ubuntu:18.04  // 列出特定镜像
$ docker image ls -f since=mongo:3.2  // 过滤出momgo:3.2 之后创建的镜像
$ docker image ls -f before=mongo:3.2  // 过滤出momgo:3.2 之前创建的镜像
$ docker image ls -f label=com.example.version=0.1  // 通过构建镜像时的label过滤
$ docker image ls --format "{{.ID}}: {{.Repository}}"  // 格式化显示结果
$ docker image ls -q  // 只列出image id
$ docker image rm $(docker image ls -q -f before=mongo:3.2)  // 删除 momgo:3.2 之前创建的镜像(-q  rm 的结合使用)
$ docker image ls --digests  // 显示镜像的摘要

$ docker build -t nginx:v3 .  //  在Dockerfile 文件所在地方执行, 通过Dockerfile 构建镜像(注意后面有个‘.’表示上下文)
$ docker build -f ../Dockerfile.php -t nginx:v3 .  // 参数指定某个文件作为 Dockerfile(一般就放在上下文目录中,不推荐这种处理)
$ docker build -t hello-world https://github.com/docker-library/hello-world.git#master:amd64/hello-world  // 从git repo 构建
        // 指定了构建所需的 Git repo,并且指定分支为 master,构建目录为 /amd64/hello-world/,然后 Docker 就会自己去 git clone 这个项目、切换到指定分支、并进入到指定目录后开始构建。
$ docker build http://server/context.tar.gz  // Docker 引擎会下载这个包,并自动解压缩,以其作为上下文,开始构建

// container
$ docker container run hello-world // 从 image 文件生成容器,并运行
$ docker container run -p 8000:3000 -it koa-demo /bin/bash // 运行容器,将容器端口3000 映射到宿主机8000,并且容器的 Shell 映射到当前的 Shell, 容器起来后执行/bin/bash
$ docker container run -it ubuntu bash // 
$ docker container start [containerID]  // 启动容器运行
$ docker container stop [containerID] // 终止容器运行
$ docker container kill [containID] // 终止容器运行
$ docker container restart [containerID]  // 将一个运行态的容器终止,然后再重新启动它
$ docker container export [containerID]  // 如果要导出本地某个容器,可以使用 docker export 命令
$ docker container import [containerID]  // 使用 docker import 从容器快照文件中再导入为镜像(可从文件夹获得,也可从url中获得)
$ cat ubuntu.tar | docker import - test/ubuntu:v1.0  // 示例,导入该容器
$ docker container ls //  列出本机正在运行的容器
$ docker container ls --all // 列出本机所有容器,包括终止运行的容器
$ docker container rm [containerID] // 删除容器
$ docker container logs [containerID] // 查看 docker 容器的输出,即容器里面 Shell 的标准输出, 如果docker run命令运行容器的时候,没有使用-it参数,就要用这个命令查看输出。
$ docker container exec -it [containerID] /bin/bash // 进入一个正在运行的 docker 容器。如果docker run命令运行容器的时候,没有使用-it参数,就要用这个命令进入容器。一旦进入了容器,就可以在容器的 Shell 执行命令了。
$ docker container cp [containID]:[/path/to/file] . // 从 Docker 容器里面,将文件拷贝到本机(当前目录)
$ docker container prune  // 可以清理掉所有处于终止状态的容器
$ docker diff webserver  // 在容器中做了操作修改之后,退出容器,, 通过diff 命令查看容器改动情况
$ docker commit --author "zxf" --message "修改了xx" webserver nginx:v2  // 将容器的存储层保存下来成为镜像,换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。
// docker commit 命令虽然可以比较直观的帮助理解镜像分层存储的概念,但是实际环境中并不会这样使用。1 会是镜像成为黑箱镜像 2 会让镜像臃肿,因为docker history 看到的其他连带的改变也进入镜像
$ docker history nginx:v2  // 查看镜像内的历史记录

// 登陆docker registry
$ docker login // 登陆 hub.docker.com 或 cloud.docker.com 

// 其他
$ docker system df  // 查看镜像、容器、数据卷所占用的空间

tips:

$ docker container run --rm -p 8000:3000 -it  --name zxftest koa-demo  --volume /data01/zxf_test/logs:/data/zxf_test/logs  /bin/bash
--rm :在容器终止运行后自动删除容器文件。(默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 --rm 可以避免浪费空间)
-p 8000:3000:容器的 3000 端口映射到本机的 8000 端口。
-it :容器的 Shell 映射到当前的 Shell,然后你在本机窗口输入的命令,就会传入容器。(-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i 则让容器的标准输入保持打开)
--name zxftest :设置容器名称 zxftest。
--restart=always :设置每次docker服务重启后容器也自动重启, 如果容器已经运行, 可以通过docker update --restart=always <CONTAINER ID> 来保证每次docker服务重启后容器也自动重启。
--volume /data01/zxf_test/scripts:/data/zxf_test/scripts:将主机 /data01/zxf_test/scripts mount 到容器中/data/zxf_test/scripts
koa-demo:0.0.1:image 文件的名字(如果有标签,还需要提供标签,默认是 latest 标签)。
/bin/bash:容器启动以后,内部第一个执行的命令。这里是启动 Bash,保证用户可以使用 Shell
-d:容器会在后台运行并不会把输出的结果 (STDOUT) 打印到宿主机上面(输出结果可以用 docker logs 查看)

利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载
  • 利用镜像创建并启动一个容器
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
  • 从地址池配置一个 ip 地址给容器
  • 执行用户指定的应用程序
  • 执行完毕后容器被终止

tips:
docker container kill命令终止容器运行,相当于向容器里面的主进程发出 SIGKILL 信号。而docker container stop命令也是用来终止容器运行,相当于向容器里面的主进程发出 SIGTERM 信号,然后过一段时间再发出 SIGKILL 信号。应用程序收到 SIGTERM信号以后,可以自行进行收尾清理工作,但也可以不理会这个信号。如果收到 SIGKILL 信号,就会强行立即终止,那些正在进行中的操作会全部丢失

Dockerfile

Dockerfile 文件。它是一个文本文件,用来配置 image。Docker 根据 该文件生成二进制的 image 文件

// 常用命令
FROM node:8.4 // 选择基础镜像 node:8.4
LABEL maintainer="zxf@xx.com"  // 拥有者
COPY package.json /usr/src/app/  // 复制上下文中package.json(源文件)文件到 /usr/src/app/(目标文件)(如果源路径为文件夹,复制的时候不是直接复制该文件夹,而是将文件夹中的内容复制到目标路径)
COPY hom?.txt /mydir/  // 可使用通配符
COPY --chown=55:mygroup files* /mydir/  // 改变文件所属信息
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /  // COPY 的格式和性质基本一致,但更强支持url获取(不推荐使用, 改RUN wget、curl 然后解压更好)
CMD ["nginx", "-g", "daemon off;"] // 指令就是用于指定默认的容器主进程的启动命令的
ENTRYPOINT [ "curl", "-s", "http://myip.ipip.net" ]  // 跟cmd 有点像, 可以用来接参数
// 示例
FROM node:8.4 // 选择基础镜像 node:8.4
LABEL maintainer="zxf@xx.com"  // 拥有者
COPY . /app // 将上下文目录中的所有文件(除了.dockerignore排除的路径),都拷贝进入 image 文件的/app目录
COPY nginx_conf /etc/nginx // 将nginx配置复制到容器中的nginx配置中
WORKDIR /app // 指定接下来的工作路径为/app
RUN npm install --registry=https://registry.npm.taobao.org // 在/app目录下,运行npm install命令安装依赖。注意,安装后所有的依赖,都将打包进入 image 文件
EXPOSE 3000  // 将容器 3000 端口暴露出来, 允许外部连接这个端口
CMD node demos/01.js  // 容器启动后自动执行node demos/01.js
// CMD ["nginx", "-g", "daemon off;"] 容器启动后自动执行启动nginx,daemon off;指令告诉Nginx留在前台
// CMD ["/usr/bin/supervisord"] 容器启动后,通过运行supervisord启动多个服务(一容器多服务不推荐)

tips:

  • RUN命令在 image 文件的构建阶段执行,执行结果都会打包进入 image 文件;CMD命令则是在容器启动后执行,一个
    Dockerfile 可以包含多个RUN命令,但是只能有一个CMD命令。

  • 指定了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash),否则它会覆盖CMD命令。

Doocker Compose

Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器。但是这个只适用于单机容器管理, 多机容器管理可使用Kubernetes(K8S)

$ docker-compose up // 启动所有服务
$ docker-compose stop // 关闭所有服务
$ docker-compose rm  // 删除容器文件

$ docker-compose ps // 列出所有运行容器
$ docker-compose logs // 查看服务日志输出
$ docker-compose port web 80 // 打印绑定的公共端口,下面命令可以输出  服务 80 端口所绑定的公共端口
$ docker-compose build // build:构建或者重新构建服务
$ docker-compose start web // start:启动指定服务已存在的容器
$ docker-compose stop web // stop:停止已运行的服务的容器
$ docker-compose rm web  // rm:删除指定服务的容器
$ docker-compose up // up:构建、启动容器
$ docker-compose kill web // kill:通过发送 SIGKILL 信号来停止指定服务的容器
//pull:下载服务镜像
$ docker-compose scale web=3 movie=3 // scale:设置指定服务运行容器的个数,以 service=num 形式指定
$ docker-compose run web bash // run:在一个服务上执行一个命令
# docker-compose.yml
mysql:
    image: mysql:5.7
    environment:
     - MYSQL_ROOT_PASSWORD=123456
     - MYSQL_DATABASE=wordpress
web:
    image: wordpress
    links:
     - mysql
    environment:
     - WORDPRESS_DB_PASSWORD=123456
    ports:
     - "127.0.0.3:8080:80"
    working_dir: /var/www/html
    volumes:
     - wordpress:/var/www/html

Kubernetes(K8S)

Kubernetes,又称为 k8s(首字母为 k、首字母与尾字母之间有 8 个字符、尾字母为 s,所以简称 k8s)或者简称为 “kube” ,是一种可自动实施 Linux 容器操作的开源平台。它可以帮助用户省去应用容器化过程的许多手动部署和扩展操作。也就是说,您可以将运行 Linux 容器的多组主机聚集在一起,由 Kubernetes 帮助您轻松高效地管理这些集群。而且,这些集群可跨公共云、私有云或混合云部署主机。因此,对于要求快速扩展的云原生应用而言(例如借助 Apache Kafka 进行的实时数据流处理),Kubernetes 是理想的托管平台
在这里插入图片描述

  • 主机(Master): 用于控制 Kubernetes 节点的计算机。所有任务分配都来自于此。
  • 节点(Node):负责执行请求和所分配任务的计算机。由 Kubernetes 主机负责对节点进行控制。

在这里插入图片描述

  • API Server:是整个系统的对外接口,供客户端和其它组件调用,相当于“营业厅”。
  • Scheduler:负责对集群内部的资源进行调度,相当于“调度室”。
  • Controller manager:负责管理控制器,相当于“大总管”。

在这里插入图片描述

  • 容器集(Pod):被部署在单个节点上的,且包含一个或多个容器的容器组。同一容器集中的所有容器共享同一个 IP 地址、IPC、主机名称及其它资源。容器集会将网络和存储从底层容器中抽象出来。这样,您就能更加轻松地在集群中移动容器。
  • Docker:创建容器的。
  • Kubelet:运行在节点上的服务,可读取容器清单(container manifest),确保指定的容器启动并运行。主要负责监视指派到它所在Node上的Pod,包括创建、修改、监控、删除等。
  • Kube-proxy:主要负责为Pod对象提供代理。
  • Fluentd:主要负责日志收集、存储与查询。
  • 复制控制器(Replication controller):用于控制应在集群某处运行的完全相同的容器集副本数量。
  • 服务(Service):将工作内容与容器集分离。Kubernetes 服务代理会自动将服务请求分发到正确的容器集——无论这个容器集会移到集群中的哪个位置,甚至可以被替换掉。
  • kubectl: Kubernetes 的命令行配置工具。

当 kubernetes 将容器集调度到一个节点上时,该节点上的 kubelet 会发送指令让 docker 启动指定的容器。kubelet 随后会不断从 docker 收集这些容器的状态,并将这些信息汇集至主机。Docker 将容器拉至该节点,并按照常规启动和停止这些容器。

示例操作

// 安装docker并验证
$ docker --version
Docker version 19.03.8, build afacb8b
$ docker-compose --version
docker-compose version 1.25.5, build 8a1c60f6
$ docker run -d -p 80:80 --name webserver nginx  // 基于nginx镜像运行一个容器,起来之后  http://localhost 可访问
// 使用docker hub 中的基础镜像运行容器
$ docker search node  // 查看node 镜像
$ docker pull node:latest  // 拉取一个镜像打本地(最新),之间设置了阿里镜像所以快
$ docker images  // 查看镜像已拉到本地
$ docker run -itd --name node-test node  // 基于镜像生成并运行容器
$ docker container ls  //  查看容器,已运行
$ docker exec -it node-test /bin/bash // 进入容器
# node -v  // 查看容器中的node 版本
// exit 命令或者使用 CTRL+D 来退出容器
$ docker ps //查看容器运行情况
$ docker logs node-test// 查看容器内的标准输出
$ docker stop node-test // 停止容器
$ docker container ls // 查看容器,已停止
$ docker container ls -all // 查看所有容器,包括已停止
$ docker container start node-test// 重新运行容器
$ docker container ls  //  查看容器,已运行
$ docker container kill node-test // 终止容器运行
$ docker container ls  //  查看容器,已停止
$ docker container rm node-test  //  查看容器,已运行
$ docker image rm node // 移除node 镜像

Tips

  • 另外一个需要注意的问题是,docker image ls 列表中的镜像体积总和并非是所有镜像实际硬盘消耗。由于 Docker 镜像是多层存储结构,并且可以继承、复用,因此不同镜像可能会因为使用相同的基础镜像,从而拥有共同的层。由于 Docker 使用 Union FS,相同的层只需要保存一份即可,因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和要小的多。
  • 注意: docker commit 命令除了学习之外,还有一些特殊的应用场合,比如被入侵后保存现场等。但是,不要使用 docker commit 定制镜像,定制镜像应该使用 Dockerfile 来完成。如果你想要定制镜像请查看下一小节。
  • Dockerfile去 build 镜像的时候,COPY 这类指令中的源文件的路径都是相对路径。这也是初学者经常会问的为什么 COPY …/package.json /app 或者 COPY /opt/xxxx /app 无法工作的原因,因为这些路径已经超出了上下文的范围,Docker 引擎无法获得这些位置的文件。如果真的需要那些文件,应该将它们复制到上下文目录中去。一般来说,应该会将 Dockerfile 置于一个空目录下,或者项目根目录下。如果该目录下没有所需文件,那么应该把所需文件复制一份过来。如果目录下有些东西确实不希望构建时传给 Docker 引擎,那么可以用 .gitignore 一样的语法写一个 .dockerignore,该文件是用于剔除不需要作为上下文传递给 Docker 引擎的。
  • 对于容器而言,其启动程序就是容器应用进程,容器就是为了主进程而存在的,主进程退出,容器就失去了存在的意义,从而退出,其它辅助进程不是它需要关心的东西。 CMD service nginx start 会被理解为 CMD [ “sh”, “-c”, “service nginx start”],因此主进程实际上是 sh。那么当 service nginx start 命令结束后,sh 也就结束了,sh 作为主进程退出了,自然就会令容器退出。正确方式是 直接执行 nginx 可执行文件,并且要求以前台形式运行:CMD [“nginx”, “-g”, “daemon off;”]

推荐文档

官方文档: https://docs.docker.com/
C语音中文网: http://c.biancheng.net/docker/ 很详细
10分钟看懂Docker和K8S:https://zhuanlan.zhihu.com/p/53260098

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值