目录
1. 什么是docker
首先我们可以好好的看看docker的那个可能的图标,你想象到了什么? ...
docker是一个开源的应用容器引擎,有Docker公司(前dotCloud公司)开发,基于Apache2.0开源授权协议发行。该引擎提供了一个轻量、快递的环境,能够运行开发者的程序,并方便高效的将程序从开发者的电脑部署到测试环境,然后再部署到生产环境。
docker的优点:
- 启动速度快(秒级),由于去除了管理程序的开销,docker容器拥有很高的性能,同一台宿主机可以运行更多的容器,有效的利用了资源
- 能够为开发,测试和部署提供一致的环境,避免了在开发或测试时一切正常,但在生成环境中却不能运行的问题。
- 鼓励面向服务架构,Docker 推荐单个容器只运行一个应 用程序或进程,这样就形成了一个分布式的应用程序模型
docker用途
- 提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境
- 提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容
- 组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构
docker与虚拟机的区别:
- VM(VMware)在宿主机器、宿主机器操作系统的基础上创建虚拟层、虚拟化的操作系统、虚拟化的仓库,然后再安装应用
- Docker在宿主机的操作系统上创建Docker引擎,直接通过宿主机的操作系统调用硬件资源,而不是虚拟化操作系统和硬件资源,所以占用资源更少,性能更高。
- 对比图
特性 | docker | vm |
启动速度 | 秒级 | 分钟级 |
硬盘使用 | MB | GB |
性能 | 接近原生 | 弱与原生 |
系统支持数量 | 单机可支持数百甚至数千 | 几十个 |
2. docker的核心组件
1)Docker客户端和服务器,也称为Docker引擎
2)Docker镜像
3)Registry
4)Docker容器
docker架构图:
docker引擎
docker是客户端/服务器架构的程序,docker客户端只需向docker服务器或守护进程发送请求,守护进程或服务器完成后返回结果,docker的守护进程有时也称作为docker引擎。用户可以在同一台宿主机上运行Dokcer守护进程和客户端,也可以从本地的docker客户端连接到另一台宿主机上的docker引擎。示意图:
- docker镜像
镜像是docker容器的基石,用户基于镜像来运行容器的,镜像在docker生命周期中属于“构建阶段”,镜像基于联合文件系统的一种层式结构,由一系列的命令构建出来。可以将镜像理解为容器的“源代码”。镜像体积小,便于分享,存储,更新。
- Registry
Registry即仓库,Registry分为公共和私有的两种。docker公司运营的公共Registry是docker hub。用户可以自己注册账号,在其中保存自己的镜像。也可以搭建私有的仓库。
- 容器
镜像处在docker生命周期的“构建”阶段,容器则处在“运行”阶段,如果将镜像理解为一个“类”,则容器可以理解为这个“类”的“运行时实例”,可以被创建,启动,停止,删除。
总结起来容器就是:一个镜像格式,一系列标准操作,一个执行环境。
3. docker的安装
3.1 安装的先决条件
安装docker时需要一些基本的前提条件:
- 运行64位cpu架构的机器(x86_64, amd64),不支持32位机器
- 运行linux3.8或更高的内核(可以使用uname -a 命令查看系统内核)
- 内核必须支持一种合适的存储驱动:Device Messager,AUFS,vfs等,默认为Device Messager。
- 内核支持cgroup和命名空间
注:cgroups,其名称源自控制组群(control groups)的简写,是Linux内核的一个功能,用来限制、控制与分离一个进程组的资源(如CPU、内存、磁盘输入输出等)
3.2.1 ubuntu安装docker
1.卸载可能存在的旧版本
apt-get remove docker docker-engine docker-ce docker.io
2.更新apt包索引
apt-get update
3.安装以下包以使apt可以通过HTTPS使用存储库(repository)
apt-get install -y apt-transport-https ca-certificates curl software-properties-common
4.添加Docker官方的GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
成功后应该显示OK
5.设置stable存储库
add-apt-repository "deb [arch=amd64] Index of linux/ubuntu/ $(lsb_release -cs) stable"
6.再更新一下apt包索引
apt-get update
7.安装最新版本的Docker CE
apt-get install -y docker-ce
8.验证
8.1查看docker服务是否启动
systemctl status docker
或如下命令
service docker status
8.2若未启动,则启动docker服务
systemctl start docker 或如下命令service docker start
apt-get update && apt-get install -y docker.io
这种方式安装的优点是简单,缺点是版本较低(目前是18.09)
3.2.2 CentOS安装docker
推荐 --- 从第三步开始 安装
1)root账户登录,查看内核版本如下
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018
x86_64 x86_64 x86_64 GNU/Linux
- yum包更新到最新
[root@localhost ~]# yum update 已加载插件:fastestmirror Loading mirror speeds from cached hostfile * base: centos.ustc.edu.cn ......
注:如果不执行更新,获取的docker版本太旧
3)安装yum-util, 该包提供yum-config-manager功能
yum install -y yum-utils
4.设置docker源
yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo(中央仓库)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo(阿里仓库)
可以任选其一
5) 安装docker, yum install docker-ce-版本号
[root@localhost ~]# yum install docker-ce-18.06.3.ce
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
正在解决依赖关系
--> 正在检查事务
---> 软件包 docker-ce.x86_64.0.18.06.3.ce-3.el7 将被 安装
6)查看docker版本号,验证
[root@localhost ~]# docker version
Client:
Version: 18.06.3-ce
API version: 1.38
Go version: go1.10.3
Git commit: d7080c1
Built: Wed Feb 20 02:26:51 2019
OS/Arch: linux/amd64
Experimental: false
7)启动docker
systemctl start docker
8.设置开机启动
systemctl enable docker
3.3 配置镜像加速器
默认的情况下docker会从docker hub中查找或下载镜像,在国内会比较慢。可以使用阿里的镜像加速器来提高速度。
具体操作步骤如下:
1)获取加速器地址
首先需要有一个淘宝或支付宝的账号,登录阿里云 https://www.aliyun.com/。
点击“控制台”,进入如下界面:
点击容器镜像服务,就可以获取镜像加速器地址,操作如下图所示:
方法2 自己配置
在/etc/docker目录下创建daemon.json配置文件
vim /etc/docker/daemon.json
具体配置文件内容如下:
{
"registry-mirrors":["你的阿里云专属加速器地址"]
}
3)重新加载daemon
systemctl daemon-reload
4)重启docker
systemctl restart docker
4. 镜像常用操作
4.1 搜索镜像
docker search 镜像名称
示例:
docker search rabbitmq
4.2 镜像下载
docker pull 镜像名称:标签
如果未指定标签,则默认我latest
示例:
# 未指定标签
docker pull ubuntu
#指定标签
docker pull ubuntu:16.04
4.3 查看宿主机中的镜像
docker images
4.3 删除镜像
docker rmi 镜像id或名称
如果提示镜像被使用,需要先停止某个ID的容器,那么要先删除容器再删除镜像,如需强行删除可以使用-f参数,例如:docker rmi -f ubuntu:16.04
5. 容器常用命令
镜像在docker生命周期中的构建阶段,容器则属于运行阶段,可以将容易理解为镜像的一个运行实例。
5.1 运行容器
首先让我们来尝试启动第一个docker容器,docker run命令提供了docker容器的创建到启动的功能。使用该命令创建和启动容器也是docker的推荐做法。
#创建并启动一个ubuntu容器
sudo docker run -it ubuntu:18.04 /bin/bash
# 除了名称外我们还能使用 id
# -itd 中的d是 运行后台运行 后边test是镜像名称 我们可以通过名称对这个镜像 进行一些操作也可使用id
docker run -itd --name test b6f bash
使用该命令时,如果镜像还没有下载,则docker会首先下载该镜像,然后执行创建并启动容器。具体参数说明如下:
- -i 开启容器中的STDIN(标准输入流),能接受命令,可以理解为已交互模式启动容器
- -t 为容器分配一个tty终端,即:分配一个命令行窗口, 有了这两个参数新创建的容器才能有一个交互式shell。
- /bin/bash 参数告诉docker在容器中启动一个bash shell
- 可以通过--name 参数为容器命名
- 如果指定 -d 参数,则说明容器以守护进程形式启动
- 可以使用 docker help run查看更详细的参数说明
- 在容器中使用,“cat /etc/issue”可以查看到运行中的容器其实为ubuntu系统。
-i -t参数是我们创建一个交互式容器的最基本的参数,需说明的是所创建的容器是交互式的,而不是一个运行后台服务的容器。
运行上面的命令,docker会为我们创建一个ubuntu的容器,并自动以root身份进入容器,如下图: 下方为没有 d命运 会自动进入镜像
图中的7b8b196818d5为容器的编号。
创建容器还可以使用docker create命令,如:
docker create -it ubuntu:latest
参数与docker run命令相同,与docker run命令不同的是docker create命令创建的容器不会自动启动。
5.2 使用容器
这是一个精简但完整的ubuntu系统,例如执行以下的命令:
root@7b8b196818d5:/# hostname
7b8b196818d5
root@7b8b196818d5:/# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
但当你收入ip,或ifconfig命令时会发现,无法找到命令:
root@7b8b196818d5:/# ip a
bash: ip: command not found
root@7b8b196818d5:/# ifconfig
bash: ifconfig: command not found
root@7b8b196818d5:/# whereis ifconfig
ifconfig:
#查看环境变量
root@7b8b196818d5:/# env
.....
HOSTNAME=7b8b196818d5
PWD=/
HOME=/root
TERM=xterm
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/env
OLDPWD=/etc/apt
因为是这些命令还都没有安装,ubuntu镜像是精简版的系统,如果需要使用这些命令需要另外安装net-tools,包括vi,vim等也是需要另外安装的。
5.3 查看运行的容器
保持刚才运行的容器不要退出,另外打开一个命令终端,输入下列命令: 这个需要先退出 镜像 ctrl+d
lisen@ubuntu:~$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7b8b196818d5 ubuntu:18.04 "/bin/bash" 2 hours ago Up 2 hours cranky_lewin
docker ps命令可以查看运行中的容器信息,包括id,镜像,名称等。
注:为什么要保持刚才运行的ubuntu容器不退出?原因是上面创建的是普通的交互式容器,不是运行于后台的服务容器,如果推出则容器自动停止运行。容器退出后可以使用 docker ps -a 命令查看到,-a参数表示查看所有容器,包括已停止的。
5.4 容器的退出
退出时如果想继续运行容器:按顺序按【ctrl+p】,【ctrl+q】
如果不想继续运行:按【ctrl+d】或输入exit
如果不是运行于后台的服务容器,则在容器退出后回自动停止运行,此时通过docker ps命令查看不到容器信息,需要使用docker ps -a命令查看。
5.5 容器的启动与停止
1)停止容器
root@ubuntu:/# docker stop 7b8b
7b8b
2)启动容器
root@ubuntu:/# docker start 7b8b
7b8b
注:7b8b为容器id,容器id可以不输入完全,但需要能唯一确定一个容器。
5.6 复制文件
复制文件可以分为从容器到宿主机的复制,和从宿主机到容器的复制
1)从容器到宿主机的复制, 容器 -> 宿主机
命令格式:docker cp 容器名或ID:要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径
示例:将test.js从容器里面拷到宿主机的/opt路径下面
//测试复制 在镜像系统中创建一个文件复制
#可通过名称 或 编号
docker cp test:/home/abc.txt /opt
2)从宿主机到容器的复制, 宿主机 -> 容器
命令格式:docker cp 要拷贝的文件路径 容器名:要拷贝到容器里面对应的路径
示例:如果宿主机已经实现了换源,则可以通过如下命令将宿主机的配置文件拷到容器中,实现ubuntu容器换源
docker cp /opt/bbb.txt ubuntu:/home
5.7 进入容器
命令格式:docker exec -it 容器ID/容器NAME /bin/bash
示例:
root@ubuntu:/# docker exec -it 7b8b /bin/bash
root@7b8b196818d5:/#
注意:只能进入运行中的容器。
5.8 查看容器信息
查看容器信息可以进入容器后,使用命令查看,例如:hostname,env等,(如果运行ifconfig,ip addr等命令,则需要先安装),可以在宿主机通过如下格式的命令查看:
root@ubuntu:/# docker exec 7b8b hostname
7b8b196818d5
root@ubuntu:/# docker exec 7b8b env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=7b8b196818d5
HOME=/root
推荐使用docker inspect命令查看容器信息,使用方式如下所示
root@ubuntu:/# docker inspect 7b8b
[
{
"Id": "7b8b196818d5d53af160847462c6ab68987d938bb68cd8ea982b229fee76268c",
"Created": "2020-01-31T03:54:16.467988209Z",
"Path": "/bin/bash",
... ...
7b8b为容器ID
该命令以json的方式返回容器的信息,内容比较多,可以只查询一种一部分,示例如下:
root@ubuntu:/# docker inspect -f {{.Config.Hostname}} 7b8b
7b8b196818d5
注:inspect使用的是go语言模板,详细资料请参考Go语言模板。
进行查询
docker inspect test | grep IP
5.9 容器的删除
命令格式:docker rm 容器ID,(与删除镜像的命令很像,只少个i,镜像删除docker rmi 镜像名)
参数:
- -f, --force=false 是否强行终止并删除一个运行中的容器
- -1, --link=false :删除容器的连接 ,但保留容器
- -v, --volumes=false :删除容器挂载的数据卷
6. 其他(了解)
6.1 如何卸载原先安装的 docker
1.打开Terminal,执行下面命令:
sudo apt-get purge docker-ce
2.删除Docker安装目录
sudo rm -rf /var/lib/docker
3.验证是否删除成功
docker info
bash: /usr/bin/docker: No such file or directory
我们可以看到已经无法找到 docker 安装目录,证明 卸载成功
6.2 关于删除容器
方法一:
#显示所有的容器,过滤出Exited状态的容器,取出这些容器的ID,
sudo docker ps -a|grep Exited|awk '{print $1}'
#查询所有的容器,过滤出Exited状态的容器,列出容器ID,删除这些容器
sudo docker rm docker ps -a|grep Exited|awk '{print $1}'
方法二:
#删除所有未运行的容器(已经运行的删除不了,未运行的就一起被删除了)
sudo docker rm $(sudo docker ps -a -q)
方法三:
#根据容器的状态,删除Exited状态的容器
sudo docker rm $(sudo docker ps -qf status=exited)
方法四:
#Docker 1.13版本以后,可以使用 docker containers prune 命令,删除孤立的容器。
sudo docker container prune (推荐)