当前位置: 首页 > news >正文

云计算第四阶段---CLOUD Day7---Day8

CLOUD  07

一、Dockerfile详细解析

指令说明
FROM指定基础镜像(唯一)
RUN在容器内执行命令,可以写多条
ADD把文件拷贝到容器内,如果文件是 tar.xx 格式,会自动解压
COPY把文件拷贝到容器内,不会自动解压
ENV设置启动容器的环境变量
WORKDIR设置启动容器的默认工作目录(唯一)
CMD容器默认的启动参数(唯一)
ENTRYPOINT容器默认的启动命令(唯一)
USER启动容器使用的用户(唯一)
EXPOSE使用镜像创建的容器默认监听使用的端口号/协议
语法案例(1)
# 编写 Dockerfile
[root@docker ~]# mkdir myimg
[root@docker ~]# vim myimg/Dockerfile 
FROM mylinux:latest
CMD  ["/bin/ls", "-l"]
# 创建镜像
[root@docker ~]# docker build -t img1:latest myimg
......
[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
img1         latest    9278f72f8cb1   5 seconds ago   249MB
mylinux      latest    e3b3d26bf0da   21 hours ago    249MB
rockylinux   8.5       210996f98b85   13 months ago   205MB
# 创建容器
[root@docker ~]# docker run -it --rm img1:latest
total 48
lrwxrwxrwx   1 root root    7 Oct 11  2021 bin -> usr/bin
drwxr-xr-x   5 root root  360 Feb  5 04:21 dev
drwxr-xr-x   1 root root 4096 Feb  5 04:21 etc
drwxr-xr-x   2 root root 4096 Oct 11  2021 home
......
# 传递参数命令,覆盖 CMD 执行
[root@docker ~]# docker run -it --rm img1:latest id
uid=0(root) gid=0(root) groups=0(root)

#制作镜像注意事项

语法案例(2)
# ENTRYPOINT 与 CMD 执行方式为 ${ENTRYPOINT} ${@-${CMD}}
[root@docker ~]# vim myimg/Dockerfile 
FROM mylinux:latest
ENTRYPOINT ["echo"]
CMD  ["/bin/ls", "-l"]
# 创建镜像
[root@docker ~]# docker build -t img2:latest myimg
......# CMD 做为参数传递,在容器内执行了 echo '/bin/ls -l'
[root@docker ~]# docker run -it --rm img2:latest 
/bin/ls -l# CMD 被替换,在容器内执行了 echo id
[root@docker ~]# docker run -it --rm img2:latest id
id
语法案例(3)
# 制作测试文件
[root@docker ~]# tar -cf myimg/myfile.tar -C /etc hosts issue
# 编辑Dockerfile
[root@docker ~]# vim myimg/Dockerfile 
FROM mylinux:latest
COPY myfile.tar /var/tmp/
ADD  myfile.tar /tmp/
RUN  id && touch /tmp/file1
USER nobody
RUN  id && touch /tmp/file2
ENV  mymsg="Hello World"
WORKDIR /tmp
CMD  ["/bin/bash"]# 创建镜像
[root@docker ~]# docker build -t img3:latest myimg
......# 运行测试
[root@docker ~]# docker run -it --rm img3:latest
# 使用 COPY 进来的文件还是 tar 包
bash-4.4$ tree /var/tmp
/var/tmp
`-- myfile.tar
# 使用 ADD 添加的文件已经被解压了
bash-4.4$ tree /tmp
/tmp
|-- hosts
`-- issue# USER 指令设置使用 nobody 用户运行容器
bash-4.4$ id
uid=65534(nobody) gid=65534(nobody) groups=65534(nobody)
# USER 指令前创建的文件是 root 权限,之后是 USER 用户权限
bash-4.4$ ls -l /tmp/file? 
-rw-r--r-- 1 root   root   0 Feb  5 05:25 /tmp/file1
-rw-r--r-- 1 nobody nobody 0 Feb  5 05:25 /tmp/file2# 环境变量可以直接调用
bash-4.4$ echo ${mymsg}  
Hello World
# WORKDIR 把工作目录设置到 /tmp
bash-4.4$ pwd
/tmp
apache 镜像

 

二、容器镜像制作

#前面是介绍如何使用,Dckerfile 制作镜像和相关参数使用的,接下来是结合docker命令使用并制作镜像。(以web服务器 apache , nginx镜像制作为例)

apache 镜像

  • 拷贝 info.php 测试文件到 /root/ 目录下
    [root@ecs-proxy ]# rsync -av info.php 192.168.1.32:/root/
  • #这里想要测试的话,可以上其他网页模版,下点动态网站模版到真机,之后真机上传到 该机器 测试
手工部署
# 创建容器
[root@docker ~]# docker run -it --name httpd mylinux:latest 
# 安装软件包
[root@975fb53cb155 /]# dnf install -y httpd php && dnf clean all
# 修改配置文件
[root@975fb53cb155 /]# vim /etc/httpd/conf.modules.d/00-mpm.conf
11: LoadModule mpm_prefork_module ... ... # 去掉注释 
23: # LoadModule mpm_event_module ... ... # 注释配置 
[root@975fb53cb155 /]# export LANG=C
[root@975fb53cb155 /]# /usr/sbin/httpd -DFOREGROUND
# 使用快捷键 (ctrl-p, ctrl-q) 退出
[root@docker ~]# 
# 添加测试页面
[root@docker ~]# echo 'Welcome to The Apache.' >index.html
[root@docker ~]# docker cp index.html httpd:/var/www/html/
[root@docker ~]# docker cp info.php httpd:/var/www/html/
制作镜像
# 编写 dockerfile 文件
[root@docker ~]# mkdir httpd
[root@docker ~]# vim httpd/Dockerfile
FROM mylinux:latest
RUN  dnf install -y httpd php && dnf clean all
RUN  sed -ri -e 's,^Load.*,#&,' -e 's,^#(.*mod_mpm_prefork.so)$,\1,' /etc/httpd/conf.modules.d/00-mpm.conf
ENV  LANG=C
ADD  myweb.tar.gz /var/www/html/
WORKDIR /var/www/html/
EXPOSE 80/tcp
CMD  ["/usr/sbin/httpd", "-DFOREGROUND"][root@docker ~]# tar -czf httpd/myweb.tar.gz index.html info.php
[root@docker ~]# docker build -t httpd:latest httpd
......

验证测试
# 查看镜像并创建容器
[root@docker ~]# docker images httpd:latest
REPOSITORY   TAG       IMAGE ID       CREATED              SIZE
httpd        latest    c1e854cde1f4   About a minute ago   299MB
[root@docker ~]# docker run -itd --name apache httpd:latest
cc2b82ad0367172c344c7207def94c4c438027c60859e94883e440b53a860a93# 查看容器地址并访问验证
[root@docker ~]# docker inspect apache |grep -i IPAddress
[root@docker ~]# curl http://172.17.0.2/info.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:   2fbc8c132f7f
1229
[root@docker ~]# docker rm -f $(docker ps -aq)

nginx 镜像

  • 拷贝 nginx-1.22.1.tar.gz 到 docker 主机
    [root@ecs-proxy ]# rsync -av nginx-1.22.1.tar.gz 192.168.1.32:/root/

 #将nginx软件从真机,上传到 该机器

手工部署
# 创建容器
[root@docker ~]# docker run -itd --name web mylinux:latest
a1448547a12c15c8b1d1defa76e96f63f0f68ccb6bdeb59958ee57fc5dfac11e
# 拷贝 nginx 源码包到容器内
[root@docker ~]# docker cp nginx-1.22.1.tar.gz web:/
Successfully copied 1.08MB to web:/
# 进入容器配置
[root@docker ~]# docker exec -it web bash
# 安装编译工具和依赖软件包
[root@a1448547a12c /]# dnf install -y openssl-devel pcre-devel gcc make
[root@a1448547a12c /]# dnf clean all
# 编译安装
[root@a1448547a12c /]# tar zxf nginx-1.22.1.tar.gz 
[root@a1448547a12c /]# cd nginx-1.22.1/
[root@a1448547a12c nginx-1.22.1]# ./configure --prefix=/usr/local/nginx --with-pcre --with-http_ssl_module
[root@a1448547a12c nginx-1.22.1]# make && make install
# 设置默认首页
[root@a1448547a12c nginx-1.22.1]# echo 'Nginx is running !' >/usr/local/nginx/html/index.html
# 添加 nginx 到环境变量
[root@a1448547a12c nginx-1.22.1]# export PATH=${PATH}:/usr/local/nginx/sbin
# 启动服务
[root@a1448547a12c nginx-1.22.1]# nginx -g "daemon off;"
# 退出容器
[root@153c0df095e2 nginx-1.22.1]# exit
制作镜像
# 将编译好的 nginx 拷贝出来
[root@docker ~]# mkdir nginx
[root@docker ~]# docker cp web:/usr/local/nginx /root/nginx/nginx
Successfully copied 5.82MB to /root/nginx/
# 编写 Dockerfile 文件
[root@docker ~]# vim nginx/Dockerfile 
FROM mylinux:latest
RUN  dnf install -y pcre openssl && dnf clean all
COPY nginx /usr/local/nginx
ENV  PATH=${PATH}:/usr/local/nginx/sbin
WORKDIR /usr/local/nginx/html
EXPOSE 80/tcp
CMD  ["nginx", "-g", "daemon off;"][root@docker ~]# docker build -t nginx:latest nginx
......
验证测试
# 查看镜像并创建容器
[root@docker ~]# docker images nginx:latest
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
nginx        latest    645dd2d9a8ec   3 minutes ago   274MB
[root@docker ~]# docker run -itd --name nginx nginx:latest
e440b53a860a93cc2b82ad0367172c344c7207def94c4c438027c60859e94883# 查看容器地址并访问验证
[root@docker ~]# docker inspect nginx |grep -i IPAddress
[root@docker ~]# curl http://172.17.0.2/
Nginx is running ![root@docker ~]# docker rm -f $(docker ps -aq)

 多阶段镜像

#什么是多阶段镜像?  通俗来说就是把一个镜像的编译与多个模块配置结合到一起

#游戏里来说,就是你制造了一个怪物的同时并给他设定好了升级程序,发生进化

[root@docker ~]# rm -rf nginx/nginx
[root@docker ~]# mv /root/nginx-1.22.1.tar.gz nginx/
[root@docker ~]# vim nginx/Dockerfile
# 第一阶段编译程序
FROM mylinux:latest as builder
ADD  nginx-1.22.1.tar.gz /
WORKDIR /nginx-1.22.1
RUN  dnf install -y openssl-devel pcre-devel gcc make
RUN  ./configure --prefix=/usr/local/nginx --with-pcre --with-http_ssl_module
RUN  make && make install
RUN  echo 'Nginx is running !' >/usr/local/nginx/html/index.html# 第二阶段最终镜像
FROM mylinux:latest
RUN  dnf install -y pcre openssl && dnf clean all
COPY --from=builder /usr/local/nginx /usr/local/nginx
ENV  PATH=${PATH}:/usr/local/nginx/sbin
WORKDIR /usr/local/nginx/html
EXPOSE 80/tcp
CMD  ["nginx", "-g", "daemon off;"][root@docker ~]# docker build -t nginx:latest nginx
......

php-fpm 镜像

手工部署
[root@docker ~]# docker run -it --name myphp mylinux:latest
[root@cbcf3d90c02e /]# dnf install -y php-fpm
# 修改配置文件
[root@cbcf3d90c02e /]# vim /etc/php-fpm.d/www.conf
38:  listen = 127.0.0.1:9000
# 创建目录,并授权
[root@cbcf3d90c02e /]# mkdir /run/php-fpm
[root@cbcf3d90c02e /]# chown -R nobody.nobody /var/log/php-fpm /run/php-fpm
# 使用 sudo 且换用户
[root@cbcf3d90c02e /]# dnf install -y sudo
[root@cbcf3d90c02e /]# sudo -u nobody /bin/bash
# 使用 nobody 启动服务
bash-4.4$ /usr/sbin/php-fpm --nodaemonize
[04-Sep-2023 09:58:01] NOTICE: [pool www] 'user' directive is ignored when FPM is not running as root
[04-Sep-2023 09:58:01] NOTICE: [pool www] 'group' directive is ignored when FPM is not running as root
[04-Sep-2023 09:58:01] NOTICE: fpm is running, pid 1
[04-Sep-2023 09:58:01] NOTICE: ready to handle connections
[04-Sep-2023 09:58:01] NOTICE: systemd monitor interval set to 10000ms
制作镜像
# 编写 dockerfile 文件
[root@docker ~]# mkdir php
[root@docker ~]# docker cp myphp:/etc/php-fpm.d/www.conf /root/php/www.conf
[root@docker ~]# vim php/Dockerfile
FROM mylinux:latest
RUN  dnf install -y php-fpm && dnf clean all && \mkdir -p /run/php-fpm && \chown -R nobody.nobody /run/php-fpm /var/log/php-fpm
COPY www.conf /etc/php-fpm.d/www.conf
USER nobody
EXPOSE 9000/tcp
CMD ["/usr/sbin/php-fpm", "--nodaemonize"][root@docker ~]# docker build -t php-fpm:latest php
验证测试
# 查看镜像并创建容器
[root@docker ~]# docker images php-fpm:latest
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
php-fpm      latest    b2404bd119b0   48 seconds ago   275MB
[root@docker ~]# docker run -itd --name php php-fpm:latest
6eeff6af4a6469c298944b2bdd2ba69f32ebcbc6cb683a0a05af4eefbf90e8c1# 验证服务
[root@docker ~]# docker exec -it php /bin/bash
# 验证用户
bash-4.4$ id
uid=65534(nobody) gid=65534(nobody) groups=65534(nobody)
# 我们无法直接调用 php 服务,可以通过查看进程验证服务
bash-4.4$ ps -ef
UID          PID    PPID  C  STIME  CMD
nobody         1       0  0  16:13  php-fpm: master process (/etc/php-fpm.conf)
nobody         7       1  0  16:13  php-fpm: pool www
nobody         8       1  0  16:13  php-fpm: pool www
nobody        17       0  0  16:13  /bin/bash
nobody        19      17  0  16:13  ps -ef
bash-4.4$ exit[root@docker ~]# docker rm -f $(docker ps -aq)

#前面介绍的是制作镜像与制作使用dockerfile文件,解下来带来的是私有 镜像仓库的配置与使用。

三、私有仓库

环境准备

主机名ip地址最低配置
registry192.168.1.352CPU,4G内存

registry 安装

# 在 registry 上安装私有仓库
[root@registry ~]# dnf install -y docker-distribution
# 启动私有仓库,并设置开机自启动
[root@registry ~]# systemctl enable --now docker-distribution

客户端配置

  • 所有 node 节点都需要配置
  • #记住是所有被控制的 Node结点
[root@docker ~]# vim /etc/hosts
192.168.1.35    registry
# 修改配置文件
[root@docker ~]# vim /etc/docker/daemon.json
{"registry-mirrors": ["http://registry:5000"],"insecure-registries":["registry:5000"]
}
# 重启服务生效
[root@docker ~]# systemctl restart docker
[root@docker ~]# docker info

上传镜像

 

# 给 nginx 镜像设置标签
[root@docker ~]# docker tag  nginx:latest registry:5000/img/myimg:nginx
# 上传 nginx 镜像
[root@docker ~]# docker push registry:5000/img/myimg:nginx
The push refers to repository [registry:5000/img/myimg]
c9d01852a13b: Pushed 
......
nginx: digest: sha256:3e1fc9ad1ee46ee4619c95dc9d71034d919e53abfc size: 952# 上传 php-fpm 镜像
[root@docker ~]# docker tag  php-fpm:latest registry:5000/img/myimg:php-fpm
[root@docker ~]# docker push registry:5000/img/myimg:php-fpm
The push refers to repository [registry:5000/img/myimg]
619c95dc93e1: Pushed 
......
php-fpm: digest: sha256:619c95dc93e1fc9ad1ee46ee4d71034d919e53abfc size: 875# 上传 httpd 镜像 
[root@docker ~]# docker tag  httpd:latest registry:5000/library/httpd:latest
[root@docker ~]# docker push registry:5000/library/httpd:latest
The push refers to repository [registry:5000/library/httpd]
95dc9d71034d: Pushed
......
latest: digest: sha256:95dc9d71034d919e53abfc3e1fc9ad1ee46ee4619c size: 968
验证测试

查看镜像名称: curl http://仓库IP:5000/v2/_catalog
查看镜像标签: curl http://仓库IP:5000/v2/镜像路径/tags/list
使用易读格式: python3 -m json.tool

# 查看仓库中所有镜像的名称
[root@docker ~]# curl http://registry:5000/v2/_catalog
{"repositories":["img/myimg", "library/httpd"]}# 查看某一镜像的所有标签
[root@docker ~]# curl http://registry:5000/v2/img/myimg/tags/list
{"name":"img/myimg","tags":["nginx", "php-fpm"]}# 易读格式查看镜像名称
[root@docker ~]# curl -s http://registry:5000/v2/_catalog |python3 -m json.tool
{"repositories": ["img/myimg","library/httpd"]
}# 易读格式查看镜像标签
[root@docker ~]# curl -s http://registry:5000/v2/img/myimg/tags/list |python3 -m json.tool
{"name": "img/myimg","tags": ["nginx","php-fpm"]
}
创建容器
# 删除所有容器
[root@docker ~]# docker rm -f $(docker ps -aq)
......# 删除所有镜像
[root@docker ~]# docker rmi -f $(docker images -q)
......# 使用仓库中的镜像运行容器
[root@docker ~]# docker run -itd --rm registry:5000/img/myimg:nginx
2b7cd6d88a7665dbea0a4b3d99478e9f302c0a5661d7676d6d3bd3cb6d181# library 是默认路径,可以省略路径地址
[root@docker ~]# docker run -itd --rm httpd:latest
634766f788d665dbea0a4b39709e0a2cc8624fd99478e9f302c0a5661d767

 


CLOUD 08

一、容器服务发布

#对外发布服务,容器需要绑定端口,才能加以区分控制

#上学的时候,遇到班上有同学同门的情况时,年级大的会叫 大XX,年级小的会叫小xx。(一个道理)这里是为了方便访问,不与其他服务默认端口冲突。 (*^▽^*)

端口绑定

  • docker run -itd -p 宿主机端口:容器端口 镜像:标签
# 端口绑定
[root@docker ~]# docker run -itd --rm --name web -p 80:80 myos:nginx
# 绑定后,直接访问宿主机的 IP 地址即可
[root@docker ~]# curl http://192.168.1.31
Nginx is running !# 一个端口只能绑定唯一容器
[root@docker ~]# docker run -itd --rm -p 80:80 myos:httpd
......
Bind for 0.0.0.0:80 failed: port is already allocated.# 使用不同端口绑定
[root@docker ~]# docker run -itd --rm -p 8080:80 myos:httpd
3c22b1d9c7484c03648d9c64fe073953fb9460015b6f2a# 绑定后,访问验证
[root@docker ~]# curl http://192.168.1.31:8080
Welcome to The Apache.

容器存储卷

  • docker run -itd -v 宿主机对象:容器内对象 镜像:标签
# 创建卷目录,并添加测试页面
[root@docker ~]# mkdir /var/webroot 
[root@docker ~]# echo "hello world" >/var/webroot/index.html# 使用卷映射数据目录
[root@docker ~]# docker rm -f web
[root@docker ~]# docker run -itd --rm --name web -p 80:80 \-v /var/webroot:/usr/local/nginx/html myos:nginx[root@docker ~]# curl http://192.168.1.31/
hello world# 修改数据卷内容可以直接在容器内体现
[root@ecs-proxy s4]# rsync -av public/info.php 192.168.1.31:/var/webroot/
[root@ecs-proxy s4]# curl http://192.168.1.31/info.php
<?PHP
......
修改配置文件
# 获取配置文件
[root@docker ~]# docker cp web:/usr/local/nginx/conf ./conf
Successfully copied 45.1kB to /root/conf# 编辑配置文件,添加 php 解析配置
[root@docker ~]# vim conf/nginx.conflocation ~ \.php$ {root           html;fastcgi_pass   127.0.0.1:9000;fastcgi_index  index.php;include        fastcgi.conf;}# 使用卷映射配置文件,重建 nginx 容器
[root@docker ~]# docker rm -f web
[root@docker ~]# docker run -itd --rm --name web -p 80:80 \-v /root/conf:/usr/local/nginx/conf \-v /var/webroot:/usr/local/nginx/html myos:nginx# 访问验证
[root@docker ~]# curl http://192.168.1.31/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>

容器网络通信

实验架构图例

 

共享名称空间
# 使用 nginx 的网络名称空间
[root@docker ~]# docker run -itd --rm --name php --network=container:web myos:php-fpm
d5a02b75486ce428f02b25f869f21299387fa4f51a605f478b466656d7c85c6f[root@docker ~]# curl http://192.168.1.31/info.php
File not found.[root@docker ~]# docker exec -it web ss -ltun
Netid  State      Recv-Q    Send-Q     Local Address:Port
tcp    LISTEN     0         128            127.0.0.1:9000
tcp    LISTEN     0         128                    *:80# 为 php 增加数据卷
[root@docker ~]# docker rm -f php
[root@docker ~]# docker run -itd --rm --name php --network=container:web \-v /var/webroot:/usr/local/nginx/html myos:php-fpm[root@docker ~]# curl http://192.168.1.31/info.php
<pre>
Array
([REMOTE_ADDR] => 192.168.1.31[REQUEST_METHOD] => GET[HTTP_USER_AGENT] => curl/7.61.1[REQUEST_URI] => /info.php
)
php_host:   da7df895c434
1229

二、微服务编排

#先来点简单的,CLOUD 二周目 在详细介绍。

#下面这个格式,是你必须记住的基本格式。编写镜像微服务的最最最简单的格式,要求熟练掌握。

服务编排与治理


项目文件
# 创建项目文件
[root@docker ~]# vim docker-compose.yaml
name: myweb
version: "3"
services:nginxsvc:container_name: nginximage: myos:nginx

项目管理命令

指令说明
up创建项目并启动容器
ls列出可以管理的项目
images列出项目使用的镜像
ps显示项目中容器的状态
logs查看下项目中容器的日志
start/stop/restart启动项目/停止项目/重启项目
down删除项目容器及网络

 容器项目

容器项目管理
# 创建项目,并启动
[root@docker ~]# docker compose -f docker-compose.yaml up -d
[+] Running 1/2⠸ Network myweb_default  Created               0.4s ✔ Container nginx        Started               0.3s # 查看项目
[root@docker ~]# docker compose ls -a
NAME                STATUS              CONFIG FILES
myweb               running(1)          /root/docker-compose.yaml# 查看项目中的容器状态
[root@docker ~]# docker compose -p myweb ps
NAME      IMAGE        COMMAND                 SERVICE    PORTS
nginx     myos:nginx   "nginx -g 'daemon…"     nginxsvc   80/tcp# 查看项目使用的镜像
[root@docker ~]# docker compose -p myweb images
CONTAINER     REPOSITORY    TAG       IMAGE ID          SIZE
nginx         myos          nginx     10dc658da2fe      274MB#  查看项目中容器的日志
[root@docker ~]# docker compose -p myweb logs
nginx  | 2023/02/13 13:55:39 [error] 7#0: *1 open() ......# 启动、停止、重启项目
[root@docker ~]# docker compose -p myweb stop
[+] Stopping 1/1✔ Container nginx  Stopped                     0.1s 
[root@docker ~]# docker compose -p myweb start
[+] Running 1/1✔ Container nginx  Started                     0.3s 
[root@docker ~]# docker compose -p myweb restart
[+] Restarting 1/1✔ Container nginx  Started                     0.3s # 删除项目
[root@docker ~]# docker compose -p myweb down
[+] Running 2/1✔ Container nginx        Removed               0.1s ✔ Network myweb_default  Removed               0.1s

 

compose 语法

指令说明
networks配置容器连接的网络
container_name指定容器名称
depends_on解决容器的依赖、启动先后的问题
command覆盖容器启动后默认执行的命令
environment设置环境变量
image指定为镜像名称或镜像 ID
network_mode设置网络模式
restart容器保护策略[always、no、on-failure]
ports暴露端口信息
volumes数据卷,支持 [volume、bind、tmpfs、npipe]

 容器服务编排

#下面的属于进阶版本

[root@docker ~]# vim docker-compose.yaml 
name: myweb
version: "3"
services:nginxsvc:container_name: nginximage: myos:nginxrestart: alwaysvolumes:- type: bindsource: /root/conf/nginx.conftarget: /usr/local/nginx/conf/nginx.conf- type: bindsource: /var/webroottarget: /usr/local/nginx/htmlnetwork_mode: bridgeports:- 80:80environment:- "TZ=Asia/Shanghai"php-fpm:container_name: php-fpmimage: myos:php-fpmrestart: alwaysvolumes:- type: bindsource: /var/webroottarget: /usr/local/nginx/htmldepends_on:- nginxsvcnetwork_mode: "container:nginx"
验证项目
# 创建,并启动项目
[root@docker ~]# docker rm -f $(docker ps -aq)
[root@docker ~]# docker compose -f docker-compose.yaml up -d
[+] Running 2/2⠿ Container nginx    Started             0.3s⠿ Container php-fpm  Started             0.3s# 查看项目
[root@docker ~]# docker compose ls -a
NAME           STATUS        CONFIG FILES
myweb          running(2)    /root/docker-compose.yaml# 查看容器状态,验证服务
[root@docker ~]# docker compose -p myweb ps 
NAME           COMMAND                    SERVICE    STATUS
nginx          "nginx -g 'daemon of..."   nginx      running    ......
php-fpm        "php-fpm --nodaemoni..."   php-fpm    running    ......# 访问 php 页面验证
[root@docker ~]# curl -s http://127.0.0.1/info.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:   7e037978c775
1229

嵌入式脚本

# 拓展提高
[root@docker ~]# vim docker-script.yaml
name: mycmd
version: "3"
services:shell:container_name: mycmdimage: myos:8.5command:- sh- -c- |for i in {1..9}dosleep 1echo "${HOSTNAME} && $${HOSTNAME}"done[root@docker ~]# docker compose -f docker-script.yaml up -d
[root@docker ~]# docker compose ls -a
NAME                STATUS              CONFIG FILES
mycmd               running(1)          /root/docker-script.yaml
[root@docker ~]# docker compose -p mycmd logs
mycmd  | docker-0001 && af878f933612
mycmd  | docker-0001 && af878f933612
mycmd  | docker-0001 && af878f933612
......

三、harbor仓库

#前面的 私人仓库只是小打小闹,真正用的上的还得是云端上的harbor仓库

环境配置

主机名ip地址最低配置
harbor192.168.1.302CPU,4G内存

 

安装部署 docker
[root@harbor ~]# vim /etc/hosts
192.168.1.30    harbor# 安装部署 docker 及 compose 组件
[root@harbor ~]# dnf install -y docker-ce
[root@harbor ~]# systemctl enable --now docker
  • 拷贝软件包到 harbor 主机
    [root@ecs-proxy ]# rsync -av harbor-* 192.168.1.30:/root/
  • #该软件包有好几个镜像,都是自己git上爬的,平常没事可以自己收集真实可靠的软件软,方便上传 harbor 仓库中使用。

创建 https 证书 

# 导入 harbor 项目镜像
[root@harbor ~]# tar -zxf harbor-v2.9.2.tgz -C /usr/local/
[root@harbor ~]# cd /usr/local/harbor
[root@harbor harbor]# docker load -i harbor.v2.9.2.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=Tedu/OU=NSD/CN=harbor"
创建并启动项目

#17,18行的配置文件名记好。别记错了   ^_^

#36 行是你 harbor admin(管理员)的密码,记不住了可以来这里看,是在记不住,自己写到excel 表格里面也可以。

# 修改配置文件
[root@harbor harbor]# cp harbor.yml.tmpl harbor.yml
[root@harbor harbor]# vim harbor.yml
05:    hostname: harbor
08:    # http:
10:      # port: 80
17:    certificate: /usr/local/harbor/tls/cert.crt
18:    private_key: /usr/local/harbor/tls/cert.key
36:    harbor_admin_password: <登录密码># 预安装环境检查,生成项目文件
[root@harbor harbor]# /usr/local/harbor/prepare
# 创建并启动项目
[root@harbor harbor]# docker compose -f docker-compose.yml up -d
# 添加开机自启动
[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 ~]# docker compose ls -a
NAME                STATUS              CONFIG FILES
harbor              running(9)          /usr/local/harbor/docker-compose.yml
# 查看容器状态
[root@harbor ~]# docker compose -p harbor ps
NAME                COMMAND                  SERVICE       STATUS
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)
harbor-portal       "nginx -g 'daemon of…"   portal        running (healthy)
nginx               "nginx -g 'daemon of…"   proxy         running (healthy)
redis               "redis-server /etc/r…"   redis         running (healthy)
registry            "/home/harbor/entryp…"   registry      running (healthy)
registryctl         "/home/harbor/start.…"   registryctl   running (healthy)

 

