云计算第四阶段---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地址 | 最低配置 |
---|---|---|
registry | 192.168.1.35 | 2CPU,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地址 | 最低配置 |
---|---|---|
harbor | 192.168.1.30 | 2CPU,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指定基础镜像(唯一)RUN在容器内执行命令,可以写多条ADD把文件拷贝到容器内,如果文件是 tar.xx 格式,会自动解压COPY把文件拷贝到容器内,不会自动解压ENV设置…...

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

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

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

钉钉与MySQL对接集成获取部门列表2.0打通EXECUTE语句
钉钉与MySQL对接集成获取部门列表2.0打通EXECUTE语句 接入系统:钉钉 钉钉是阿里巴巴集团打造的企业级智能移动办公平台,是数字经济时代的企业组织协同办公和应用开发平台。钉钉将IM即时沟通、钉钉文档、钉闪会、钉盘、Teambition、OA审批、智能人事、钉工…...
微信小程序点赞动画特效实现
这里提供两种实现点赞动画特效的方法: 方法一:使用 CSS 动画 wxml 文件: <view class"like-container"><image src"{{isLiked ? likedImg : unlikedImg}}" class"like-icon {{isLiked ? liked : }}" bindta…...
Day25笔记-普通文件读写with上下文二进制文件csv文件
一、文件读写【重点掌握】 常见文件的读写分类: 1.普通文件文件,如txt,py,html等 2.二进制文件,如图片,音频,视频,压缩包等 3.csv文件,如csv,需要借助于系统模块csv 4.对…...

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

【Windows】快速帮你解决如何找到 Windows 上的 .condarc 文件
🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…...

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

“吉林一号”宽幅02B系列卫星
离轴四反光学成像系统 1.光学系统参数: 焦距:77.5mm; F/#:7.4; 视场:≥56゜; 光谱范围:400nm~1000nm。 2.说明: 光学系统采用离轴全反射式结构,整…...

我的AI工具箱Tauri版-FasterWhisper音频转文本
本教程基于自研的AI工具箱Tauri版进行FasterWhisper音频转文本服务。 FasterWhisper音频转文本服务 是自研AI工具箱Tauri版中的一款模块,专门用于将音频或视频中的语音内容自动转化为文本或字幕。通过简单的配置,该工具能够批量处理大量音频或视频文件&…...
Java后端中的延迟队列实现:使用Redis与RabbitMQ的不同策略
Java后端中的延迟队列实现:使用Redis与RabbitMQ的不同策略 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 在后端开发中,延迟队列(Delayed Queue)…...

Linux中使用cp命令的 -f 选项,但还是提醒覆盖的问题
问题: linux 在执行cp的命令的时候,就算是执行 cp -f 也还是会提醒是否要进行替换。 问题原因: 查看别名,alias命令,看到cp的别名为cp -i,那就是说cp本身就是自带覆盖提醒,就算我们加上-f 的…...
互联网技术的持续演进:从现在到未来
互联网技术的持续演进:从现在到未来 在过去的十年里,互联网技术发生了飞速变化。无论是大数据、人工智能,还是5G网络和物联网,每一种技术的突破都在改变我们的生活方式和工作模式。作为现代社会的核心驱动力,互联网技…...

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,nums[i] [starti, endi] ,其中 starti 是第 i 辆车的起点,endi 是第 i 辆车的终点。 返回数轴上被车 任意…...

基于k8s手动部署rabbitmq集群(Manually Deploying RabbitMQ Cluster Based on k8s)
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…...

mybatis 配置文件完成增删改查(四) :多条件 动态sql查询
文章目录 就是你在接收数据时,有的查询条件不写,也能从查到相应的stauts也可能为空恒等式标签 代替where关键字 就是你在接收数据时,有的查询条件不写,也能从查到相应的 注意是写字段名 还是 属性名 companyName不写也能查出满足…...

先楫HPM6750 Windows下VSCode开发环境配置
用的是EVKmini,ft2232作为调试器jtag接口调试 启动start_gui.exe 以hello_world为例,更改一下build path,可以generate并使用gcc compile 最后会得到这些 点击start_gui里面的命令行,用命令行启动vscode 新建.vscode文件夹&…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...

9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...