Docker基础

一: Docker 概述

1.1 Docker 是什么

  • Docker 是一个开源的应用容器引擎,基于go 语言开发并遵循了apache2.0 协议开源
  • Docker 是在Linux 容器里运行应用的开源工具,是一种轻量级的“虚拟机”
  • Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的,可移植的,自给自足的容器。

Docker 的Logo设计为蓝色鲸鱼,拖着许多集装箱,鲸鱼可以看作为宿主机,集装箱可以理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。Docker从一开始就以提供标准化的运行时环境为目标,真正做到"Build,Ship and Run any APP,Angwhere",可以将同一个构建版本用于开发、测试、预发布、生产等任何环境,并且做到了与底层操作系统的解耦。在此基础上还进一步发展出了Caas (容器即服务)技术。

image-20211006142342964

1.2 Docker 常用场景

Docker通常用于如下场景:

  • web应用的自动化打包和发布;
  • 自动化测试和持续集成、发布;
  • 在服务型环境中部署和调整数据库或其他的后台应用;
  • 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。

1.3 什么是容器

容器是一种轻量级,可移植,自包含的软件打包技术,是一种应用程序,可以在几乎任何地方以相同的方式运行。

一个容器包含了完整的运行时环境: 除了应用程序本身之外,这个应用所需的全部依赖、类库、其他二进制文件、配置文件等,都统一被打入了一个称为容器镜像的包中。通过将应用程序本身,和其依赖容器化,操作系统发行版本和其他基础环境造成的差异,都被抽象掉了。

1.4 容器的优点

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

1.5 容器与虚拟机的区别

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

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

Docker容器和虚拟机的区别

特性Docker容器虚拟机
启动速度秒级分钟级
计算能力损耗几乎无损耗可达50%
性能接近原生弱与
系统支持量(单机)成百上千几十个
隔离性资源隔离/限制完全隔离
镜像体积镜像MB级别虚拟机镜像GB级别

1.6 传统环境,虚拟机环境,容器环境的区别

传统环境:是在硬件资源上安装操作系统上安装 app
虚拟化环境:在硬件资源,操作系统上安装一层虚拟层,在虚拟层的基础上,将硬件资源划分,创建虚拟机,在虚拟机的基础上安装操作系统,再构建二进制环境,然后再安装app。对资源损耗大.
容器环境:在硬件资源,操作系统上构建容器引擎,运行容器,在容器内提供二进制环境,然后在二进制环境的基础上提供服务。对于资源的损耗远小于虚拟化环境.

img

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

docker 本质就是宿主机的一个进程,docker 通过namespace 实现资源隔离,通过cgroups 实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘。比如分配500G,并不是实际占用物理磁盘500g,而是随着使用扩展。)

Linux 的namespace (命名空间)

namespace系统调用参数隔离内容
UTSCLONE_NEWUTS主机名和域名
IPCCLONE_NEWWIPS信号量,消息队列和共享内存
PIDCLONE_NEWPID进程编号
NETWORKCLONE_NEWNET网络设备,网络栈,端口等
MOUNTCLONE_NEWNS挂载点(文件系统)
USERCLONE_NEWUSER用户和用户组(3.8以后的内核才支持)

1.8 Docker 的核心概念

镜像:

  • Docker 的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向Docker容器引擎的只读模板。镜像不包含任何动态数据,其内容在构建之后也不会被改变.
  • docker镜像只需要一个基础的base Image,按照需求不断的叠加就可以了。
  • 共享一份基础的。一个基础镜像出现多个容器,如果容器内的etc文件被修改,但是基础镜像的是不会被改变的。
  • 修改只会在单个的容器内。 例如要安装一个tomcat镜像,新的镜像是在基础的linux下一层一层叠加上来的。
  • 通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容代码,运行时间,库,环境变量和配置文件。
  • Docker镜像也是一个压缩包只是这个压缩包不只是可执行文件,环境部署脚本,它还包含了完整的操作系统。因为大部分的镜像都是基于某个操作系统来构建,所以很轻松的就可以构建本地和远端一样的环境,这也是docker镜像的精髓。