harbor 管理

容器管理命令说明
docker login登录私有镜像仓库
docker logout退出登录

 登录私有仓库

# 添加主机配置
[root@docker ~]# vim /etc/hosts
192.168.1.30    harbor# 添加私有仓库配置
[root@docker ~]# vim /etc/docker/daemon.json
{"registry-mirrors": ["https://harbor:443", "其他镜像仓库"],"insecure-registries":["harbor:443", "其他镜像仓库"]
}
[root@docker ~]# systemctl restart docker# 登录 harbor 仓库
[root@docker ~]# docker login harbor:443
Username: <登录用户>
Password: <登录密码>
... ...
Login Succeeded
# 认证信息记录文件
[root@docker ~]# cat /root/.docker/config.json 
{"auths": {"harbor:443": {"auth": "bHVjazoqKioqKioqKg=="}}
}
# 退出登录
[root@docker ~]# docker logout harbor:443
Removing login credentials for harbor:443

 上传镜像

# 设置标签
[root@docker ~]# docker tag myos:httpd harbor:443/private/httpd:latest
# 没有登录上传失败
[root@docker ~]# docker push harbor:443/private/httpd:latest
65dbea0a4b39: Preparing 
unauthorized: unauthorized to access repository ......# 登录成功后才可以上传
[root@docker ~]# docker login harbor:443
Username: <登录用户>
Password: <登录密码>Login Succeeded
# 上传成功
[root@docker ~]# docker push harbor:443/private/httpd:latest
The push refers to repository [harbor:443/private/httpd]
......# 上传镜像到 library 项目
[root@docker ~]# docker tag myos:latest harbor:443/library/myos:latest
# 没有权限上传失败
[root@docker ~]# docker push harbor:443/library/myos:latest
The push refers to repository [harbor:443/library/myos]
65dbea0a4b39: Preparing 
unauthorized: unauthorized to access repository: 
......# 赋权后重新上传镜像
[root@docker ~]# docker push harbor:443/library/myos:latest
The push refers to repository [harbor:443/library/myos]
......

