ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

docker容器初识

2020-03-07 14:00:34  阅读:185  来源: 互联网

标签:容器 httpd mageedu 初识 镜像 docker Docker


部分内容摘自《马哥教育》课程,仅为学习参考

1 docker环境准备

1.1 环境准备

环境:centos7, 4C8G,500G磁盘
首先将docker-ce.repo文件下载到centos系统的/etc/yum.repo目前中(清华大学镜像)
*#wget https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo*
下载后,将repo中的地址改为baseurl=https://download.docker.com/linux/后面保持一致
技巧:可批量替换
(在vim编辑里面执行:%s@https://download.docker.com@https://mirrors.tuna.tsinghua.edu.cn/docker-ce/@)
在这里插入图片描述
测试:执行yum repolist,返回结果,正常。

1.2 安装docker

#yum install docker-ce

Docker程序环境:
环境配置文件:
/etc/sysconfig/docker-network
/etc/sysconfig/docker-storage
/etc/sysconfig/docker
Unit File:
Usr/lib/systemd/system/docker.service

Docker Registry配置文件:
/etc/container/registries.conf

Docker-ce配置文件:
/etc/docker/daemon.json
注册阿里云账号,获取加速器地址:
https://cr.console.aliyun.com/#/accelerator

1.3 docker镜像加速器

1、docker-cn,加速一般;
2、阿里云加速器
3、中国科技大学
配置加速器:
将内容写入到dameon.json中
{
“registry-mirrors”:[“https://registry.docker-cn.com”]
}
在这里插入图片描述

最后,启动docker服务
#systemctl start docker.service
测试
#docker version 查看版本,使用的Go版本等
#docker info 查看更详细信息,如存储驱动overlay等

1.4 常用命令

Docker search:搜索镜像仓库中的镜像
Docker pull :下载到本地
Docker images:列出本地的镜像
Docker create:
Docker start
Docker run
Docker attach
Docker ps
Docker logs
Docker restart
Docker stop
Docker kill
Docker rm

举例:
Docker image pull nginx:1.14-alpine #下载nginx镜像,(分层,多层下载)
Docker image pull busybox #默认下载latest,busybox最小镜像,模拟最小系统

下载之后,列出镜像的详细信息用 --no-trunc
#docker image ls --no-trunc

启动容器:
Docker container create/run --help
Docker run --name b1 -it busybox:latest,创建一个名字为b1的容器,创建完直接进入
#容器内执行ps 可以看到PID为1的是用户空间,如果用户空间挂了,容器就停止了
(在容器内创建/data/html文件夹,常见index.html文件,写入busybox httpd server.,保存退出,容器内执行httpd –f –h /data/html,,就启动了服务,根据docker inspect b1可以看到容器地址,在宿主机中访问curl 172.17.0.2容器地址可以看到服务,若停止服务,直接ctrl+c ).

 - 备注:create只创建默认不启动,run直接创建后启动

Docker kill 强制终止docker,不建议用,停止的容器是可以docker rm b1,删除动作

Docker run --name web1 -d nginx:1.14-alpine 如果本地没有该镜像,会自动去docker镜像中心去下载

由于一个容器只跑一个服务,所有启动后服务直接前台运行,并且日志不用保存文件中,直接放到控制台,直接docker logs container可以看到

安装redis容器
Docker run --name kvstore1 -d redis:4-alpine ,直接把镜像拉到本地
执行docker ps
在这里插入图片描述

交互式进入容器
Docker exec -it kvstore1 /bin/sh ,默认使用sh
1) 进行容器执行netstat -anlp可以查看到服务端口 监听等
2) 执行redis-cli可以进入登录到redis中,执行keys * 等

1.5 容器的生命周期

在这里插入图片描述

2 Docker镜像管理

2.1 Docker镜像的工作原理

Docker :码头工人

Docker Daemon docker守护进行,主机称为docker host
Docker容器启动依赖image
Docker HUB是docker默认的Registries
镜像同一个应用程序的不同版本,用标签来识别这些不同的镜像
镜像可以理解成应用程序的集装箱,码头工人负责装卸,

