Docker 容器入门

Posted 奋斗的蜗牛灬

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker 容器入门相关的知识,希望对你有一定的参考价值。

前言

云计算三层架构

  • IAAS 基础设施即服务
    • 应用:硬件(服务器、网络设置、防火墙等)虚拟化、网络虚拟化(大二层)。例:openstack
  • PAAS 平台即服务 环境
    • 例:数据库、 docker 、kubernetes
  • SAAS 应用即服务 应用
    • 例:应用商店的应用

而Docker就是 PAAS 中的技术。

一、Docker 概述

1.1 Docker是什么?

  • 是一个开源的应用容器引擎,基于GO语言开发并遵循了 Apache2.0 协议开源。
  • 是在 Linux容器里运行应用的开源工具,是一种轻量级的 “虚拟机"
  • Docker 的容器技术可以在一台主机上轻松 为任何应用创建一个轻量级的、可移植的、自给自足的容器
  • Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

    Docker图标:鲸鱼可看作为宿主机,集装箱可理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。
Docker 并非是一个通用的容器工具,它依赖于已存在并运行的 Linux 内核环境。

Docker 实质上是在已经运行的 Linux 下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部署的 Linux 主机。

因此,Docker 必须部署在 Linux 内核的系统上。
如果其他系统想部署 Docker 就必须安装一个虚拟 Linux 环境。

除了 Docker 以外,还有 Rocket 、Containerd 等常用容器。

1.2 Docker 设计宗旨

Docker 的设计宗旨:Build、Ship and Run Any App、Anywhere。

即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的 "一次封装,到处运行 "的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。

容器化越来越受欢迎,因为容器是:

  • 灵活:即使是最复杂的应用也可以集装箱化。
  • 轻量级:容器利用并共享主机内核。
  • 可互换:可以即时部署更新和升级。
  • 便携式:可以在本地构建,部署到云,并在任何地方运行。
  • 可扩展:可以增加并自动分发容器副本。
  • 可维叠:可以垂直和即时堆叠服务。
    以前是把服务应用部署在物理机、虚拟机上的,现在是把服务应用部署在容器中。

容器是在 linux上本机运行,并与其他容器共享主机的内核,它运行的是一个独立的进程,不占用其他任何可执行文件的内存,非常轻量。

虚拟机运行的是一个完成的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。

Docker 与 虚拟机的区别(重点)

特性Docker容器虚拟机
启动速度秒级(相当于在宿主机启动一个进程)分钟级
计算能力损耗几乎无损耗50%左右
性能接近原生弱于
系统支持量(单机)上千个几十个
隔离性资源隔离/限制完全隔离

相同点:都是运行在宿主机上面的,

容器在内核中支持2种重要技术:

  • docker本质就是宿主机的一个进程,docker是通过 namespace 实现资源隔离,通过 cgroup 实现资源限制
  • 通过写时复制技术(cop-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500g并不是实际占用物理磁盘500g)。
Docker是容器管理工具,容器由镜像创建而来,镜像从仓库中获取而来,

Linux 的六大命令空间 namespaces

  • MNT 磁盘
  • IPC 进程
  • Net 网络
  • UTS 主机
  • PID
  • User

docker 和 openstack 的区别

openstack 是 通过KVM创建的虚拟机

docker 通过 cgroup 实现资源限制,k8s 通过systemd 实现资源限制

1.3 Docker 核心概念

镜像

  • Docker 的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向Docker 容器引擎的只读模板。
  • **通过镜像启动一个容器,**一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和 配置文件
  • Docker镜像也是一个压缩包,只是这个压缩包不只是可执行文件,环境部署脚本,它还包含了完整的操作系统。因为大部分的镜像都是基于某个操作系统来构建,所以很轻松的就可以构建本地和远端一样的环境,这也是Docker镜像的精髓。

容器

  • Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。
  • 可以把容器看做是一个简易版的Linux环境〈包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序。
容器共有两种状态:running  exited.

用户也可以用 docker commit 命令将一个容器压制为image,供后续使用。

