Docker基础(一)

目录

一、Docker

1.简介

2.Docker与虚拟机的区别

3.Docker底层原理

①名称空间(namespaces)

②系统资源管理(cgroups)

4.Docker的优势

5.Docker的使用场景

6.Docker三要素

7.Docker引擎

二、Docker的架构

1.Docker使用的是客户端-服务端的架构

2.Docker 三大组件

三、控制组

四、部署20版Docker

1.安装Docker

①环境配置

②安装依赖包

③安装docker-ce社区版

④开启docker

2.设置镜像加速

3.网络优化

4.docker-server端配置文件

5.查看

①查看docker版本

②显示docker的系统信息,内核、镜像数、容器数等

③查看容器资源

五、Docker镜像操作

1.运行镜像

2.搜索镜像-search

3.下载镜像-pull

4.查看镜像/容器

5.查看当前docker下的镜像详细信息

6.添加镜像标签

7.删除镜像

8.镜像导出

六、Docker相关操作

1.查询容器

2.删除容器

3.启动运行容器

①创建容器

②启动容器

③启动一次性容器

④持续后台运行

4.停止容器

5.进入、退出容器

①使用run

②使用exec(容器必须为开启状态)

③退出容器

6.容器导入导出

①导出

②导入

七、Docker网络模式

1.Host模式

2.Container模式

3.None模式

4.Bridge模式

5.Docker自定义网络

①查看网络列表

②查看容器IP

③自定义网络固定IP

④网络模式内加入指定的IP地址

6.暴露端口

①指定端口

②随机端口

八、Docker数据卷

1.容器文件复制

2.添加Linux系统命令到容器里

3.免交互在容器进行操作

4.数据卷

5.数据卷容器

①数据卷

②新容器挂载web1

③测试

6.容器互联(使用centos镜像)


一、Docker

1.简介

Docker相当于虚拟机Vmware Workstation,只不过虚拟机Vmware Workstation工作在Windows下,而Docker工作在Linux下。

Docker相当于一个瓶子,里面装着饮料,服务就相当于饮料,Docker就是装着不同的饮料,把饮料相互分开不会串味,就是说docker把多个服务互相隔离开来,互不影响。

Docker是基于容器技术的轻量级虚拟化的解决方案。相当于把Linux的资源管理模块(cgroup)、名称空间(namespaces)等容器底层技术进行完美封装、并抽象的为用户提供创建和管理的便捷界面(C/S)

Docker是一个用于开发,交付和运行应用程序的开放平台。Docker使您能够将应用程序与基础架构分开,从而可以快速交付软件。

是一个开源的应用容器引擎,让开发者可以打包方式封装应用以及依赖包到一个可移植的锐像中,然后发布到任何流行的Linux或者windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制(隔离机制),相互之间不会有任何接口

2.Docker与虚拟机的区别

虚拟机是在操作系统上进行隔离,而docker是在应用上进行隔离

不同点                  container                                          VM

启动速度              秒级(进程控制)                            分钟级(来宾操作系统管理)

运行性能              接近原生(直接在内核中运行90%) 50%左右损失

磁盘占用              MB                                                   GB(操作系统镜像2G)

数量                     成百上千(进程)                            一般几十台(操作系统级别)

隔离性                  进程级别                                          系统级别(更彻底)

操作系统              主要支持Linux(只需要支持引擎)  几乎所有(吃宿主机操作系统的支持)

封装程度              只打包项目代码和依赖关系,共

享宿主机内核                                   完整的操作系统,与宿主机隔离

3.Docker底层原理

①名称空间(namespaces)

隔离了6个名称空间

mount           文件系统、挂载点(一个文件系统内不能重复挂载一个指定目录)

user               操作进程的用户和用户组(一个文件系统内不能有重复的用户和用户组)

pid                进程编号(一个文件系统内每个进程的进程不能重复)

uts                 主机名和主机域(一个文件系统内主机名不能重复)

