容器架构-Docker的成长之路

news2024/11/8 19:34:30

目录

1. 什么是容器

2. 容器 vs 虚拟机

3. Docker极速上手指南

环境准备

3.1 配置docker源

3.2 下载镜像加速的配置

 3.3 下载自动补全工具

4. Docker C/S架构

 5. Docker的镜像管理

5.1 下载nginx:alpine镜像并查看

5.2 sl大法

5.3 删除镜像

5.4 镜像清理用的命令

5.5 给镜像设置标签

5.6 查看镜像详细信息

6. Docker的容器管理

6.1 run 运行容器

6.2 ps查看已经创建的容器

6.3 create,start,stop,restart指令

6.4 exec,attach连接容器

数据库环境启动与进入 

6.5 cp宿主机与容器传输数据

6.6 commit 创建镜像

6.7 查看容器状态top,stats

 6.8 inspect 查看容器各项指标,通过json格式显示

6.9 端口映射

7. 数据卷挂载

7.1 挂载代码目录,配置文件目录

7.2 创建数据卷

8. 手动实现创建tengine镜像

9. 自动实现Dockerfile

9.1 概述

9.2 Dockerfile使用

 9.3 Dockerfile中的指令

9.4 编译安装tengine变成Dockerfile

9.5 与ENTRYPOINT区别

理解cmd

理解ENTRYPOINT

10. 多服务镜像nginx+php

11. 分离式 nginx+php部署kodexp

12. Docker Compose

12.1 docker compose极速上手指南 

12.2 compose文件的常用指令

13. docker镜像仓库之registry仓库

13.1 仓库选型与概述

13.2 环境规划

13.3 极速上手指南 

13.4 docker企业级镜像仓库harbor仓库

13.5 harbor仓库使用指南


1. 什么是容器

1. 容器是隔离的环境中运行的一个进程,如果进程结束,容器就会停止.

2. 容器的隔离环境,拥有自己的ip地址,系统文件,主机名,进程管理,相当于一个mini的系统

2. 容器 vs 虚拟机

虚拟机容器
优点

使用简单

有成熟管理工具,vmware

可以随意定制

启动虚拟机要经历完整的Linux启动流程

快速部署

大部分环境都有现成镜像

让我们不再关注系统基础设施,把关注点放在配置,升级,优化

不依赖硬件

不依赖硬件

相当于一个进程

缺点

需要硬件支持虚拟化技术

资源利用率不高

同一台虚拟跑多个服务,可能有冲突

占用资源较多

不满足目前升级,快速扩容,快速部署,回滚不方便

使用较为复杂

共享linux系统内核,推荐使用较新linux内核

3. Docker极速上手指南

环境准备

主机ip
docker0110.0.0.81

docker02

10.0.0.82

3.1 配置docker源

##安装相关依赖
yum install -y yum-utils
##更换国内的一些源地址
yum-config-manager  --add-repo  https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
##
sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
##yum安装
yum install -y docker-ce
##开启自启
systemctl  enable --now docker
##检查版本
docker version

3.2 下载镜像加速的配置

mkdir -p /etc/docker
tee /etc/docker/daemon.json << 'EOF'
{
  "registry-mirrors": ["https://xxxxxx.com"]  ##自己的加速地址
}
EOF
systemctl daemon-reload
systemctl restart docker
docker info  ##当Registry Mirrors字段的地址为加速器的地址时,说明加速器已经配置成功

 3.3 下载自动补全工具

yum install -y bash-completion bash-completion-extras

4. Docker C/S架构

1. docker pull nginx 下载nginx镜像到本地仓库.

如果本地仓库有则提示镜像已经下载.

如果本地出仓库没有,则docker服务端访问远程仓库,下载镜像

docker run -d -p 80:80 nginx
##Unable to find image 'nginx:latest' locally   1.提示你本地没有nginx镜像 nginx:latest最新版
##latest: Pulling from library/nginx  2.找远程仓库下载
##Digest:sha256:28402db69fec7c17e179ea87882667f1e054391138f77ffaf0c3eb388efc3ffb  3.运行镜像,成为docker容器
##查看镜像
docker images
##查看容器
docker ps

##访问10.0.0.81:80 >容器的80端口

 注意事项: 此处使用到了docker -p端口映射公共,需要使用iptables的nat功能,需要开启系统的内核转发功能

vim /etc/sysctl.conf

net.ipv4.ip_forward = 1  ##写入

sysctl -p ##出现net.ipv4.ip_forward = 1 即可

 5. Docker的镜像管理

docker search  ##搜索镜像, 优先选官方,stars数量多
docker pull    ##拉取镜像(下载镜像),注意版本
docker push    ##推送镜像(上传镜像)
docker load    ##导入镜像
docker save    ##导出镜像
docker images  ##查看镜像列表
docker rmi     ##删除镜像
docker tag     ##给镜像打标签

5.1 下载nginx:alpine镜像并查看

docker pull  ##下载镜像
docker pull nginx/nginx-ingress:latest-alpine  
docker images ##查看镜像
##查找镜像
docker search 

5.2 sl大法

保存docker镜像(save),其他节点上导入(load)

