目录

1. 什么是docker

2. docker的核心组件

3. docker的安装

3.1 安装的先决条件

3.2.1 ubuntu安装docker

3.2.2 CentOS安装docker

3.3 配置镜像加速器

4. 镜像常用操作

4.1 搜索镜像

4.3 查看宿主机中的镜像

4.3 删除镜像

5. 容器常用命令

5.1 运行容器

5.2 使用容器

5.4 容器的退出

5.5 容器的启动与停止

5.6 复制文件

5.7 进入容器

5.8 查看容器信息

5.9 容器的删除

6. 其他(了解)

6.1 如何卸载原先安装的 docker

6.2 关于删除容器


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
  1. 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 (推荐)

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