27.构建python应用镜像-dockerfile实践项目
1.基于官方的镜像,构建python代码运行环境 dockerfile
2.运行镜像,开启一个读写的容器空间(定制操作,将代码丢进去,运行调试)
3.提交这个变化的容器层数据,提交新的镜像 docker commit
4.运行新镜像,加入参数,运行的容器可以端口映射且访问页面
5.这里还要写容器内的应用程序的启停脚本:-v 将脚本映射到容器去
--改进:镜像只提供一个运行环境,其他数据:配置文件、源码、脚本,都尽量使用-v 映射进去方便进行维护
28.容器的无状态和有状态
容器运行的nginx产生的数据可以随意丢弃,称为无状态
容器运行的数据库产的数据很重要,需要对数据持久化存储,称为有状态
dockerfile中volume参数的作用:将数据映射出来,防止运维运行忘记主动使用-v参数
29.Docker存储卷用法
volume数据卷
作用:避免重要的数据,因容器重启而丢失,避免容器不断变大,产生大朗的数据,容器最终可以提供为镜像
可以使用-v参数,主动修改 -v 宿主机:容器:权限,权限2
30.搭建nginx+centos镜像
cd /opt/dockerfile/7.9test
curl -o ./Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o ./epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo
cat >Dockerfile <<'EOF'
> FROM centos:7.9.2009
> RUN rm -rf /etc/yum.repos.d/*
> ADD *.repo /etc/yum.repos.d/
> RUN yum makecache fast \
> && yum install nginx -y \
> && yum clean all
> EXPOSE 80
> CMD ["nginx","-g","daemon off;"]
> EOF
docker bulit -t nginx .
之后 dokcer run -d -P nginx 然后访问端口发现报错403.根据 docker部署nginx报403 拍错
31.cmd、entrypoint关系
32.dockerfile的优化方案(官网里有)
33.Dockerfile多阶段构建jar包
每一个镜像,都可以作为公共镜像,让其他镜像再使用
centos + jdk环境
运行jar包,下载对应jar包,docker run -v 把jar映射到容器内 使用镜像 java -jar xxx.jar包
34.mysql为什么要加入-v 一些参数,才能容器化启动?
因为mysql容器中有entryponit中的脚本中,必须运行的时候必须要有指定的 参数才能启动
35.docker history完整信息截取
docker history -- help 有一个完全信息参数 | gerp -i +需要查询的关键信息
36.拿到镜像怎么做?
首先查询docker hub中文档,再查看该镜像的entrypoint脚本中需要指定的参数,怎么运行
37.提取容器ip格式化语法---format语法学一下
docker inspect `docker ps -aq`|grep -i IPaddress
docker inspect --format='{{.NetworkSettings.Networks.bridge.IPAddress}}' 容器名
# 简单玩法, 基于key 提取value,格式化主机名,容器ip
docker inspect --format='{{.Name}} {{.NetworkSettings.Networks.bridge.IPAddress}}' `docker ps -aq`
38.容器部署zabbix、jenkins等
39.yaml语法
基于容器化部署的应用,都是使用yaml语法
json网站格式,理解yaml格式类型(主要是字典和列表),使用工具yaml转json对应看
{ }--字典,里面每一个,就是一个元素---网站对应看
version: '3' # yaml语法版本,版本越高,支持字段就越多,得看官网文档,有有哪些字段语法
services: #定义服务,名字
myjenkins: # myenkins服务
image: 'jenkins/jenkins:latest' # 镜像名
container_name: myjenkins # 你运行容器的名字
restart: always # 容器重启策略
privileged: true # 特权化运行容器
user: root # 制定容器进程执行用户
ports:
- '8080:8080'
- '50000:50000'
volumes:
- '/linux0224_data/jenkins:/var/jenkins_home'
- '/var/run/docker.sock:/var/run/docker.sock'
- '/usr/bin/docker:/usr/bin/docker'
- '/root/.ssh:/root/.ssh'
40.docker-compse使用(注意有缩进)
1.安装 2.写docker-compose.yml 3.语法校验docker-compose.yml ,然后运行docker-compose up -d
41.私有仓库docker-harbor
1.下载harbor软件包、yaml文件
2.查看解压文件,修改相关参数 运行部署脚本
3.修改docker配置,支持非https镜像仓库
4.推送到私有镜像仓库,需要修改镜像tag,指定项目地址
5.登录docker harbor login输入账号密码才能推和拉取镜像
42.私有registry仓库,纯api形式的仓库
43.docker所有网桥信息查询
docker inspect `docker network ls -q` |grep -i '"Subnet"'
docker network ls
docker查看资源信息的命令
docker inspect image xx
docker inspect container xx
docker inspect network xx
44.docker网桥与虚拟网络接口的关系
45.docker网桥的增删改查
46.容器访问控制
容器和宿主机之间通信 宿主机和外网之前通信
容器与容器之间的通信:使用同一个网桥
47.容器通信方式
网桥模式:一般docker network ls name为bridge的是dokcer0
docker0为二层交换机,分配ip地址
-net 的参数含义(网桥有用默认的网桥,也有自创的,也有用已存在的网桥)
主机模式:容器不创建单独的网络环境,直接使用宿主机的network
none:单机无网络环境的容器,需要计算产生数据的一些服务,比如AI 深度学习纯计算服务
48.网桥创建的时候,可以使用网络工具 百度搜 子网创建器
49.brctl show 、ifconfig:br-开头的都是自建网桥、docker network ls
50.查看网桥和容器的关系,查看网桥有哪些容器使用?
docker inspect 网桥 -->查看该网桥的子网网段 和 containers中使用该网桥的容器名及ip
51.如何使用自建网桥br-X,创建一个veth接口: docker run -d -p XXX:XXX --network=该网桥id 镜像,使用该网桥就自动创建相应的虚拟网络接口
52.修改docker0网段
查看docker0信息 docker inspect bridge
docker run -it busybox --- ifconfig查看docker0网段信息
公司对容器网络环境有要求,给了ip范围,说了你们的容器的环境只能是192.168.15.0/24,去修改docker配置文件 添加zip 192.168.15.1/24
53.网络总结
1. 桥接模式(Bridge)
优点:
- 隔离性好:每个容器都有独立的网络命名空间,相互之间隔离,不会互相干扰。
- 简单易用:桥接网络是Docker的默认网络模式,无需额外配置,容器可以直接进行通信。
- 支持跨主机通信:虽然桥接模式本身主要适用于单机部署,但可以通过端口映射或Overlay网络实现跨主机通信。
- 支持端口映射:方便外部访问容器内的服务。
缺点:
- 性能损失:桥接网络需要进行网络地址转换(NAT),可能会引入一定的性能损失。
- 端口冲突:如果多个容器使用相同的端口号,可能会导致端口冲突。
- 网络隔离性限制:虽然容器间网络隔离,但容器仍可通过宿主机的网桥进行通信,这可能带来一定的安全风险。
2. 主机模式(Host)
优点:
- 性能最优:容器直接使用宿主机的网络接口和IP地址,无需进行额外的网络地址转换,性能最高。
- 简化网络配置:容器与宿主机共享网络命名空间,无需进行端口映射或网络转发配置。
- 无需网络策略:只要能访问到宿主机,就能访问到容器。
缺点:
- 安全性降低:容器与宿主机共享网络命名空间,容器可以直接访问主机上的网络资源,增加安全风险。
- 端口冲突:如果多个容器使用相同的端口号,可能会导致端口冲突。
- 隔离性差:容器不再拥有独立的网络栈,网络环境隔离性差。
3. 容器模式(Container)
优点:
- 高效通信:两个容器共享同一个网络命名空间,容器间通信非常高效,无需经过宿主机的网络栈。
- 简化配置:对于需要紧密协作的容器(如微服务架构中的容器),容器模式可以简化网络配置。
缺点:
- 隔离性差:与桥接模式一样,宿主机意外的其他主机无法访问到容器。
- 安全性问题:由于容器间共享网络命名空间,一个容器的网络安全问题可能影响到其他容器。
4. 自定义网络模式
优点:
- 高度可配置:支持各种网络驱动(如bridge、overlay、macvlan等),可以根据需要创建复杂的网络拓扑。
- 提供隔离性和安全性:通过子网、网关、DNS等配置,实现容器间的隔离和通信控制。
- 支持服务发现:在自定义网络中,容器可以通过服务名进行通信,而无需关注底层网络配置。
缺点:
- 配置复杂度较高:需要适当的网络知识来配置自定义网络。
- 可能涉及额外的网络性能开销:特别是在使用跨主机网络通信时。
5. 无网络模式(None)
优点:
- 安全性增强:容器与外部网络完全隔离,提供更高的安全性。
- 资源节省:无需为容器分配网络接口和IP地址,节省网络资源。
缺点:
- 无法进行网络通信:容器无法与外部网络或其他容器进行通信,仅适用于不需要网络连接的场景。
54.先想好命令怎么敲--->再转为yaml格式
55.如何使用docker-compose
docker-compose命令语法
教程文档:
https://yeasy.gitbook.io/docker_practice/compose/compose_file
粘贴代码使用粘贴模式 set paste
56.docker-compose部署zabbix
学习软件 sublime Text、Notepad++
把yaml格式都放到sublime Text中加入yaml格式写看,再使用vim 的粘贴模式粘贴
docker-compose容器编排后也要用docker-compose命令管理,尽量别使用docker命令管理
57.使用docker-compose部署wordpress
docker-compose -f wordpress.yml ps
docker inspect wordpress-compose_db_1
# 容器内,暴露的数据卷
"Volumes": {
"/var/lib/mysql": {}
},
# 挂在再外部的信息
},
"Mounts": [
{
"Type": "volume", # 卷的类型
"Name": "wordpress-compose_db_data",
"Source": "/var/lib/docker/volumes/wordpress-compose_db_data/_data",
"Destination": "/var/lib/mysql",
"Driver": "local",
"Mode": "rw",
"RW": true,
"Propagation": ""
}
],
# volume 类型解释
# volume 容器内的数据,映射到宿主机的 /var/lib/docker/volumes/卷的名字
# bind类型 docker run -v 宿主机目录:容器目录