往期回顾:
云端技术驾驭DAY01——云计算底层技术奥秘、云服务器磁盘技术、虚拟化管理、公有云概述
云端技术驾驭DAY02——华为云管理、云主机管理、跳板机配置、制作私有镜像模板
云端技术驾驭DAY03——云主机网站部署、web集群部署、Elasticsearch安装
云端技术驾驭DAY04——Logstash安装部署及插件模块
云端技术驾驭DAY06——容器技术概述、镜像与容器管理、定制简单镜像、容器内安装部署服务
云端技术驾驭DAY07——Dockerfile详解、容器镜像制作、私有仓库
云端技术驾驭DAY08
部署容器服务
对外发布服务
端口映射
- 容器化带来的问题之(一)
– 新创建容器的IP地址是随机的
– 容器在重启后每次IP都会发生变化
– 容器服务只有宿主机才能访问 - 如何才能使用容器对外提供稳定的服务?
– 容器端口可以与宿主机的端口进行映射绑定
– 从而把宿主机变成对应的服务,不用关心容器的IP地址
– 每个端口都只能和一个容器绑定 - 端口映射语法:
docker run -itd -p 宿主机端口:容器端口 镜像名称:标签
[root@docker-0001 ~]# docker run -itd --name web -p 80:80 myos:httpd // 宿主机绑定apache服务容器
d8fb6b299c59d507a409ff6f6e5e13c03181111e17a728e6aba6f0a783ec3050
[root@docker-0001 ~]# curl http://192.168.1.31
Welcome to The Apache.
容器卷
容器卷概述
- 容器化带来的问题之(二)
– Docker容器不适合保存任何数据
– 重要数据在容器内不方便管理容器丢失
– 修改多个容器中的数据非常困难
– 多容器之间有数据共享、同步的需求
– 数据文件与配置文件频繁更改 - 以上问题都可以使用容器卷来解决
- Docker可以映射宿主机文件或目录到容器中
– 目标对象不存在就会自动创建
– 多个容器可以映射同一个目标对象来达到数据共享的目的 - 启动容器时,使用-v映射参数(可有多个)
docker run -itd -v 宿主机对象:容器内对象 镜像名称:标签
映射卷
- 目标:让httpd容器和nginx容器共享网站数据目录
- 准备测试页面
[root@docker-0001 ~]# mkdir /var/webroot
[root@docker-0001 ~]# echo "hello world" > /var/webroot/index.html
[root@docker-0001 ~]# cp info.php /var/webroot
- 创建容器,并映射数据卷
[root@docker-0001 ~]# docker run -itd --rm --name mynginx -v /var/webroot:/var/www/html myos:nginx
06a5d36e68729dd160faa4340faa8aa1560db6e3883709cd1b1b7a2322c623b3
[root@docker-0001 ~]# docker run -itd --rm --name myhttpd -v /var/webroot:/var/www/html myos:httpd
dd5231c7747b0ca6d8e0894412487bf3be80cd57c2204f2c8ac30319b896e832
- 访问测试
[root@docker-0001 ~]# docker inspect mynginx | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",
[root@docker-0001 ~]# curl 172.17.0.2
Nginx is running !
[root@docker-0001 ~]# docker inspect myhttpd | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.3",
"IPAddress": "172.17.0.3",
[root@docker-0001 ~]# curl http://172.17.0.3
hello world
- 使用共享卷修改配置文件
[root@docker-0001 ~]# mkdir /var/webconf // 获取配置文件
[root@docker-0001 ~]# docker cp mynginx:/usr/local/nginx/conf/nginx.conf /var/webconf
[root@docker-0001 ~]# vim /var/webconf/nginx.conf // 编辑配置文件添加php解析
61 location ~ \.php$ {
62 root html;
63 fastcgi_pass 127.0.0.1:9000;
64 fastcgi_index index.php;
65 include fastcgi.conf;
66 }
- 使用卷映射配置文件,重建nginx容器
[root@docker-0001 ~]# docker rm -f mynginx
mynginx
[root@docker-0001 ~]# docker run -itd --rm --name mynginx -p 80:80 -v /var/webconf/nginx.conf:/usr/local/nginx/conf/nginx.conf -v /var/webroot:/usr/local/nginx/html myos:nginx
1f5747c9a99386fafd6ace45c25329618e3596c490d9f5e24186a56d3dee5b88
容器网络通信
容器间通讯
- docker的网络通信模式
– bridge模式(默认)
– host模式,与宿主机共享网络
– none模式,无网络
– container模式,共享其他容器的网络命名空间
– 自定义网络,自由创建桥接网络或者overlay网络
共享网络命名空间
- 语法格式
- 参数 --network=container:容器名称|ID
- 创建php容器,使用nginx的网络名称空间
[root@docker-0001 ~]# docker run -itd --network=container:mynginx -v /var/webroot:/usr/local/nginx/html --rm --name myphp myos:php-fpm
30b49c6eebc6cf0b12088e758c86bd86b9dccc7050915254fe26c5eba9d4ec87
- 验证配置
[root@docker-0001 ~]# docker exec -it mynginx ss -ntulp
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp LISTEN 0 128 127.0.0.1:9000 0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1,fd=6))
[root@docker-0001 ~]# curl http://127.0.0.1/info.php // 访问nginx容器的php页面,解析成功
<pre>
Array
(
[REMOTE_ADDR] => 172.17.0.1
[REQUEST_METHOD] => GET
[HTTP_USER_AGENT] => curl/7.61.1
[REQUEST_URI] => /info.php
)
php_host: dd5231c7747b
1229
服务编排与治理
微服务管理
微服务概述
- 微服务是什么?
– 微服务并不是一种技术,而是架构思想、它以容器技术为载体,演进出的一种以软件运行环境、产品、研发、运营为一体全新模式。站在Docker的角度,软件就是容器的组合,而容器又是服务的最佳载体,一台计算机同时运行多个容器,从而就能很轻松地实现复杂的架构 - 微服务架构的优点:
– 松耦合高内聚、高可扩展、出色的弹性、易于部署和访问 - 容器编排服务
– 在微服务架构中每个微服务一般都会包含多个容器实例
– 为了解决编排部署的问题,docker公司推出了docker compose工具
– Compose是一个用于定义和运行多容器的应用的工具
– 使用Compose。可以在一个文件中配置多个容器服务,然后使用一个简单的命令就可以轻松、高效地管理配置中引用的所有容器服务
微服务治理
- 安装部署
[root@docker-0001 ~]# dnf -y install docker-compose-plugin // 安装compose组建
[root@docker-0001 ~]# vim docker-compose.yaml // 创建项目
name: websvc
version: "3"
services:
websvc:
container_name: nginx
image: myos:nginx
- 常用指令
指令 | 说明 |
---|---|
up | 创建项目并启动容器 |
down | 删除项目容器及网络 |
ls | 列出可以管理的项目 |
start/stop/restart | 启动项目/停止项目/重启项目 |
images | 列出项目使用的镜像 |
ps | 显示项目中容器的状态 |
logs | 查看下项目中容器的日志 |
- 创建项目
[root@docker-0001 ~]# docker compose -f docker-compose.yaml up -d // -f指定配置文件 -d后台运行
[+] Running 2/2
⠿ Network websvc_default Created 0.1s
⠿ Container nginx Started 0.3s
- 查看项目
[root@docker-0001 ~]# docker compose ls
NAME STATUS CONFIG FILES
websvc running(1) /root/docker-compose.yaml
- 查看项目使用的镜像
[root@docker-0001 ~]# docker compose -p websvc images
Container Repository Tag Image Id Size
nginx myos nginx 10dc658da2fe 274MB
- 查看项目中的容器状态
[root@docker-0001 ~]# docker compose -p websvc ps
NAME COMMAND SERVICE STATUS PORTS
nginx "nginx -g 'daemon of…" websvc running 80/tcp
- 启动、停止、重启项目
[root@docker-0001 ~]# docker compose -p websvc stop
[+] Running 1/0
⠿ Container nginx Stopped 0.1s
[root@docker-0001 ~]# docker compose -p websvc start
[+] Running 1/1
⠿ Container nginx Started 0.2s
[root@docker-0001 ~]# docker compose -p websvc restart
[+] Running 1/1
⠿ Container nginx Started 0.3s
- 查看项目中容器的日志
[root@docker-0001 ~]# docker inspect nginx | grep -i ipaddress
"SecondaryIPAddresses": null,
"IPAddress": "",
"IPAddress": "172.18.0.2",
[root@docker-0001 ~]# curl 172.18.0.2/info.php
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.22.1</center>
</body>
</html>
[root@docker-0001 ~]# docker compose -p websvc logs
nginx | 2024/02/20 02:50:55 [error] 8#0: *1 open() "/usr/local/nginx/html/info.php" failed (2: No such file or directory), client: 172.18.0.1, server: localhost, request: "GET /info.php HTTP/1.1", host: "172.18.0.2"
- 删除项目
[root@docker-0001 ~]# docker compose -p websvc down
[+] Running 2/2
⠿ Container nginx Removed 0.1s
⠿ Network websvc_default Removed 0.0s
微服务编排
- Compose概述
– 在Compose中有两个核心概念,分别是服务和项目
– 服务:一个应用的容器,实际上可以包括若干运行相同镜像的容器实例
– 项目:由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yaml文件中定义 - compose语法
指令 | 说明 |
---|---|
networks | 配置容器连接的网络 |
container_name | 指定容器名称 |
depends_on | 解决容器的依赖、启动先后的问题 |
command | 覆盖容器启动后默认执行的命令 |
environment | 设置环境变量 |
image | 指定为镜像名称或镜像 ID |
network_mode | 设置网络模式 |
restart | 容器保护策略[always、no、on-failure] |
ports | 暴露端口信息 |
volumes | 数据卷,支持 [volume、bind、tmpfs、npipe] |
- 编写docker-compose.yaml文件
[root@docker-0001 ~]# vim docker-compose.yaml
name: websvc
version: "3"
services:
nginxsvc:
container_name: nginx
image: myos:nginx
network_mode: bridge
restart: always
ports:
- 80:80
volumes:
- type: bind
source: /var/webroot
target: /usr/local/nginx/html
- type: bind
source: /var/webconf/nginx.conf
target: /usr/local/nginx/conf/nginx.conf
environment:
- "TZ=Asia/Shanghai" // 设置附加变量:时区
php-fpm:
container_name: php
image: myos:php-fpm
network_mode: "container:nginx" // 设置使用 nginx 的网络名称空间
restart: always
volumes:
- type: bind
source: /var/webroot
target: /usr/local/nginx/html
depends_on:
- nginxsvc // 解决容器启动的先后顺序
- 验证项目
[root@docker-0001 ~]# docker compose -f docker-compose.yaml up -d
[+] Running 2/2
⠿ Container nginx Started 0.2s
⠿ Container php Started 0.3s
[root@docker-0001 ~]# docker compose ls
NAME STATUS CONFIG FILES
websvc running(2) /root/docker-compose.yaml
[root@docker-0001 ~]# docker compose -p websvc ps
NAME COMMAND SERVICE STATUS PORTS
nginx "nginx -g 'daemon of…" nginxsvc running 0.0.0.0:80->80/tcp, :::80->80/tcp
php "php-fpm --nodaemoni…" php-fpm running
[root@docker-0001 ~]# curl -s http://127.0.0.1/info.php // 访问php页面验证
<pre>
Array
(
[REMOTE_ADDR] => 172.17.0.1
[REQUEST_METHOD] => GET
[HTTP_USER_AGENT] => curl/7.61.1
[REQUEST_URI] => /info.php
)
php_host: e35f686e6b27
1229
私有镜像仓库
harbor仓库
- harbor概述
– Habor是在Registry上进行了相应的企业级扩展,这些特性包括:web界面、登陆、搜索等功能,区分公有、私有镜像,以及基于角色的访问控制,继承日志审计、支持水平扩展等功能
– 部署harbor环境相当繁琐,涉及到web服务器、数据库服务器、程序代码、docker私有镜像仓库等9个应用
安装部署
- Harbor安装部署概述
– 官方为了简化安装部署的步骤和流程,采用了微服务方式对项目进行了管理,所有应用官方都以Docker镜像的方式发布,项目采用compose方式管理 - 准备云主机
主机名 | IP | 配置 |
---|---|---|
harbor | 192.168.1.30 | 2vCPUs 4GiB内存 |
- 安装部署Docker环境
[root@harbor ~]# echo "192.168.1.30 harbor" >> /etc/hosts
[root@harbor ~]# dnf -y install docker-ce docker-compose-plugin
[root@harbor ~]# systemctl enable docker --now
- 提前准备harbor镜像,导入到harbor主机
[root@ecs-proxy ~]# rsync -av public/harbor-v2.7.0.tgz 192.168.1.30:
[root@harbor ~]# tar -zxf harbor-v2.7.0.tgz -C /usr/local/
[root@harbor ~]# tar -zxf harbor-v2.7.0.tgz -C /usr/local/
[root@harbor ~]# cd /usr/local/harbor/
[root@harbor harbor]# docker load -i harbor.v2.7.0.tar.gz
- 创建https证书
[root@harbor harbor]# mkdir tls
[root@harbor harbor]# openssl genrsa -out tls/cert.key 2048
[root@harbor harbor]# openssl req -new -x509 -days 3650 -key tls/cert.key -out tls/cert.crt -subj "/C=CN/ST=BJ/L=BJ/O=T/OU=N/CN=harbor"
- 修改配置文件
[root@harbor harbor]# cp harbor.yml.tmpl harbor.yml
[root@harbor harbor]# vim harbor.yml
5 hostname: harbor
8 #http:
10 # port: 80
17: certificate: /usr/local/harbor/tls/cert.crt
18: private_key: /usr/local/harbor/tls/cert.key
34: harbor_admin_password: admin123
- 预安装环境检查,生成项目文件
[root@harbor harbor]# /usr/local/harbor/prepare
- 创建并启动项目
[root@harbor harbor]# docker compose -f docker-compose.yml up -d
[+] Running 10/10
⠿ Network harbor_harbor Created 0.1s
⠿ Container harbor-log Started 0.5s
⠿ Container harbor-portal Started 1.3s
⠿ Container redis Started 1.4s
⠿ Container registryctl Started 1.2s
⠿ Container harbor-db Started 1.3s
⠿ Container registry Started 1.4s
⠿ Container harbor-core Started 1.7s
⠿ Container nginx Started 2.4s
⠿ Container harbor-jobservice Started 2.3s
- 添加开机自启动
[root@harbor harbor]# chmod 0755 /etc/rc.d/rc.local
[root@harbor harbor]# echo "/usr/bin/docker compose -p harbor start" >>/etc/rc.d/rc.local
- 查看验证项目
[root@harbor harbor]# docker compose ls
NAME STATUS CONFIG FILES
harbor running(9) /usr/local/harbor/docker-compose.yml
[root@harbor harbor]# docker compose ls
NAME STATUS CONFIG FILES
harbor running(9) /usr/local/harbor/docker-compose.yml
[root@harbor harbor]# docker compose -p harbor ps
NAME COMMAND SERVICE STATUS PORTS
harbor-core "/harbor/entrypoint.…" core running (healthy)
harbor-db "/docker-entrypoint.…" postgresql running (healthy)
harbor-jobservice "/harbor/entrypoint.…" jobservice running (healthy)
harbor-log "/bin/sh -c /usr/loc…" log running (healthy) 127.0.0.1:1514->10514/tcp
harbor-portal "nginx -g 'daemon of…" portal running (healthy)
nginx "nginx -g 'daemon of…" proxy running (healthy) 0.0.0.0:80->8080/tcp, :::80->8080/tcp, 0.0.0.0:443->8443/tcp, :::443->8443/tcp
redis "redis-server /etc/r…" redis running (healthy)
registry "/home/harbor/entryp…" registry running (healthy)
registryctl "/home/harbor/start.…" registryctl running (healthy)
- 通过ELB发布harbor服务
- 浏览器访问ELB绑定的弹性公网IP
- 输入用户名
admin
,密码admin123
私有仓库管理
-
创建用户
– 用来登陆harbor,以及认证权限
填写用户信息
-
新建项目
– 用来存储镜像的地址路径
-
项目授权
– 由于library项目管理员默认只有admin用户,如果普通用户想要上传镜像到library,则需要授权
– 管理员登陆 --> 选择library --> 成员 --> 新建成员 --> 设置为项目管理员
-
Harbor管理
容器管理命令 | 说明 |
---|---|
docker login | 登录私有镜像仓库 |
docker logout | 退出登录 |
- 登陆私有仓库
[root@docker-0001 ~]# echo "192.168.1.30 harbor" >> /etc/hosts
[root@docker-0001 ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://harbor:443","http://registry:5000"],
"insecure-registries":["https://harbor:443","registry:5000"]
}
[root@docker-0001 ~]# systemctl restart docker
[root@docker-0001 ~]# docker login harbor:443
Username: haji
Password: ×××××
... ...
Login Succeeded
- 认证信息记录文件
[root@docker-0001 ~]# cat /root/.docker/config.json
{
"auths": {
"harbor:443": {
"auth": "aGFqaTpIYWppLjc3Nw=="
}
}
}
- 上传镜像
[root@docker-0001 ~]# docker tag rockylinux:8.5 harbor:443/myimg/rockylinux:8.5 // 设置标签
[root@docker-0001 ~]# docker push harbor:443/myimg/rockylinux:8.5 // 上传镜像
- 将镜像上传到library项目
[root@docker-0001 ~]# docker tag myos:latest harbor:443/library/myos:latest
[root@docker-0001 ~]# docker push harbor:443/library/myos:latest
The push refers to repository [harbor:443/library/myos]
1e3ea69e39a7: Pushed
latest: digest: sha256:f396e19f1909cdedd6c39c973eac5ccb9dd07d7baee3c280e55b0c8a6b6dc41d size: 527
- 退出登陆
[root@docker-0001 ~]# docker logout harbor:443
Removing login credentials for harbor:443