#上传完镜像,就可以登录harbor仓库网页端查看了,注意网址为: https:IP:443   #ip为你配置的harbor仓库 IP地址。

为什么要加上 https呢? 因为用了网页加密模块,443端口则是模块服务的默认端口。

一开始登录进去是 admin 管理员账户,提醒你配置新密码,你配置的密码自己要记住。不然用的时候抓马。。。。。

总体来说,CLOUD 一周目的内容完全讲述完了,主要包括了云平台的使用,docker软件命令的使用,容器,镜像,虚拟化之间的关系dockerfile与微服务地点编写.

  还有镜像的制作,上传。 私有镜像仓库与harbor仓库的简单使用

下周末,我会开始 云计算 CLOUD 二周目的课程记录,后续也会把 面试题类型 单开一个专栏系列写出来。

 敬请期待吧 ^_^

相关文章:

云计算第四阶段---CLOUD Day7---Day8

CLOUD 07 一、Dockerfile详细解析 指令说明FROM指定基础镜像&#xff08;唯一&#xff09;RUN在容器内执行命令&#xff0c;可以写多条ADD把文件拷贝到容器内&#xff0c;如果文件是 tar.xx 格式&#xff0c;会自动解压COPY把文件拷贝到容器内&#xff0c;不会自动解压ENV设置…...

