Docker安装及命令

  • Post author:
  • Post category:其他

安装方法

CentOS7

CentOS7以后,内核版本至少3.10才可以成功安装Docker

# 更新软件包
$ sudo yum update

#安装一些安装用的工具
$ sudo yum install -y yum-utils \
    device-mapper-persistent-data \
    lvm2
    
# 添加Docker稳定版本的yum软件源
$ sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安装Docker
$ sudo yum install -y docker-ce

# 启动Docker
$ sudo systemctl start docker

平常因为开关机导致docker服务关闭的话可以使用下面这条指令来启动Docker

$ service docker start

进行配置

指定访问docker在中国的仓库

因为默认的仓库在国外,因为某些原因访问速度缓慢,所以需要换上国内的镜像

  1. 进入/etc/docker
  2. 修改daemon.json,没有的话新建一个
  3. 修改或新增以下内容,保存退出
    {
      "registry-mirrors": ["https://registry.docker-cn.com"]
    }
    

    国内还有其他加速节点,可以加入上上一个文件地址数组中。如果镜像不能用了,自己百度一下新的能用的镜像替换一下就可以啦。

    https://registry.docker-cn.com
    
    http://hub-mirror.c.163.com
    
    https://3laho3y3.mirror.aliyuncs.com
    
    http://f1361db2.m.daocloud.io
    
    https://mirror.ccs.tencentyun.com
    
  4. 重启docker服务
    $ service docker restart
    

Docker有两个重要的概念,镜像和容器
可以看一下这篇文章,写的非常好,可以帮助理解接下来的命令

镜像操作

获取镜像

$ docker [image] pull NAME [ :TAG]

[image]可加不加,直接输入docker pull xxx:xxx也是可以的

Name是目标镜像的名字

[:TAG]代表镜像的版本号,如果不显示的指定版本,默认拉取latest镜像,是最新的,一般也是不稳定的
支持的选项

  • -a 获取仓库中的所有镜像
  • –disable-content-trust 取消镜像内容校验,默认为真

查看镜像信息

$ docker images
或者
$ docker image ls

可以显示本地存在的镜像信息,包括镜像名,版本号,镜像ID,创建时间,文件大小等,比如

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              18.04               4c108a37151f        2 weeks ago         64.2MB
busybox             latest              e4db68de4ff2        2 weeks ago         1.22MB
redis               latest              3c41ce05add9        3 weeks ago         95MB
python              latest              34a518642c76        3 weeks ago         929MB
nginx               latest              719cd2e3ed04        3 weeks ago         109MB
mysql               5.7                 a1aa4f76fab9        3 weeks ago         373MB
jenkins/jenkins     lts                 95bf220e341a        3 weeks ago         566MB

支持的选项

  • -a 列出所有镜像文件包括临时文件
  • –digests=true 列出镜像的数字摘要值
  • -f 过滤列出的镜像
  • –format=“TEMPLATE” 控制输出格式
  • -q只显示镜像ID

用-q可以批量把这些镜像进行操作,不过一般这个命令还只是看一下镜像名或者短ID

为本地镜像添加TAG标签

$ docker tag xxx:xxx myxxx:xxx

给镜像添加一个新标签,方便以后操作这个镜像(比如,原镜像名和版本号太长了,我就给它搞一个短的镜像名和版本号)

实际上新旧标签指向同一个镜像,他们的镜像ID相同

查看镜像详细信息

$ docker [image] inspect NAME[:TAG]

信息包括制作者,适应架构,各层数字摘要等

查看镜像历史

$ docker history NAME[:TAG]

如果你看了上面那篇文章,你应该知道镜像文件是由多个层组成的,使用这个命令可以查看各个层的创建信息

过长命令被截断,使用--no-trunc显示完整信息

搜索镜像

$ docker search [option] keyword