容器的特点:
●灵活:即使是最复杂的应用也可以集装箱化。
●轻量级:容器利用并共享主机内核。
●可互换:可以即时部署更新和升级。
●便携式:可以在本地构建,部署到云,并在任何地方运行。
●可扩展:可以增加并自动分发容器副本。
●可堆叠:可以垂直和即时堆叠服务。

仓库

  • Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用 push命令将它上传到公有仓库〈Public)或者 私有仓库(Private)。
  • 当下次要在另外一台机器上使用这个镜像时,只需从仓库拉取。

Docker 的镜像、容器、日志等内容全部都默认存储在 /var/lib/docker 目录下

1.4 文件系统(Docker 架构)

Linux文件系统 和 Docker文件系统:

Linux文件系统

  • Linux文件系统 由 bootfsrootfs 组成**,bootfs 主要包含 bootloader 和 kernel。**
    • bootloader 主要是引导加载kernel,当kernel 被加载到内存之后bootfs就被卸载掉了。
    • rootfs包含的就是典型Linux系统中/dev、 /proc、 /bin、/etc 等标准目录。

Docker文件系统:

  • Docker 容器是建立在 Aufs 分层文件系统基础上的,Aufs支持将不同的目录挂载到同一个虚拟文件系统下,并实现一种 layer的概念。每一层文件系统我们叫做一层 layer,Aufs可以对每一层文件系统设置三种权限:只读(read-only),读写(read-write) 以及 写出(whiteout-able)。
  • docker 镜像中每一层文件系统都是 read-only。
传统的 Linux 加载 bootfs 时会先将 rootfs 设为 read-only,
然后在系统自检之后将 rootfs  read-only 改为 read-write,
然后我们就可以在 rootfs 上进行写和读的操作了。

同一个内核版本的所有Linux发行版本系统的bootfs是相同的,而rootfs则是不同的。
在Docker中,基础镜像中的roofs会一直保持只读模式,Docker 会利用 AUFS 来在这个rootfs上增加更多的只读文件系统,
最后它们看起来就像一个文件系统即容器的rootfs。

在Docker的体系里把这些read-only的rootfs叫做Docker的镜像。

由此可见在一个Linux系统之中:

  • 所有Docker容器都 共享宿主机系统的 bootfs,即Linux内核;
  • 每个容器有自己的 rootfs,它可以来自不同的 Linux 发行版的基础镜像,包括Ubuntu,Debian和 SUSE等;
  • 所有基于一种基础镜像的容器都共享这种 rootfs

文件系统参考链接

二、安装 Docker

目前Docker 只支持 64 位的操作系统。

安装方式:可以使用CURL获得Docker的安装脚本(get-docker.sh)进行安装(比较慢)、或者使用yum仓库在线安装。

首先在Linux中关闭防火墙,与增强安全功能。

systemctl stop firewalld.service
setenforce 0

安装 docker 依赖包,软件包,安装源

使用 yum 在线源

yum install -y yum-utils device-mapper-persistent-data lvm2

---------------------------
yum-utils:提供了 yum-config-manager 管理工具。
device mapper: 是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
device mapper 存储驱动程序需要 device-mapper-persistent-data  lvm2。
---------------------------

#设置阿里云镜像源,在线安装(用阿里云源或者默认的安装,不能用光盘中的包安装),要几分钟
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 

#安装 Docker-CE并设置为开机自动启动(docker-ce 一定要装)
yum install -y docker-ce docker-ce-cli containerd.io

systemctl start docker.service
systemctl enable docker.service 

安装好的 Docker 系统有两个程序:Docker服务端、Docker客户端。
其中Docker 服务端是一个服务进程,负责管理所有容器。
Docker 客户端则扮演着Docker服务端的远程控制器,可以用来控制Docker的服务端进程。

大部分情况下Docker服务端和客户端运行在一台机器上。

我们是通过 Docker客户端 调用 Docker服务端的 deamon进程服务的。




三、Docker 相关操作

3.1 查看docker信息

docker version

docker info   #容器、镜像、目录信息、cpu、版本号等信息

#/var/lib/docker #docker 数据存储目录



3.2 镜像的操作

查找指定镜像 search

docker search 服务名

例如:
docker search nginx