深入解析ThingsBoard与ThingsKit物联网平台的差异

VS 在物联网(IoT)领域&#xff0c;平台的选择对于企业来说至关重要。本文将深入探讨ThingsBoard社区版与ThingsKit企业版这两个物联网平台的差异&#xff0c;帮助读者更好地理解它们的特色和适用场景。 系统相同点 首先&#xff0c;ThingsBoard社区版和ThingsKit企业版都基于…...

五、CAN总线

目录 一、基础知识 1、can介绍 2、CAN硬件电路 3、CAN电平标准 4、CAN收发器芯片介绍 5、CAN帧格式 ① CAN帧种类 ② CAN数据帧 ③ CAN遥控帧​编辑 ④ 位填充 ⑤ 波形实例 6、接收方数据采样 ① 接收方数据采样遇到的问题 ② 位时序 ③ 硬同步 ④ 再同步 ⑤ 波…...

Linux:终端(terminal)与终端管理器(agetty)

终端的设备文件 打开/dev目录可以发现其中有许多字符设备文件&#xff0c;例如对于我的RedHat操作系统&#xff0c;拥有tty0到tty59&#xff0c;它们是操作系统提供的终端设备。对于tty1-tty12使用ctrlaltF*可以进行快捷切换&#xff0c;下面的命令可以进行通用切换。 sudo ch…...