支持的选项

  • -f 过滤输出内容 后面跟规则
    • ‘is-official=true’ 查官方的镜像
    • ‘stars=xxx’ 收藏数在xxx以上的镜像
  • –format string 格式化输出内容
  • –limit int 限制输出结果个数,默认25个
  • –no-trunc 不截断输出结果

例如查找官方提供的带nginx关键字的镜像

$ docker search -f 'is-official=true' nginx

实际上,你可以打开浏览器去docker官网仓库去搜索

删除镜像

$ docker rmi IMAGE [IMAGE...] 
或者
$ docker image rm IMAGE [IMAGE...]

选项

  • -f 强制删除镜像,即使有容器依赖它
  • -no-prune 不要清理未带标签的父镜像

后面可以跟上标签,当同一个镜像拥有多个标签的时候,docker rmi命令只是删除了该镜像多个标签中的指定 标签而巳,并不影响镜像文件; 但当镜像只剩下一个标签的时候就要小心了,此时再使用docker rmi命令会彻底删 除镜像。

也可以跟上ID,会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。

清理镜像

$ docker image prune

选项

  • -a 删除所有无用镜像,不光是临时镜像
  • -filter 知情理符合给定过滤器的镜像
  • -f 强制删除镜像,不进行提示确认

创建镜像

基于已有容器创建

$ docker [container] commit [OPTIONS] CONTAINER [REPOSITORY [:TAG]]

选项

  • -a 作者信息
  • -c –change=[] 提交的时候执行Dockerfile指令,包括CMD | IENTRYPOINT | NV | EXPOSE | LABEL | ONBUILD | USER | VOLUME | WORKDIR
  • -m 提交信息
  • -p 提交时暂停容器运行

在你在容器运行某镜像的时候,对镜像进行某些操作,导致和原有镜像有了区别,就可以使用commit命令提交镜像,在原有的基础上创建新的镜像

此时,你对新建的镜像使用history命令查看镜像历史,你就会这个镜像是在原有镜像上面又加了一层

基于本地模板导入

$ docker [image] import [OPTIONS] filel|URL| -[REPOSITORY 
[:TAG] ] 

模板下载地址

http://openvz.org/Download/templates/precreated

例如,下载了ubuntu的模板文件之后运行命令

$ cat ubuntu-18.04-x86_64-minimal.tar.gz I docker import - ubuntu:lB.04

使用Dockerfile创建镜像

Dockerfile是一个文本格式的配置文件,由一行行命令组成,只支持#开头的注释

指令说明

image

image

存出镜像

$ docker save -o [filename] [image] 导出镜像到指定文件中

选项

  • -o –output string 导出到指定文件

载入镜像

$ docker load -i [file]

选项

  • -i –input string 从指定文件导入

上传镜像

$ docker push user/[REPOSITORY 
[:TAG] ]  将本地指定镜像上传到官方仓库,第一次上传需要登录 登录信息保存在`~/.docker`目录下

容器操作

创建容器

新建一个新容器

$ docker [container] create 

支持的选项非常多

