深入理解Docker(二)
深入玩转Docker
技术
Docker 官方团队对Logo的解释:「The logo is a Whale carrying a stack of containers. It is on its way to deliver those to you」
一、什么是 Linux 容器
Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。
容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。
1.docker
如何工作
Docker
技术使用 Linux
内核和内核功能(例如 Cgroups 和 namespaces)
来分隔进程,以便各进程相互独立运行。
这种独立性正是采用容器的目的所在;它可以独立运行多种进程、多个应用程序,更加充分地发挥基础设施的作用,同时保持各个独立系统的安全性。
容器工具(包括 Docker
)可提供基于镜像的部署模式。这使得它能够轻松跨多种环境,与其依赖程序共享应用或服务组。Docker
还可在这一容器环境中自动部署应用程序(或者合并多种流程,以构建单个应用程序)。
此外,由于这些工具基于 Linux
容器构建,使得 Docker
既易于使用,又别具一格 —— 它可为用户提供前所未有的高度应用程访问权限、快速部署以及版本控制和分发能力。
2.Docker
技术是否与传统的 Linux
容器相同?
否。Docker
技术最初是基于 LXC
技术构建(大多数人都会将这一技术与“传统的” Linux 容器联系在一起
),但后来它逐渐摆脱了对这种技术的依赖。
就轻量级 虚拟化
这一功能来看,LXC
非常有用,但它无法提供出色的开发人员或用户体验。除了运行容器之外,Docker
技术还具备其他多项功能,包括简化用于构建容器、传输镜像以及控制镜像版本的流程。
传统的 Linux
容器使用 init
系统来管理多种进程。这意味着,所有应用程序都作为一个整体运行。与此相反,Docker
技术鼓励应用程序各自独立运行其进程,并提供相应工具以实现这一功能。这种精细化运作模式自有其优势。
3.docker
的目标
docker
的主要目标是"Build,Ship and Run any App,Angwhere"
,构建,运输,处处运行
- 构建:做一个docker镜像
- 运输:docker pull
- 运行:启动一个容器
每一个容器,他都有自己的文件系统rootfs
二、Dockerfile自动构建docker镜像
1.官方构建dockerffile
文件参考
https://github.com/CentOS/CentOS-Dockerfiles
2.Dockerfile
指令集
dockerfile
主要组成部分:
基础镜像信息 FROM centos:7.6
制作镜像操作指令RUN yum insatll openssh-server -y
容器启动时执行指令 CMD ["/bin/bash"]
dockerfile
常用指令:
FROM 这个镜像的妈妈是谁?(指定基础镜像)
MAINTAINER 告诉别人,谁负责养它?(指定维护者信息,可以没有)
RUN 你想让它干啥(在命令前面加上RUN即可)
ADD 给它点创业资金(COPY文件,会自动解压)
WORKDIR 我是cd,今天刚化了妆(设置当前工作目录)
VOLUME 给它一个存放行李的地方(设置卷,挂载主机目录)
EXPOSE 它要打开的门是啥(指定对外的端口)
CMD 奔跑吧,兄弟!(指定容器启动后的要干的事情)
dockerfile
其他指令:
COPY 复制文件
ENV 环境变量
ENTRYPOINT 容器启动后执行的命令
Docker 网络类型
1.docker
的网络类型
- None 不为容器配置任何网络功能,没有网络 --net=none
- Container 与另一个运行中的容器共享 Network Namespace, --net=container:containerID
- Host 与主机共享 Network Namespace, --net=host
- Bridge Docker 设计的 NAT 网络模型,默认类型
Bridge
默认docker
网络隔离基于网络命名空间,在物理机上创建docker
容器时会为每一个docker
容器分配网络命名空间,并且把容器IP
桥接到物理机的虚拟网桥上。
- 不为容器配置网络功能
此模式下创建容器是不会为容器配置任何网络参数的,如:容器网卡、IP、通信路由等,全部需要自己去配置。
$ docker run -it --network none nginx:latest /bin/bash
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
- 与其他容器共享网络配置
(Container)
此模式和host
模式很类似,只是此模式创建容器共享的是其他容器的IP和端口而不是物理机,此模式容器自身是不会配置网络和端口,创建此模式容器进去后,你会发现里边的IP
是你所指定的那个容器IP
并且端口也是共享的,而且其它还是互相隔离的,如进程等。
$ docker run -it --network container:mysql nginx:latest /bin/bash
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
105: eth0@if106: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.3/16 brd 172.18.255.255 scope global eth0
valid_lft forever preferred_lft forever
- 使用宿主机网络
此模式创建的容器没有自己独立的网络命名空间,是和物理机共享一个Network Namespace
,并且共享物理机的所有端口与IP
,并且这个模式认为是不安全的。
$ docker run -it --network host nginx:latest /bin/bash
$ docker network list
NETWORK ID NAME DRIVER SCOPE
354dd276484b blog_default bridge local
29bcc0a154e9 bridge bridge local
4d3011f66608 filerun_filerun bridge local
26f287d32282 guacamole_guacamole bridge local
60f1d35eee93 host host local
4910e0d1d145 iobroker_default bridge local
2dc582562cfb kodexplorer_kodexplorer bridge local
f989cd6eae90 nextcloud_nextcloud bridge local
f5e12ca6938b none null local
1b955f55ab0d owncloud_default bridge local
148e24e266b0 solo_default
三、使用容器的建议
- 不要以拆分方式进行应用程序发布
- 不要创建大型镜像
- 不要在单个容器中运行多个进程
- 不要再镜像内保存凭证,不要依赖IP地址
- 以非root用户运行进程
- 不要使用“最新”标签
- 不要利用运行中的容器创建镜像
- 不要使用单层镜像
- 不要将数据存放在容器内
Over~
版权协议须知!
本篇文章来源于 Uambiguous ,如本文章侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
1292 0 2020-07-21
博主卡片
运维时间
搭建这个平台,只为分享及记载自己所遇之事和难题。
现在时间 2025-01-17
今日天气
随机推荐
站点统计
- 文章总数:241篇
- 分类总数:29个
- 评论总数:14条
- 本站总访问量 365234 次
@svmuvwpuqi 真棒!
@smdxydrauu 博主太厉害了!
@xiaozi 最后的分享的镜像下载地址打不开 服务器没有开机吗?
@yuanyuan 为什么我的4b安装centos7.9 插上tf卡 显示不兼...
@Wong arrhenius 牛比
@MakerFace 厉害了!
@TongSir 老哥 更新下我的友链链接 https://blog.ton...