钉钉与MySQL对接集成获取部门列表2.0打通EXECUTE语句

钉钉与MySQL对接集成获取部门列表2.0打通EXECUTE语句 接入系统&#xff1a;钉钉 钉钉是阿里巴巴集团打造的企业级智能移动办公平台&#xff0c;是数字经济时代的企业组织协同办公和应用开发平台。钉钉将IM即时沟通、钉钉文档、钉闪会、钉盘、Teambition、OA审批、智能人事、钉工…...

微信小程序点赞动画特效实现

这里提供两种实现点赞动画特效的方法&#xff1a; 方法一&#xff1a;使用 CSS 动画 wxml 文件: <view class"like-container"><image src"{{isLiked ? likedImg : unlikedImg}}" class"like-icon {{isLiked ? liked : }}" bindta…...

Day25笔记-普通文件读写with上下文二进制文件csv文件

一、文件读写【重点掌握】 常见文件的读写分类&#xff1a; ​ 1.普通文件文件,如txt&#xff0c;py&#xff0c;html等 ​ 2.二进制文件&#xff0c;如图片&#xff0c;音频&#xff0c;视频&#xff0c;压缩包等 ​ 3.csv文件&#xff0c;如csv,需要借助于系统模块csv ​ 4.对…...

MySQL安装教程

