Docker(容器虚拟化技术 )

1.docker

        Docker是开源的Linux软件,是一个帮助解决如何安装、拆卸、升级、分发、信任和管理软件的工具,任何使用Docker的软件其实是在一个容器内运行。rkt(rock-it)也是一个运行容器的平台,它使用的是OCI镜像,也可以运行在常规的Docker容器镜像。

2.容器

        运行Docker可以认为是在用户空间运行的两个程序(Docker守护进程和Docker CLI(用户交互))。容器是以Docker守护程序的子进程运行,封装在容器中,并授权其在自身用户空间储存子空间中 运行。容器之间是相互隔离的(如文件系统内)。

3.镜像

         3.1 使用Docker分发软件,实际就是分发镜像。镜像理解为一个只读的文件包。镜像可以创建容器。镜像在Docker生态系统中是可交付的基本单元。

        3.2 镜像分层(每一层可以被不同镜像重用):镜像不是一个大的二进制块,而是由多层组成的。不同的镜像可能会共享分才层,这会让储存和传输变得高效。例如node:7镜像,所有组成的基础镜像只会被储存一次,Docker会加载每一层,一些分层已经储存在机器上了,它就会只下载未被储存的分层。

4.命令

1. service docker start 启动docker

2.docker run(运行容器)--volume 路径(定义挂载点)--volume-from 容器名(复制该容器卷的定义)     -d/--detach(后台运行) -it(对容器保持stdin打开,容器分配虚拟终端) --name web(容器id)-p 3000:3000(本机端口:容器端口)  -P(自动映射端口)  --network 网络名 --network-alias 网络别名  --link web:web(单向这个容器访问web容器 :号后标识内部访问) nginx:latest(镜像名称)

docker create -e (注入环境参数)WS=fd 镜像名 镜像创建容器

docker ps -a(查看所有容器) 查看正在运行的容器

docker start/restart/stop 容器名字 重启/停止容器

docker rm -f 删除正在运行中容器 -l 删除容器的连接,保留容器 -v 删除容器过载的数据卷

docker export -o test.tar 容器名

docker import 文件 - 镜像名:标签

docker inspect -f '{{.State.Running/Pid}}' 容器名字 查看容器元数据

docker cp ./some_file CONTAINER:/work 本机到容器

docker cp CONTAINER:/var/logs/ /tmp/app_logs 容器到本机

docker logs wp 查看容器日志

docker top web 查看容器进程

docker exec web sh命令(kill pid) 在容器中执行命令 |docker exec -it  web /bin/bash(或bash) 进入容器

dokcer build -t(镜像名称)  getting-started

docker rm -f web 删除容器(停止)

docker stop web 停止容器

docker rm -vf $(docker ps -qa) 删除所有容器(包括运行的容器)

镜像操作

docker  -a 拉取所有镜像标签 --username/--password/--registry-token/--secret/--socket pull/search 镜像名,例如 docker pull ubuntu:14.0

docker images 查看所有镜像

docker rmi 删除镜像

docker tag myimage:tag myimage:newtag 

docker tag registry:2 localhost:5000/distribution 创建镜像

docker tag registry:2 YOUR_USER_NAME/registry:2  (tag时,镜像id不变)

docker commit -m -a  容器  镜像  提交修改的容器镜像(基于已经镜像的容器)

docker history 镜像:tag 查看镜像历史

docker stats 查看容器内存

docker login -u YOUR-USER-NAME    

5.仓库

        5.1 仓库名由该镜像所在主机、拥有该镜像的用户账号和一个简短的名称组成。例如:qua.io/dockeruer/che_hello_registry。仓库储存镜像。

        5.2 启动私有仓库服务,对外暴露5000 docker run -d -p 5000:5000 --restart=always(开机自启) --name local-registry(容器名字) registry:2(镜像)

        查看私有仓库的镜像:curl -X GET http://localhost:5000/v2/_catalog

        上传私有仓库,需要镜像重命名。docker tag tutum/lamp 127.0.0.1:5000/tutum/lamp:v1(v1镜像tag)

6.镜像文件

       6.1 镜像很小时。docker save -O myfile.tar 镜像名(导出镜像文件)

                加载镜像文件 docker load -i myfile.tar

       6.2 Dockerfile 文件构建镜像 dockerfile

                 ENTRYPOINT 定义容器启动时被调用的可执行程序 CMD 指定传递给ENTRTPOINT的参数。ENTRYPOINT ["",""] 和 ENTRYPOINT node app.js区别在于shell的使用

              docker build -t docker1:list -f ./dockerfile .

        6.3 /etc/docker/daemon.json文件,下载慢 修改镜像"https://ooq07srv.mirror.aliyuncs.com"或
  "https://registry.cn-hangzhou.aliyuncs.com"

        一旦图层发生更改,所有下游图层也必须重新创建

