前言
什么是docker? docker是一个开源的应用容器引擎。
容器是什么? 容器是一种轻量级的虚拟化技术 ,它是一个由应用运行环境、容器基础镜像组成的集合。 以 Web 服务 Nginx 为例,如下图所示:Nginx 容器是由 Nginx 主程序、Nginx 运行依赖组件(gcc、pcre、openssl)、CentOS 7 基础镜像组成。(注:CentOS 7 基础镜像并非完整的操作系统镜像,只是操作系统的基础文件和库文件).
Docker和容器的关系?
容器是一种虚拟化技术,docker 是实现容器的一种工具,我们称它为容器引擎; 可以驱动容器的引擎还有 podman、containerd 等,docker 是目前市面上应用范围最广的一种容器引擎。
容器和虚拟机的区别
启动速度:每个虚拟都机是一个完整的操作系统包括操作系统和内核,所以它是一个重量级的系统;而容器是轻量级的,因为容器只打包了操作系统的基础文件和库文件、还有应用程序及所有的依赖,他的运行速度就如同在系统中创建一个进程一样快,所以启动速度较快。
运行性能:由于虚拟机增加了虚拟化层用于虚拟化硬件,势必会增加一定的开销,所以运行性能有所损失;而容器是直接运行在物理操作系统上的,他本身与系统上其他进程并没有太大区别,所以运行性能是接近原生的。
磁盘占用:虚拟机是一个完整的操作系统,是 GB 级别的,而容器只包含了一些系统启动的必要组件和程序依赖,是 MB 级别的。
数量:运行一个操作系统的开销较大,运行一个进程的开销较小,同样的服务器资源可以运行更多的容器。
隔离性:虚拟机是一个完整的操作系统级别的隔离,要比容器好很多;容器是进程级别的隔离,隔离的不彻底,因为多个容器之间使用的是同一个宿主机的操作系统内核。
封装速度:虚拟机封装会包含操作系统,封装速度比较慢,容器只封装操作系统的基础文件和库文件、应用程序、依赖,封装速度较快
docker的组成
docker 官网: http://www.docker.com 帮助文档链接: https://docs.docker.com/ docker 镜像: https://hub.docker.com/ docker 中文网站: http://www.docker.org.cn/ 清华源镜像站:https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/ 阿里云镜像站:https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.3e221b11xaRalQ
- Docker 主机(Host): 一个物理机或虚拟机,用于运行Docker服务进程和容器,也称为宿主机,node节点
- Docker 服务端(Server): Docker守护进程,运行docker容器
- Docker 客户端(Client): 客户端使用 docker 命令或其他工具调用docker API
- Docker 镜像(Images): 镜像可以理解为创建实例使用的模板,本质上就是一些程序文件的集合
- Docker 仓库(Registry): 保存镜像的仓库,官方仓库: https://hub.docker.com/ ,可以搭建私有仓库harbor
- Docker 容器(Container): 容器是从镜像生成对外提供服务的一个或一组服务,其本质就是将镜像中的程序启动后生成的进程
docker build 创建镜像 整体流程是 :
1.构建镜像 上传到私有仓库(阿里云仓库等)
2.下载镜像到本地
3.运行镜像
docker pull 拉取镜像
docker run 安装镜像
目前主要通过以下技术实现容器运行空间的相互隔离:
|隔离类型 |功能 |系统调用参数 |内核版本 | |:--| |MNT Namespace(mount) |提供磁盘挂载点和文件系统的隔离能力 |CLONENEWNS |2.4.19 | |IPC Namespace(Inter-Process Communication) |提供进程间通信的隔离能力,包括信号量,消息队列和共享内存 |CLONENEWIPC |2.6.19 | |UTS Namespace(UNIXTimesharing System) |提供内核,主机名和域名隔离能力 |CLONENEWUTS |2.6.19 | |PID Namespace(ProcessIdentification) |提供进程隔离能力 |CLONENEWPID |2.6.24 | |Net Namespace(network) |提供网络隔离能力,包括网络设备,网络栈,端口等 |CLONENEWNET |2.6.29 | |User Namespace(user) |提供用户隔离能力,包括用户和组 |CLONENEWUSER |3.8 | |TimeNamespace |提供时间隔离能力 |CLONE_NEWTIME |5.6 | |syslogNamespace |提供syslog隔离能力 |syslognamespace是由华为工程师RuiXiang(瑞翔)提出的,但没有合并到linux内核中,后systemd在2020年2在2020年2 月实现了一个名为“journalnamespace”的类似功能 | | |Controlgroup(cgroup)Namespace |提供进程所属的控制组的身份隔离 | |Linux4.6 |
低级容器运行时与高级容器运行时
High-Level:高级运行时提供基于API的远程管理操作,客户端可以通过高级别运行时管理容器的整个生命周期(创建、删除、重启、停止),高级别运行时并不真正直接运行容器,而是调用低级别运行时运行,比如dockerd、containerd都是高级别运行时。
Low-Level:接受高级别运行时的指令,按照相应的指令运行容器,因此低级别运行时是真实运行容器的地方,例如runc
镜像仓库 Registry 一保存镜像而且是多个不同镜像版本的地方,叫做镜像仓库
- Docker hub: docker官方的公共仓库,已经保存了大量的常用镜像,可以方便大家直接使用
- 阿里云,网易等第三方镜像的公共仓库
- Image registry: docker 官方提供的私有仓库部署工具,无web管理界面,目前使用较少
- Harbor: vmware 提供的自带web界面自带认证功能的镜像私有仓库,目前有很多公司使用
安装
OS系统版本选择: Docker 目前已经支持多种操作系统的安装运行,比如Ubuntu、CentOS、Redhat、Debian、Fedora,甚至是还支持了Mac和Windows,在linux系统上需要内核版本在3.10或以上
centos7安装
yum安装 更换阿里源安装
cd /etc/yum.repos.d/
mkdir bak
mv *.repo bak/
修改阿里yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#按照需要的版本号 安装所需版本就可以 服务端和客户端
yum -y install docker-ce-(version) docker-ce-cli-(version)
#启动docker
systemctl start docker
安装最新版本
#安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm
#安装yum源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装最新版本的docker
yum install -y docker-ce docker-ce-cli containerd.io
#如果想要安装非最新版本 可根据列出版本号安装
[root@xyy10 yum.repos.d]# yum list --showduplicates docker-ce
yum -y install docker-ce-19.03.15-3.el7 docker-ce-cli-19.03.15-3.el7 containerd.io
#注:尽量服务端和客户端版本一致
#获取阿里的镜像加速地址
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
[root@xyy10 yum.repos.d]# mkdir -p /etc/docker
[root@xyy10 yum.repos.d]# tee /etc/docker/daemon.json <<-'EOF'
> {
> "registry-mirrors": ["加速器地址"]
> }
> EOF
{
"registry-mirrors": ["加速器地址"]
}
[root@xyy10 yum.repos.d]# systemctl daemon-reload
[root@xyy10 yum.repos.d]# systemctl start docker
[root@xyy10 yum.repos.d]# systemctl status docker
#查看版本
docker version
#查看详细信息
docker info
二进制安装
下载地址
https://download.docker.com/linux/static/stable
https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/static/stable/x86_64/
wget https://download.docker.com/linux/static/stable/x86_64/docker-19.03.5.tgz
tar xzvf
cp docker/* /usr/bin/
#启动docker
dockerd &
docker run hello-world
# 编辑service文件
vim /usr/lib/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start docker.service
#配置加速器同上
ubantu安装
#修改源
sed -ri.bak 's#\/\/.*.ubuntu.com#\/\/mirrors.aliyun.com#' /etc/apt/sources.list
镜像管理
|命令 |含义 |例子 | |:--| |docker --help |查看帮助 | | |docker image --help |查看镜像帮助 |docker image --help | |docker search 镜像名称 |搜索相关镜像 |docker search nginx | |docker pull 镜像名称:标签 |下载镜像(不加标签默认使用latest) |docker pull nginx | |docker images |查看所有已有镜像 |docker images | |docker images 镜像名称 |查看单个镜像 |docker images nginx | |docker inspect 镜像ID |查看镜像的详细信息 |docker inspect 56b21e040954 | |docker tag 旧名称 新名称 |修改镜像的 标签 |docker tag nginx:latest lucky/nginx:1.25 |
下载镜像
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
Options:
-a, --all-tags Download all tagged images in the repository
--disable-content-trust Skip image verification (default true)
--platform string Set platform if server is multi-platform capable
-q, --quiet Suppress verbose output
#NAME: 是镜像名,一般的形式 仓库服务器:端口/项目名称/镜像名称
#:TAG: 即版本号,如果不指定:TAG,则下载最新版镜像 日常使用中建议指定版本号
[root@xyy10 overlay2]# docker pull redis
Using default tag: latest #默认下载镜像站的最新版本
latest: Pulling from library/redis
#查看版本号 docker image inspect 指定镜像 或者IMAGE ID
[root@xyy10 overlay2]# docker image inspect redis:latest |grep -i version
"DockerVersion": "20.10.7",
"GOSU_VERSION=1.12",
"REDIS_VERSION=6.2.6",
#查看镜像
[root@xyy10 overlay2]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 2 years ago 141MB
redis latest 7614ae9453d1 2 years ago 113MB
#日常使用中 多直接使用run 直接获取
docker run -d --name nginx_test nginx
注释:
-d #后台运行
--name #自定义容器名称
nginx #容器镜像
管理命令总结
**查看正在运行的容器**
`docker ps`
参数:
-a #查看运行的所有容器,包括运行状态和停止状态的容器
**启动、停止、重启容器**
`docker start nginx_test` #启动 Nginx 容器
`docker stop nginx_test` #停止 Nginx 容器
`docker restart nginx_test` #重启 Nginx 容器
**进入容器**
`docker exec -it nginx_test bash`
参数:
-it #打开终端交互(进入容器操作)
**删除运行的容器**
`docker rm -f nginx_test`
**查看容器镜像**
`docker images`
**删除容器镜像**
`docker rmi nginx:latest`
`docker rmi d6454d54b3d9 (IMAGE ID)`
**下载容器镜像**
`docker search nginx`
`docker pull nginx`
**镜像导出为文件**
`docker save nginx:latest nginx.tar`
**从文件导入镜像**
`docker load < nginx.tar`
**编译镜像**
`docker build -t nginx:v1 .`
启动容器
docker-run 帮助 man docker-run
[root@xyy10 ~]# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:2498fce14358aa50ead0cc6c19990fc6ff866ce72aeb5546e1d59caac3d0d60f
Status: Downloaded newer image for hello-world:latest