MySQL安装教程 如果需要删除原有mysql&#xff0c;然后安装过新的&#xff0c;可以参照如何彻底卸载旧mysql重装测试 1. 准备资源 mysql官网直达&#xff1a;https://dev.mysql.com/downloads/mysql/ CADN&#xff1a;https://download.csdn.net/download/luocong321/89592962 …...

【Windows】快速帮你解决如何找到 Windows 上的 .condarc 文件

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…...

『正版软件』XYplorer 专业的 Windows 文件管理工具软件

在数字化时代&#xff0c;我们每天都在与各种文件打交道。无论是工作文档、个人照片还是多媒体资料&#xff0c;管理这些文件的效率直接关系到我们的工作效率和生活体验。今天&#xff0c;我要向大家推荐一款功能强大、操作简便的文件管理软件 —— XYplorer。 XYplorer&#x…...

“吉林一号”宽幅02B系列卫星

离轴四反光学成像系统 1.光学系统参数&#xff1a; 焦距&#xff1a;77.5mm&#xff1b; F/#&#xff1a;7.4&#xff1b; 视场&#xff1a;≥56゜&#xff1b; 光谱范围&#xff1a;400nm&#xff5e;1000nm。 2.说明&#xff1a; 光学系统采用离轴全反射式结构&#xff0c;整…...

