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

CLOUD 07

一、Dockerfile详细解析

指令 说明
FROM 指定基础镜像(唯一)
RUN 在容器内执行命令,可以写多条
ADD 把文件拷贝到容器内,如果文件是 tar.xx 格式,会自动解压
COPY 把文件拷贝到容器内,不会自动解压
ENV 设置启动容器的环境变量
WORKDIR 设置启动容器的默认工作目录(唯一)
CMD 容器默认的启动参数(唯一)
ENTRYPOINT 容器默认的启动命令(唯一)
USER 启动容器使用的用户(唯一)
EXPOSE 使用镜像创建的容器默认监听使用的端口号/协议
cpp 复制代码
语法案例(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)

#制作镜像注意事项

cpp 复制代码
语法案例(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
cpp 复制代码
语法案例(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/
  • #这里想要测试的话,可以上其他网页模版,下点动态网站模版到++真机++ ,之后真机上传到 ++该机器++ 测试
cpp 复制代码
手工部署
# 创建容器
[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/
制作镜像
cpp 复制代码
# 编写 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
......
验证测试
cpp 复制代码
# 查看镜像并创建容器
[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软件从真机,上传到 该机器

cpp 复制代码
手工部署
# 创建容器
[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
制作镜像
cpp 复制代码
# 将编译好的 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
......
验证测试
cpp 复制代码
# 查看镜像并创建容器
[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)

多阶段镜像

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

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

cpp 复制代码
[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 镜像

手工部署
cpp 复制代码
[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
制作镜像
cpp 复制代码
# 编写 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
验证测试
cpp 复制代码
# 查看镜像并创建容器
[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 安装

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

客户端配置

  • 所有 node 节点都需要配置
  • #记住是所有被控制的 Node结点
cpp 复制代码
[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

上传镜像

cpp 复制代码
# 给 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

cpp 复制代码
# 查看仓库中所有镜像的名称
[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"
    ]
}
创建容器
cpp 复制代码
# 删除所有容器
[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 宿主机端口:容器端口 镜像:标签
cpp 复制代码
# 端口绑定
[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 宿主机对象:容器内对象 镜像:标签
cpp 复制代码
# 创建卷目录,并添加测试页面
[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
......
修改配置文件
cpp 复制代码
# 获取配置文件
[root@docker ~]# docker cp web:/usr/local/nginx/conf ./conf
Successfully copied 45.1kB to /root/conf

# 编辑配置文件,添加 php 解析配置
[root@docker ~]# vim conf/nginx.conf
        location ~ \.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>

容器网络通信

实验架构图例
cpp 复制代码
共享名称空间
# 使用 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 二周目****再详细介绍。

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

服务编排与治理

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

项目管理命令

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

容器项目

cpp 复制代码
容器项目管理
# 创建项目,并启动
[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]

容器服务编排

#下面的属于进阶版本

cpp 复制代码
[root@docker ~]# vim docker-compose.yaml 
name: myweb
version: "3"
services:
  nginxsvc:
    container_name: nginx
    image: myos:nginx
    restart: always
    volumes:
      - type: bind
        source: /root/conf/nginx.conf
        target: /usr/local/nginx/conf/nginx.conf
      - type: bind
        source: /var/webroot
        target: /usr/local/nginx/html
    network_mode: bridge
    ports:
      - 80:80
    environment:
      - "TZ=Asia/Shanghai"
  php-fpm:
    container_name: php-fpm
    image: myos:php-fpm
    restart: always
    volumes:
      - type: bind
        source: /var/webroot
        target: /usr/local/nginx/html
    depends_on:
      - nginxsvc
    network_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

嵌入式脚本

cpp 复制代码
# 拓展提高
[root@docker ~]# vim docker-script.yaml
name: mycmd
version: "3"
services:
  shell:
    container_name: mycmd
    image: myos:8.5
    command:
      - sh
      - -c
      - |
        for i in {1..9}
        do
            sleep 1
            echo "${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内存
cpp 复制代码
安装部署 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 证书

cpp 复制代码
# 导入 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 表格里面也可以。

cpp 复制代码
# 修改配置文件
[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 退出登录

登录私有仓库

cpp 复制代码
# 添加主机配置
[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

上传镜像

cpp 复制代码
# 设置标签
[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 二周目 的课程记录,后续也会把 面试题类型 单开一个专栏系列写出来。

敬请期待吧 ^_^

相关推荐
CodeCaptain3 小时前
阿里云ECS上配置Nginx的反向代理
nginx·阿里云·云计算
有谁看见我的剑了?11 小时前
VMware OVF Tool 工具安装学习
云计算
盛夏5201 天前
Docker容器化部署SpringBoot+Vue项目:从零到一在阿里云宝塔面板的实践指南
阿里云·docker·云计算
狐571 天前
2026-01-10-云计算问答题部分整理-期末复习
云计算·期末复习
2401_861277551 天前
中国电信星辰AI大模型有哪些主要功能
人工智能·云计算·软件工程·语音识别
Akamai中国2 天前
基准测试:Akamai云上的NVIDIA RTX Pro 6000 Blackwell
人工智能·云计算·云服务·云存储
oMcLin2 天前
如何在 Ubuntu 22.04 LTS 上部署并优化 OpenStack 云计算平台,实现多租户虚拟化与弹性伸缩?
ubuntu·云计算·openstack
Tob管理笔记2 天前
建筑业如何精准开拓优质客户?技术驱动下的方法论与实践
大数据·云计算·数据库开发
咕噜企业分发小米2 天前
独立IP服务器有哪些常见的应用场景?
人工智能·阿里云·云计算
Mr. zhihao2 天前
使用 KMS 管理阿里云 OSS 临时凭证(AK/SK/STS):原理、对比与实战代码示例
阿里云·云计算