##保存docker 镜像 -o输出到指定的文件
docker save nginx:1.22 -o nginx_1.22.tar
##导入load
docker load  -i nginx_1.22.tar
##批量保存镜像
docker images | awk 'NR>1 {print "docker save " $1 ":" $2 " -o " $1"_"$2".tar"}' | bash

5.3 删除镜像

##镜像在运行是不能删除
docker rmi nginx/nginx-ingress:3.7.0-20241027-alpine

5.4 镜像清理用的命令

##用于清理一些临时镜像,未来我们自定义镜像的时候会有
docker image prune
docker images -a   #可以查看系统中所有镜像,包含隐藏镜像

5.5 给镜像设置标签

##将latest-alpine标签改为alpine
docker tag nginx/nginx-ingress:latest-alpine nginx/nginx-ingress:alpine

5.6 查看镜像详细信息

##查看nginx:alpine镜像的信息,输出的是json格式
docker image inspect nginx:alpine
##可以配合jq命令取出容器的id
docker image inspect nginx|jq .[].Size

6. Docker的容器管理

docker  ps     ##查看容器列表  -a ##查看所有容器
docker  run    ##创建并运行容器
docker create  ##创建容器 --name
docker start   ##启动容器
docker  stop   ##停止容器
docker  restart ##重启容器
docker  kill   ##强制停止容器
docker  rm     ##删除容器
##批量删除所有容器 docker rm -f `docker ps -a -q`
docker exec   ##进入正在运行的容器(分配一个新终端)
docker attach  ##进入正在运行的容器(使用相同的终端)  #偷偷离开的快捷键ctrl +p,ctrl +q

6.1 run 运行容器

docker run指令的选项说明
-d容器后台运行并输出容器的id
-p端口映射 80:80 宿主机:容器
-v挂载数据卷
-i进入交互模式,进入这个镜像中. 一般与-t一起使用
-t分配一个终端(入口)
--name给容器指定个名字(方便管理容器),如果不设置会随机起名

##运行容器并指定名称
docker run -d -p 80:80 --name nginx-xzb  nginx:1.22 
##创建容器centos7.9并进入容器
docker run -it --name "xzb-linux-cs7.9" centos:centos7.9.2009

注意事项:

1. 容器中启动的进程,阻塞住容器,否则容器退出

 nginx -g 'daemon off;'   nginx前台运行.

/usr/sbin/php-fpm nodaemonize php前台运行.

/usr/sbin/sshd -D               ssh前台运行.

java -jar xxx.jar               java前台运行.

6.2 ps查看已经创建的容器

docker ps   ##查看运行的容器
docker ps --no-trunc ##显示完整信息,不要省略((一般指的命令部分)
docker ps -a  ##显示所有容器
docker ps -q  ##过滤出所有运行中的容器的id

6.3 create,start,stop,restart指令

docker run =docker pull+docker create+docker start ##所以一般使用docker run 而不是使用create,start
##创建容器
docker container create --name "nginx-last" nginx
##启动容器
docker container start nginx-last
##查看
docker -ps
##停止容器
docker container stop nginx-last
##重启容器
docker container restart nginx-last
## kill 结束容器
docker container kill nginx-last 
##rm 删除容器
docker rm -f  `docker ps -aq`  ##删除所有容器
docker rm `docker ps -a -f 'status=exited'`  ##删除已经退出的容器

6.4 exec,attach连接容器

##进入一个已经运行中的容器
docker exec -it nginx-xzb  /bin/bash   ##如果/bin/bash不能用就用/bin/sh
##修改下ngx首页文件
echo "I am in container" > /usr/share/nginx/html/index.html
##浏览器访问 10.0.0.81:80

为何连接进入容器后,要执行/bin/bash或/bin/sh呢?

进入容器后有个命令行环境(命令解释器),输入命令. 

数据库环境启动与进入 
##创建mysql容器,并设置root密码为xzb123
docker run -d --name "xzb_mysql" -e MYSQL_ROOT_PASSWORD=xzb123 mysql:5.7-debian
##直接进入数据库中
docker exec  -it xzb_mysql mysql -uroot -pxzb123
##docker run -e表示指定容器中的变量和值 key=value

6.5 cp宿主机与容器传输数据

docker cp 源  目标
docker cp  宿主机路径或文件  容器:容器中的目录  宿主机>>>容器 上传
docker cp  容器:容器中的目录 宿主机路径或文件 容器>>>宿主机   下载
## /etc/hosts上传到容器的/tmp/目录下
docker cp  /etc/hosts  nginx-xzb:/tmp/
##将容器目录/usr/share/nginx/html/index.html 下载到/tmp下
docker cp nginx-xzb:/usr/share/nginx/html/index.html /tmp/

6.6 commit 创建镜像

docker start nginx-xzb ##启动容器
docker commit nginx-xzb  nginx_web_01:restart_v1  ##将容器nginx-xzb制作成镜像
docker images  ##查看镜像
docker run -d -p 80:80 --name "nginx_xzb02" nginx_web_01:restart_v1   ##使用新镜像

6.7 查看容器状态top,stats