下载/获取镜像 pull

默认是从官方源下载的,网速会受到外网的波动。

格式:docker pull 仓库名称[:标签]

例如:
docker pull nginx

#如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为 latest标签。
即docker pull nginx 等于 docker pull nginx:latest

下载/获取镜像 pull (加速)

  • 默认 docker pull 获取是从 docker 官方源下载的,服务器在国外,可能很卡,我们可以用 阿里云提供的加速服务。
    配置阿里云镜像加速,不然下载速度很慢
  • 加速地址从自己的阿里云上获取,阿里云官网:https://account.aliyun.com/
    • 获取方式:登录阿里云 → 控制台 → 在上面搜索 容器镜像服务 → 左下角的镜像加速器;在此页面中显示阿里云的镜像加速地址和配置方法。

mkdir -p /etc/docker

tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://8ur59nrv.mirror.aliyuncs.com"]
}
EOF

#先重载,再重启docker服务
systemctl daemon-reload 
systemctl restart docker


用命令 docker info,可以看到配置已生效

验证,pull centos ,可正常获取

查看镜像信息 images、inspect

#查看下载到本地的所有镜像
docker images

--------
REPOSITORY:镜像属于的仓库;
TAG:镜像的标签信息,标记同一个仓库中的不同镜像;
IMAGE ID:镜像的唯一ID号,唯一标识一个镜像;
CREATED:镜像创建时间;
VIRTUAL SIZE:镜像大小;
------

#根据镜像的唯一标识ID 号,获取镜像详细信息,【拍错首选方法】
docker inspect 镜像的ID

例如
docker inspect f6d0b4767a6c

--------

配错方法:
1.查看报错信息
2.执行 docker inspect 查看相关配置向有没有问题



添加新标签(打标签、该标签名)tag

docker tag 仓库名:原标签名 仓库名:新标签名

例如:
docker tag nginx:latest nginx:test
docker images | grep nginx

镜像ID不变,只是改标签名(创建一个新的硬链接(两个文件名对应相同的数据))

删除镜像 rmi

docker rmi 镜像的ID   #会彻底删除该镜像

docker rmi 仓库名:标签名  #当一个镜像有多个标签时,只是删除其中指定的标签

-f : 强制删除

例如:
docker rmi f6d0b4767a6c
docker rmi nginx:test
docker images

注意:如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。


将镜像存储到本机上 save

#将镜像存储到本机上,命名为nginx.tar,前提是改镜像已经下载了

docker save -o 执行存放镜像的位置/镜像文件名 仓库名:标签名

例如:
docker save -o /opt/nginx.tar nginx:latest

从本机载入镜像 load

导入前应该看看有没有已经导入过了。

方法一:
docker load < 本地导出的镜像名

方法二:
docker --input 本地导出的镜像名

例如:
docker load < /opt/nginx.tar
docker load --input /opt/nginx.tar

上传镜像 push

  • 默认上传是上传到 docker Hub 官方公共仓库,需要注册使用公共仓库的账号 进行登录:https://hub.docker.com,才能上传到公共仓库
  • 可以使用 docker login 命令来输入用户名、密码和邮箱来完成注册和登录。
  • 在上传镜像之前,还需要先对本地镜像添加新的标签,然后再使用 docker push 命令进行上传。
docker push [OPTIONS] NAME[:TAG]

例如:按照下面的流程就可以上传到公有云,有兴趣的可以上传
#改标签
docker tag 仓库名:标签名 用户名/仓库名:标签名
#登录
docker login
Username:   #用户名
Password:   #密码

#上传
docker push 用户名/仓库名:标签名

比如我的docker仓库账号 304350406

第一步:使用账号密码登录docker仓库

第二步:修改镜像标签,push 镜像到共有仓库

第三步:从共有仓库pull 拉取镜像

查看仓库中的镜像信息 docker search 账号名

3.3 容器的操作

查看容器运行状态 ps -a

容器的STATUS状态:
up是正在运行的
Exited (0)是正常停止的容器
Exited (0)异常停止的容器

docker ps       #查看运行中的容器
docker ps -a    #加-a 列出所有的容器,包括未运行的容器