容器:

  • Docker 的容器是从镜像创建的运行实例,它可以被启动,停止和删除。所创建的每一个容器都是相互隔离,互不可见,以保证平台的安全性
  • 容器是一种轻量级,可移植,自包含的软件打包技术,是一种应用程序,可以在几乎任何地方以相同的方式运行。
  • 可以把容器看做一个简易版的Linux环境(包括root用户权限,尽享空间,用户空间和网络空间等)和运行在其中的应用程序。一个Docker容器包含了所有的某个应用运行所需要的环境

仓库:

  • Docker 仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(public)或者私有仓库库(Private)。当下次要在另外一台机器上使用这个镜像时,只需要从仓库获取
  • 公共仓库和私有仓库最大的却别就是网速,公共仓库从公网,私有仓库是从局域网,速度的差别,安全性,公共的肯定没有私有的安全,保存在自己的硬盘上是最稳的

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

1.9 为什么镜像如此小

比如centos7.5 的系统镜像,虚拟机的该系统镜像是以GB为单位,然而docker的镜像却只是以MB为单位。

linux操作系统是由内核空间和用户空间组成的,内核空间就是kernel,linux刚启动的时候会加载这个bootfs文件系统,之后这个bootfs会卸载掉,用户文件系统就是rootfs,包含dev,bin等目录。

对于刚下载的centos这个镜像来说,底层会使用docker的内核,自己只需要提供用户空间就可以了 ,对于精简的系统用户空间可以很小,只需要包括最基本的命令和程序库就可以了

我们平时安装的centos除了最基本的还会安装很多的软件,服务,图形桌面等等,所以会有好几个g大小

1.10 小结

容器

  • 提供在多台主机上运行应用程序相同的运行环境

docker

  • 开源的容器引擎,由GO语言开发,是容器运行应用的工具,是一个轻量级的虚拟机。可以利用docker 在多台主机上轻松创建并运行容器
  • docker 容器可以被看作运行在宿主机上的一个进程,容器共享宿主机的内核。容器是通过namespace(命名空间)隔离资源,通过cgroups(资源配额)去限制资源

核心概念

  • 镜像:运行容器的基础,包含运行你应用程序所需的所有内容
  • 容器:是从镜像创建的运行实例
  • 仓库:集中保存镜像的地方,分为公有仓库(docker hub),私有仓库(harbor)

二:安装Docker

目前,Docker 只能支持64 位系统
systemctl stop firewalld
setenforce 0

2.1 安装依赖包

#关闭防火墙和selinux 
[root@host103 ~]# systemctl disable --now firewalld 
[root@host103 ~]# setenforce 0
#将系统的网络源从备用中移出,启用
 [root@host103 ~]# cd /etc/yum.repos.d/ 
 [root@host103 yum.repos.d]# ls \
 bak  local.repo 
 [root@host103 yum.repos.d]# mv bak/* .
 
 #安装依赖包
[root@host103 yum.repos.d]# yum -y  install \ 
yum-utils device-mapper-persistent-data lvm2

yum-utils:

  • 提供了 yum-config-manager 工具

device mapper:

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

2.2 设置阿里云镜像源,安装并启动Docker-ce

