Docker 入门

2020-03-02
使用帮助,每个命令后加入--help即可加入帮助。例如:

docker image --help
docker ps --help

CentOS下安装Docker

Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker。

  • 通过 uname -r 命令查看你当前的内核版本
[root@VM_0_7_centos ~]# uname -r
3.10.0-957.5.1.el7.x86_64
  • 卸载旧版本
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
  • 使用 yum 安装依赖包
sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

鉴于国内网络问题,强烈建议使用国内源,官方源请在注释中查看。

sudo yum-config-manager \
      --add-repo \
      https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo

# 官方源
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

如果需要最新版本的 Docker CE 请使用以下命令:

sudo yum-config-manager --enable docker-ce-edge

如果需要测试版本的 Docker CE 请使用以下命令:

 sudo yum-config-manager --enable docker-ce-test
  • 安装 Docker CE
sudo yum install docker-ce
  • 也可以使用 yum 源直接安装 Docker
sudo yum -y install docker 
  • 启动 Docker 后台服务
[root@VM_0_7_centos ~]# service docker start

Ubuntu 下安装Docker

  • 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc
  • 卸载 docker 引擎
sudo apt-get purge docker-ce docker-ce-cli containerd.io

sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
  • 使用脚本安装
 curl -fsSL https://get.docker.com -o get-docker.sh
 sudo sh get-docker.sh

建立 Docker 用户组

默认情况下, docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。

建立 docker 组:

sudo groupadd docker

将当前用户加入 docker 组:

sudo usermod -aG docker $USER

配置镜像加速器

腾讯云镜像加速器

  1. 创建或修改 /etc/docker/daemon.json 文件,并写入以下内容:
{
   "registry-mirrors": [
       "https://mirror.ccs.tencentyun.com"
  ]
}
  1. 依次执行以下命令,重新启动 Docker 服务。
sudo systemctl daemon-reload

sudo systemctl restart docker
# Ubuntu16.04 请执行 sudo systemctl restart dockerd 命令

检查加速器是否生效:
执行 docker info 命令,返回结果中包含以下内容,则说明配置成功。

Registry Mirrors:
 https://mirror.ccs.tencentyun.com

Docker的生命周期管理常用命令:

docker image ls 列表中的镜像体积总和并非是所有镜像实际硬盘消耗。由于 Docker 镜像是多层存储结构,并且可以继承、复用,因此不同镜像可能会因为使用相同的基础镜像,从而拥有共同的层。由于 Docker 使用 Union FS,相同的层只需要保存一份即可,因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和要小的多。

  • 查看镜像、容器、数据卷占用实际存储空间
docker system df
  • 启动Docker
systemctl start docker
  • 停止Docker
systemctl stop docker
  • 重启Docker
systemctl restart docker
  • 查看Docker服务状态
systemctl status docker
  • 设置开机启动Docker服务
systemctl enable docker

镜像

镜像是构建 Docker 世界的基石。用户基于镜像来运行自己的容器。镜像也是 Docker 声明周期中的“构建”部分。镜像是基于联合(Union)文件系统的一种层式的结构,由一系列指令一步一步构建出来。

本地镜像都保存在 Docker 宿主机的 var/lib/docker 目录下。每个镜像都保存在 Docker 是采用的存储驱动目录下面,如 aufsdevicemapper 。也可以在 var/lib/docker/containers目录下面看到所有的容器。

  • 查看本地所有镜像
docker images
docker images -q # 查看本地所有镜像id
  • 查看部分镜像
docker images 镜像名
  • 搜索镜像(也可在docker hub上查找)
docker search 镜像名称
  • 拉取镜像
docker pull 镜像名称[:版本]
  • 删除本地镜像
docker rmi 镜像 id 或名称
docker rmi `docker images -a -q` # 删除本地所有镜像
  • 虚悬镜像(dangling)
    无仓库名和标签,均为<None>
  • 显示虚悬镜像