7.储存卷

        卷是保存Docker 容器中数据的首选机制。虽然绑定挂载依赖于主机的目录结构,但是卷完全有Docker管理。

        管理数据两种方式:1.数据卷:容器内数据直接映射到本地主机环境。2.数据卷容器:使用特定容器维护数据卷。

        1.利用 docker run  --name 容器  -v /webapp  tranining/webapp python app.py 创建容器同时创建数据卷挂在到容器的/webapp目录2. -v /src/webapp:/opt/webapp:ro 主机目录作为数据卷。容器对数据卷只读(rw可以读写)3. -v ~/.bash_history:/.bash_history  本机文件作为数据卷(不推荐。建议挂载文件所在目录)

         2. 数据卷容器,也就是个容器。专门提供数据卷供其他容器挂载。用户需要在多个容器间共享一些持续更新的数据。创建一个名为dbdata数据卷容器并挂载容器目录/dbdata, docker run -it -v /dbdata --name dbdata ubuntu。创建db1容器和db2容器使用--volumes-from来挂载dbdata容器中的数据卷。docker run -it --volumes-from dbdata --name db1 ubuntu。docker run -it --volumes-from dbdata --name db2 ubuntu。备份 docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata。恢复 docker run -v /dbdata -name dbdata2 ubuntu /bin/bash,docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar -C /dbdata

        3. -p 5000:5000。-p 127.0.0.1:5000:5000 本机地址固定端口。-p 127.0.0.1::5000 本机地址随机端口

        储存卷是容器目录树上的挂载点。类型有两种:绑定挂载存储卷(使用的是用户提供的主机目录或文件)bind,管理储存卷(由Docker守护进程控制的位置)volume        

        创建储存卷 todo-db, 用参数进行挂载  -v todo-db:/etc/todo (结果 "Source": "/var/lib/docker/volumes/todo-db/_data","Destination": "/etc/todo",) 。Source 为宿主机目录。  Destination 为容器内目录。挂载储存卷的作用持久化数据。例如,进入容器的/etc/todo,touch一个文件(在宿主机/var/lib/docker/volumes/todo-db/_data,会自动生成这个文件),退出容器后删除该容器。最后查看宿主机的/var/lib/docker/volumes/todo-db/_data目录依然文件存在。

docker volume create todo-db
docker volume inspect todo-db 查看数据卷位置
docker run -dp --mount type=volume,src=todo-db,target=/etc/todos unbutu

8.Docker网络

        连接Docker网络,需要经过Docker 0虚拟网桥接口路由到容器虚拟接口。包括单主机虚拟网络和多主机虚拟网络。由强到弱Closed容器(容器进程只能访问本地环路。 --net none),Briged容器,Joined容器,Open容器。

        用户自定义桥接网络

               docker 使用特定工具来管理底层网络基础设施(如在linux上配置iptables规则)

               docker  network  create/ls/rm/inspect 桥接网络名(查看/删除/查看/connect/disconnect 网络名 容器id )

               mysql 连接示例:

docker run -d `
     --network todo-app --network-alias mysql `
     -v todo-mysql-data:/var/lib/mysql `
     -e MYSQL_ROOT_PASSWORD=secret `
     -e MYSQL_DATABASE=todos `
     mysql:8.0
docker run -dp 3000:3000 \
   -w /app -v "$(pwd):/app" \
   --network todo-app \
   -e MYSQL_HOST=mysql \
   -e MYSQL_USER=root \
   -e MYSQL_PASSWORD=secret \
   -e MYSQL_DB=todos \
   node:18-alpine \
   sh -c "yarn install && yarn run dev"

              docker主机默认有none,host,bridge网络。且不能被删除。初始化Swarm时,自动创建名为docker_gwbridge(bridge)和ingress(overlay)网络。

             使用 docker network ls 命令

  NETWORK ID          NAME                DRIVER              SCOPE
1475f03fbecb        bridge              bridge              local
e2d8a4bd86cb        docker_gwbridge     bridge              local
407c477060e7        host                host                local
f4zr3zrswlyg        ingress             overlay             swarm
c97909a4b198        none                null                local

            网络驱动都有自己的scope。swarm在某一节点创建,集群全部节点都可以共享,且id相同。local 则在每个节点有唯一的id。每个节点间网络是隔离的。

            网络驱动程序:1.Docker网络驱动程序 提供了使网络工作的实际实现。它们是可插拔的。多个网络驱动程序可以在给定的Docker引擎或集群上同时使用,但每个Docker网络只能通过单个网络驱动程序实例化。细分内置网络驱动程序,插件网络驱动程序。2.IPAM驱动程序 Docker有一个内置的IP地址管理驱动程序,如果未指定网络和端点,则为它们提供默认子网或IP地址。IP地址也可以通过网络、容器和服务创建命令手动分配。还存在提供与现有IPAM工具集成的插件。

            内置网络驱动程序——内置网络驱动是Docker引擎的本地部分。如Overlay或Bridge,None,Host,MacVLAN。
            插件网络驱动程序——插件网络驱动是由社区和其他供应商创建的网络驱动程序。Contiv: 由思科系统公司领导的一个开源网络插件,为多租户微服务部署提供基础设施和安全策略。Contiv还为非容器工作负载和物理网络(如ACI)提供集成。weave:一个网络插件,用于创建跨多个主机或云连接Docker容器的虚拟网络。Weave提供应用程序的自动发现,可以在部分连接的网络上运行,不需要外部集群存储,并且操作友好。calico:calico是云数据中心虚拟网络的开源解决方案。它针对的是大多数工作负载(虚拟机、容器或裸机服务器)只需要IP连接的数据中心。Calico使用标准IP路由提供这种连接。工作负载之间的隔离,无论是根据租户所有权还是任何细粒度的策略,都是通过在承载源和目标工作负载的服务器上进行iptables编程来实现的。kuryr:作为OpenStack kuryr项目的一部分开发的网络插件。它利用OpenStack网络服务Neutron实现了Docker网络(libnetwork)远程驱动程序API。

          IPAM驱动程序——infoblox 一个开源的IPAM插件,提供与现有infoblox工具的集成。defalut   docker默认的IPAM驱动

         Docker使用Linux桥、网络名称空间、veth对、iptables网络构建块来实现其内置的CNM网络驱动程序。这些工具的组合为复杂的网络策略提供了转发规则、网络分段和管理工具。

        Linux桥是一个种网络设备,实现了在同一层网络(第二层,数据链路层)上多个网络接口之间的通信。它根据MAC地址转发流量,这些地址是通过检测流量动态学习得到的。Linux桥在许多Docker网络驱动中被广泛使用。需要注意,Linux桥不应与Docker网络驱动中的桥接(bridge)模式混淆,后者是Linux桥的一个更高层次的实现。

        Linux网络命名空间是内核中一个独立的网络堆栈,具有自己的接口、路由和防火墙规则。网络命名空间确保同一主机上的两个容器将无法相互通信,甚至无法与主机本身通信,除非配置为通过Docker网络进行通信。通常,CNM网络驱动程序为每个容器实现单独的名称空间。主机网络命名空间包含主机接口和主机路由表。此网络名称空间称为全局网络名称空间。

        虚拟以太网设备或veth是一个Linux网络接口,充当两个网络名称空间之间的连接线。veth是一个全双工链路,在每个命名空间中都有一个接口。一个接口中的流量被导向另一个接口。Docker网络驱动程序在创建Docker网络时使用veths来提供命名空间之间的显式连接。当容器连接到Docker网络时,veth的一端被放置在容器内(通常被视为ethX接口),而另一端则连接到DockerNetwork。

        iptables是本机数据包过滤系统,它是一个功能丰富的L3(网络层。ip地址和协议)/L4(端口)防火墙,为数据包标记、伪装和丢弃提供规则链。内置的Docker网络驱动程序广泛利用iptables来划分网络流量,提供主机端口映射,并标记流量以进行负载平衡决策。

        在Docker Engine主机上,默认创建名bridge的网络(driver=bridge,scope=local,Subnet=172.17.0.0/16,Gateway=172.17.0.1,com.docker.network.bridge.name: docker0)。

        运行docker run -it --name c1 busybox sh。查看c1容器接口名eth0@if15,其中eth0为逻辑接口@if15创建的15网络接口,本机对应网络接口名veth50d16d7@if14。inet=172.17.0.2/16 

        运行主机brctl show。容器c1在本机中的网络接口为veth50d16d7,使用docker0网络。

bridge name     bridge id               STP enabled     interfaces
docker0         8000.0242cf660b64       no              veth50d16d7

        Overlay。VXLAN自Linux内核3.7版,操作系统核心功能。(Layer 2)数据链路层,通过MAC地址进行寻址,提供介质访问控制,并且允许设备在同一广播域内相互通信。(Layer 3)网络层,负责在不同网络段之间路由数据包,主要依据IP地址进行寻址和路径选择。Overlay 传统的第二层(Layer 2)以太网数据帧[包括源MAC地址、目的MAC地址、类型/长度字段以及数据负载],添加上VXLAN头部[包含了一个重要的字段VNI(VXLAN Network Identifier),用于区分不同的虚拟网络],嵌入到第三层(Layer 3)的UDP报文[有源IP地址和目的IP地址,用于在IP网络中路由udp数据报]之中,实现了在三层网络架构上扩展二层网络的功能。

        

9.Docker-compose

        Compose 是一个用于定义、启动、和管理服务的工具。通常在YAML文件中定义服务和服务系统,docker-compose命令进行管理,如docker-compose up -d。

docker compose down,该命令不会删除数据卷。环境变量在Dockerfile中用$variable_name或${variable_name}表示。它们被同等对待,大括号语法通常用于解决变量名没有空格的问题。例如

FROM busybox
ENV FOO=/bar
WORKDIR ${FOO}   # exec进入目录/bar
ADD . $FOO       # ADD . /bar 添加宿主机当前目录内容到/bar。url和tar。copy只是copy
COPY \$FOO /quux # COPY $FOO /quux
RUN echo 'we are running some # of cool things'

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值