我的AI工具箱Tauri版-FasterWhisper音频转文本

本教程基于自研的AI工具箱Tauri版进行FasterWhisper音频转文本服务。 FasterWhisper音频转文本服务 是自研AI工具箱Tauri版中的一款模块&#xff0c;专门用于将音频或视频中的语音内容自动转化为文本或字幕。通过简单的配置&#xff0c;该工具能够批量处理大量音频或视频文件&…...

Java后端中的延迟队列实现:使用Redis与RabbitMQ的不同策略

Java后端中的延迟队列实现&#xff1a;使用Redis与RabbitMQ的不同策略 大家好&#xff0c;我是微赚淘客返利系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在后端开发中&#xff0c;延迟队列&#xff08;Delayed Queue&#xff09…...

Linux中使用cp命令的 -f 选项,但还是提醒覆盖的问题

问题&#xff1a; linux 在执行cp的命令的时候&#xff0c;就算是执行 cp -f 也还是会提醒是否要进行替换。 问题原因&#xff1a; 查看别名&#xff0c;alias命令&#xff0c;看到cp的别名为cp -i&#xff0c;那就是说cp本身就是自带覆盖提醒&#xff0c;就算我们加上-f 的…...

互联网技术的持续演进:从现在到未来

互联网技术的持续演进&#xff1a;从现在到未来 在过去的十年里&#xff0c;互联网技术发生了飞速变化。无论是大数据、人工智能&#xff0c;还是5G网络和物联网&#xff0c;每一种技术的突破都在改变我们的生活方式和工作模式。作为现代社会的核心驱动力&#xff0c;互联网技…...

vscode安装ESLint与Vetur插件后自动修复代码不生效