image

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iojrJH6O-1585211122610)(https://note.youdao.com/yws/public/resource/0dde7d1f128c899c4ffce2ebba14a653/xmlnote/86977E7A81E34175A45A753769DA9369/9944)]

image

image

启动容器

$ docker [container] start

创建并启动容器

等价于先 createstart,create的选项也可以使用

$ docker [container] run

如果想要进行交互,常用的命令是

$ docker [container] -it run xxx:xx /bin/bash

选项

  • -i 让容器的标准输出保持打开
  • -t 分配一个伪终端并绑定到容器的标准输出上
  • -d 以守护态运行

image

查看日志

$ docker [container] logs

选项

  • -details 打印详细日志
  • -f 保持持续输出
  • -since string 输出从某个时间点开始的日志
  • -tail string 输出最近的若干日志
  • -t 显示时间戳信息
  • -until string 输出某个时间之前的日志

暂停容器

$ docker [container] pause CONTAINER [CONTAINER ...]

恢复的话用

$ docker [container] unpause CONTAINER [CONTAINER ...]

终止容器

$ docker [container] stop [-t | --time[=10]] [CONTAINER ... ] 

自动清除掉所有处于停止状态的容器

$ docker container prune

Docker 容器中指定的应用终结时,容器也会自动终止

重启容器

$ docker [container] restart

进入容器

容器启动时,使用-d参数会在后台运行,这时候进入容器进行操作使用

$ docker [container] attach

支持选项

  • –detach-keys[=[]] 指定退出attach模式的快键键序列,默认是CTRL-P CTRL-Q;
  • –no-stdin=true|false 是否关闭标准输入,默认打开
  • –sig-proxy=true|false 是否代理收到的系统信号给应用进程,默认为true

多个窗口同事attach到同一个容器时,所有窗口同步显示,某个阻塞,其他窗口也无法执行操作了,所以这个命令几乎不使用,而使用exec

$ docker [container] exec

选项

  • -d 在后台执行命令
  • –detach-keys=”” 指定将容器切回后台的按键
  • -e 指定环境变量列表
  • -i 打开标准输入接收用户输入命令,默认false
  • –privileged=true|false 是否给执行命令以高权限,默认false
  • -t 分配伪终端
  • -u 执行命令的用户或ID

通过指定 -it 参数来保持标准输入打开,并且分配一个伪终端。 通过exec 命令对 容器执行操作是最为推荐的方式

删除容器

$ docker [container] rm

选项

  • -f 强制,可以删除运行状态的容器
  • -l 删除容器连接,保留容器
  • -v 删除容器挂载的数据卷

导出容器

$ docker [container] export -o [fileName]

导入容器

可以从文件 URL 和仓库中导入

$ docker [container] import file|URL|- [REPOSITORY[:TAG]]

选项

  • -c 导入同时使用Dockerfile进行修改
  • -m 给修改命名

实际上,既可以使用 docker load 命令来导入镜像存储文件到本地镜像库,也可以使 用 docker [container] import 命令来导入一个容器快照到本地镜像库。 这两者的区 别在于:容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态), 而镜像存储文件将保存完整记录,体积更大。此外,从容器快照文件导人时可以重新指定标签等元数据信息

查看容器

查看容器详情

$ docker container inspect 

查看容器内进程

$ docker top

查看统计信息

$ docker stats

选项

  • -a 全部,默认仅运行
  • -format string 格式化输出信息
  • -no-stream 不持续输出
  • -no-trunc 不截断输出信息

复制文件

$ docker [container] cp 本地路径 容器名:容器路径

查看变更

$ docker [container] diff 容器名

查看端口映射

$ docker [container] port 容器名

更新配置

$ docker [container] update 容器名

image

Docker仓库

Docker Hub 公共镜像市场

官方提供的镜像仓库 https://hub.docker.com

登录

$ docker login

用户无需登录就可以用docker search查找官方仓库中的镜像,并利用docker [image] pull下载到本地

自动创建

可以与 GitHub等绑定,当代码提交之后自动更新对应镜像

第三方仓库

使用第三方仓库下载的时候,需要在镜像名称前加上第三方服务器提供的服务器具体地址

搭建本地私有仓库

直接下载仓库镜像并执行

$ docker run -d -p 5000:5000 registry:2

默认会被创建到/var/lib/registry,可以使用-v参数指定路径,5000为监听端口

$ docker run -d -p 5000 5000 -v /opt/data/registry:/var/lib/registry registry: 2 

具体步骤回头再写一篇

Docker数据管理

Docker有两种数据管理的方式

  • 数据卷: 容器内数据直接映射到本地主机环境;
  • 数据卷容器: 使用特定容器维护数据卷.

数据卷

数据卷是一个可供容器使用的特殊目录, 它将主机操作系统目录直接映射进容器