ipc                 信号量、消息队列、共享内存(不同应用之间不能调用相同的内存空间)

net                网络设备、端口、网络协议栈等(应用之间端口不能一样)

②系统资源管理(cgroups)

mount命名空间:管理文件系统挂载点

pid命名空间:     进程隔离

uts命名空间:     隔离内核和版本标识符

ipc命名空间:      管理访问ipc资源(ipc:进程间通信)

net命名空间:     管理网络接口

4.Docker的优势

①dockerdocker引擎统一了基础设施环境-docker环境—》image—》封装一个简易的操作系统(3.0+G )

②docker引擎统一了程序打包(装箱/封装-类比于集装箱)方式-docker镜像—》images

③docker引擎统一了程序部署(运行)方式-docker容器——》基于镜像-》运行为容器(可运行的环境)

实现了一次构建,多次、多处使用

5.Docker的使用场景

K8S image镜像+container容器的方式

war jar ——》github gitlab 私有仓库(代码仓库)—》jenkins(测试)(应用程序封装/构建镜像)—》运维下载,使用容器技术进行运行/发布

①打包应用程序简单部署

②可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦),例如:服务器从腾讯云迁移到阿里云

③持续集成和持续交付(Ci/CD) :开发到测试发布

④部署微服务

⑤提供PAAS产品(平台即服务){OpenStack的云主机类似于阿里云的ECS,属于IAAS;Docker (K8S)属于PAAS

6.Docker三要素

①镜像——》模板

②容器——》基于镜像,运行状态/运行时状态

③仓库——》存放镜像模板

7.Docker引擎

Docker Engine时具有以下主要组件的C/S客户端-服务器应用程序:

server端:服务器是一种长期运行的程序,称为守护程序进程(docker命令)

clinet端:rest api,它指定程序可以用来与守护进程进行通信并指示其操作的接口

命令行界面(CLI)客户端(docker命令)

docker run            运行

docker start          开启

docker rm             删除

二、Docker的架构

1.Docker使用的是客户端-服务端的架构

Docker客户端与Docker守护进程进行对话,该守护进程完成了构建,运行和发布Docker容器的繁重工作。

Docker区别于传统的虚拟化,不需要虚拟硬件资源,直接使用容器引擎,所以速度快

Docker Client:客户端/提供一个与用户交互,展示的平台+管理、控制docker服务端(功能)的工具docker

Docker客户端(docker):是许多Docker用户与Docker交互的主要方式。当使用诸如之类的命令时docker run,客户端会将这些命令发送到dockerd,以执行这些命令。该docker命令使用docker api。Docker客户端可以与多个守护程序通信。

Docker daemon:守护进程。Docker守护程序(docker)侦听Docker api请求并管理Docker对象,例如图像,容器,网络和卷。守护进程还可以与其他守护程序通信以管理Docker服务。

Docker images:镜像

Docker container:容器

Docker registry:镜像仓库(yum仓库)

储存镜像的地方,默认在公共的Docker Hub上查找,可以搞个人仓库(registry harbor)

2.Docker 三大组件

镜像:一组资源集合,包含了应用程序软件包、应用程序相关的依赖包、运行应用程序所需要的基础环境(泛指操作系统环境),可以理解为容器的模板

容器(Docker container):基于镜像的一种运行时状态

仓库(Docker reqistry):存放image镜像模板;仓库分类:1、公共仓库-》docker hub,私有仓库registry harbor

三、控制组

Linux上的Docker引擎还是依赖于另一种成为控制组(cgroups)的技术,cgroup将应用程序限制为一组特定的资源。控制组允许DockerEngine将可用的硬件资源共享给容器,并有选择地实施限制和约束。例如,可以限制特定的容器的可用内存。

4个CPU

1、3                     2、4

container1            container2

四、部署20版Docker

1.安装Docker

①环境配置

关闭防火墙

systemctl stop firewall

systemctl disable firewall

setenforce 0

vim /etc/selinux/config

SELINUX=disabled

vim /etc/reslov.conf

nameserver 114.114.114.114

②安装依赖包

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

device-mapper-persisten-data          存储驱动

lvm2                                                 控制工具

设置阿里云镜像源

cd /etc/yum.repos.d

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

③安装docker-ce社区版

yum install -y docker-ce

④开启docker

systemctl start docker

systemctl enable docker

2.设置镜像加速

官方镜像加速器 阿里云网站

关于加速器的地址,可以在阿里云容器镜像服务控制台登陆后,在左侧导航栏选择镜像工具,镜像加速器,在页面就会显示独立分配的加速器地址

通过修改daemon配置文件/etc/docker/daemon.json来使用加速器

tee /etc/docker/daemon.json <<-'EOF'

{

              地址

}

EOF

systemctl daemon-reload

systemctl restart docker

3.网络优化

vim /etc/sysctl.conf

net.ipv4.ip_forward=1                 #开启地址转发

sysctl -p

由于容器也是个独立的,需要在虚拟机上开启路由转发,才能让网络进入容器

systemctl restart network

systemctl restart docker

使用docker images 、docker image ls 查看镜像列表

docker ps -a

4.docker-server端配置文件

{

       "graph": "/data/docker",                                  #数据目录

       "storage-driver": "overlay2",                            #存储引擎 早期的时候存储引擎时aufs,新的是overlay2(overlayfs:文件系统,解决docker镜像分层)

       "insecure-registries": [" registry.access.redhat.com", "quary.io"]     #私有仓库位置

       "registry-mirrors": ["https://q***"]                    #镜像加速

       "bip": "172.7.5.1/24",                                        #docker网络;控制网段的位置;需要创建新的网桥,系统默认的docker0是不变的

       "exec-opts": ["native.cgroupdriver-systemd"],  #启动时候的额外参数(驱动)

       "live-restore":true                                            #当docker容器引擎挂掉的时候,使用docker跑起来的容器还能运行(分离)

5.查看

①查看docker版本

②显示docker的系统信息,内核、镜像数、容器数等

docker info

③查看容器资源

docker stats

五、Docker镜像操作

1.运行镜像

docker run hello-world

解释:

①The Docker client contacted the Docker daemon.

docker client 客户端连接到了服务端(服务端是以一个守护进程的形式跑在操作系统里面的)restful api典型的c/s架构

②The Docker daemon pulled the “hello-world” image from the Docker Hub.(amd64)

docker 服务端的守护进程从docker hub 上下载了镜像(Ps:服务端会先检查本地系统是否有这个镜像)

③The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading.

服务端创建了一个新的容器,然后从拉去的这个镜像启动了一个容器,容器执行了脚本/可执行程序让我们可以查看/使用(client)

④The Docker daemon streamed that output to the Docker client, which sent it

to your terminal.

docker服务端把这些信息流(传递〉返回到客户端并展示出来,(展示在终端上)

docker client 可以是多种形式,比如"docker"命令工具所在的终端

docker search nginx

docker search centos:7

搜索对的都是docker公共仓库里,用户自己制作上传上去的镜像,供其他用户下载使用

3.下载镜像-pull

client端连接服务端,从docker(hub)仓库上把镜像下载下来

格式:docker pull 镜像名称

docker pull nginx

4.查看镜像/容器

docker images             #查看镜像列表

docker images -q               #查询镜像过滤出来的ID#q:过滤出镜像ID

docker ps -a         #查看容器列表

5.查看当前docker下的镜像详细信息

格式:docker inspect 镜像ID

docker inspect ea335eea17ab

6.添加镜像标签

格式:docker tag 原镜像:原标签 原镜像:新标签

docker tag hello-world:latest hello-world:new

更改的新的镜像标签只是复制了老的镜像,删除老的镜像用新的镜像不影响

统计镜像是通过统计不同的镜像id

7.删除镜像

删除镜像之前需要删除容器ID

docker rmi hello-world:lastest

格式:docker rm 容器id

docker rm cfe2aa6e41c9

删除标签

格式:docker rmi 标签

docker rmi hello-wrold

8.镜像导出

docker svae -o 文件名(自己取名) 镜像名

docker load <

导出

docker save -o hello-wold-1 hello-world:latest

导入

也可以导入到别的docker下

scp hello-world-1 root@192.168.72.11:/opt

docker load < hello-world-1

六、Docker相关操作

1.查询容器

docker ps -a                #显示所有容器,包括未运行的,a:all(全部)

docker ps -qa              #显示所有容器的id,q:过滤出ID

2.删除容器

docker rm 容器id

docker rm -f                      #强制删除容器(正在运行)

docker rm 60078f0578eb

#docker rm -f `docker ps -qa`                  #强制批量删除容器,不建议使用

#docker ps -a | grep hello|awk '{print $1}'

#docker ps -a | awk '{print "docker rm " $1'} | bash        ##批量删除容器(正则匹配);$1:是容器的id

#for i in `docker ps -a | grep -i exit | awk '{print$1}'`; do docker rm -f $i;done    ##批量删除"exit"状态(指定状态)的容器

3.启动运行容器

①创建容器

docker create –[i、t、d] 名字:标签 /binbash

-i:让容器的标准输入保持打开

-t:分配一个伪终端

-d:后台守护进程的方式运行

docker create -it nginx:latest /bin/bash

②启动容器

docker start 容器id

③启动一次性容器

持续性运行浪费资源,就一次性执行操作

docker run centos:7 /usr/bin/bash -c ls /  #-c:传递命令参数

④持续后台运行

docker run -d centos:7 /usr/bin/bash -c “while true;do echo hello;done”

#while true;do echo hello;done代表死循环

4.停止容器

docker stop 容器id

docker stop e9aed6611134

5.进入、退出容器

①使用run

docker run -it 镜像名 /bin/bash

docker run -it nginx;latest /bin/bash

②使用exec(容器必须为开启状态)

docker exec -it 容器id /bin/bash

PS:

1.docker run -it会创建前台进程,但是会在输入exit后终止进程。

2.docker attach 会通过连接stdin,连接到容器内输入输出流,会在输入exit后终止容器进程.

3.docker exec -it 会连接到容器,可以像ssh一样进入容器内部,进行操作,可以通过exit退出容器,不影响容器运行。

③退出容器

cttl+d或exit

6.容器导入导出

①导出

docker export 容器id > 文件名

docker export 6c4380bae87a > centos7

②导入

docker import 导出的文件名(容器) 指定镜像名称(打上标签)

docker import centos7 centos7:new

cat 文件名(容器) | docker import – centos:new

cat centos7 | docker import – centos:new

七、Docker网络模式

docker的网络形式

loopback:回环网卡、TCP\IP网卡是否生效

virtual vridge:自身继承了一个虚拟化功能(kvm架构),是原生架构的一个虚拟化平台,安装了一个虚拟化平台之后就会系统就会自动安装虚拟网卡

(安装完vmwokerstation后,在网络适配器里可以看到很多的VMent1、VMent2……)

dock0:容器的网关,绑定物理网卡,主要是做NAT地址转换,端口映射;dock0本身也是一种容器

veth对:一组虚拟设备,用户连接两个不同的名称空间,宿主机内就是veth

1.Host模式

就是与宿主机共享网络名称空间/网络协议栈

Host模式下,容器不会虚拟出子的网卡、配置自己的IP等,而是使用宿主机的IP和端口,

启用容器时使用Host模式,那这个容器就不会获得一个独立的网络名称空间,而是会和宿主机共用一个名称空间,但是容器的其他方面像文件系统、进程列表还是会和宿主机隔离的

Host模式下,容器直接使用主机的IP地址与外界通信,容器内的服务端口也可以使用宿主机的端口,不需要进行地址转换

最大的优势就是网络性能比较好,但是docker host已经使用的端口就不能在去使用了,网络隔离性不好

2.Container模式

多个容器共享一个网络名称空间,就是指定新的创建的容器和一个已经存在的容器共享一个网络名称空间,就不是和宿主机进行共享了

新创建的容器不会创建自己的网卡,配置自己的ip,而是和一个指定的容器共享IP、端口范围等。一样的两个容器除了网络方面,其他的像文件系统、进程列表等还是隔离的

3.None模式

容器有自己的独立网络名称空间,但并没有进行任何网络设置,相当于自己在一个封闭的网络环境里,这种模式的网络无法联网,但是封闭的网络能很好的保证容器的安全性

4.Bridge模式

这个模式会为每个容器分配、设置IP等,并将容器连接到一个docker虚拟网桥,通过docker0虚拟网桥及iptables的nat表配置与宿主机通信,当docker进程启动时,会在主机创建一个名为docker0的虚拟网桥,此主机上启动的docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在一个二层网络中。

从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡vetj pair设备,Docker讲veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中,可以通过brctl show命令查看

bridge模式是docker的默认网路模式,不写-net参数,就是bridge模式。使用docker run -p时,docker实际是iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。

5.Docker自定义网络

①查看网络列表

docker network ls

②查看容器IP

docker inspect 6c4380bae87a

③自定义网络固定IP

docker run -itd –-name test1 –-network bridge –-ip 172.17.0.100 centos:latest  /bin/bash

发现这种方式会报错:只能遵守默认的分配地址方式;无法指定,状态是在创建状态上

只能先创建网络模式后,在进行指定固定IP

docker network create --subnet=172.20.0.0/16 ttnet

④网络模式内加入指定的IP地址

docker run -itd --name centos-t1 --net ttnet --ip 172.20.0.100 centos:latest /bin/bash

6.暴露端口

docker run -itd nginx:latest /bin/bash

打开Nginx容器后通过浏览器打不开网页

①指定端口

docker run -itd -p 1234:80 nginx /bin/bash            #暴露出来的端口是1234

开启nginx

docker exec -it 0c2ee2fc128a /bin/bash -c nginx

输入ip加端口,这个ip是宿主机ip,端口是暴露出来的端口进行访问

②随机端口

docker run -itd -P nginx /bin/bash           #指定随机端口

重新开启nginx

docker exec -it 480286ada746 /bin/bash -c nginx

访问,ip还是宿主机ip,端口就是随机端口

八、Docker数据卷

1.容器文件复制

负责文件到宿主机里

docker cp /opt/abc 容器id:/opt/abc

2.添加Linux系统命令到容器里

添加的docker容器里是没有系统命令的,可以手动添加

docker run -itd –name centos-1 –privileged=true centos:7 /sbin/init

在去用系统命令就可以

3.免交互在容器进行操作

docker exec -it centos-1 /bin/bash -c “mkdir /abc”

docker exec -it centos-1 /bin/bash -c "ls"

4.数据卷

数据卷是一个提供容器使用的特殊目录

创建数据卷

docker run -it -v /data/abc:/data –name test1 centos:7 /bin/bash

cd /data

touch 1.txt

去宿主机查看

5.数据卷容器

就是一个普通的容器,实现荣期间的互联互通

①数据卷

docker run -it --name web1 -v /data1 -v /data2 centos:7 /bin/bash

②新容器挂载web1

docker run -it --name db1 --volumes-from web1 centos:7 /bin/bash

③测试

创建文件测试

容器web1

cd /data1

touch 1.txt

echo “this is test” > 1.txt

在新容器db1查看

6.容器互联(使用centos镜像)

docker run -itd -P --name web1 centos:7 /bin/bash

#创建并运行容器取名web1,端口号自动映射

docker run -itd -P --name web1 centos:7 /bin/bash

#创建并运行容器取名web2,链接到web1和其通信 –link:打通隧道

各自下载ifconfig的工具:yum install -y net-tools

web1:

web2:

像redis哨兵模式就需要用到

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值