CONTAINER ID :容器的ID号
IMAGE:加载的镜像
COMMAND:运行的程序
CREATED:创建时间
STATUS:当前的状态
PORTS:端口映射
NAMES:名称

创建容器 create

  • 容器创建:就是将镜像加载到容器的过程。
  • 新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器。
docker create [选项] 镜像运行的程序

创建的时候要使用属性:
-i:让容器的标准输入保持打开
-t:让Docker分配一个伪终端
/bin/bash :使用bash 解释器来运行容器

;
docker create -it nginx:latest /bin/bash

启动、停止、重启容器 start、stop

docker start 容器ID  #启动一个或多个已经被停止的容器
docker stop  容器ID  #停止一个运行中的容器
docker restart  容器ID #重启容器

例:
docker start 15b4aaa5d079
docker ps -a
docker stop 15b4aaa5d079
docker ps -a
docker restart 15b4aaa5d079

创建并运行容器 run (重点)

  • 可以直接执行 docker run 命令,等同于先执行 docker create 命令,再执行 docker start 命令;
  • 一般第一次可以使用 run,后面维护还是使用 start / stop / restart
注意:容器是一个与其中运行的 shell 命令共存亡的终端,命令运行容器运行,命令结束容器退出。

docker 容器默认会把容器内部第一个进程,也就是 pid=1 的程序作为 docker容器是否正在运行的依据,
如果docker容器中pid = 1的进程挂了,那么docker容器便会直接退出,
也就是说Docker容器中必须有一个前台进程,否则认为容器已经挂掉。(不能只有后台进程,容器会退出)

当利用 docker run 来创建容器时,Docker在后台的标准运行过程是:

1)检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载;
2)利用镜像创建并启动一个容器;
3)分配一个文件系统给容器,在只读的镜像层外面 挂载一层可读写层;
4)从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中;
5)分配一个地址池中的IP地址给容器;
6)执行用户指定的应用程序,执行完毕后容器被终止运行。
docker run [选项] 镜像名
 [命令] [变量]

-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
-c 命令表示后面的参数将会作为字符串读入作为执行的命令
-v: 绑定一个卷
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
--name="名称": 为容器指定一个名称(不指定会随机生成一个名称)
--link name:alias 添加链接到另一个容器,格式“--link容器名:别名”

例如:
docker run nginx  #运行后容器就结束
docker run -d nginx   #运行后容器在后台执行
docker run -d nginx /bin/bash -c "ls"


进入、退出、停止容器 exec、exit、stop

进入的容器时,容器的状态一定要是运行 UP 状态!!!

进入的容器时,容器的状态一定要是运行状态!!!

-i 选项表示让容器的输入保持打开;
-t 选项表示让 Docker分配一个终端

docker exec [选项] 容器ID 命令
例:
docker exec -it 15b4aaa5d079 /bin/bash

exit   #退出容器

docker stop 容器ID   #停止容器,容器状态变成 Exited  
-f 强制停止、docker kill 强制杀掉容器

删除容器 rm

docker rm [-f] 容器ID


从宿主机拷贝文件到docker 容器中 cp

首先在宿主机中的文件系统中选择一个文件
执行 docker cp 命令,将文件拷贝到宿主机的目录中

比如将宿主机/dev/abc.txt 拷贝到容器的/opt/目录中:
docker cp /dev/abc.txt 容器ID:/opt/

docker exec -it 容器ID bash
cd /optl
ls
就能看到这个文件

容器导出/迁移 export、导入镜像 import

docker export 容器ID号 > 导出的容器文件名
#导出的文件内容都是二进制

再通过scp 命令拷贝到另一台机器中



总结

Docker是什么?

  • 是一个容器引擎,是由Go语言开发的,轻量级的虚拟机,封装的容器可以在任何主机上运行。

以上是关于Docker 容器入门的主要内容,如果未能解决你的问题,请参考以下文章

Docker入门

Docker删除报错:Error response from daemon: conflict: unable to delete 08b152afcfae (must be forced)(代码片段

Docker入门篇-容器

docker入门

docker 基础入门

Docker入门实战-SSH连接docker容器