数据卷的特性:

  1. 可以在容器之间共享和重用, 容器间传递数据将变得高效与方便;
  2. 对数据卷内数据的修改会立即生效,无论是容器内操作还是本地操作;
  3. 对数据卷的更新不会影响镜像,解耦开应用和容器;
  4. 卷会一直存在,直到没有容器使用,可以安全地卸载它

创建数据卷

$ docker volume create 数据卷名

可用的选项

  • -d –driver string 指定卷驱动程序名,默认为local
  • –label 为卷设置元数据
  • -o –opt map 设置驱动程序特定选项

创建的数据卷在/var/lib/docker/volumes路径下

挂载数据卷

挂载数据卷一般是在docker run命令中使用--mount或者-v选项

最初,-v 或 –volume 标志用于独立容器,而 –mount 标志用于群集服务。但是,从 Docker 17.06 开始,也可以在独立容器上使用 –mount。一般来说,–mount 更明确和详细。最大的不同在于 -v 语法将所有选项组合在一个字段中,而 –mount 语法将它们分开。建议使用 –mount语法。

使用–mount(推荐)

$ docker run --mount,type=xxx,source=xxx,destination=xxx,readonly,bind-propagation=xxx
  • type为数据卷类型,有三种类型的数据卷
    • volume 普通数据卷,在主机/var/lib/docker/volumes路径下创建一个新目录,Docker会管理该目录内容,将容器目录下的数据同步到该目录
    • bind 绑定数据卷,主机上的文件或目录被挂载到容器中,覆盖容器相关目录内容;依赖宿主机特定的目录结构,DockerFile不能使用这种方式
    • tmpfs 临时数据卷,只存在于内存中
  • source 宿主机位置 也可以替换为 src,匿名卷忽略这个参数;如果目录不存在,会报错
    • type是volume时填写已创建好数据卷的名字
    • type是bind时填写绑定文件夹的绝对路径
  • destination 容器内位置 必须是容器内绝对路径
  • readonly为只读,容器只有数据卷挂载目录的只读权限
  • bind-propagation子属性
    • shared 原始mount的次级mount会显示在重复mount中, 且重复mount的次级mount的内容也会在原始mount中显示
    • slave 与shared mount相似,只是内容单方向可见,重复mount的内容不会在原始mount中显示。
    • private 次级mount在原始mount和重复mount之间互不可见
    • rshared 与shared mount一样,只是传播范围扩展至嵌套的重复mount和原始mount
    • rslave 与slave mount一样,只是传播范围扩展至嵌套的重复mount和原始mount
    • rprivate 默认值,与private mount一样,即原始mount和重复mount之间都不会传播内容。

使用-v

$ docker run -v source:destination:option

-v的语法比较简单,通过两个冒号分隔出三个位置

  • 第一个位置是宿主机位置,如果目录不存在,会创建数据卷或者目录
    • 如果填写绝对路径,数据卷类型为bind绑定数据卷
    • 如果填写相对路径,数据卷类型为volume普通数据卷
  • 第二个位置是容器内位置,必须是绝对路径
  • 第三个位置是可选的,是一个使用逗号分隔的选项列表
    • ro 只读
    • delegated
    • cached
    • z
    • Z

关于数据卷,还有其他命令

查看数据卷

$ docker volume ls

需要注意,只会显示volume类型的数据卷

  • -f, –filter 指定过滤规则
    • ‘dangling=true’ 未经任何容器使用的卷
    • ‘driver=xxx’ 过滤卷上的驱动程序名
  • –format 使用模板规则打印
  • -q 只显示卷名

查看数据卷详细信息

$ docker volume inspect 数据卷名

删除数据卷

$ docker volume rm 数据卷名

# 清理无用数据卷
$ docker volume prune

数据卷容器

数据卷容器是一个用于多个容器之间共享更新数据的容器

创建数据卷容器

首先,创建一个数据卷容器dbdata,并在其中创建一个数据卷挂载到/dbdata