docker top nginx-xzb ##top查看容器中的进程信息
docker stats nginx-xzb  ##stats显示容器信息内存,磁盘

MEM USAGE /LIMIT  ##容器占用的内存大小 /内存限制(默认没有限制
NET I/O           ##网络数据传输  输入/输出  
##输入 Input 进入到容器中  
##输出 Output 离开容器. 用户访问80
BLOCK I/O ##磁盘读写
PIDS ##进程和线程数量

 6.8 inspect 查看容器各项指标,通过json格式显示

##docker  inspect + jq工具
docker inspect oldboy_nginx_v2  |jq .[].Id ##取出容器id号码
##.[] 用于去掉最外层的[]的
##.Id 取出{}中的键值
docker inspect nginx-xzb |jq .[].State.Status  ##取出容器状态
docker inspect nginx-xzb |jq .[].Name  ##取出容器名字
docker inspect nginx-xzb |jq .[].NetworkSettings.IPAddress  ##取出容器ip地址
docker inspect nginx-xzb |jq '.[].NetworkSettings.Ports."80/tcp"[0].HostPort' ##取出容器端口

6.9 端口映射

使用docker的时候 外界访问docker容器中的服务或端口,需要使用端口映射.本质类似于iptables防火墙的端口映射

##1对1端口映射
-p 80:80         ##-p选项(小写字母P) 宿主机端口:容器中的端口
docker run  -d  --name "xzb_nginx_80"  -p 80:80  nginx:1.20.2-alpine
##映射多个端口 映射8080,8081,8082 到容器中
##一个一个写
docker run -d -p 8080:8080 -p 8081:8081 -p 8082:8082  --name "nginx_port" nginx:1.22
docker port  容器名字或id
##表示连续
docker run -d -p  8084-8086:8080-8082 -p 88:80 --name "nginx_port2" nginx:1.22
##ip绑定端口
docker run -d -p 172.16.1.81:12306:80 --name "nginx_xzb" nginx:1.22 
curl 172.16.1.81:12306

7. 数据卷挂载

docker run -v  ##指定要挂载的目录/文件:容器内部路径
##挂载文件 宿主机的/app/docker/code/index.html 挂载到容器/usr/share/nginx/html/index.html
##挂载文件
mkdir -p  /app/docker/code/
echo "i am master" >/app/docker/code/index.html
docker run -d -p 8000:80 -v /app/docker/code/index.html:/usr/share/nginx/html/index.html   --name "nginx_volume" nginx:1.22
##挂载目录
docker run -d -p 8888:80 -v `pwd`:/usr/share/nginx/html/   --name "nginx_volume_dir" nginx:1.22
##查看容器挂载的数据卷
docker inspect nginx_volume_dir |jq .[].HostConfig.Binds

7.1 挂载代码目录,配置文件目录

##nginx:1.22镜像
mkdir -p /app/docker/conf/nginx/conf.d/   ##子配置文件目录 /etc/nginx/conf.d/
touch /app/docker/conf/nginx/nginx.conf   ##主配置文件 /etc/nginx/nginx.conf
mkdir -p /app/docker/code/restart/         ##站点目录  /usr/share/nginx/html/
docker run -d -p 80:80 -v /app/docker/conf/nginx/conf.d/:/etc/nginx/conf.d/ -v /app/docker/conf/nginx/nginx.conf:/etc/nginx/nginx.conf -v /app/docker/code/restart/:/usr/share/nginx/html/ --name "nginx_volume" nginx:1.22 

7.2 创建数据卷

docker volume create xzblogdata ##创建数据卷
docker volume ls                ##查看数据卷
ll /var/lib/docker/volumes/
docker run -d -p 8888:80 -v xzblogdata:/var/log/nginx/  --name "xzb_create_volume" nginx:1.22   ##挂载数据卷
ls -l /var/lib/docker/volumes/xzblogdata/_data/
##查看容器日志
docker logs  容器id或名字

8. 手动实现创建tengine镜像

##1.下载并启动ubuntu:20.04容器叫ubt_tengine_2.3.3
docker run -it --name "ubt_tengine_2.3.3" ubuntu:20.04 /bin/bash
##配置源
sed -i 's/https:\/\/mirrors.aliyun.com/http:\/\/mirrors.cloud.aliyuncs.com/g' /etc/apt/sources.list
##生成缓存
apt update

#2.下载常用软件
apt install -y wget vim curl
##下载tengine软件包
wget -P /tmp/ https://tengine.taobao.org/download/tengine-2.3.4.tar.gz
cd /tmp/
tar xf tengine-2.3.4.tar.gz
#3.编译安装3步曲
./config
make
make install
##3.1安装依赖
apt install -y libssl-dev make gcc pcre2-utils libpcre3-dev zlib1g-dev
## 进入到tengine软件包中
##3.2 prefix=/app/tools/tengine/  tengine的安装目录
./configure --prefix=/app/tools/tengine --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_mp4_module --with-stream --with-stream_ssl_module --with-stream_realip_module --add-module=modules/ngx_http_upstream_check_module --add-module=modules/ngx_http_upstream_session_sticky_module
echo $? ##上一个命令的执行结果 ,如果是0表示成功,非0就是失败
##3.3 make编译
make -j 1
## make install编译安装
make install 
##3.4 检查
/app/tools/tengine/sbin/nginx -V