About Docker Images
Docker镜像含有启动容器所需要的文件系统以及内容,因此,其用于创建并启动docker容器,
采用分层构建机制,最底层为bootfs,其次为rootfs
Bootfs:用户系统引导的文件系统,包括bootloader和kernel,容器启动完成后会将其卸载以节约内存资源;
Rootfs:位于bootfs之上,表现为docker容器的根文件系统;
传统模式中,系统启动之时,内核挂载rootfs时会首先将其挂为“只读”模式,完整性自检完成后将其挂载为读写模式;
Docker中,rootfs由内核挂载为只读,而后通过联合挂载技术额外挂载一个“可写”层;

备注:创建一个容器,拥有完整的文件系统

位于下层的镜像成为父镜像(parent image),最底层的称为基础镜像(base image),最上层为“可读写”层,其下均为只读层;
在这里插入图片描述

Aufs
Advanced multi-layered unification filesystem:高级多层统一文件系统
用于为linux文件系统实现联合挂载
Aufs是之前的UnionFS的重新实现,2006年由Junjiro Okajima开发
Docker最初使用aufs作为文件系统层,它目前仍作为存储后端之一来支持;
Aufs的竞争产品是overlayfs,后者自从3.18版本开始被合并到linux内核
Docker的分层景象,除了aufs,docker还支持btrfs,devicemapper和vfs等;
在Ubuntu系统下,docker默认Ubuntu的aufs;而在centos7上用的是devicemapper;

Docker Registry (Registry 登记处,)docker 仓库
启动容器时,docker daemon会试图从本地获取相关镜像,本地镜像不存在时,将从registry中下载该镜像并保存到本地;

备注:docker registry必须是https

在这里插入图片描述

Docker Registry分类
Docker Hub :官方
Sponsor Registry:第三方,供客户和docker社区使用
Mirror Registry:只让客户使用
Vendor Registry :发布docker镜像的供应商提供的Registry
在这里插入图片描述
在这里插入图片描述

Docker hub和Github可以建立关系,如果Github有变化,docker Hub会自动拉到自己那
本机 - Github – docker Hub,

Docker pull [:]/[/]:
比如:quay.io是一个仓库,命名空间为coreos;软件为flannel,如果不指定,默认去dockerhub中下载
Docker pull quay.io/coreos/flannel:v0.10-am64
解释:docker 下载镜像,pull+哪个仓库:端口可省+命名空间

2.2 基于容器制作docker镜像

在这里插入图片描述

过程模拟:
1、 启动一个容器,容器内启动一个服务,制作成一个新的镜像
a) docker run --name b1 -it busybox:latest
b) 进入容器创建data/html目录,创建index.html,内容(去掉第一个\)<\h1> welcome busybox httpd server ,不用关闭容器
c) 在宿主机中执行docker commit -p b1
d) docker image ls 可以看到一个没有TAG的镜像
e) 可以使用docker tag打上标签,dockers tag 38baa835d452 mageedu/httpd:v0.1-1
f) docker image ls就能看到
g) 也可以对有tag的镜像进行改tag,另外一个镜像可以有多少tag
h) 删除镜像用docker image rm mageedu/httpd:v0.1-1
i) 使用docker inspect busybox(镜像名) 可以看到cmd后面是/sh,默认启动,或者nginx -g daemon off代表前台
j) 用创建好的镜像,启动一个容器 docker run --name t1 mageedu/httpd:v0.1-1,然后验证html目录是否存在,这个镜像并没有改变默认运行的命令(sh)
k) 期望容器默认运行httpd,可以在容器内用httpd –h 查看;
l) 制作修改默认运行命令的镜像docker commit -a “Mageedu mage@mage.com” -c ‘CMD [“/bin/httpd” , “-h” , “/data/html”] ’ -p b1 mageedu/httpd:v0.2 ,
m) docker image 能看到v0.2的镜像
n) 用v0.2的镜像启动一个容器
o) 然后docker inspect + 容器名,可以看到CMD中是http,直接curl +ip 可以访问
在这里插入图片描述

