docker命令整理

Posted 耳冉鹅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker命令整理相关的知识,希望对你有一定的参考价值。

三个基本概念

  • 镜像Image
  • 容器Container
  • 仓库Repository
    即Docker的生命周期

镜像

操作系统分为内核用户空间。对于Linux而言,内核启动后会挂载root文件系统为其提供用户空间支持。
Docker镜像相当于是一个root文件系统。

分层存储

镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完便不会再发生变化,后一层的人和改变只会发生在自己这一层。
eg:删除前一层文件的操作,仅仅是在当前层标记该文件已删除。在最终容器运行时,虽然不会看到这个文件,但实际上该文件会一直跟随镜像。

容器

镜像(Image)与容器(Container)的关系,等同于实例的关系,镜像是静态的定义,容器是镜像运行时的实体。

容器可以被创建、启动、停止、删除、暂停等。

容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。

仓库

一个Docker Registry中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。

通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。

使用镜像

  • 从仓库获取镜像
  • 管理本地主机上的镜像
  • 镜像实现的基本原理

获取镜像

从 Docker 镜像仓库获取镜像的命令是 docker pull。其命令格式为:

docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

运行

有镜像后,我们能够以镜像为基础启动并运行一个容器

docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 就是运行容器的命令

OPTIONS说明:

  • -d: 后台运行容器并返回容器ID
  • -i: 以交互模式运行容器,通常与-t同时使用
  • -t: 为容器重新分配一个伪终端
  • –name:”XXX”: 为容器指定一个名称

通过exit退出容器

列出镜像

使用docker image ls 命令

使用docker system df 命令来查看镜像、容器、数据卷所占用的空间

$ docker image ls
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
redis                latest              5f515359c7f8        5 days ago          183 MB
nginx                latest              05a60462f8ba        5 days ago          181 MB
mongo                3.2                 fe9198c04d62        5 days ago          342 MB
<none>               <none>              00285df0df87        5 days ago          342 MB
ubuntu               18.04               329ed837d508        3 days ago          63.3MB
ubuntu               bionic              329ed837d508        3 days ago          63.3MB

虚悬镜像

上述的<none> 镜像即位虚悬镜像。

原因: 新旧镜像同名,旧镜像名称便被取消。 可用下述命令查看虚悬镜像:

docker image ls -f dangling=true

删除虚悬镜像命令:

docker image prune

中间层镜像

使用docker image ls -a 命令

这样会看到很多无标签的镜像,与之前的虚悬镜像不同,这些无标签的镜像很多都是中间层镜像,是其它镜像所依赖的镜像。

列出部分镜像

可以使用docker images | grep XXX 命令

删除本地镜像

可以使用docker image rm命令,格式为:

docker image rm [选项] <镜像1> [<镜像2> ...]

<镜像>可以是镜像短ID镜像长ID镜像名

用 docker image ls 命令来配合

eg : 要删除所有仓库名为redis的镜像:

docker image rm $(docker image ls -q redis)

操作容器

容器是独立运行的一个或一组应用,以及它们的运行态环境。

启动

新建启动

命令: docker run

eg: 输出一个“Hello World”,之后终止容器

docker run ubuntu:18.04 /bin/echo 'Hello world'
Hello world

eg: 启动一个bash终端,并允许用户进行交互

erranliu@ErrandeMacBook-Pro ~ % docker run -t -i ubuntu /bin/bash 
root@f919673e95ae:/#

-t选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,-i 则让容器的标准输入保持打开

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

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

启动已终止

docker container start命令,直接将一个已终止(exited)的容器启动运行

守护态运行

让Docker在后台运行而不是直接把执行命令的结果输出在当前宿主机下。

可以通过-d参数来实现

docker run ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
hello world
hello world
hello world
hello world
. . .
docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a

docker container logs 77b2dc01fe0f
hello world
hello world
hello world
. . .

终止