##4. 收尾,启动,测试
##4.1 创建nginx用户和组
groupadd nginx
useradd -g nginx nginx 
##4.2 nginx命令软连接到/sbin/下面
ln -s /app/tools/tengine/sbin/nginx /sbin
nginx -V
##4.3 启动与本地测试
echo "i am tengine in docker01">/app/tools/tengine/html/index.html 
curl localhost
##5.生成镜像
docker commit ubt_tengine_2.3.3   tengine:2.3.3-v1
##保存镜像
docker save tengine:2.3.3-v1 -o tengine.tar
##运行容器
docker run -d -p 80:80 --name "tengine_v1" tengine:2.3.3-v1 nginx -g 'daemon off;'
##检查
##访问:10.0.0.82

9. 自动实现Dockerfile

9.1 概述

1. 通过1个文件Dockerfile,生成自定义镜像

2. 为何使用Dockerfile:

我们目前都是手动拉取镜像,手动进行配置,手动安装依赖,手动编译安装,创建用户....,这个过程类似于命令行使用ansible模块(繁琐,不方便重复执行)

书写Dockerfile把之前手动创建自定义镜像的过程,通过Dockerfile里面的指令实现.类似于书写playbook

9.2 Dockerfile使用

##准备目录
mkdir -p /server/dockfile/01-centos-nginx/
cd /server/dockfile/01-centos-nginx/
vim Dockerfile
##书写dockerfile
FROM centos:7
LABEL author="oldboyxzb"
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
RUN curl  -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum install -y nginx
RUN rm -fr /usr/share/nginx/html/index.html
RUN echo 'oldbouxzb linux' >/usr/share/nginx/html/index.html
CMD ["nginx","g","dameon off;"]

##根据Dockerfile构建镜像
docker build . -t 'nginx:1.20.2-centos7'  ##.表示 Dockerfile在当前目录下面 -t 就是给镜像命名

##运行
docker run -d -p 81:80 --name "nginx_centos7" nginx:1.20-centos7  nginx -g 'daemon off;'

##浏览器访问81端口

 9.3 Dockerfile中的指令

Dockerfile指令(开头部分都是大写)含义应用建议
FROM指定基本镜像类似于docker pull下载镜像尽量少写ubuntu或者ubuntu:latest,尽量指定具体的版 本.
LABEL用于指定容器的属性信息,作者,个人联系方式(邮件)推荐使用
ENV用于创建Dockerfile中使用的变量软件版本可以创建使用变量
RUN制作镜像过程中需要的执行命令,通常系统配置,服务配置,部署。 但不能出现阻塞当前终端的命令RUN 系统命令即可,不建议使用连续多个RUN,合并连续多 个RUN.
ADD可以把指定文件或目录拷贝到容器中(指定目录),会解压压缩包. 相对于当前目录ADD restart.tar.gz 空格/app/code/restart/            拷贝压缩包使用.
COPY可以把指定文件或目录拷贝到容器中(指定目录),不支持自动解压. 相对于当前目录ADD restart.tar.gz 空格/app/code/restart/            拷贝文件或者目录.
EXPOSE指定镜像要对外暴露的端口EXPOSE 80 ,用于指定一个或多个容器的端口
CMD用于指定容器的入口命令.入口命令可以在docker run的时候替换.运行镜像 启动容器的时候,容器默认运行的命令是什么CMD ["命令","参数01","参数02"],大部分都会使用CMD
ENTRYPOINT用于指定容器的入口命令.无法被docker run替换, dockerrun指定的时候仅 仅作为 entrypoint命令的参数而已ENTRYPOINT ["executable", "param1", "param2"]  ,使用不多.

9.4 编译安装tengine变成Dockerfile

FROM ubuntu:20.04
LABEL author="xzb"
ADD tengine-2.3.3.tar.gz /tmp/
#换源安装依赖
RUN sed -ri 's#archive.ubuntu.com|security.ubuntu.com#mirrors.aliyun.com#g' /etc/apt/sources.list \
    && apt update \
    && apt install -y libssl-dev make gcc pcre2-utils libpcre3-dev zlib1g-dev \
    && echo "Dependencies installed"
##创建用户
RUN useradd -s /sbin/nologin nginx \
    && echo "User created"
##创建目录
RUN mkdir -p /app/tools/tengine/ \
    && echo "directory created"
RUN cd /tmp/tengine-2.3.3/ \
    && ./configure --prefix=/app/tools/tengine/ --user=nginx --group=nginx \
       --with-http_ssl_module --with-http_v2_module --with-http_realip_module \
       --with-http_stub_status_module --with-http_mp4_module --with-stream \
       --with-stream_ssl_module --with-stream_realip_module \
       --add-module=modules/ngx_http_upstream_check_module \
       --add-module=modules/ngx_http_upstream_session_sticky_module \
    && make -j 1 \
    && make install \
    && echo "configure completed"