$ docker run -it -v /dbdata --name dbdata ubuntu

这个例子中使用的是匿名数据卷,将一个随机名字的数据卷挂载到容器的/dbdata目录

常用的镜像都可以生成数据卷容器

可以在其他容器中使用--volumes-from来挂载dbdata容器中的数据卷

$ docker run -it --volumes-from dbdata -name dbl ubuntu 
$ docker run -it --volumes-from dbdata -name db2 ubuntu 

这三个容器任意一方在该目录写入,其它容器都可以看到

可以多次使用--volumes-from 参数来从多个容器挂载多个数据卷,还可以从其他已 经挂载了容器卷的容器来挂载数据卷:

$ docker run -d --name db3 --volumes-from dbl training/postgres 

简单来说,就是获取其他容器上挂载的数据卷,同时挂载在自己这个容器上

利用数据卷容器来迁移数据

备份

$ docker run --name worker --volumes-from dbdata -v /dataDir:/backer busybox tar -cvf /backer/backup.tar /dbdata 

这句命令的意思是,创建一个镜像,获取dbdata的数据卷,挂载到当前容器同名目录(dbdata挂载在/dbdata,所以我们的容器中也挂载在/dbdata),然后新建一个bind类型数据卷,挂载宿主机/dataDir到容器内部的/backer

启动容器后执行命令tar -cvf /backer/backup.tar /dbdata 将dbdata的数据卷内数据打包,放在新建数据卷内

这样,我们宿主机的/dataDir就可以获取dbdata数据卷内的打包数据backup.tar

使用busybox的原因是,这个容器的使命就是运行打包这条命令,运行之后容器就执行完毕,所以没必要使用拥有完善功能的镜像,busybox就几个MB却包含了经常使用的命令,非常适合这种场景

恢复

首先我们再创建一个和dbdata1相同的数据卷容器,命名为dbdata2

$ docker run -it -v /dbdata --name dbdata2 ubuntu

下面我们将上一步备份的数据,恢复到数据卷容器中

$ docker run --name worker2 --volumes-from dbdata2 -v /dataDir:/backer busybox tar -xvf /backer/backup.tar

和备份的思路相同,获取dbdata2的数据卷,挂载在容器/dbdata;然后主机含有tar文件的dataDir挂载到容器/backer

因为上一步是用绝对路径压缩的,而我们当前容器目录结构和备份时容器目录结构是相同的,所以不用指定解压目录.

这样就恢复完成了

端口映射与容器互联

从外部访问容器应用

在启动容器的时候,如果不指定对应参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。

可以在启动容器的时候使用-P ;这样,Docker会随机映射一个49000~49900的端口到内部容器开放的网络端口;
不同的容器开放的网络端口也不同,比如redis会将随机端口映射到6379,而mysql会映射到3306

小写-p可以指定端口进行映射,并且,在一个指定端口上只能绑定一个容器,支持以下格式

  • IP:端口号:容器端口号
  • IP::容器端口号
  • 宿主机端口号:容器端口号

可以使用docker ps -l查看容器总体映射情况

可以使用docker port 容器名 [容器端口]来查看指定容器(或它的某个端口)的映射情况

映射所有接口地址可以在-p后面加上 5000:5000 将本地的5000端口映射到容器的5000端口. 此时会默认绑定本地所有接口上的所有地址

绑定多个端口的话需要使用多次-p

便捷访问

自定义容器命名

run的参数--name,给容器进行命名
可以使用命令来查看容器名字

$ docker [container] inspect

容器互联

接收容器连接源容器可以使用run--link参数让容器之间安全地交互

  • –link参数的格式是 name:alias ,即名字:别名

如果你进入接收容器中使用查看etc/hosts的文件,你会发现它自动将自己的id映射向自己的ip,然后将源容器的容器名映射向源容器的ip


版权声明:本文为cuixiaoming1994原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。