深入理解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 ,如本文章侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意

727 0 2020-07-21


分享:
icon_mrgreen.gificon_neutral.gificon_twisted.gificon_arrow.gificon_eek.gificon_smile.gificon_confused.gificon_cool.gificon_evil.gificon_biggrin.gificon_idea.gificon_redface.gificon_razz.gificon_rolleyes.gificon_wink.gificon_cry.gificon_surprised.gificon_lol.gificon_mad.gificon_sad.gificon_exclaim.gificon_question.gif
博主卡片
林里克斯 博主大人
一个致力于Linux的运维平台
运维时间
搭建这个平台,只为分享及记载自己所遇之事和难题。

现在时间 2024-04-26

今日天气
站点统计
  • 文章总数:240篇
  • 分类总数:29个
  • 评论总数:10条
  • 本站总访问量 216094 次

@奥奥

@Wong arrhenius 牛比

@MakerFace 厉害了!