vscode安装ESLint与Vetur插件后自动修复代码不生效 1、安装ESLint 和 Vuter 2、运行结果 2.1、代码保存时代码中的分号;能被检测出来,但是不会自动修复 2.2、手动运行ESLint 修复命令(在终端中执行 npx eslint . --fix)可以修复问题 3、解决办法 在.vscode目录下setti…...

2848、与车相交的点

2848、[简单] 与车相交的点 1、题目描述 给你一个下标从 0 开始的二维整数数组 nums 表示汽车停放在数轴上的坐标。对于任意下标 i&#xff0c;nums[i] [starti, endi] &#xff0c;其中 starti 是第 i 辆车的起点&#xff0c;endi 是第 i 辆车的终点。 返回数轴上被车 任意…...

基于k8s手动部署rabbitmq集群(Manually Deploying RabbitMQ Cluster Based on k8s)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…...

mybatis 配置文件完成增删改查(四) :多条件 动态sql查询

文章目录 就是你在接收数据时&#xff0c;有的查询条件不写&#xff0c;也能从查到相应的stauts也可能为空恒等式标签 代替where关键字 就是你在接收数据时&#xff0c;有的查询条件不写&#xff0c;也能从查到相应的 注意是写字段名 还是 属性名 companyName不写也能查出满足…...

先楫HPM6750 Windows下VSCode开发环境配置

用的是EVKmini&#xff0c;ft2232作为调试器jtag接口调试 启动start_gui.exe 以hello_world为例&#xff0c;更改一下build path&#xff0c;可以generate并使用gcc compile 最后会得到这些 点击start_gui里面的命令行&#xff0c;用命令行启动vscode 新建.vscode文件夹&…...

【JavaScript】LeetCode:41-45

文章目录 41 排序链表42 合并k个升序链表43 LRU缓存44 二叉树的中序遍历45 二叉树的最大深度 41 排序链表 递归 归并排序找到链表中心点&#xff0c;从中心点将链表一分为二。奇数个节点找中心点&#xff0c;偶数个节点找中心左边的点作为中心点。快慢指针找中心点&#xff0c…...

数据结构(Day18)

一、周学习内容 1、9.18 数据结构&#xff08;Day15&#xff09;-CSDN博客 2、9.19 数据结构&#xff08;Day16&#xff09;-CSDN博客 3、9.20 链表 目的 插入删除不需要移动任何节点&#xff08;元素&#xff09;。 不需要预估存储空间大小&#xff0c;长度动态增长或减小。…...

error: ‘InsertAtTop‘ was not declared in this scope

Qt编译错误记录&#xff1a; 报错&#xff1a;error: ‘InsertAtTop’ was not declared in this scope ui->comboBoxJob->setInsertPolicy(InsertAtTop);这行代码在Qt中编译就会报这个错误&#xff0c;原因是输入参数需要加类名限定&#xff0c;改为&#xff1a; ui-…...

MySQL缓冲池详解

Buffer Pool 本文参考开源项目&#xff1a;小林coding在线文档&#xff1b; 01-缓冲池概述 ​ 在MySQL查询数据的时候&#xff0c;是通过存储引擎去磁盘做IO来获取数据库中的数据&#xff0c;这样每次查询一条数据都要去做一次或者多次磁盘的IO&#xff0c;无疑是非常慢的。…...

【我的 PWN 学习手札】tcache stash with fastbin double free —— tcache key 绕过

参考看雪课程&#xff1a;PWN 探索篇 前言 tcache key 的引入使得 tcache dup 利用出现了困难。除了简单利用 UAF 覆写 key 或者House Of Karui 之外&#xff0c;还可以利用 ptmalloc 中的其他机制进行绕过。 一、Tcache Stash with Fastbin Double Free 之前是 double free …...

How can I stream a response from LangChain‘s OpenAI using Flask API?

题意&#xff1a;怎样在 Flask API 中使用 LangChain 的 OpenAI 模型流式传输响应 问题背景&#xff1a; I am using Python Flask app for chat over data. In the console I am getting streamable response directly from the OpenAI since I can enable streming with a f…...

什么是慢充优惠话费充值api?如何选择平台

一、话费充值api的定义 话费充值api是一种能够让开发者将话费充值功能集成到自己的平台的接口。通过接入话费充值api接口&#xff0c;就能够实现话费充值平台的搭建&#xff0c;从而为用户提供话费充值服务&#xff0c;这一接口主要适用于对话费充值有长期稳定需求的企业或者商…...

【MySQL 03】表的操作

目录 1.在数据库内创建表 2.表的查询 3.表的插入 往数据库中插入数据 4.表的修改 5.删除表 1.在数据库内创建表 create table 表名(字段1 字段1类型); 这样我们就创建好了一张表&#xff0c;我们可以进入hellosql目录下进行查看&#xff1a;所以在数据库内建立表&#xf…...

3、论文阅读:EnYOLO:一种基于图像增强的水下目标区域自适应实时检测框架

图像增强和目标检测的结合 前言介绍相关工作UIE 水下图像增强UOD 水下目标检测UDA 水下域自适应方法介绍训练过程推理过程网络概述多阶段训练策略Burn-In Stage(预热阶段)Mutual-Learning Stage(相互学习阶段)Domain-Adaptation Stage(领域适应阶段)多阶段训练策略算法介…...

MYSQL面试知识点手册

第一部分&#xff1a;MySQL 基础知识 1.1 MySQL 简介 MySQL 是世界上最流行的开源关系型数据库管理系统之一&#xff0c;它以性能卓越、稳定可靠和易用性而闻名。MySQL 主要应用在 Web 开发、大型互联网公司、企业级应用等场景&#xff0c;且广泛用于构建高并发、高可用的数据…...