推送docker镜像至registry
将docker image中的镜像推送到dockerhub中(需要先注册)
帮助:docker push –help
推送步骤:
1、首先登陆,docker login -u mageedu (mageedu为dockerhub的用户名),然后输入密码
2、docker push mageedu/httpd 如果不加tag默认全推
3、如果推送的非dockerhub,比如aliyun,首先在阿里云官方找到容器镜像服务的推送地址并设置Registry登陆用户名和密码,并创建好仓库名和命名空间
在这里插入图片描述
4、docker login -u mageedu,
5、docker push registry.cn-qingdao.aliyuncs.com/mageedu/httpd

备注:远程和本地的标签必须保证一致

2.3 镜像的本地分发

将机器A的镜像传给机器B
首先,将两个镜像打包成myimage.gz
#docker save -o myimage.gz mageedu/httpd:v0.1-1 mageedu/httpd:v0.2
然后,传给机器B(保证已安装docker),在机器B中执行#docker load –i myimage.gz
最后,docker image ls可以看到分发过来的镜像

3 Docker网络Ⅰ

3.1 Docker网络模型及工作原理

六种名称空间:UTS、User、Mount、IPC、PID、NET
OVS;openvswitch 开源虚拟交换机,vxlan 流控技术,SDN等等用软件模拟网络
在这里插入图片描述
介绍:宿主机A和宿主机B内的容器通信

图一:S1和S2为一台物理机中的两个虚拟交换机,C1-C4是容器
S1和S2通信用一台docker容器作为路由器(除路由器之外还可以用NAT或者IPTABLES规则代替),如果采用路由器,实现方式为使用单独的名称空间,这个容器模拟网卡
在这里插入图片描述
图二:C5为另外一台物理机上面的容器
若C1与C5通信,各自桥接到各自的物理机,两个物理机通信即可。(把物理机当作交换机来用,物理机按照MAC转发到容器中)
在这里插入图片描述
图二:C4访问C6, C4做SNAT,C6做DNAT,效率不高,需要做两次转发;
建议方式:使用overlay network 叠加网络,

图三:C1=192.168.1.1 C5=192.168.1.5
C1-> 主机封装C1+目的地址封装,类似于隧道技术,达到C1和C5在同一个网段内通信

3.2 Docker网络模型验证

在这里插入图片描述
在这里插入图片描述

Docker网段为172.17,启动每一个容器,会自动分配一对网卡设备,一半在物理机上,一半在docker内
比如:物理机中一半,另一半在容器内,并且都关联到docker0网卡中;
在这里插入图片描述
通过#brctl show 可以看到关联关系
在这里插入图片描述

容器内查看:
在这里插入图片描述

生成虚拟网卡规则:
执行#iptables -t nat -vnL (下图)
POSTROUTING 任何接口进来,只要不从docker0地址出去,源地址172.17 都自动SNAT(docker0默认是NAT桥)
在这里插入图片描述

知识点:wget -o - -q 172.17.0.2 等同可代替curl 172.17.0.2来测试

3.3 暴露容器应用节至节点外部
访问容器的客户端来源
1、 同一个网段同一个虚拟交换机的容器(可直接访问)
2、 物理机访问(可直接访问)
3、 另外一台物理机访问容器(需要DNAT方式访问,唯一方法,容器创建的时候选择桥接,创建好DNAT规则,才可以被外部访问),(缺陷:如果本台物理机两个容器都是80端口,就会出现冲突),建议采用叠加网络(重叠网)可解决该问题。
在这里插入图片描述

共享名称空间的网络模式(部分隔离,部分共享,一般共享网络协议相关的,比如主机名,nat等)下图:
在这里插入图片描述
另外,容器可共享物理机的名称空间,这就是第二种网络类型的host,容器可以管理物理机的网络,第三种网络类型NULL,就是代表不给网卡,孤岛环境

3.4 桥接式网络管理

在创建容器的时候,可以指明网络模式(默认bridge),可以用docker network inspect bridge 查看容器使用的网络模式

3.5 配置docker进程的网络属性

指定网络模型来创建容器:
#docker run --name t1 -it --network bridge --rm busybox:latest
创建完容器exit后自动删除:下图
在这里插入图片描述

指定none网络模式:
#docker run --name t1 -it --network bridge --rm busybox:latest
在这里插入图片描述

4 Docker网络Ⅱ

4.1 网络名称空间

