目录
[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区别)
[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. 什么是容器
容器是隔离的环境中运行的一个进程,如果进程结束,容器就会停止.
容器的隔离环境,拥有自己的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架构
- 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
注意事项:
- 容器中启动的进程,阻塞住容器,否则容器退出
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个文件Dockerfile,生成自定义镜像
为何使用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:
- 用户通过docker run/exec启动进入容器的时候,指定了命令. 这个命令会替代CMD命令和参数
2.CMD写的入口命令和命令的选项.(可以被替换)
ENTRYPOINT:
- 用户通过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 | 查看镜像 |
如果docker-compose简单修改端口,数据卷.docker-compose up -d 会自动识别,重新创建容器
如果容器的名字也改了,会造成新旧容器的端口冲突,会失败. 可以 up -d remove-orphans 删除之前容器或失效容器
12.2 compose文件的常用指令
depends_on: 依赖,先启动指定的容器然后再启动当前容器
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
附言:你中途一定会遇到各种问题,百度查就完事了,大部分网上都有,不要放弃。