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在后台运行的标准操作包括:
- 检查本地是否存在指定的镜像,不存在则从registry下载
- 利用镜像创建并启动一个容器
- 分配一个文件系统,并在只读的镜像层外面挂在一层可读写层
- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
- 从地址池配置一个ip地址给容器
- 执行用户指定的应用程序
- 执行完毕后容器被终止
启动已终止
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命令整理的主要内容,如果未能解决你的问题,请参考以下文章