docker container stop 可以终止一个运行中的容器

处于终止状态的容器,可以通过docker container start命令来重新启动

docker container restart 命令会将一个运行态的容器终止,然后再重新启动它

进入容器

在使用 -d 参数时,容器启动后会进入后台。

某些时候需要进入容器进行操作,包括使用 docker attach 命令或 docker exec 命令,推荐使用 docker exec 命令,原因会在下面说明。

attach命令


$ docker run -dit ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550

$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
243c32535da7        ubuntu:latest       "/bin/bash"         18 seconds ago      Up 17 seconds                           nostalgic_hypatia

$ docker attach 243c
root@243c32535da7:/#

注意: exit后会导致容器的停止

exec命令


$ docker run -dit ubuntu
69d137adef7a8a689cbcb059e94da5489d3cddd240ff675c640c8d96e84fe1f6

$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
69d137adef7a        ubuntu:latest       "/bin/bash"         18 seconds ago      Up 17 seconds                           zealous_swirles

$ docker exec -i 69d1 bash
ls
bin
boot
dev
...

$ docker exec -it 69d1 bash
root@69d137adef7a:/#

删除

docker container rm 删除一个处于终止状态的容器

docker container prune 清除所有处于终止状态的容器

仓库

仓库(Repository)是集中存放镜像的地方。

一个容易混淆的概念是注册服务器(Registry)。实际上注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。从这方面来说,仓库可以被认为是一个具体的项目或目录。例如对于仓库地址 docker.io/ubuntu 来说,docker.io 是注册服务器地址,ubuntu 是仓库名。

docker pull 拉取仓库中镜像下载到本地

docker push 用户登录后通过该命令将镜像推送到仓库

Docker Compose

实现对Docker容器集群的快速编排

Compose 允许用户通过一个单独的docker-compose.yml 模板文件(YAML格式)来定义一组相关联的应用容器为一个项目(project)

两个重要概念:

  • 服务(service): 一个应用的容器,实际上可以包括若干运行相同镜像的容器实例
  • 项目(project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml 文件中定义

Compose 默认管理对象是项目,通过子命令对项目中的一组容器机械能便捷地生命周期管理

命令说明

up docker-compose up [options] [SERVICE...]

该命令会尝试自动完成包括构建镜像,创建服务,启动服务,并关联服务相关容器的一系列操作

down 此命令会停止up 命令所启动的容器并移除网络

Compose 模板文件

默认的模板文件名称为docker-compose.yml ,格式为YAML格式。

version: "3"

services:
  webapp:
    image: examples/web
    ports:
      - "80:80"
    volumes:
      - "/data"

读取变量

Compose 模板文件支持动态读取主机的系统环境变量和当前目录下的.env 文件中的变量

例如,下面的 Compose 文件将从运行它的环境中读取变量 $MONGO_VERSION 的值,并写入执行的指令中。

version: "3"
services:

db:
  image: "mongo:$MONGO_VERSION"

如果执行 MONGO_VERSION=3.2 docker-compose up 则会启动一个 mongo:3.2 镜像的容器;如果执行 MONGO_VERSION=2.8 docker-compose up 则会启动一个 mongo:2.8 镜像的容器。

若当前目录存在 .env 文件,执行 docker-compose 命令时将从该文件中读取变量。

在当前目录新建 .env 文件并写入以下内容。

# 支持 # 号注释
MONGO_VERSION=3.6

执行 docker-compose up 则会启动一个 mongo:3.6 镜像的容器。

以上是关于docker命令整理的主要内容,如果未能解决你的问题,请参考以下文章

docker容器时间与宿主机时间不一致问题总结

宿主机计划任务执行docker相关命令

centos7 docker宿主机配置桥接物理网络终极实战

docker 容器系统必须和宿主机一样吗

docker共享宿主机的jdk

docker从容器里面拷文件到宿主机或从宿主机拷文件到docker容器里面