#配置阿里云镜像源
 [root@host103 ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
 [root@host103 ~]# ls /etc/yum.repos.d/docker-ce.repo  
 /etc/yum.repos.d/docker-ce.repo 
 
 [root@host103 ~]# sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
 [root@host103 ~]# yum makecache fast 

img

img

img

2.3 安装Docker-CE

#安装Docker-CE,并启动,同时设置为开机自启 
[root@host103 ~]# yum -y install docker-ce 
[root@host103 ~]# systemctl enable --now docker.service  
#查看docker的版本信息 
[root@host103 ~]# docker version 
#查看当前docker的详细信息 
[root@host103 ~]# docker info 

安装好的Docker系统有两个程序,Docker服务端和Docker客户端。其中Docker 服务端是一个服务进程,负责管理所有容器。Docker客户端则扮演着Docker服务端的远程控制器,可以用来控制Docker的服务端进程。大部分情况下,Docker服务端和客户端运行在一台机器上

image-20211006163850482

image-20211006165408776

img

三:docker 的镜像操作

3.1 搜索镜像

格式: docker search 关键字

#搜索nginx的镜像 
[root@host103 ~]# docker search nginx 

image-20211006170111641

3.2 获取镜像

格式: docker   pull   仓库名称[:标签]
如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为 latest 标签。

#拉取 镜像 nginx 
[root@host103 ~]# docker pull nginx

image-20211006170639584

3.3 镜像加速下载

(阿里云的镜像加速: 控制台---->在产品与镜像服务搜索容器镜像服务----> 镜像工具------>镜像加速器)

查看加速器地址,选择相应的操作系统,查看操作文档

mkdir -p /etc/docker 
tee /etc/docker/daemon.json <<-'EOF' 
{  
"registry-mirrors": ["https://k0ki64fw.mirror.aliyuncs.com"] 
} 
EOF 
systemctl daemon-reload 
systemctl restart docker 

img

img

img

image-20211006174114285

3.4 查看镜像信息

镜像下载后存放在 /var/lib/docker

#镜像文件存放在 /var/lib/docker 目录中 
[root@host103 ~]# ls /var/lib/docker/ 

#查看下载的镜像文件信息 
[root@host103 ~]# cat  /var/lib/docker/image/overlay2/repositories.json 

#查看下载到本地的所有镜像信息 
[root@host103 ~]# docker images 
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE 
nginx        latest    f8f4ffc8092c   8 days ago   133MB 

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

image-20211006175100068

image-20211006175429713

3.5 根据镜像的唯一标识ID 号,获取镜像的详细信息

格式: docker   inspect   镜像ID号
镜像ID 号可以不用打全。

[root@host103 ~]# docker inspect f8f4 

image-20211006180139241

3.6 为本地镜像添加新的标签

格式: docker   tag  名称:[ 标签]

[root@host103 ~]# docker tag nginx:latest nginx:nginx01 
[root@host103 ~]# docker images | grep nginx 
nginx        latest    f8f4ffc8092c   8 days ago   133MB 
nginx        nginx01   f8f4ffc8092c   8 days ago   133MB 

[root@host103 ~]# docker tag nginx:latest web:nginx01 
[root@host103 ~]# docker images  
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE 
nginx        latest    f8f4ffc8092c   8 days ago   133MB 
nginx        nginx01   f8f4ffc8092c   8 days ago   133MB 
web          nginx01   f8f4ffc8092c   8 days ago   133MB 

image-20211006180601141

3.7 删除镜像

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

格式2: docker   rmi  镜像ID  [-f]
会彻底删除镜像
注意:如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像

#通过仓库:标签 删除镜像 
[root@host103 ~]# docker rmi web:nginx01  
Untagged: web:nginx01 
[root@host103 ~]# docker images  
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE 
nginx        latest    f8f4ffc8092c   8 days ago   133MB 
nginx        nginx01   f8f4ffc8092c   8 days ago   133MB  
#使用镜像ID号删除,直接删除则报错。 
[root@host103 ~]# docker rmi f8f4 
Error response from daemon: conflict: unable to delete f8f4ffc8092c (must be forced) - image is referenced in multiple repositories 
#使用镜像号彻底删除该镜像, 要使用 -f 表示强制 
[root@host103 ~]# docker rmi f8f4 -f 
Untagged: nginx:latest 
Untagged: nginx:nginx01 
Untagged:nginx@sha256:06e4235e95299b1d6d595c5ef4c41a9b12641f6683136c18394b858967cd1506
 [root@host103 ~]# docker images 

image-20211006184028771

image-20211006184308754

3.8 存储镜像

将镜像保存为本地文件。
格式: docker   save   -o  存储文件名   存储的镜像

[root@host103 ~]# docker save -o  /opt/nginx nginx:latest 
[root@host103 ~]# ls /opt/nginx  
/opt/nginx 

image-20211006184620970

3.9 载入镜像

将镜像文件导入到镜像仓库中
格式1: docker   load   <   存储的文件

格式2: docker   load   i   存储的文件

[root@host103 ~]# docker load < /opt/nginx
[root@host103 ~]# docker images 
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE 
nginx        latest    f8f4ffc8092c   8 days ago   133MB 

image-20211006184958898

3.10 上传镜像到公有仓库

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

#使用docker login 输入用户名密码登录注册的公有仓库账号 
[root@host103 ~]# docker login 
Username:zhijiyiyu 
Password: 

#添加新的标签。在前面添加上自己的dockerhub的username 
[root@host103 ~]# docker tag nginx:latest   zhijiyiyu/nginx:web 

#上传镜像 
[root@host103 ~]# docker push zhijiyiyu/nginx:web 

#退出登录
[root@host103 ~]# docker logout 

image-20211007161952087

docker 命令管理

docker version #查看docker版本号
docker info #查看docker 的详细信息(包括容器状态,服务端版本,镜像数,底层文件系统,cpu数等)

--------------------docker 镜像操作 ----------------------------

docker search 关键字(多时仓库名) #搜索镜像

docker pull 仓库名称[:标签] #获取镜像

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

docker inspect 镜像ID号 #从查看镜像的详细信息

docker tag 名称:[标签] 新名称:[新标签] #为本地的镜像添加新的标签

docker rmi 仓库名称:标签 #删除镜像
docker rmi 镜像ID #删除镜像(彻底删除镜像)

docker save -o 存储文件名 存储的镜像 #存出镜像

docker load <或 -i 存储的镜像 #载入镜像

----------------------------- docker 容器操作 ----------------------

docker create [-it] 镜像 [命令] #创建容器

docker start 容器ID/名称 #启动容器

docker stop/kill 容器ID/名称 #停止 容器

exit 或者 ctrl +p ctrl +q #退出容器

docker rm [-f] 容器ID/名称 #删除已经停止的容器(-f 表示强制,可以删除运行的)

docker rm $(docker ps -aq) #批量清理后台停止的容器

docker ps [选项] #查看容器
-a :显示所有容器,包括未运行的
-f : 根据条件过滤显示内容
–format : 指定返回值的模板文件
-l : 显示最近创建的容器
-n 数字 : 列出最近创建的多少个容器
–no-trunc : 不截断输出
-q : 静默模式,只显示容器编号
-s : 显示总的文件大小

docker top 容器ID或容器名 #查看容器内的进程

docker logs 容器ID或容器名 #查看容器里的日志

docker run [-itd] 镜像 命令 [-c “命令序列”] # 运行容器。(并进入)

docker attch 容器名/容器ID #进入容器

docker exec -it 容器名/容器ID /bin/bash #进入容器

------------------------ docker 网络 -------------------------

docker run -d --name 名称 -P 镜像 # -P 随机映射端口, --name 指定创建的容器名
docker run -d --name 名称 -p 宿主机端口:容器内 端口

docker inspect 容器 | grep -i ‘networkmode’ #查看容器的网络模式

docker inspect -f ‘{{.State.Pid}}’ 容器ID #查看容器进程号

ls -l /proc/容器进程号/ns #查看容器的命名空间

brctl show #查看网桥

#自定义网络模式
docker network create --subnet=ip地址池 --opt “com.docker.network.bridge.name”=“自定义网卡名” 自定义网络模式
docker run -itd --name 容器名或者ID --net 网络模式 --ip ip地址 镜像 命令

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YJ Thoreau

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值