Docker 是一款针对程序开发人员和系统管理员来开发、部署、运行应用的一款虚拟化平台。它可以让你像使用集装箱一样快速的组合成应用,并且可以像运输标准集装箱一样
Vagrant 是另一款虚拟化工具,与 Docker 的区别参见这里 。
1. 安装篇 1.1. 系统要求
可通过命令 uname -a 查看系统基本信息
❗️要求:x64 位、内核版本 >= 3.10
推荐:
Ubuntu 16.04 Xenial +
Debian 8 Jessie +
CentOS7 +
提示:如果你要安装 Docker 的操作系统是图形界面,macOS、Windows、Linux 都有对应的桌面客户端 GUI 程序,各自下载地址如下:
说明:Docker Desktop 包含了 Docker 的所有东西,安装了这个就不需要看后续安装步骤了。后续的安装说明,适用于非图形界面的服务器系统 。
1.2. 一键安装脚本 此脚本适用于 Ubuntu、Debian、CentOS 系统,其中:官方版在某些情况下可能安装比较慢,阿里云的脚本在 CentOS7.4 下多次尝试都失败,所以推荐 DaoCloud 版。
1 2 3 4 5 6 7 8 9 10 ➜ curl -sSL https://get.docker.com/ | sh ➜ curl -sSL https://get.daocloud.io/docker | sh ➜ curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh 或 ➜ wget -qO- http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh
检查是否安装成功
1 2 ➜ docker --version Docker version 18.02.0-ce, build fc4de44
启动 Docker,并加入自启动
1 2 3 ➜ systemctl start docker ➜ systemctl enable docker Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
提示:
安装成功之后,如果想让普通用户拥有 docker 的所有权限,需执行 sudo usermod -aG docker your-user
将普通用户加入到 docker 组,否则需要使用 sudo docker commands
的形式执行所有 docker 命令。
加入 docker 组后,需重启系统才能生效。
1.3. 手动安装官方参考文档
2. 基础入门篇 2.1. 镜像 2.1.1. 介绍 Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
Docker 镜像是怎么实现增量的修改和维护的? 每个镜像都由很多层次构成,Docker 使用 Union FS 将这些不同的层结合到一个镜像中去。
通常 Union FS 有两个用途:
实现不借助 LVM、RAID 将多个 disk 挂到同一个目录下;
将一个只读的分支和一个可写的分支联合在一起,Live CD 正是基于此方法可以允许在镜像不变的基础上允许用户在其上进行一些写操作。
Docker 在 AUFS 上构建的容器也是利用了类似的原理。
2.1.2. 镜像加速器 由于国内访问 Docker Hub 有时会遇到困难,所以需要配置镜像加速器,推荐如下两个,需登录后获取自己的镜像加速地址。
2.1.3. 常用操作命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 $ docker search ubuntu:16.04 $ docker pull [选项] [Docker Registry地址]<仓库名>:<标签> $ docker images $ docker rmi [选项] <镜像1> [<镜像2> ...] $ docker rmi $(docker images -q -f dangling=true ) $ docker rmi $(docker images -q redis) $ sudo docker tag <镜像ID> <标签名> $ docker save -o 导出镜像名.tar.gz <镜像ID 或 镜像名:tag> $ docker load < 导出镜像名.tar.gz 或 $ docker load --input 导出镜像名.tar.gz
2.2. 容器 2.2.1. 介绍 镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。
容器可以被创建、启动、停止、删除、暂停等。
容器的实质是进程 ,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间 。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。也因为这种隔离的特性,很多人初学 Docker 时常常会把容器和虚拟机搞混。
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化 。所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
2.2.2. 常用操作命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 $ docker run ubuntu:16.04 /bin/echo 'hello world' hello world $ docker run -it ubuntu:16.04 /bin/bash root@0eb917598209:/ exit $ $ docker run -d ubuntu:16.04 /bin $ docker ps $ docker ps -a $ docker ps -a --format "table {{.ID}}\t{{.Names}}\t{{.Ports}}\t{{.Status}}" $ docker attach <容器id > $ docker exec -it $CONTAINER_ID /bin/bash $ docker stop $CONTAINER_ID $ docker start $CONTAINER_ID $ docker logs $CONTAINER_ID $ docker logs -f --tail =100 $CONTAINER_ID $ docker ps -a | grep $CONTAINER_NAME $ find /var/lib/docker/containers/ -name *-json.log | grep 959a80270bbc $ cat /dev/null > /absolute/path/to/959a80270bbc.log $ docker inspect $CONTAINER_ID $ docker rm $CONTAINER_ID -1 $CONTAINER_ID -2 $CONTAINER_ID -3 ... $ docker rm $(docker ps -a -q) $ docker export <容器ID> > <导出文件名>.tar $ cat <导出文件名>.tar | docker import - <导入之后的镜像名:标签> $ docker cp [OPTIONS] $CONTAINER_ID :容器中的文件路径 本地目标路径 $ docker cp [OPTIONS] 本地文件路径 $CONTAINER_ID :容器中的目标路径
2.3. Docker 常用命令图解