docker images -f dangling=true
  • 删除虚悬镜像
docker image prune
  • 查看镜像内的历史记录
    可以看到镜像是如何构建出来的,及 docker build 命令的执行输出过程。
docker history 镜像名
  • 中间层镜像
    docker images只会显示顶层镜像;docker images -a显示包括中间层镜像在内的所有镜像,这样会看到许多无标签镜像,这些不是虚悬镜像,而是中间层镜像,是其他镜像的依赖,不应该删除,否则会出错。

容器

镜像是多层存储,每一层是在前一层的基础上进行的修改;而容器同样也是多层存储,是在以镜像为基础层,在其基础上加一层作为容器运行时的存储层。容器是基于镜像启动起来的,容器中可以运行一个或多个进程。可以认为,镜像是 Docker 声明周期中的构建或打包阶段,而容器则是启动或执行阶段。

  • 查看容器
docker ps # 查看正在运行的容器
docker ps -a # 查看所有容器
docker ps -qa # 查看所有容器 ID
  • 创建并启动容器
docker run 参数

docker run --name webserver -d -p 80:80 nginx

这条命令会用 nginx 镜像启动一个容器,命名为 webserver ,并且映射了 80 端口,这样我们可以用浏览器去访问这个 nginx 服务器。

参数说明
-i 保持容器标准输入打开(interactive),通常与 -t 同时使用
-t 为容器重新分配一个伪输入终端(pseudo-tty)
-d 以守护(后台)模式运行容器;需要使用docker exec命令进入容器,退出后,容器不会关闭
--name 为创建的容器命名
--rm 容器退出后立即将其删除
  • 查看容器改动情况
docker diff 容器名
  • 将容器保存为镜像
    当我们运行一个容器的时候(如果不使用卷的话),我们做的任何文件修改都会被记录于容器存储层里。而 Docker 提供了一个 docker commit 命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化。

docker commit 的语法格式为:

docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]

docker commit \
      --author "Tao Wang <twang2218@gmail.com>" \
      --message "修改了默认网页" \
      webserver \
      nginx:v2

其中 --author 是指定修改的作者,而 --message 则是记录本次修改的内容。这点和 git 版本控制相似,不过这里这些信息可以省略留空。

  • 进入容器
docker attach 容器名称 # 退出容器后,容器会关闭
docker exec 容器名称 # 退出容器后,容器不会关闭
  • 停止容器
docker stop 容器名称
  • 启动容器
docker start 容器名称
  • 重新启动容器
docker restart 容器名称
  • 暂停容器
docker pause 容器名称
  • 继续已经暂停的容器
docker unpause 容器名称
  • 删除容器(若容器为运行状态则无法删除,需先停止容器;但是可加入-f参数强制删除容器)
docker rm 容器名称
 # 删除所有容器
docker rm $(docker ps -qa) # -a 会列出所有容器,-q 表示只需要返回容器的 ID
  • 查看容器信息
    docker inspect 命令会对容器进行详细的检查,然后返回其配置信息,包括名称、命令、网络配置以及很多有用的数据。
docker inspect 容器名称

除了查看容器,还可以通过浏览 /var/lib/docker 目录来深入了解Docker的工作原理。该目录存放着Docker镜像、容器以及容器的配置。所有的容器都保存在 /var/lib/docker/containers 目录下。

  • 查看容器日志
docker logs 容器名称 # 输出最后几条日志项并返回
docker logs -f 容器名称 # 监控Docker 日志
docker logs -tf 容器名称 # 监控Docker 日志并打印时间戳
  • 查看容器内部运行的进程
docker top 容器名
  • 查看一个或多个容器的统计信息(类似top命令,实时监控)
docker stats 容器名[可以有多个容器名]

