1、docker 数据管理-v
1.1 Docker容器的分层
容器的层,只有最上层能写,其他都是可读!!!
容器的数据分层目录:
- LowerDir: 镜像层,即镜像本身,只读
- UpperDir:容器的最上层,可读写 ,容器变化的数据存放在此处
- MergedDir:容器的文件系统,使用Union FS(联合文件系统)将lowerdir 和 upperdir 合并完成后给容器使用,最终呈现给用户的统一视图
- WorkDir:容器在宿主机的工作目录,挂载后内容会被清空,且在使用过程中其内容用户不可见
查看指定容器数据分层: ⭐
docker inspect 镜像名:tag版本
通过docker inspect命令,可以看到上面这个界面的信息
1.2 容器数据持久保存方式
数据永久保存,是将容器中的数据保存到宿主机的指定目录
Docker的数据类型分为两种:
- 数据卷( Data Volume): 直接将宿主机目录挂载至容器的指定的目录 ,推荐使用此种方式,此方式较常用
- 数据卷容器(Data Volume Container): 间接使用宿主机空间,数据卷容器是将宿主机的目录挂载至一个专门的数据卷容器,然后让其他容器通过数据卷容器读写宿主机的数据 ,此方式不常用
1.3 数据卷的三种方式:
启动容器时,可以指定使用数据卷实现容器数据的持久化,有三种方法:
- 指定宿主机目录或文件: (挂载)。指定宿主机的具体路径和容器路径的挂载关系 容器和真机共用空间,把容器的文件挂载到 真机的文件夹
- 匿名卷: 不指定数据名称,只指定容器内目录路径充当挂载点,docker自动指定宿主机的路径进行挂载 在/var/lib下面
- 命名卷: 指定数据卷的名称和容器路径的挂载关系 和匿名卷在一个位置,只是可以自定义名称
docker run 命令的以下格式可以实现数据卷
选项 | 含义 |
---|---|
-v | 把容器里的文件夹,挂载到真机 |
-v, --volume=[host-src:]container-dest[:<options>]
<options>
ro 从容器内对此数据卷是只读,不写此项默认为可读可写
rw 从容器内对此数据卷可读可写,此为默认值
注意: 一般只建议在创建容器时进行挂载,不建议启动容器后再挂载。因为启动容器后再挂载的话,需要修改配置文件,且不一定能挂载成功。
1.3.1 指定宿主机目录或文件
格式:
-v <宿主机绝对路径的目录或文件>:<容器目录或文件>[:ro] //将宿主机目录挂载容器目录,两个目录都可自动创建
示例:
docker run -it --name wxy -v /data/:/opt centos:7
拆解:
1、docker run -it //交互进入docker容器
2、--name wxy //指定容器名为wxy
3、-v /data/:/opt //真机中的/data/,对应挂载到容器中的/opt,实现主机和容器之间的文件共享。
4、centos:7 //指定使用centos7版本的镜像,来创建容器
小拓展:为什么必须是宿主机的绝对路径?
在执行docker run命令时,使用-v本地目录:容器内目录
,可以完成本地目录挂载。本地目录必须以/
或./
开头,如果直接以名称开头,会被识别为数据卷,而非本地目录
-v mysql:/var/lib/mysql
会被识别为一个数据卷叫mysql-v ./mysql:/var/lib/mysql
会被识别为当前目录下的mysql目录
1.3.2 匿名卷(基本不用)
匿名卷作用:把容器里的文件夹挂载到真机 名称很长
只指定容器内路径,没有指定宿主机路径信息,宿主机自动生成/var/lib/docker/volumes/<卷ID>/_data
目录,并挂载至容器指定路径
格式:
-v <容器内路径>
示例:
docker run -d --name nginx -v /etc/nginx nginx
拆解:
--name nginx //指定容器名为nginx
nginx //最后的nginx是镜像的名称
1.3.3 命名卷⭐
命名卷将固定的存放在/var/lib/docker/volumes/<卷名>/_data
格式:
-v <卷名>:<容器目录路径>
可以通过以下命令事先创建,如果没有 事先创建卷名,docker run时也会自动创建卷
docker volume create <卷名>
这步可以省略!!!
示例:
docker run -d -p 80:80 --name cxk -v vol1:/usr/share/nginx/html nginx
拆解:
-p 80:80 //将容器的80端口映射到主机的80端口
-v vol1:/usr/share/nginx/html //挂载到容器的/usr/share/nginx/html目录
nginx //运行的镜像
docker rm 的 -v 选项可以删除容器时,同时删除相关联的匿名卷
-v, --volumes Remove the volumes associated with the container
管理卷
联合文件系统:只有最顶层的可以读写,其他都是可读
1.4 管理卷的操作
docker volume 命令 | 含义 |
---|---|
docker volume create | 创建卷 |
docker volume inspect | 显示一个卷或多个卷的详细信息 |
docker volume ls | 查看卷的列表,列出卷 |
docker volume prune | 删除所有匿名卷 |
docker volume rm | 删除一个或多个卷 |
1.5 容器服务器数据卷
两个容器共用一个数据卷:多个容器通过同一个数据卷容器为基点,实现所有容器数据共享
wxy2把自己的数据卷 共享给wxy3
`运行一个wxy2的容器:`
[root@7-2 data]# docker run -it --name wxy2 -v /data/test/:/usr/share/nginx/html nginx:1.18 bash //运行一个命名为wxy2的容器,并将主机的/data/test,挂载到容器中的/usr/share/nginx/html
root@451e180c8d07:/# cd /mnt
root@451e180c8d07:/mnt# echo "test page " > index.html
`运行一个wxy3的容器:`
[root@7-2 ~]# docker run -d --name wxy3 --volumes-from wxy2 -p 80:80 nginx:1.18 //选项用于在Docker容器之间共享卷(volume)。通过该选项,可以让一个容器共享另一个容器的卷,从而实现数据共享和持久化
[root@7-2 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8a2af91c5b9e nginx:1.18 "/docker-entrypoint.…" 6 minutes ago Up 6 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp wxy3
440667ef5320 nginx:1.18 "/docker-entrypoint.…" 6 minutes ago Up 6 minutes 80/tcp wxy2
[root@7-2 ~]# docker inspect 8a2af91c5b9e //查看详细信息,找到对应的ip地址
"IPAddress": "172.17.0.2",
[root@7-2 ~]# curl 172.17.0.2
2、docker 网络管理--network
下图中,docker0就是网桥,类似于网关或者路由器,能让两个不同网段进行互通。网桥就是把多块网卡合成一块网卡
这是容器产生的虚拟网卡,所以这个网桥是虚拟的网桥技术,不是物理的网桥
2.1 创建容器后的网络配置
每次新建容器后
- 宿主机多了一个虚拟网卡,和容器的网卡组合成一个网卡,比如: 137: veth8ca6d43@if136,而在容器内的网卡名为136,可以看出和宿主机的网卡之间的关联
- 容器会自动获取一个172.17.0.0/16网段的随机地址,默认从172.17.0.2开始,第二次容器为172.17.0.3,以此类推
- 容器获取的地址并不固定, 每次容器重启,可能会发生地址变化
同一个宿主机的不同容器之间 可以相互通信,但不同主机之间的容器 一辈子也通不了!!!
2.2 修改默认网络设置docker0
新建容器默认使用的是docker0的网络配置,但是可以自定义修改,修改默认指向自定义的网桥网络
示例:用自定义的网桥代替默认的docker0
- 新建网桥
[root@7-2 ~]# brctl show //查看网桥
bridge name bridge id STP enabled interfaces
docker0 8000.0242cb5f2fec no veth15707c1
vethaa87210
virbr0 8000.525400d8f922 yes virbr0-nic
[root@7-2 ~]# brctl addbr docker1 //添加docker1网卡
[root@7-2 ~]# ip a a 192.168.1.1/24 dev docker1 //ip a a全称是ip address add,给网桥设置地址
- 修改service 文件
[root@7-2 ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -b docker1 //在启动命令行加入 -b docker1
- 重启服务
[root@7-2 ~]# systemctl daemon-reload
[root@7-2 ~]# systemctl restart docker
- 进入容器
[root@7-2 ~]# docker run -it centos:7
[root@81e71933fef2 /]# ifconfig
bash: ifconfig: command not found
[root@81e71933fef2 /]# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
192.168.1.3 81e71933fef2
2.3 修改docker 0 默认的网段
[root@7-2 ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -bip 192.168.2.1/24
# 在启动命令行加入 -b docker1
[root@7-2 ~]# systemctl daemon-reload
[root@7-2 ~]# systemctl restart docker
2.4 容器间名称互联
新建容器时,docker会自动分配容器名称,容器ID和IP地址,导致容器名称,容器ID和IP都不固定,那么如何区分不同的容器,实现和确定目标容器的通信呢?解决方案是给容器起个固定的名称,容器之间通过固定名称实现确定目标的通信
有两种固定名称:
- 容器名称
- 容器名称的别名
docker run 创建容器,可使用--link
选项实现容器名称的引用
docker run --name <容器名称> //先创建指定名称的容器
docker run --link <目标通信的容器ID或容器名称> //再创建容器时引用上面容器的名称
2.5 docker的网络模式 --network
- host
- container
- none
- bridge:网桥,是默认的网络模式
- network-name:自定义网络
使用 docker network ls 命令查看默认的网络模式
2.5.1 自定义网络模式
默认新建的容器使用Bridge模式,创建容器时,docker run 命令使用以下选项指定网络模式
docker run --network=<mode>
docker run --net=<mode>
<mode>: 可以指定以下值
none
bridge
host
container:<容器名或容器ID>
<自定义网络名称>
示例:
docker run -d --name wxy --network host|container|bridge|none nginx:1.18
2.5.2 bridge 网桥模式
bridge网桥模式,是默认的docker网络模式!!!
可用于和外部网络之间进行通信,通过SNAT访问外网,使用DNAT可以让容器被外部主机访问,所以此模式也称为NAT模式。
bridge网络模式特点:
- 网络资源隔离: 不同宿主机的容器无法直接通信,各自使用独立网络
- 无需手动配置: 容器默认自动获取172.17.0.0/16的IP地址,此地址可以修改
- 可访问外网: 利用宿主机的物理网卡,SNAT连接外网
- 外部主机无法直接访问容器: 可以通过配置DNAT接受外网的访问
- 低性能较低: 因为通过NAT,网络转换带来更多的损耗
- 端口管理繁琐: 每个容器必须手动指定唯一的端口,容器产生端口冲容
注意:使用此模式 一定要开启路由转发:net.ipv4.ip_forward⭐⭐⭐!!!!!
修改默认的bridge模式网络配置:
[root@localhost ~]#vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"], //指定了Docker镜像的镜像加速地址,Docker将会从这个镜像地址加速器下载镜像
"bip": "192.168.100.100/24", //指定了Docker守护进程使用的网桥的IP地址和子网掩码
"fixed-cidr": "192.168.100.128/26", //用于配置Docker守护进程的固定CIDR地址,指定了Docker守护进程的固定CIDR地址范围
"default-gateway": "192.168.100.200" //指定了Docker守护进程使用的默认网关地址。容器将使用这个默认网关来访问外部网络
}
//注意每一行结尾加,逗号 最后一行不用加
为什么要开启路由转发:因为容器的网段和宿主机的网段不同,不同网段之间无法通信,而开启了路由转发,相当于设置了一个静态路由,路由的作用就是让不同网段之间的主机,进行通信!!!
小拓展1:路由转发、路由表、静态路由之间的关系:
- 开启路由转发是使设备能够执行路由功能的前提条件。如果路由转发未开启,即使路由表中有相应的路由规则,设备也不会转发数据包。
- 路由表是路由转发功能所依赖的数据结构,路由转发根据路由表中的信息来决定数据包的去向。
- 静态路由是路由表中的一种条目类型,它们是网络管理员为了特定目的而手动添加的。没有静态路由,路由表可能只包含由操作系统自动生成的直接路由或通过动态路由协议学习到的路由。
总结来说,开启路由转发是使设备能够转发数据包的基础,路由表提供了数据包传输的具体路径信息,而静态路由是管理员为了特定目的手动添加到路由表中的固定路径规则。这三者共同工作,确保网络中的设备能够找到正确的路径来转发数据包。
小拓展2:静态路由和动态路由的区别
- 静态路由需要手动添加,不够灵活
- 动态路由可以根据网络中的信息,自动生成,扩展性好
2.5.3 host模式
如果指定host模式启动容器,那么新创建的容器不会创建自己的虚拟网卡,而是直接使用宿主机的网卡和IP地址,因此在容器里面查看到的IP信息就是宿主机的信息,访问容器的时候直接使用 宿主机IP+容器端口 即可,不过容器内除网络以外的其它资源,如: 文件系统、系统进程等 仍然和宿主机保持隔离。
此模式由于直接使用宿主机的网络无需转换,网络性能最高,但是各容器内使用的端口不能相同,适用于运行容器端口比较固定的业务。
Host 网络模式特点:
- 使用参数 --network host 指定
- 共享宿主机网络
- 网络性能无损耗
- 网络故障排除相对简单
- 各容器网络无隔离
- 网络资源无法分别统计
- 端口管理困难:容易产生端口冲突
- 不支持端口映射
示例:
docker run -d --network host --name web1 nginx
2.5.4 none模式
在使用none 模式后,Docker 容器不会进行任何网络配置,没有网卡、没有IP也没有路由,因此默认无法与外界通信,需要手动添加网卡配置IP等,所以极少使用。
none模式特点:
- 使用参数 --network none 指定
- 默认无网络功能,无法和外部通信
示例:
docker run -it --network none centos:7
2.5.5 container模式
使用此模式创建的容器需指定和一个已经存在的容器共享一个网络,而不是和宿主机共享网, 新创建的容器不会创建自己的网卡也不会配置自己的IP,而是和一个被指定的已经存在的容器共享IP和端口范围,因此这个容器的端口不能和被指定容器的端口冲突,除了网络之外的文件系统、进程信息等仍然保持相互隔离,两个容器的进程可以通过lo网卡进行通信。
Container 模式特点:
- 使用参数
–-network container:名称或ID
指定 - 与宿主机网络空间隔离
- 空器间共享网络空间
- 适合频繁的容器间的网络通信
- 直接使用对方的网络,较少使用
docker run -d --name wxy --network container:web1 nginx:1.18
3、docker仓库管理——harbor
harbor,中文意思是港口。harbor是让别的客户进行访问的
compose是单机部署harbor的软件!!!
本章节的目的:是把软件装好,然后可以上传下载镜像
3.1 镜像仓库Registry
统一保存镜像而且是多个不同镜像版本的地方,叫做镜像仓库
- Docker hub: docker官方的公共仓库,已经保存了大量的常用镜像,可以方便大家直接使用
- 阿里云,网易等第三方镜像的公共仓库
- Image registry: docker 官方提供的私有仓库部署工具,无图形化界面,管理起来较为复杂,目前使用较少
- Harbor: vmware 提供的自带web界面自带认证功能的镜像私有仓库,目前有很多公司使用
3.2 Harbor 特性
1、基于角色控制:用户和仓库都是基于项目进行组织的,而用户在项目中可以拥有不同的权限。
2、基于镜像的复制策略:镜像可以在多个Harbor实例之间进行复制(同步)。
3、支持 LDAP/AD:Harbor 可以集成企业内部已有的 AD/LDAP(类似数据库的一张表),用于对已经存在的用户认证和管理。
4、镜像删除和垃圾回收:镜像可以被删除,也可以回收镜像占用的空间。
5、图形化用户界面:用户可以通过浏览器来浏览,搜索镜像仓库以及对项目进行管理。
6、审计管理:所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
7、支持 RESTful API:RESTful API 提供给管理员对于 Harbor 更多的操控, 使得与其它管理软件集成变得更容易。
8、Harbor和docker registry的关系:Harbor实质上是对docker registry做了封装,扩展了自己的业务模板。
3.3 Harbor 构成
Harbor 在架构上主要有 Proxy、Registry、Core services、Database(Harbor-db)、Log collector(Harbor-log)、Job services 共6大组件。
-
Proxy
: 代理。是一个 nginx 的前端代理,Harbor 的 Registry、UI、Token 服务等组件, 都处在 nginx 反向代理后边。 该代理将来自浏览器、docker clients 的请求转发到后端不同的服务上。 -
Registry
: 仓库。负责储存 Docker 镜像,并处理 Docker push/pull 命令。由于要对用户进行访问控制, 即不同用户对 Docker 镜像 有不同的读写权限,Registry 会指向一个 Token 服务, 强制用户的每次 Docker pull/push 请求都要携带一个合法的 Token, Registry 会通过公钥对 Token 进行解密验证。 -
Core services
: 核心服务。Harbor的核心功能,主要提供以下3个服务:UI(harbor-ui)
: 提供图形化界面,帮助用户管理 Registry 上的镜像(image), 并对用户进行授权。WebHook
:为了及时获取Registry 上image 状态变化的情况,在Registry 上配置 Webhook,把状态变化传递给 UI 模块。Token 服务
:负责根据用户权限给每个 Docker push/pull 命令签发 Token。Docker 客户端向 Registry 服务发起的请求, 如果不包含 Token,会被重定向到 Token 服务,获得 Token 后再重新向 Registry 进行请求。
-
Database(harbor-db)
:数据库。为core services提供数据库服务,负责储存用户权限、审计日志、Docker 镜像分组信息等数据。 -
Job services
: 主要用于镜像复制,本地镜像可以被同步到远程 Harbor 实例上。 -
Log collector(harbor-log)
: 日志管理。负责收集其他组件的日志到一个地方。
3.4 harbor 安装
3.4.1 安装 docker-compose 工具
先关闭防火墙:
systemctl stop firewalld
setenforce 0
******* 加载docker-compose-Linux-x86_64-1.27.4 *******
[root@localhost mnt]#ls
docker-compose-Linux-x86_64-1.27.4
[root@localhost mnt]#cp docker-compose-Linux-x86_64-1.27.4 /usr/bin/docker-compose
[root@localhost mnt]#chmod +x /usr/bin/docker-compose
[root@localhost mnt]#docker-compose version
docker-compose version 1.27.4, build 40524192
docker-py version: 4.3.1
CPython version: 3.7.7
OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
3.4.2 准备 Harbor 软件
******* 加载harbor-offline-installer-v1.2.2.tgz *******
[root@localhost data]# tar xf harbor-offline-installer-v1.2.2.tgz
3.4.3 Harbor 工具介绍
[root@localhost data]# cd harbor/
[root@localhost harbor]# ls
common docker-compose.notary.yml harbor_1_1_0_template harbor.v1.2.2.tar.gz LICENSE prepare
docker-compose.clair.yml docker-compose.yml harbor.cfg install.sh NOTICE upgrade
#拆解:
docker-compose.yml //文件编排的文本文档,依靠这个文件自动拉取镜像
3.4.4 修改 Harbor 配置文件
[root@localhost harbor]# vim harbor.cfg //修改下面两处配置
5 hostname = 192.168.125.120 //主机
59 harbor_admin_password = 123456 //密码
3.4.5 安装前准备
如果是快照还原,需先重启docker
准备配置文件
[root@localhost harbor]#./prepare //脚本,是用来检测环境的。注意:该脚本必须在当前的harbor目录中运行。因为脚本会调用docker-compose.yml文件
Generated and saved secret to file: /data/secretkey
Generated configuration file: ./common/config/nginx/nginx.conf
Generated configuration file: ./common/config/adminserver/env
Generated configuration file: ./common/config/ui/env
Generated configuration file: ./common/config/registry/config.yml
Generated configuration file: ./common/config/db/env
Generated configuration file: ./common/config/jobservice/env
Generated configuration file: ./common/config/jobservice/app.conf
Generated configuration file: ./common/config/ui/app.conf
Generated certificate, key file: ./common/config/ui/private_key.pem, cert file: ./common/config/registry/root.crt
The configuration files are ready, please use docker-compose to start the service.
3.4.6 执行安装脚本
执行脚本前将 端口号占用的 清理清理
[root@localhost harbor]#./install.sh
Creating harbor-log ... done
Creating harbor-db ... done
Creating redis ... done
Creating registryctl ... done
Creating registry ... done
Creating harbor-adminserver ... done
Creating harbor-core ... done
Creating harbor-jobservice ... done
Creating harbor-portal ... done
Creating nginx ... done
✔ ----Harbor has been installed and started successfully.----
Now you should be able to visit the admin portal at http://192.168.91.106 .
For more details, please visit https://github.com/goharbor/harbor .
[root@localhost harbor]#docker ps -a //装好之后,会多出很多容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
98d6b809adfb goharbor/nginx-photon:v1.7.6 "nginx -g 'daemon of…" 2 minutes ago Up 2 minutes (healthy) 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp, 0.0.0.0:4443->4443/tcp, :::4443->4443/tcp nginx
11e9893e9d5b goharbor/harbor-portal:v1.7.6 "nginx -g 'daemon of…" 2 minutes ago Up 2 minutes (healthy) 80/tcp harbor-portal
75c67093bdb3 goharbor/harbor-jobservice:v1.7.6 "/harbor/start.sh" 2 minutes ago Up 2 minutes harbor-jobservice
13fbbdd28084 goharbor/harbor-core:v1.7.6 "/harbor/start.sh" 2 minutes ago Up 2 minutes (healthy) harbor-core
7fd98c9ff339 goharbor/registry-photon:v2.6.2-v1.7.6 "/entrypoint.sh /etc…" 2 minutes ago Up 2 minutes (healthy) 5000/tcp registry
c6ea938cde84 goharbor/harbor-adminserver:v1.7.6 "/harbor/start.sh" 2 minutes ago Up 2 minutes (healthy) harbor-adminserver
37dee6cfb7eb goharbor/harbor-registryctl:v1.7.6 "/harbor/start.sh" 2 minutes ago Up 2 minutes (healthy) registryctl
cb4f4e1c3445 goharbor/redis-photon:v1.7.6 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 6379/tcp redis
3836bf4395b9 goharbor/harbor-db:v1.7.6 "/entrypoint.sh post…" 2 minutes ago Up 2 minutes (healthy) 5432/tcp harbor-db
e74a35ab4f00 goharbor/harbor-log:v1.7.6 "/bin/sh -c /usr/loc…" 2 minutes ago Up 2 minutes (health: starting) 127.0.0.1:1514->10514/tcp harbor-log
3.4.7 web端操作
3.4.7.1 登录
用户名: admin 密码: 123456
3.4.7.2 新建项目
3.4.7.3 命令行登录
- 默认是走https协议, 无法登录
[root@7-2 data]# docker login 192.168.125.120
Username: admin
Password: 123456
Error response from daemon: Get "https://192.168.125.120/v2/": dial tcp 192.168.125.120:443: connect: connection refused //会报错
- 需要修改 service 文件
建议换一台电脑,刚才使用的7-2,可以换成7-3:
[root@localhost ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 192.168.125.120 --insecure-registry 192.168.125.130
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
[root@localhost ~]# docker login 192.168.125.120
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@localhost ~]# cat /root/.docker/config.json
{
"auths": {
"192.168.125.120": {
"auth": "YWRtaW46MTIzNDU2"
}
}
3.4.7.4 测试上传仓库
[root@localhost ~]# docker pull nginx:1.18
#下载镜像
- 打上标签
[root@7-3 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox-httpd v1.0 0cd460acb7db 9 days ago 1.24MB
busybox latest beae173ccac6 2 years ago 1.24MB
centos latest 5d0da3dc9764 2 years ago 231MB
nginx 1.18 c2c45d506085 3 years ago 133MB
[root@7-3 ~]# docker tag c2c45d506085 192.168.125.120/wxy/nginx:1.18 //tag打标签
[root@7-3 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox-httpd v1.0 0cd460acb7db 9 days ago 1.24MB
busybox latest beae173ccac6 2 years ago 1.24MB
centos latest 5d0da3dc9764 2 years ago 231MB
192.168.125.120/wxy/nginx 1.18 c2c45d506085 3 years ago 133MB
nginx 1.18 c2c45d506085 3 years ago 133MB
- 上传
[root@7-3 ~]# docker push 192.168.125.120/wxy/nginx:1.18
The push refers to repository [192.168.125.120/wxy/nginx]
4fa6704c8474: Pushed
4fe7d87c8e14: Pushed
6fcbf7acaafd: Pushed
f3fdf88f1cb7: Pushed
7e718b9c0c8c: Pushed
1.18: digest: sha256:9b0fc8e09ae1abb0144ce57018fc1e13d23abd108540f135dc83c0ed661081cf size: 1362
4、docker-compose 单机编排工具
容器的核心在于编排,也就是批量操作
常见的编排工具有:K8S、compose、openstack(华为用的这个工具的二开)
- docker-compose 是单机编排
- k8s 是多机编排
k8s是很好的编排软件,但是构建镜像还是要使用dockerfile,这个没办法使用k8s!!!
4.1 docker-compose 作用
如果说docker命令就像linux的命令,那么docker-compse就像shell脚本,可以自动的执行容器批量操作,从而实现自动化的容器管理;或者说docker命令相当于ansible命令,那么docker compose文件,就相当于ansible-playbook的yaml文件
作用:
- 调用dockerfile,构建镜像,并且使用该镜像
- 创建容器
- 创建多个容器副本
- 删除镜像
也就是我们对容器、镜像的操作,docker-compose都可以帮我们去做。
4.2 YAML语言
docker-compose 也是用的yaml语言,k8s用的也是这种
YAML 文件格式及编写注意事项 YAML 是一种标记语言,它可以很直观的展示数据序列化格式,可读性高。 类似于 json 数据描述语言,语法比 json 简单的很多。 YAML 数据结构通过缩进来表示,连续的项目通过减号来表示, 键值对用冒号分隔,数组用中括号 [ ] 括起来, hash 用花括号 { } 括起来
yaml语言的特征:
- 大小写敏感
- 通过缩进表示层级关系
- 不支持制表符 tab 键缩进,只能使用空格缩进
- 缩进的空格数目不重要,只要相同层级左对齐,通常开头缩进2个空格
- 用 # 号注释
- 符号字符后缩进1个空格,如冒号 : 逗号 , 横杠 -
- 如果包含特殊字符用单引号(' ')引起来会作为普通字符串处理;双引号(" ") 是特殊字符,作为本身想表示的意思
4.3 docker-compose 命令行工具指令⭐
命令只能在 docker-compose.yaml的目录下执行
注意:这是命令行、终端的指令
命令 | 含义 |
---|---|
build | 构建镜像 |
up | 调用docker-compose.yaml文件,来启动容器。 如果想后台启动,就是加-d |
down | #停止和删除所有容器、网络、镜像和卷 |
bundle | 从当前docker compose 文件生成一个以<当前目录>为名称的json格式的Docker Bundle 备份文件 |
config -q | 查看当前配置,没有错误不输出任何信息 |
create | 创建服务,较少使用 |
events | 输出日志。从容器接收实时事件,可以指定json 日志格式,较少使用 |
exec | 进入指定容器进行操作 |
help | 显示帮助细信息 |
images | 显示镜像信息,较少使用 |
kill | 强制删除。 强制终止运行中的容器 |
logs | 查看容器的日志 |
pause | 暂停服务 |
port | 查看端口 |
ps | 列出容器,较少使用。docker-compose ps 等价于 docker ps -a |
pull | 重新拉取镜像。镜像发生变化后,需要重新拉取镜像,较少使用 |
push | 上传镜像 |
restart | 重启服务。较少使用 |
rm | 删除。 删除已经停止的服务 |
run | 运行一次性运行容器 |
scale | 设置指定服务运行的容器个数 |
start | 启动服务。较少使用 |
stop | 停止服务。较少使用 |
top | 显示容器运行状态 |
unpause | 取消暂定 |
如果想使用docker-compose指令,那么一定要有docker-compose.yaml文件,并且在当前文件夹下。如果不是默认的docker-compose文件,要用-f命令,就和dockerfile一样
示例:
docker-compose up
docker-compose up -d
docker-compose down
4.4 docker-compose 编排工具⭐
与上面指令不同的是:下面这些指令是写在docker-compose.yaml文件里的,是文件里的指令,作用是用来编排容器的。
指令 | 含义 | 演示 |
---|---|---|
build | 指定构建上下文和可选的Dockerfile用于构建镜像。 | build: context: /opt/test dockerfile: Dockerfile |
dockerfile | 指定Dockerfile的路径。通常在build部分中使用。 | dockerfile: Dockerfile.prod |
context | 指定构建上下文的路径,即包含Dockerfile和构建上下文的目录路径 | context: /opt/test |
image | 指定用于服务/容器的镜像名称。 | image: myapp:latest |
command | 覆盖由镜像指定的默认命令,类似于dockerfile中的CMD | command: ["python", "app.py"] |
container_name | 为容器指定自定义名称。 | container_name: my_container |
deploy | 指定部署选项,如副本和放置 | deploy: replicas: 3 |
environment | 为服务指定环境变量 | environment: - DEBUG=true |
networks | 指定连接服务的网络 | networks: - frontend - backend |
network_mode | 指定容器的网络模式 | network_mode: "host" |
ports: | 将容器端口映射到主机端口 | ports: - "8080:80" 前面是真机,后面是容器 |
volumes | 挂载主机或其他容器的卷 | volumes: - "nginx-data:/usr/local/nginx/html |
volumes_from | 从另一个服务/容器挂载卷 | volumes_from: - data-container |
hostname: | 指定主机名 | hostname: my-container |
sysctls | 为容器设置内核参数 | sysctls: - net.core.somaxconn=1024 |
restart | 重启策略 | restart: always |
depends_on | 指定该服务依赖的其他服务 | depends_on: - mysql |
上面是列举一个常用的指令,如果想要了解其他的指令,需要查看官方文档。
示例:
build
context: /opt/test
dockerfile: Dockerfile
构建镜像
4.5 docker-compose 实际操作
目的:启动单台容器
4.5.1 启动单台容器
docker compose 文件可在任意目录,创建文件名为docker-compose.yml 配置文件,要注意前后的缩进
[root@7-2 opt]# mkdir -p /opt/compose_nginx/
[root@7-2 opt]# cd compose_nginx/
[root@7-2 compose_nginx]# mkdir nginx
[root@7-2 compose_nginx]# cd ..
[root@7-2 opt]# tree
.
├── compose_nginx //存放compose文件
│ └── nginx //存放dockerfile,或其他相关文件
└── docker-compose-Linux-x86_64-1.27.4
2 directories, 1 file
4.5.1.1 准备yml文件
[root@7-2 compose_nginx]# vim docker-compose.yaml
server-nginx-web:
image: nginx:1.18
container_name: web1
expose:
- 80
- 443
ports:
- "80:80"
- "443:443"
4.5.1.2 检查语法格式
- 方法一:直接输出到屏幕上
[root@7-2 compose_nginx]# docker-compose config //检查语法格式的命令
services:
server-nginx-web:
container_name: web1
expose:
- 80
- 443
image: nginx
network_mode: bridge //默认网桥模式
ports:
- 8080:80/tcp
- 8443:443/tcp
version: '1'
- 方法二:静默模式
[root@7-2 compose_nginx]# docker-compose config -q //静默输出quiet,也可以检查语法格式,但不会显示在屏幕上。
[root@7-2 compose_nginx]# echo $? //查询上一个命令是对还是错
0 //0代表正确;1代表错误
4.5.1.3 启动
- 前台启动
[root@7-2 compose_nginx]# docker-compose up
Creating web1 ... done
Attaching to web1
web1 | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
web1 | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
web1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
web1 | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
web1 | 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
web1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
web1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
web1 | /docker-entrypoint.sh: Configuration complete; ready for start up
web1 | 2024/08/06 15:34:10 [notice] 1#1: using the "epoll" event method
web1 | 2024/08/06 15:34:10 [notice] 1#1: nginx/1.21.5
web1 | 2024/08/06 15:34:10 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6)
web1 | 2024/08/06 15:34:10 [notice] 1#1: OS: Linux 3.10.0-693.el7.x86_64
web1 | 2024/08/06 15:34:10 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 65536:65536
web1 | 2024/08/06 15:34:10 [notice] 1#1: start worker processes
web1 | 2024/08/06 15:34:10 [notice] 1#1: start worker process 31
web1 | 2024/08/06 15:34:10 [notice] 1#1: start worker process 32
- 后台启动
[root@localhost docker-compose]#docker-compose up -d
Starting web1 ... done
- 验证网页
[root@7-2 compose_nginx]# curl 127.0.0.1:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
4.5.1.4 关闭
- down 注意:使用down时,会关闭容器,同时将容器直接删除
[root@localhost docker-compose]# docker-compose down
Stopping web1 ... done
Removing web1 ... done
[root@localhost docker-compose]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost docker-compose]# docker-compose ps
Name Command State Ports
------------------------------
- kill 只是关闭退出容器,并不会将容器删除
[root@localhost docker-compose]#docker-compose kill
Killing web1 ... done
[root@localhost docker-compose]#docker ps -a //注意:使用该命令时,注意要在指定的文件夹下。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ba3ddaf383c5 nginx "/docker-entrypoint.…" 13 seconds ago Exited (137) 4 seconds ago web1
[root@localhost docker-compose]#docker-compose ps
Name Command State Ports
--------------------------------------------------------
web1 /docker-entrypoint.sh ngin ... Exit 137
- rm 只删除停止的容器
[root@localhost docker-compose]#docker-compose rm
docker-compose中, down=kill+rm
docker-compose down 同时包含了kill关闭 和rm删除
4.5.1.5 查看事件 docker-compose events
启动 关闭这些就属于事件
[root@localhost docker-compose]# docker-compose events
2024-08-06 23:48:01.074031 container attach 6969aebfd1fa56aaa06d4bc8cabf4d520742b6617d63a05c4753dd78163791cd (image=nginx, maintainer=NGINX Docker Maintainers <docker-maint@nginx.com>, name=web1)
2024-08-06 23:48:01.402957 container start 6969aebfd1fa56aaa06d4bc8cabf4d520742b6617d63a05c4753dd78163791cd (image=nginx, maintainer=NGINX Docker Maintainers <docker-maint@nginx.com>, name=web1)
#json 格式
#docker-compose events --json
# 启动
[root@localhost docker-compose]#docker-compose up
4.5.2 启动多个容器
- 启动nginx和tomcat
server-nginx-web:
image: nginx:1.18
container_name: web1
expose:
- 80
- 443
ports:
- "8001:80"
- "8443:443"
server-tomcat:
image: tomcat
container_name: tomcat1
[root@localhost docker-compose]#docker-compose config -q
# -q 静默不输出
- 启动
[root@localhost docker-compose]#docker-compose up
[root@localhost ~]#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1f7f52445524 tomcat "catalina.sh run" 10 seconds ago Up 10 seconds 8080/tcp tomcat1
6969aebfd1fa nginx "/docker-entrypoint.…" 11 minutes ago Up 10 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp, 0.0.0.0:8443->443/tcp, :::8443->443/tcp web1
4.5.3 调用 dockerfile文件 执行编排⭐
- 调用dockerfile
FROM centos:centos7.9.2009
LABEL author="zhou cloud" \
version="1.0" \
description="test"
RUN rm -rf /etc/yum.repos.d/
ADD qh.repo /etc/yum.repos.d/ //这个清华源是第一个文件
RUN yum -y install gcc gcc-c++ make automake pcre pcre-devel zlib zlib-devel openssl openssl-devel wget
ADD nginx-1.22.0.tar.gz /usr/local/src //准备第二个:nginx的压缩包
RUN cd /usr/local/src/nginx-1.18.0 && ./configure --prefix=/apps/nginx && make && make install
COPY index.html /apps/nginx/html //第三个准备网页页面
EXPOSE 80
CMD ["-g","daemon off;"]
ENTRYPOINT ["/apps/nginx/sbin/nginx"]
[root@7-2 nginx]# ls
Dockerfile index.html nginx-1.22.0.tar.gz qh.repo //准备这四个文件
[root@localhost centos7]# docker build -t c7:n3 .
[root@localhost centos7]# docker run -d -p 80:80 --name web1 c7:n1
- 编写 compose 文件
vim /opt/compose_nginx/docker-compose.yml
services:
nginx:
container_name: web1
hostname: nginx
build:
context: /opt/compose_nginx/nginx
dockerfile: Dockerfile
ports:
- 1216:80
- 1217:443
networks:
mynet:
ipv4_address: 172.18.0.10
volumes:
- ./wwwroot:/usr/local/nginx/html
networks:
mynet:
driver: bridge
ipam:
config:
- subnet: 172.18.0.0/16
#解释:
services: 定义了要运行的服务。
nginx: Nginx 服务的配置。
container_name: 指定容器的名称为 web1。
hostname: 指定容器的主机名为 nginx。
build: 指定了构建 Nginx 容器所需的上下文和 Dockerfile。
ports: 将主机端口 1216 映射到容器的 80 端口,将主机端口 1217 映射到容器的 443 端口。
networks: 将服务连接到名为 lnmp 的自定义网络。
volumes: 将主机上的 ./wwwroot 目录挂载到容器中的 /usr/local/nginx/html 目录。
networks: 定义了自定义网络。
lnmp: 自定义网络的配置。
driver: 网络驱动程序为 bridge。
ipam: IP 地址管理配置。
config: 子网配置,指定了 IP 地址范围。
docker-compose build //先创建
docker-compose up //再开启