容器架构-Docker的成长之路

目录

[1. 什么是容器](#1. 什么是容器)

[2. 容器 vs 虚拟机](#2. 容器 vs 虚拟机)

[3. Docker极速上手指南](#3. Docker极速上手指南)

环境准备

[3.1 配置docker源](#3.1 配置docker源)

[3.2 下载镜像加速的配置](#3.2 下载镜像加速的配置)

[3.3 下载自动补全工具](#3.3 下载自动补全工具)

[4. Docker C/S架构](#4. Docker C/S架构)

[5. Docker的镜像管理](#5. Docker的镜像管理)

[5.1 下载nginx:alpine镜像并查看](#5.1 下载nginx:alpine镜像并查看)

[5.2 sl大法](#5.2 sl大法)

[5.3 删除镜像](#5.3 删除镜像)

[5.4 镜像清理用的命令](#5.4 镜像清理用的命令)

[5.5 给镜像设置标签](#5.5 给镜像设置标签)

[5.6 查看镜像详细信息](#5.6 查看镜像详细信息)

[6. Docker的容器管理](#6. Docker的容器管理)

[6.1 run 运行容器](#6.1 run 运行容器)

[6.2 ps查看已经创建的容器](#6.2 ps查看已经创建的容器)

[6.3 create,start,stop,restart指令](#6.3 create,start,stop,restart指令)

[6.4 exec,attach连接容器](#6.4 exec,attach连接容器)

数据库环境启动与进入

[6.5 cp宿主机与容器传输数据](#6.5 cp宿主机与容器传输数据)

[6.6 commit 创建镜像](#6.6 commit 创建镜像)

[6.7 查看容器状态top,stats](#6.7 查看容器状态top,stats)

[6.8 inspect 查看容器各项指标,通过json格式显示](#6.8 inspect 查看容器各项指标,通过json格式显示)

[6.9 端口映射](#6.9 端口映射)

[7. 数据卷挂载](#7. 数据卷挂载)

[7.1 挂载代码目录,配置文件目录](#7.1 挂载代码目录,配置文件目录)

[7.2 创建数据卷](#7.2 创建数据卷)

[8. 手动实现创建tengine镜像](#8. 手动实现创建tengine镜像)

[9. 自动实现Dockerfile](#9. 自动实现Dockerfile)

[9.1 概述](#9.1 概述)

[9.2 Dockerfile使用](#9.2 Dockerfile使用)

[9.3 Dockerfile中的指令](#9.3 Dockerfile中的指令)

[9.4 编译安装tengine变成Dockerfile](#9.4 编译安装tengine变成Dockerfile)

[9.5 与ENTRYPOINT区别](#9.5 与ENTRYPOINT区别)

理解cmd

理解ENTRYPOINT

[10. 多服务镜像nginx+php](#10. 多服务镜像nginx+php)

[11. 分离式 nginx+php部署kodexp](#11. 分离式 nginx+php部署kodexp)

[12. Docker Compose](#12. Docker Compose)

[12.1 docker compose极速上手指南](#12.1 docker compose极速上手指南)

[12.2 compose文件的常用指令](#12.2 compose文件的常用指令)

[13. docker镜像仓库之registry仓库](#13. docker镜像仓库之registry仓库)

[13.1 仓库选型与概述](#13.1 仓库选型与概述)

[13.2 环境规划](#13.2 环境规划)

[13.3 极速上手指南](#13.3 极速上手指南)

[13.4 docker企业级镜像仓库harbor仓库](#13.4 docker企业级镜像仓库harbor仓库)

[13.5 harbor仓库使用指南](#13.5 harbor仓库使用指南)


1. 什么是容器

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

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

2. 容器 vs 虚拟机

虚拟机 容器
优点 使用简单 有成熟管理工具,vmware 可以随意定制 启动虚拟机要经历完整的Linux启动流程 快速部署 大部分环境都有现成镜像 让我们不再关注系统基础设施,把关注点放在配置,升级,优化 不依赖硬件 不依赖硬件 相当于一个进程
缺点 需要硬件支持虚拟化技术 资源利用率不高 同一台虚拟跑多个服务,可能有冲突 占用资源较多 不满足目前升级,快速扩容,快速部署,回滚不方便 使用较为复杂 共享linux系统内核,推荐使用较新linux内核

3. Docker极速上手指南

环境准备

主机 ip
docker01 10.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/restart docker 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 Docshttps://docs.docker.com/reference/compose-file/legacy-versions/

13. docker镜像仓库之registry仓库

13.1 仓库选型与概述

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

13.2 环境规划

主机名 环境与ip地址
docker01 docker环境 10.0.0.81
docker02 registry环境 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

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

相关推荐
TsengOnce10 分钟前
Docker 安装 禅道-21.2版本-外部数据库模式
运维·docker·容器
永卿00122 分钟前
nginx学习总结(不包含安装过程)
运维·nginx·负载均衡
Stark、23 分钟前
【Linux】文件IO--fcntl/lseek/阻塞与非阻塞/文件偏移
linux·运维·服务器·c语言·后端
人类群星闪耀时1 小时前
大模型技术优化负载均衡:AI驱动的智能化运维
运维·人工智能·负载均衡
新时代农民工--小明2 小时前
前端自动化部署更新,自动化打包部署
运维·前端·自动化
一个不秃头的 程序员2 小时前
服务器上加入SFTP------(小白篇 1)
运维·服务器
fnd_LN2 小时前
Linux文件目录 --- 复制命令CP、递归复制目录、软连接、硬链接
linux·运维·服务器
MorleyOlsen2 小时前
【Trick】解决服务器cuda报错——RuntimeError: cuDNN error: CUDNN_STATUS_NOT_INITIALIZED
运维·服务器·深度学习
周周的奇妙编程2 小时前
基于鲲鹏服务器的打砖块小游戏部署
运维·服务器
大熊程序猿3 小时前
airflow docker 安装
运维·docker·容器