我们能看到一个守护式容器的列表,以及它们的 CPU,内存,网络IO及存储 IO 的性能和指标。这对快速监控一台主机上的一组容器非常有用。

  • 自动重启容器
    如果由于某种错误而导致容器停止运行,还可以通过 --restart
    志,让Docker自动重新启动该容器。--restart 标志会检查容器的
    退出代码,并据此来决定是否要重启容器。默认的行为是Docker不会
    重启容器。
docker run --restart=always --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

在本例中,--restart 标志被设置为 always 。无论容器的退出代码是什么,Docker都会自动重启该容器。除了always ,还可以将这个标志设为 on-failure ,这样,只有当容器的退出代码为非 0 值的时候,才会自动重启。另外,on-failure 还接受一个可选的重启次数参数:

--restart=on-failure:5

这样,当容器退出代码为非0时,Docker会尝试自动重启该容器,最多重启5次。

  • 清理所有处于中止状态的容器
docker container prune
  • 导出容器
docker export 容器名

$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
7691a814370e ubuntu:14.04 "/bin/bash" 36 hours ago Exited
(0) 21 hours ago test
$ docker export 7691a814370e > ubuntu.tar

这样将导出容器快照到本地文件。

  • 导入容器快照
    可以使用 docker import 从容器快照文件中再导入为镜像。
docker import 容器名

$ cat ubuntu.tar | docker import - test/ubuntu:v1.0
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3MB

此外,也可以通过指定 URL 或者某个目录来导入,例如

$ docker import http://example.com/exampleimage.tgz example/imagerepo

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

容器和宿主的文件复制(双向)

docker cp

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
  • 把容器做成镜像(不推荐此种方式)
docker commit

数据卷

数据卷是用来持久化数据的,其生命周期独立于容器,容器删除后,不会删除数据卷,也不存在垃圾回收。

  • 创建数据卷
docker volume create 名称
  • 查看所有数据卷
docker volume ls
  • 主机中查看指定数据卷信息
docker volume inspect 名称
  • 删除数据卷
docker volume rm 名称
docker rm -v 容器名称 # 删除容器时,使用 -v 参数可以同时移除数据卷
  • 清理无主数据卷
docker volume prune
  • 配置数据卷
    创建启动容器时,使用-v参数设置数据卷,多次使用-v标记可以创建多个数据卷

使用-v时,若本地目录不存在则自动创建
使用--mount(推荐),若本地目录不存在则报错。使用--mount标记可以指定挂载一个本地主机的目录到容器中去

$ docker run -d -P \
  --name web \
  # -v /src/webapp:/opt/webapp \
  --mount type=bind,source=/src/webapp,target=/opt/webapp \
  training/webapp \
  python app.py

使用 --mount 标记可以指定挂载一个本地主机的目录到容器中去。--mount 标记也可以从主机挂载单个文件到容器中。上面的命令加载主机的 /src/webapp 目录到容器的 /opt/webapp 目录。本地目录的路径必须是绝对路径,以前使用 -v 参数时如果本地目录不存在 Docker 会自动为你创建一个文件夹,现在使用 --mount 参数时如果本地目录不存在,Docker 会报错。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容

  • 《Docker从入门到实践》阅读笔记 原书地址: https://yeasy.gitbooks.io/docker...
    GuoYuebo阅读 11,359评论 1 39
  • 不管是作为开发还是架构,都有必要了解容器技术,它不仅可以帮助我们了解程序运行时的情况,也能在平时给我们软件安装方面...
    佐蓝Gogoing阅读 552评论 0 0
  • Docker入门 Docker命令官方示例 [toc] 1. Docker架构 1.1 Docker镜像与Dock...
    CaiGuangyin阅读 1,835评论 2 6
  • 《Docker技术入门与实践》笔记 2 核心概念 Docker的三个核心概念分别为:镜像、容器和仓库。 2.1 镜...
    涵仔睡觉阅读 384评论 0 0
  • 基本概念 镜像Docker 镜像就是一个只读的模板,镜像可以用来创建 Docker 容器 容器容器是从镜像创建的运...
    巨子联盟阅读 7,550评论 0 3