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.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>
容器网络通信
实验架构图例
共享名称空间
# 使用 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: nginx image: 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: 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
嵌入式脚本
# 拓展提高 [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内存 |
安装部署 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 二周目的课程记录,后续也会把 面试题类型 单开一个专栏系列写出来。
敬请期待吧 ^_^