ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Docker

Docker

原创 Linux操作系统 作者:mi_zy 时间:2020-02-22 14:52:41 0 删除 编辑

docker学习

    容器是独立运行的一个或一组应用,以及它的运行态环境。 容器如果配置合理可以提供和宿主机基本一致的性能。 除了与硬件相关的软件,几乎都可以跑在docker上;mysql应该 用数据卷将数据写到host的硬盘上,再备份host硬盘以实现数据安全

    问题: 在网络方面, 默认docker容器是通过桥接与NAT和主机外网络通信 ,这样就出现2个问题,一个是因为是NAT,外部主机无法主动访问到容器内(除了端口映射),另外默认桥接IP是一样的,这样会出现不同主机的容器有相同的IP的情况。这样两容器更加不能通信。

*:Docker容器网络模型: https://yq.aliyun.com/articles/30328?spm=a2c4e.11153987.0.0.2ff7d422NmD07x

    解决办法: kubernetes默认使用Flannel作为overlay网络。Flannel是CoreOS 团队针对 Kubernetes 设计的一个覆盖网络(OverlayNetwork)工具,其目的在于帮助每一个使用 Kuberentes 的CoreOS 主机拥有一个完整的子网。

docker默认使用的是bridge网络模式,但每次重启容器后ip会变化自定义一个birdge网络, 支持自定义ip

docker run -itd --name nginx2 --net extnetwork --ip 172.19.0.2 nginx:latest /bin/bash  // 创建容器并固定ip

Docker CE社区版,分为stable,test,nightly,支持64位CentOS 7,要求内核版本不低于3.10;

yum install -y yun-utils device-mapper-persistent-data lvm2  //按照依赖包

yum-config-manager -add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo  //使用国内源

yum makecache fast  //生存一个缓存

yum install docker-ce   //按照

systemctl enable docker

systemctl start docker   //启动 Docker CE

vi  /etc/docker/daemon.json   //镜像加速器配置,docker info 查看配置是否成功

    {

        "registry-mirrors":[

        "https:/registry.docker-cn.com"

        ]

    }

1、镜像导出

    docker stop ID  //停止后才能导出

    docker export ID >本地文件名    //导出,tar压缩包格式

2、文件导入为镜像,机器之间移动

    cat id.tar |docker import - mycentos:7.6.1810

    docker image ls   //查看本地导入的镜像

3、 docker container rm id  //能删除中止的容器;不能删除正在运行的容器,或强制删除-f

        docker container prune   //快速 删除所有中止(stop)的容器

4、docker run --name myname centos:7.6.1810 /bin/echo 'hello word'   //容器运行后立即终止

5、docker run -i -t centos:7.6.1810 /bin/bash  //运行用户交互,-t分配伪终端pseudo-tty;-i让容器的标准输入保持打开

6、docker container start id  //启动容器

7、docker exec -it 容器id /bin/bash  //进入容器,exit后容器不会关闭;只要不删除容器,数据不会丢失。

8、 docker attach ID  //exit后,容器会自动退出

9、 docker container start/ stop/ restart id   //容器的启动,关闭,重新启动

10、docker run -d centos:7.6.1810 /bin/sh -c "ping -t 192.168.2.3"  //-d在后台运行,避免输出信息到宿主机,避免关闭终端导致容器退出。

11、docker container logs  id( centos:7.6.1810)  //查看10项的输出内容

12、docker ps  //查看docker容器运行状态

13、docker search centos     //docker仓库,官方Repository有15000多个images,注册后,push自己的镜像上去

14、docker run -d -p 5000(宿主机docker-proxy端口):5000(容器端口) --restart=always --name registry registry  //启动registry镜像的容器

15、docker tag mycentos:7.6.1810  127.0.0.1:5000/ mycentos:7.6.1810  //先打tag标记

        docker push  127.0.0.1:5000/ mycentos:7.6.1810  // 本地镜像push到私有仓库,https安全连接问题:

        vi  /etc/docker/daemon.json  添加一下内容重启服务systemctl restart docker

        {

        “insecure-registries":[

            "172.16.22.33:5000"

            ]

        }

16、curl 127.0.0.1:5000/v2/_catalog    //查看私有仓库内的镜像

17、 docker pull   127.0.0.1:5000/ mycentos:7.6.1810     //从私有仓库下载镜像

18、容器的数据持久化:

a)volumes:(/var/lib/docker/volumes/)只能docker进程管理,其它进程无法进行读写操作,docker volume create my-vol/docker volume ls/docker volume inspect my-vol(查看宿主机对应目录mountpoint:/var/lib/docker/volumes/my-vol/_data)/(启动容器挂载数据卷)docker run -d -P --name web --mount source=my-vol,target=/webapp training/webapp python app.py(-P:容器在宿主机上启动一个随机的端口, 与容器里的端口建立映射;-p 5000:5000小写p可以指定端口 映射关系) /docker volume prune(删除无主数据卷)/docker inspect 容器名称/docker rm -v(删除容器的同时移除数据卷)   