#ip
在这里插入图片描述
创建一个网络名称空间:
#ip netns add r1
#ip netns add r2
查看
#ip netns list
在这里插入图片描述
查看r1中的网卡
#ip netns exec r1 ifconfig -a (因为没有激活要-a,观察到只有lo 没有其他网卡)

创建网卡对(使用ip link --help)
#ip link add name veth1.1 tyep veth peer name veth1.2
#ip link show (可以看到刚刚创建的网卡) 默认down的状态
在这里插入图片描述

可以将一个设备移动到另一个网络名称空间(只能属于一个空间)
#ip link set dev veth1.2 netns r1 ,将veth1.2移动到r1网络名称空间中;
#ip netns exec r1 ip link set dev veth1.2 name eth0 ,将veth1.2名字改成eth0;
#ifconfig veth1.1 10.1.0.1/24 up 激活veth1.1 ;
#ip netns exec r1 ifconfig eth0 10.1.0.1/24 up,激活eth0;
互ping测试,结果可以通信;
将veth1.1移动到r2网络空间中
#ip link set dev veth1.1 netns r2;
#ip link show 查看已经转移
#ip netns exec r2 ifconfig veth1.1 10.1.0.3/24 up 启动
互ping测试,能通信;
IP netns功能,可以模拟物理桥 NAT等作用,再借用iptables nat等一起

4.2 主机名和容器ID

#hostname 得到的就是容器ID,默认的主机名
或者通过创建时修改
#docker run --name t1 -it --network bridge -h t1.mageedu.com --rm busybox:latest
在这里插入图片描述

也可以正常执行nslookup (默认主机DNS解析)
在这里插入图片描述
还可以指定
#docker run --name t1 -it --network bridge -h t1.mageedu.com --dns 114.114.114.114,8.8.8.8 --rm busybox:latest
在这里插入图片描述

或者添加域名
#docker run --name t1 -it --network bridge -h t1.mageedu.com --dns 114.114.114.114 --dns-search ilinux.io --rm busybox:latest
在这里插入图片描述

主机名解析
#docker run --name t1 -it --network bridge -h t1.mageedu.com --dns 114.114.114.114 --add-host www.mageedu.com:1.1.1.1 --rm busybox:latest
在这里插入图片描述

4.3 服务对外发布(端口映射)

四种暴露方式:
在这里插入图片描述
1、ContainerPort 随机端口
举例:
创建一个80端口的服务,(v0.2镜像中有httpd服务,暂时用它启动httpd)

docker run --name myweb --rm -p 80 mageedu/httpd:v0.2

然后使用docker inspect找到该容器IP,宿主机中进行测试
在这里插入图片描述
最后,找到物理机中转发到该容器的动态端口,使用iptables -t nat -vnL 或者执行#docker port myweb
在这里插入图片描述
在这里插入图片描述

在浏览器中输入http://物理机IP:9001 (由于物理机是阿里云ECS,所以公网47.92.83.209地址等同于本机的ifconfig中显示的172.26.36.33地址)
在这里插入图片描述

最后docker kill myweb ,关闭该容器

备注:以上方法为docker的服务固定端口指向物理机所有IP的固定端口上

2、ContainerPort 指定固定物理机IP的固定端口
启动一个容器,指定IP和端口
#docker run --name myweb --rm -p 172.26.36.33::80 mageedu/httpd:v0.2 (由于物理机是阿里云ECS,所以公网47.92.83.209地址等同于本机的ifconfig中显示的172.26.36.33地址)
在这里插入图片描述
执行#docker port myweb,看下映射状态
在这里插入图片描述
在这里插入图片描述

3、容器80端口与物理机80端口映射

docker run --name myweb --rm -p 80:80 mageedu/httpd:v0.2
在这里插入图片描述
在这里插入图片描述

4、容器80端口与物理机8090端口映射

#docker run --name myweb --rm -p 172.26.36.33:8090:80 mageedu/httpd:v0.2
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
总结和注意事项,暴露必须是监听的端口,可以-p暴露多次多个端口,-P(大P)代表所有容器端口映射至主机端口

5 存储卷(待续)

存储卷类型以及功能
存储卷应用
存储卷共享

标签:容器,httpd,mageedu,初识,镜像,docker,Docker
来源: https://blog.csdn.net/weixin_40308963/article/details/104713604

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有