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
配置镜像加速器
- 创建或修改
/etc/docker/daemon.json
文件,并写入以下内容:
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com"
]
}
- 依次执行以下命令,重新启动 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 是采用的存储驱动目录下面,如aufs
或devicemapper
。也可以在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 会报错。