RUN ln -s /app/tools/tengine/sbin/nginx /sbin \
    && rm -fr /tmp/* \
    && rm -fr /var/cache/* \
    && echo "Links created and cleanup done"
COPY index.html /app/tools/tengine/html/index.html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

9.5 与ENTRYPOINT区别

CMD:

1. 用户通过docker run/exec启动进入容器的时候,指定了命令. 这个命令会替代CMD命令和参数

2.CMD写的入口命令和命令的选项.(可以被替换)

ENTRYPOINT:

1. 用户通过docker run/exec启动进入容器的时候,指定了命令. 指定的命令,选项会成为ENTRYPOINT命令的选项

2.入口的指令不可替换. 一般指定脚本,脚本用于判断用户docker run/exec的时候是否输入了命令.

理解cmd

FROM ubuntu:20.04
RUN touch oldboy.txt
CMD ["top","-b","-c"]
docker run -d --name "ubuntu_cmd" ubuntu_cmd:latest ##不加任何选项默认是top -b -c
docker run -d --name "ubuntu_cmd_v1" ubuntu_cmd:latest  sleep 60  ##COMMAND变为sleep 60

理解ENTRYPOINT

FROM ubuntu:20.04
RUN touch oldboy.txt
ENTRYPOINT ["top","-b","-c"]
docker run -d --name "ubuntu_entrypoint" ubuntu_entrypoint:latest  ##不加选项默认top -b -c
docker run -d --name "ubuntu_entrypoint_v2" ubuntu_entrypoint:latest sleep 60 ##CMD变为top -b -c sleep 60

10. 多服务镜像nginx+php

##本人采取多阶段提交 先创建ubuntu镜像 再用二进制包下载nginx和php
##1. 部署ubuntu镜像
FROM ubuntu:20.04
LABEL authot="xzb"
ENV MYPATH /etc/nginx
WORKDIR $MYPATH
RUN apt-get -y update
##安装vim编辑器
RUN apt-get -y install vim 
RUN apt-get -y install lrzsz
##安装ifconfig
RUN apt-get -y install net-tools
##nginx依赖
RUN apt-get install -y gcc
RUN apt-get install -y libpcre3 libpcre3-dev
RUN apt-get install -y zlib1g zlib1g-dev
RUN apt-get install -y openssl
RUN apt-get install -y libssl-dev
CMD echo $MYPATH
CMD echo "success"
CMD /bin/bash

##构建
docker build -t "ubuntu:1.0" .
##2. 在ubuntu:1.0中部署nginx
FROM ubuntu:1.0
LABEL author="xzb"
ENV MYPATH /etc/nginx
WORKDIR $MYPATH
RUN apt-get install -y make
RUN mkdir -p /tmp/nginx/
ADD nginx.tar.gz /tmp/nginx/
RUN cd /tmp/nginx/nginx-1.21.0/ && ./configure \
    --prefix=/usr/local/nginx \
    --sbin-path=/usr/local/nginx/sbin/nginx \
    --conf-path=/etc/nginx/nginx.conf \
    && make \
    && make install
RUN ln -s /usr/local/nginx/sbin/nginx /usr/bin/
EXPOSE 80 443
CMD ["nginx","-g","daemon off;"]
wget  http://nginx.org/download/nginx-1.26.1.tar.gz
##构建
docker build -t "ubuntu-nginx:1.0" .
##3. 在ubuntu-nginx:1.0 中部署php
wget https://www.php.net/distributions/php-7.4.30.tar.gz
FROM ubuntu-nginx:1.0
LABEL author="xzb"
ENV MYPATH /tmp/php
WORKDIR $MYPATH

##安装依赖
RUN apt-get update
ARG DEBIAN_FRONTEND=noninteractive
RUN echo "6" | apt-get install -y pkg-config 
RUN apt-get -y install gcc make openssl curl libssl-dev \
libxml2-dev libzip-dev libcurl4-openssl-dev libpng-dev libjpeg-dev \
libwebp-dev libonig-dev libsqlite3-dev libsodium-dev libargon2-dev
RUN mkdir -p  /tmp/php/
ADD php-7.4.30.tar.gz /tmp/php/
RUN cd /tmp/php/php-7.4.30/ && ./configure --prefix=/usr/local/php74 \
    --with-config-file-path=/etc \
    --with-fpm-user=www \
    --with-fpm-group=www \
    --with-curl --enable-fpm \
    && make \
    && make install \
    && cp php.ini-development /usr/local/php74/etc/php.ini \
    && ln -s /usr/local/php74/sbin/php-fpm   /sbin/
ADD php-fpm.conf /usr/local/php74/etc/php-fpm.conf
ADD www.conf /usr/local/php74/etc/php-fpm.d/www.conf
ADD nginx.conf /etc/nginx/nginx.conf 
ADD index.php /usr/local/nginx/html/index.php
RUN groupadd www
RUN useradd -g www www
ADD startServer.sh /tmp/php/startServer.sh
RUN chmod +x /tmp/php/startServer.sh
EXPOSE 80 443
ENTRYPOINT ["./startServer.sh"]
##构建
docker build -t "ubuntu-nginx-php:1.0" .
## nginx.conf
user  www;
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        location ~ \.php$ {
           root           html;
           fastcgi_pass   127.0.0.1:9000;
           fastcgi_index  index.php;
           fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
           include        fastcgi_params;
        }
    }
}
## php-fpm.conf
include=/usr/local/php74/etc/php-fpm.d/*.conf
## www.conf
[www]
user = www
group = www
listen = 127.0.0.1:9000
pm = dynamic
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
## index.php
<?php
phpinfo();
?>
##startServer.sh
#!/bin/bash
php-fpm
nginx -g "daemon off;"

11. 分离式 nginx+php部署kodexp

##nginx的子配置文件
server{
 listen 80;
 server_name kodexp.oldboylinux.cn;
 root /app/code/kodexp;
 location / {
   index index.php;

 }
 location ~ \.php$ {
   fastcgi_pass  php:9000;  ##这里的php:9000要和后面启动容器时 --link时的容器名一致
   fastcgi_index index_php;
   fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
   include       fastcgi_params;
 }
}
##nginx的主配置文件
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

##php的配置文件
[www]
user = www-data 
group = www-data
listen = 0.0.0.0:9000
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
 ##修改代码权限
chmod -R 777 code
chown -R root.root code
##启动php  pwd可以改为你的绝对路径,我的路径是在/app/docker/php-nginx-alone中
docker run -d --name "kodexp_php" -v `pwd`/conf/www.conf:/usr/local/etc/php-fpm.d/www.conf -v `pwd`/code:/app/code/kodexp php:7-fpm 
##启动nginx 
docker run -d --name "kodexp_nginx" -p 80:80 --link kodexp_php:php -v `pwd`/conf/nginx.conf:/etc/nginx/nginx.conf -v `pwd`/conf/kodexp.conf:/etc/nginx/conf.d/kodexp.conf -v `pwd`/code:/app/code/kodexp nginx:1.20.2-alpine 

##浏览器一定要解析访问
10.0.0.81 kodexp.oldboylinux.cn

12. Docker Compose

docker镜像可以通过Dockerfile一键创建

docker容器的管理(启动,关闭,重启),需要手动执行,如何管理多个容器,这就引出了单机容器编排工具 docker compose

12.1 docker compose极速上手指南 

yum install -y  docker-compose ##安装
##环境准备
mkdir -p /server/compose/
##docker-compose格式
version: "3.3"      ##版本信息
service:            ##service部分指定运行容器的信息
  web_ngx:          ##服务的名字,与容器名近似
    image: "nginx:1.20.2-alpine"    ##指定镜像
    link:           ##容器连接--link
     - web_php
    ports:          ##端口映射 -p
     - "8000:80"
  web_php:          ##服务的名字,与容器名近似
     image: "php-7-fpm"  
##启动命令
docker-compose up -d
docker-compose命令格式这个命令包含了docker container和docker image 命令
up -d创建并运行容器 启动的时候后台运行类似于docker run -d
stop/start/restartdocker container 关闭、开启、重启容器
ps查看容器运行情况 只有-q选项
top容器进程信息
logs容器日志
rm删除容器(需要容器已经关闭)
images查看镜像

1. 如果docker-compose简单修改端口,数据卷.docker-compose up -d 会自动识别,重新创建容器 

2. 如果容器的名字也改了,会造成新旧容器的端口冲突,会失败. 可以 up -d remove-orphans 删除之前容器或失效容器

12.2 compose文件的常用指令

1. depends_on: 依赖,先启动指定的容器然后再启动当前容器

2. volumes: 数据卷

其他选项参考官方文档:

Legacy versions | Docker Docsicon-default.png?t=O83Ahttps://docs.docker.com/reference/compose-file/legacy-versions/

13. docker镜像仓库之registry仓库

13.1 仓库选型与概述

docker镜像仓库方案应用场景与特点
镜像保存为压缩包使用的时候,sl(save/load),仅适用于节点极少的情况.很不方便
registry镜像仓库使用方便,适用于小型网站集群.(镜像不多,环境不复杂),命令行操作
harbor镜像仓库企业级镜像仓库(docker,k8s)都可用,图形化页面
公有云的镜像服务在公有云上申请个人,企业

13.2 环境规划

主机名环境与ip地址
docker01docker环境 10.0.0.81
docker02registry环境 10.0.0.82

所有主机对应主机名能够解析:

cat >>/etc/hosts<< EOF

     10.0.0.81 docker01.oldboylinux.cn
     10.0.0.82 docker02.oldboylinux.cn reg.oldboylinux.cn

EOF

13.3 极速上手指南 

##1. 下载registry #镜像仓库服务器配置
docker pull registry
##2. 配置(docker服务端准许使用http)
vim /etc/docker/daemon.json 
{
    "registry-mirrors": [ "https://自己的镜像加速地址.com" ],
    "insecure-registries":["reg.oldboylinux.cn:5000"]
}
systemctl restart docker
##注意第2行结尾的逗号
##注意reg.oldboylinux.cn域名解析.hosts解析


##3. 启动容器
docker run -d --name "registry_xzb" -p 5000:5000 -v registry:/var/lib/registry --restart=always registry:latest
##4. 查看私有仓库镜像信息
http://reg.oldboylinux.cn:5000/v2/_catalog ##默认没有信息

##5. (上传镜像到私有仓库)
## tag 给镜像打上标签(地址/路径/名字:版本)
## push 推送镜像
docker tag nginx:1.22  reg.oldboylinux.cn/xzb/nginx:1.22

##查看私有仓库的镜像
##拉取镜像
docker pull  reg.oldboylinux.cn:5000/xzb/centos:7.9

13.4 docker企业级镜像仓库harbor仓库

##环境准备
tar xf  harbor-offline-installer-v2.3.1.tgz  -C /app/tools/
###目录结构
common.sh
harbor.yml.tmpl ###临时配置文件  正式配置文件 叫harbor.yml
install.sh       #每次修改配置 需要执行下
LICENSE
prepare 
##配置文件
cat >>/etc/hosts<<EOF
 10.0.0.81 docker01.oldboylinux.cn
 10.0.0.82 docker02.oldboylinux.cn reg.oldboylinux.cn harbor.oldboylinux.cn
EOF
##准备配置文件
cp harbor.yml.tmpl harbor.yml
## 1.修改域名部分
hostname: harbor.oldboylinux.cn 
## 2.注释掉了 https相关的内容
 #https:
 #  # https port for harbor, default is 443
 #  port: 443
 #  # The path of cert and key files for nginx
 #  certificate: /your/certificate/path
 #  private_key: /your/private/key/path
## 3.修改了harbor仓库的默认的密码 
harbor_admin_password: xzb996
##进行安装
./install.sh ##80端口不要被占用

##浏览器解析访问
用户名:admin 
密码:xzb996

13.5 harbor仓库使用指南

##
vim /etc/docker/daemon.json
{
    "registry-mirrors": [ "https://自己的阿里云镜像地址.com" ],
    "insecure-registries":["harbor.oldboylinux.cn"]
}

## 登录harbor
docker login -uadmin -pxzb996 harbor.oldboylinux.cn
##打标签
docker tag  nginx-php:lastest  harbor.oldboylinux.cn/nginx/nginx-php:lastest
##上传
docker push harbor.oldboylinux.cn/nginx/nginx-php:lastest

附言:你中途一定会遇到各种问题,百度查就完事了,大部分网上都有,不要放弃。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2236039.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【开源社区】ELK 磁盘异常占用解决及优化实践

1、问题及场景描述 本文主要讨论在 CentOS环境下基于 rpm 包部署 ELK 系统磁盘异常占用的问题解析和解决方案。 生产问题描述&#xff1a;以下问题现实场景基于ELK体系下&#xff0c;ES服务的磁盘占用问题解析。默认情况下&#xff0c;基于 RPM 安装的 Elasticsearch 服务的安…

仪表板展示|DataEase看中国:历年双十一电商销售数据分析

背景介绍 2024年“双十一”购物季正在火热进行中。自2009年首次推出至今&#xff0c;“双十一”已经成为中国乃至全球最大的购物狂欢节&#xff0c;并且延伸到了全球范围内的电子商务平台。随着人们消费水平的提升以及电子商务的普及&#xff0c;线上销售模式也逐渐呈现多元化…

【深度学习】论文笔记:空间变换网络(Spatial Transformer Networks)

博主简介&#xff1a;努力学习的22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a; Yaoyao2024往期回顾&#xff1a; 【机器学习】有监督学习由浅入深讲解分类算法Fisher算法讲解每日一言&#x1f33c;: 今天不想跑&#xff0c;所以才去跑&#xff0c;这才是长…

基于java+SpringBoot+Vue的旅游管理系统设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven mysql5.7或8.0等等组成&#x…

【HarmonyOS】not supported when useNormalizedOHMUrl is not true.

【HarmonyOS】 not supported when useNormalizedOHMUrl is not true. 问题背景&#xff1a; 集成三方库编译时&#xff0c;IDE提示报错信息如下&#xff1a; hvigor ERROR: Bytecode HARs: [cashier_alipay/cashiersdk] not supported when useNormalizedOHMUrl is not true…

如何对LabVIEW软件进行性能评估?

对LabVIEW软件进行性能评估&#xff0c;可以从以下几个方面着手&#xff0c;通过定量与定性分析&#xff0c;全面了解软件在实际应用中的表现。这些评估方法适用于确保LabVIEW程序的运行效率、稳定性和可维护性。 一、响应时间和执行效率 时间戳测量&#xff1a;使用LabVIEW的时…

gitlab项目如何修改主分支main为master,以及可能遇到的问题

如果你希望将 Git 仓库的主分支名称从 main 修改为 master&#xff1a; 1. 本地修改分支名称 首先&#xff0c;切换到 main 分支&#xff1a; git checkout main将 main 分支重命名为 master&#xff1a; git branch -m main master2. 更新远程仓库 将本地更改推送到远程仓库…

(六千字心得笔记)零基础C语言入门第八课——函数(上)

文章目录 一、函数的概念1.1 函数的概念 二、库函数2.1 标准库和头文件2.2 库函数的使用方法sqrt函数&#xff08;举例&#xff09;功能包含的头文件实践2.2.4 库函数文档的一般格式 三、自定义函数3.1 自定义函数的语法形式3.2 函数的举例 四、形参和实参4.1 实参4.1 形参4.3 …

案例精选 | 河北省某检察院安全运营中异构日志数据融合的实践探索

河北省某检察院是当地重要的法律监督机构&#xff0c;肩负着维护法律尊严和社会公平正义的重要职责。该机构依法独立行使检察权&#xff0c;负责对犯罪行为提起公诉&#xff0c;并监督整个诉讼过程&#xff0c;同时积极参与社会治理&#xff0c;保护公民权益&#xff0c;推动法…

DBAPI连接阿里云 maxcompute 报错

使用正确的驱动包 访问以下链接寻找驱动包 https://github.com/aliyun/aliyun-odps-jdbc/releases/tag/v3.4.3 注意要使用odps-jdbc-3.4.3-jar-with-dependencies.jar &#xff0c;这个是完整的jar包 不要使用odps-jdbc-3.4.3.jar&#xff0c;这个不是完整的&#xff0c;它还…

【MongoDB】MongoDB的Java API及Spring集成(Spring Data)

文章目录 Java APISpring 集成1. 添加依赖2. 配置 MongoDB3. 创建实体类4. 创建 Repository 接口5. 创建 Service 类6. 创建 Controller 类7. 启动 Spring Boot 应用8. 测试你的 API 更多相关内容可查看 Java API maven <dependency><groupId>org.mongodb</gr…

2-Ubuntu/Windows系统启动盘制作

学习目标&#xff1a; 掌握使用Win32DiskImager、Rufus等工具制作系统启动盘的基本步骤。独立将ISO镜像文件写入USB闪存驱动器&#xff0c;确保在需要时顺利安装或修复系统。通过学习如何选择正确的源文件和目标驱动器&#xff0c;理解启动盘的使用场景和注意事项&#xff0c;…

CSS的三个重点

目录 1.盒模型 (Box Model)2.位置 (position)3.布局 (Layout)4.低代码中的这些概念 在学习CSS时&#xff0c;有三个概念需要重点理解&#xff0c;分别是盒模型、定位、布局 1.盒模型 (Box Model) 定义&#xff1a; CSS 盒模型是指每个 HTML 元素在页面上被视为一个矩形盒子。…

【贪心算法】No.1---贪心算法(1)

文章目录 前言一、贪心算法&#xff1a;二、贪心算法示例&#xff1a;1.1 柠檬⽔找零1.2 将数组和减半的最少操作次数1.3 最⼤数1.4 摆动序列1.5 最⻓递增⼦序列1.6 递增的三元⼦序列 前言 &#x1f467;个人主页&#xff1a;小沈YO. &#x1f61a;小编介绍&#xff1a;欢迎来到…

人工智能又创新!人声分离AI工具大放异彩

AI可以与人对话聊天、帮我们写PPT、做简单的图片处理等等&#xff0c;随着人工智能技术的发展&#xff0c;AI也逐渐深入到音视频编辑领域&#xff0c;很多人声分离AI工具应运而生。这些AI的作用&#xff0c;就是帮助我们从一首歌曲中将人声和伴奏分开。 AI是如何做到人声分离的…

现代Web开发:WebSocket 实时通信详解

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 现代Web开发&#xff1a;WebSocket 实时通信详解 现代Web开发&#xff1a;WebSocket 实时通信详解 现代Web开发&#xff1a;WebS…

物理验证Calibre LVS | SMIC Process过LVS时VNW和VPW要如何做处理?

SMIC家工艺的数字后端实现PR chipfinish写出来的带PG netlist如下图所示。我们可以看到标准单元没有VNW和VPW pin的逻辑连接关系。 前几天小编在社区星球上分享了T12nm ananke_core CPU低功耗设计项目的Calibre LVS案例&#xff0c;就是关于标准单元VPP和VBB的连接问题。 目前…

《C++类型转换:四种类型转换的规定》

C类型转换&#xff1a;四种类型转换的规定 1. 内置类型中的类型转换2. 内置类型和自定义类型的转换3. 自定义类型转换成内置类型4. 自定义类型之间的转换5. C强制类型转换5.1 static_cast5.2 reinterpret_cast5.3 const_cast5.4 dynamic_cast 6. RTTI&#xff08;了解&#xff…

安全工程师入侵加密货币交易所获罪

一名高级安全工程师被判犯有对去中心化加密货币交易所的多次攻击罪&#xff0c;在此过程中窃取了超过 1200 万美元的加密货币。 沙克布艾哈迈德&#xff08;Shakeeb Ahmed&#xff09;被判刑&#xff0c;美国检察官达米安威廉姆斯&#xff08;Damian Williams&#xff09;称其…

鸿蒙生态崛起:开发者的机遇与挑战

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题 点这里。 实战项目访问&#xff1a;http://javapub.net.cn/ 引言 作为一名技术博主&#xff0c;我对技术趋势始终保持着敏锐的洞察力。在数字化时代&#xff0c;操作系统作为智能设备的核心&#xff0c;其重要性不言而喻。随…