b)bind mounts:(挂载宿主机目录),除了docker之外的进程也可以任意修改。--mount type=bind,souce=/home/atc/,target=/home/atc(不指定source,target下的内容会拷贝到新建的source目录下)

19、docker logs 容器ID   //容器运行异常exited,查看日志命令

20、使用dockerfile定制镜像:每条指令构建一层,要修改的目录文件需要通过dockerfile新建一层;vi Dockerfile

        FROM nginx  //指定基础镜像

        RUN echo ‘自定义内容’>容器内的' 绝对'路径/文件名  //执行命令行命令,或 RUN ["可执行文件","参数1","参数2"]

        RUN  yum -y install curl && rm -rf /var/cahe/yum/*   //按照curl并删除不用的安装文件。

    //将本地文件复制进镜像,使用COPY,ADD指令,使用上下文指定目录让服务器端获得本地文件。

        COPY ifcfg-eth*  /etc/sysconfig/networking/  (WORKDIR指定工作目录,目标路径可以使用相对路径)

        ADD atc.tar.gz /home/atc/     //源路径为一个tar压缩文件的话,ADD指令自动解压缩tar压缩文件到目标路径。

        CMD ["sh","-c","echo $HOME"]    //指定启动容器时所运行的程序及参数,前台服务和容器关联。

        CMD ["nginx","-g","deamon off;"]  //nginx前台运行, 容器不会退出。

        ENTRYPOINT入口点设置,CMD含义发生变化,CMD的“内容”作为参数传给ENTRYPOINT指令。

    docker build -t image-name:version-tag .    (通过点. 表示当前目录,找Dockerfile构建镜像)

21、VOLUME /data   //镜像中定义匿名卷,用于持久保存镜像运行数据。

22、EXPOSE申明端口,不会开启这个端口,docker run -P时开启端口,会自动随机映射EXPOSE的端口

23、WORKDIR指定工作目录,以后各层的当前目录就被改为指定的目录。

        WORKDIR /home/atc

        ADD ["zzzz.tar.gz","."]       // 点. 表示当前目录 /home/atc

        ENV  PYPATH "/usr/python/"     //设置环境变量$ PYPATH,RUN调用v$PYTHON

        USER指定当前用户,改变之后层的执行RUN,CMD,ENTRYPOINT这类命令的身份

        HEALTHCHECK健康检查,判断容器的状态是否正常,starting---->healthy(unh ealthy)

*:CMD,ENTRYPOINT, HEALTHCHECK只可以出现一次,如果写了多个,只有最后一个生效

24、Docker的网络:

    通过“-P”或“-p”参数来指定端口映射,外部访问容器。容器只指定端口,不指定IP

    docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py  //指定udp端口

    docker port 容器ID            //查看端口映射

25、 Docker的容器互联:

    docker network create -d bridge mynet   //自定义的docker网络来连接多个容器, -d bridge/overlay

    docker run -it  --rm --name busybox1 --network mynet  busybox sh  

    docker run -it  --rm --name busybox2 --network mynet  busybox sh   //连到一个网络mynet,互通

    docker network ls   //查看网络

    ping busybox2   //容器内部网络172.23.0.1,容器互联使用名称,不用IP,ip会变化。

26、Docker编排工具docker compose 多个容器互联使用

    定义模板文件docker-compose.yml,[service,network,volume],多个容器成一个项目

    DNS服务器,network_mode:"bridge"桥接;“host”

     networks:配置容器连接的网络

27、Compose支持Linux,maxOS,windows平台,下载后直接可以运行。

YAML(Yet Another Markup Language)语言(发音 /ˈjæməl/ )是一个类似 XML、JSON 的标记性语言。使用空格作为嵌套缩进工具。通常建议使用两个空格缩进,不建议使用 tab (甚至不支持)。Compose 就是来做这个事情的,它允许用户通过一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器为一个项目(project)。

Docker-Compose只能管理当前主机上的Docker

Docker Swarm和Kubernetes是基于Dcoker的跨主机的容器管理平台,d ocker Swarm在与Kubernetes的竞争中败下阵来

28、默认情况下,容器可以建立到外部网络的连接,但是外部网络无法连接到容器,docker允许通过外部访问容器或容器之间互联来提供容器的服务。 http://blog.sina.com.cn/s/blog_a130ce010102xa17.html

29、Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法通过直接Container-IP访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即docker run创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。

a)host模式:

容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。 容器将不会虚拟出自己的网卡,配置自己的IP等,而是 使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了—— host模式时容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。

b)Container模式:

模式指定新创建的容器和已经存在的一个"容器共享"一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。

c)none模式( 该模式关闭了容器的网络功能):

Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。

d)bridge模式(docker的默认网络模式):

当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

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

bridge模式是docker的默认网络模式,不写--net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则(地址映射,端口转换。DNAT:进来的时候改变目的地址(dnat),出去的时候改变源地址(un_dnat)),实现端口转发功能。可以使用iptables -t nat -vnL查看。

overlay:

在docker1.7代码进行了重构,单独把网络部分独立出来编写,所以在docker1.8新加入的一个overlay网络模式。Docker对于网络访问的控制也是在逐渐完善。overlay网络用于连接不同机器上的docker容器,允许不同机器上的容器相互通信,同时支持对消息进行加密


二、实践实例

1、容器:6类独立用户空间,可以完全或部分隔离,如共享宿主机的UTS,NETWORK(127.0.0.1 localloop就可以通信),IPC

 *       UTS/IPC/NETWORK/PID/Mount/User&Group

https://www.missshi.cn/api/view/blog/5d08567c3b4ab21b71000007

        UTS:隔离系统的hostname以及NIS domain name。

        IPC:隔离System V IPC objects和POSIX message queuessocket就被network namespace隔离pipe好像也没必要隔离,对匿名pipe来说,只能在父子进程之间通讯,所以隔离的意义不大,而命名管道和文件系统有关,所以只要做好文件系统的隔离,命名管道也就隔离了。

         Mount namespace:用来隔离文件系统的挂载点, 使得不同的mount namespace拥有自己独立的挂载点信息。

由于ID为1的进程的特殊性,所以每个PID namespace的第一个进程的ID都是1。当这个进程运行停止后,内核将会给这个             PID:namespace里的所有其他进程发送SIGKILL信号,致使其他所有进程都停止,于是namespace被销毁掉。

        network namespace:用来隔离网络设备, IP地址, 端口等。 每个namespace将会有自己独立的网络栈,路由表,防火墙规则,socket等。 每个新的network namespace默认有一个本地环回接口,除了lo接口外,所有的其他网络设备(物理/虚拟网络接口,网桥等)只能属于一个network namespace。每个socket也只能属于一个network namespace。

*实现虚拟交换机互联,1是使用内核模拟虚拟路由器实现,2是使用内核的路由转发到物理和虚拟网卡功能(ipforward=1),3是 路由转发到物理网卡并使用SNAT+DNAT,实现多物理机上多容器间通信。4是 多物理机上多容器间通信避免地址转换的overlay方式。

https://edu.51cto.com/center/course/lesson/index?id=499722

bridge:物理网卡其实充当的是交换机,另外模拟1个虚拟网卡(连接到交换机)给host主机用。 网络模式 bridged

host:共享宿主机的网络名称空间,网络模式open;joind:链接式网络,多个容器共享其中一个容器的网络名称空间,可以使用127.0.0.1通信。

none:主机没有网络, 网络模式closed

2、host主机上ip addr显示的docker0是桥接的虚拟网卡,起交换机作用;vetheb26767@if5是和容器互联的一对网卡中的一个, @if5在容器当中的网卡, vetheb26767@是物理机上的网卡。brctl命令(yum install bridfe-utits)将容器的网卡插入 docker0(NAT桥,可以做地址转换) ;ip link show;开启内核核心转发 (ipforward=1),iptables--SNAT

访问容器的来源:

     1)同一个交换机的其它容器

     2)宿主机

     3)其它物理机或其它物理机上的容器(端口映射NAT)

3、ip netns  add r1创建网络名称空间;

    ip netns exec r1 ifconfig -a在指定名称空间执行命令;

    ip link add name veth1.1 type veth peer name veth1.2创建网卡设备对;

    ip link set veth1.2 netns r1将网卡设备对中其中一个网卡veth1.2放在r1网络名称空间;

    ip netns exec r1 ifconfig  veth1.2 192.168.1.4/24 up给 r1网络名称空间中网卡veth1.2配ip地址

    ifconfig  veth1.1 192.168.1.5/24 up给 宿主机 网卡veth1.1配ip地址,这样 r1网络名称空间中 网卡veth1.2与宿主机 网卡veth1.1这对设备就可以通信。

4、简化开发、部署-兼容异构系统:程序员在容器中写程序,制作成镜像部署在生产服务器,保持环境一致。

5、登录工作在后台的容器:

1)exec 同时结合-it 和 /bin/sh

2)attach 会导致退出的时候,自动停止容器

3)nsenter  进入名称空间:

        docker inspect -f '{{.State.Pid}}' redis   //查看已启动容器的进程pid值

        nsenter -t 6767 -u -i -n -p                   //使用nsenter进入名称空间






来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7970627/viewspace-2676754/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 航迹引接
请登录后发表评论 登录
全部评论
空管自动化,传输,对空通信

注册时间:2011-02-02

  • 博文量
    196
  • 访问量
    351741