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://"
一旦图层发生更改,所有下游图层也必须重新创建
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,: 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'