本期目标:封装一个即用型镜像,可用于运行基于Centos 7.6的PHP项目。
本文不涉及 dockerfile 语法。 假设您了解基本的类 Unix 操作。 系统知识丰富,熟悉类Unix操作环境,包括但不限于安装了Mac或Linux的物理机,类Unix虚拟机,或者安装了MinGW或CygWin的Windows机器。 安装),了解基本的docker操作,具备一定的dockerfile读取能力。
准备工作
建立工作目录
mkdir ~/docker -learncd ~/docker-learn
Dockerfile创建
触摸 Dockerfile
接下来,将常用的 nginx.conf 复制到您的工作目录。 p>
cp xxx/nginx.conf nginx.conf
封装基础镜像
编辑创建的Dockerfile
基础内容
表示此镜像继承自最新版本的centos
从centos安装nginx
创建nginx源文件
由于centos仓库中没有nginx,所以需要自己更新并添加nginx源。 使用docker将
nginx.org的RHEL源内容复制到nginx.repo文件中。
您也可以在本地运行以下命令来创建nginx.repo。
sudo 三通。 /nginx. 存储库 <<-"EOF"[nginx-stable]name=nginx stable repobaseurl=http://nginx.org/packages/centos/$releasever/$basearch/gpgcheck=1enabled=1gpgkey=https://nginx.org/keys/nginx_signing.key[nginx-mainline]name=nginx 主线 repobaseurl = http://nginx.org/packages/mainline/centos/$releasever/$basearch/gpgcheck=1enabled=0gpgkey=https://nginx.org/keys/nginx_signing.keyEOF
将复制 nginx.repo 命令写入 Docker 镜像
COPY nginx.repo /etc/yum.repos.d/nginx.repo
使用 yum 安装 nginx 并将其配置为开机启动
RUN yum makecache && yum install nginx && chkconfig nginx on
安装 php
>centos 以前版本的 php 和相关软件包存在于默认源中。 您需要更改为新版本的源。
本文remi开源镜像
安装remi源码
RUN rpm -ivh http://rpms.famillecollet.com/enterprise/remi [k4 ]release-7.rpm && yum update -y
使用 yum。 安装 php 和相关包并将它们配置为开机启动。
运行 yum install -y --enablerepo=remi --enablerepo=remi-php72 php php-openssl php-curl php-bcmath php-devel php- mbstring php-mcrypt php-mysqlnd php-pdo php-gd php-xml php-opcache php-fpm && chkconfig php-fpm 上
清理工作
众所周知,如果你想把图片推送到网上,图片越小越好。 运行docker yum会产生大量缓存,因此需要做一些清理工作。
RUN yum clean headers && yum clean package && yum clean metadata && rm -rf /usr/ share/man
声明镜像运行时入口点
即容器运行时执行的第一个命令。 init,您很可能无法运行某些特权命令,例如 chkconfig
ENTRYPOINT ["/sbin/init"]
Merge dockerfile。
dockerfile 中的每条指令都会生成一个额外的镜像层,这必然会增加镜像的大小。
通常的方法是尽可能将多个指令的顺序合并为一个。 它可以有效地减小图像尺寸。
FROM centos#复制两个仓库COPY conf/tsinghua-base.repo/etc/yum.repos.d/CentOS-Base.repoCOPY conf/nginx.repo /etc/yum.repos.d/nginx.repo# 安装组件及相关包 RUN yum makecache && yum - y install nginx && chkconfig nginx on && yum install -y epel-release && rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm && yum update [k4 ] ]y && yum install -y --enablerepo=remi --enablerepo=remi-php72 php php-openssl php-curl php- bcmath php[ k4]devel php-mbstring php-mcrypt php-mysqlnd php-pdo php-gd php-xml php-opcache php-fpm && chkconfig php-fpm top && yum clean header && yum clean package && yum clean 元数据 && rm -rf /usr/share/man# 声明入口点 ENTRYPOINT ["/sbin/init"]
测试镜像可用性
构建镜像
请注意,nginx官方存储库不太稳定,可能会导致运行时出现错误,请小心。 通常重试几次后就会成功。
对于其他类型的错误,请检查您的环境和 dockerfile 是否存在问题。
docker 构建。 -t 首先-build
以特权启动在后台运行的容器返回ID
-[使用k4后]privileged 选项,容器被赋予实际的 root 权限。 否则,仅授予本地常规用户权限。 仅当在容器中执行某些特殊操作(例如 systemctl)时才需要此选项。
docker run -d --privileged first-build
测试镜像运行状态
docker exec -it (docker run 命令返回的ID) ps aux | grep "[nginx|php]"
如果返回结果与此类似,则操作正确。
> docker exec -it cca6 ps aux | grep "[nginx|php]"root 1 0.0 0.0 43112 4888 ? Ss 09:15 0:00 /sbin/initroot 17 0.0 0.0 39096 6476 ? SS 09:15 0:00 /usr/lib/systemroot 29 0.1 0.0 35100 3308 SS 09:15 0:00 /usr/lib/sy茎根 370 0.0 0.1 371588 21424 ?Ss 09:15 0:00 php-fpm: masterroot 381 0.0 0.0 24264 2784 ?Ss 09:15 0:00 /usr/lib/systemdbus 386 0.0 0.0 58000 41 6 4 ?Ss 09 : 15 0:00 /usr/bin/dbus-droot 418 0.0 0.0 46432 980 ?Ss 09:15 0:00 nginx: 主 pnginx 421 0.0 0.0 46832 3512 ? S 09:15 0:00 nginx: 工作根 564 0.0 0.0 8096 1820 tty1 Ss+ 09:15 0:00 /sbin/agetty --apache 822 0.0 0.0 371588 12468 ?S 09:15 0:00 php-fpm: 池 wapache 825 0.0 0.0 371588 12 4 68 ?S 09 :15 0:00 php-fpm: pool wroot 2859 0.0 0.0 51752 3448 pts/0 Rs+ 09:21 0:00 ps aux
端口是,映射用于启动图像。 然后,您还可以在本地浏览器中查看 nginx 默认欢迎页面。
docker run -d --privileged -p 8080:80 first-build
Push Go到阿里云容器服务
注册阿里云命名空间
进入阿里云镜像控制台,
https://cr.console.aliyun.com/cn- zhangjiakou /instances/repositories
界面大概是这样的
使用图片加速器
点击左下角图片加速器 https : //cr.console.aliyun.com/cn-zhangjiakou/instances/mirrors 你会看到一个专门的加速链接。
找到您的操作系统并一一运行它们。 本文使用Ubuntu版本。
可以看到执行很顺利,没有出现异常。
登录阿里云docker仓库。
sudo docker login - -username=你阿里云用户名registry.cn-zhangjiakou.aliyuncs.com密码:阿里云密码登录成功
创建命名空间
单击左侧的命名空间 单击创建命名空间并输入命名空间名称。
命名空间可以理解为镜像所属的组织
示例:centos镜像的全称是docker.io/centos,docker.io是centos镜像的名称。 空间,但 docker.io 命名空间下有多个 centos 镜像。公开和私有是指公众是否可以查看阿里云镜像市场上的镜像以及是否可以未经许可进行检索。
创建仓库
现在您已经创建了命名空间,下一步是创建仓库。
仓库可以理解为一个组织创建的软件包的名称。
示例:centos镜像的全名是docker.io/centos,其中centos是仓库(软件)。 docker.io 和 centos 软件有很多版本。
https://cr.console.aliyun.com/cn-zhangjiakou/instances/repositories 进入仓库页面,点击新建仓库。
选择您刚刚创建的命名空间。 ,摘要是米勒的介绍。
单击“下一步”并为您的代码源选择本地存储库。
点击“创建镜像库”时,出现数据线表示创建成功。
将鼠标悬停在下载图标上可以看到仓库的专用地址。
更改图像名称。
将构建好的镜像first-build推送到阿里云仓库。 首先,使用docker 镜像 | 首先运行 grep-build 来查找镜像 ID。 接下来,重命名镜像,使其符合Docker第三方仓库镜像名称格式。
第三方镜像仓库镜像名称格式:仓库地址/组织/镜像名称:镜像版本号以阿里云为例:阿里云仓库地址/命名空间/仓库名称:版本注册中心。 cn -zhangjiakou.aliyuncs.com/leasn-docker/learn-docker:1
然后运行以下命令进行更改:
docker标签3482e8529a90registry.cn-zhangjiakou.aliyuncs.com/leasn-docker/learn-docker:1
再次使用docker镜像| grep first-build,它会被重命名,你可以看到无法找到它,因为它就在那里。
推送镜像
sudo docker Pushregistry.cn- zhangjiakou.aliyuncs.com/leasn-docker/learn-docker
所有推送操作完成后,您将看到您的阿里云仓库中多了版本。
至此,镜像推送成功。 基于阿里云的支持,镜像已在全球范围内提供。
向阿里云对开源行业的奉献致敬
封装项目的执行镜像
接下来,了解如何在您自己的项目中运行该图像。
这次您可以基于我们推送阿里云镜像了。
FROMregistry.cn-zhangjiakou.aliyuncs.com /leasn-docker/learn-docker:1
准备好的nginx副本.conf 到镜像
COPY nginx.conf /etc/nginx/conf/nginx.conf
nginx.conf 全文
user nginx; ;pid /run/nginx.pid;events {worker_connections 1024 ;}http {监听服务器{80; 服务er_name 127.0.0.1; root/var/www/html; 位置 ~ .php($|/) { fastcgi_pass 127.0.0.1:9000; fastcgi_split_path_info ^(.+.php)(. *)$; fastcgi_param PATH_INFO $fastcgi_path_info; $fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } }}
将项目的源代码复制到图像中。
在当前目录下创建一个项目,并确保该项目只有一个文件。 位于./proj
将项目复制到镜像并加权到运行目录
COPY proj /var/www/htmlRUN chmod [ k4 ]R 755 /var/www/html/
Dockerfile全文
来自registry.cn-zhangjiakou. aliyuncs.com/leasn-docker/learn-docker:1COPY nginx.conf /etc/nginx/nginx.confCOPY proj /var/www/htmlRUN chmod -R 755 /var/www/html/
构建镜像并使用端口映射运行容器
docker build .docker run --privileged -d [k4 ] ]p 8080:80 773ed8872493
如果没有发生任何其他事情,phpinfo() 已经在本地显示在 127.0.0.1:8080 处。
这里没有详细解释如何运行整个phpinfo项目。
使用 docker-compose 推送新版本并放置
图像
Compose 允许您定义和运行多容器的工具Docker 应用程序。 Compose 允许您使用 YAML 文件配置应用程序的服务。 然后,您可以使用一个命令从您的配置创建并启动所有服务。该应用程序是使用sudo apt install docker-compose安装的。
调整目录结构
在当前工作目录之外再添加一层目录。 粗略来说,工作目录 > docker-learn (之前的工作目录) && docker-compose.yaml
目录树结构:
编辑 docker-compose.yaml
docker-compose 包含多个用 yaml 语言编写的指令。 您将看到在命令行运行的运行命令的参数被写入文件中,并且通过集成工具协调启动。
主命令:
version版本信息,我不明白为什么一定是3
version: 3
需要编辑服务我们整理了服务清单。 这次主要写一个叫docker-learn的服务
services:
docker-compose.yaml全文
version: " 3" services: # 服务名称 docker-learn: # 服务是否以特权启动,即 --privileged Privilege: true # Build build: # 构建上下文为:docker build ./ docker[ k4]learn context: ./docker-learn # 端口映射,即-p 80:80 ports: - 80:80 # 对外暴露的端口是Dockerfile的EXPOSE命令 # EXPOSE命令只声明容器需要的端口open,它实际上并没有打开它们。 # 这个选项实际上适用于 docker run -it -P (大写): - 80 # 相当于 docker run -v 的目录映射 # Volume: # - ./logs /php - fpm:/var/log/php-fpm # - ./logs/nginx:/var/log/nginx
使用 docker-compose 启动镜像。
关闭其他正在运行的容器,避免与目标容器发生冲突。 跑。
docker ps | awk "{print $1}" | grep -v CON | xargs docker Kill
启动镜像
使用多个带 ups服务名称不运行该服务中定义的所有容器。
如果一个服务内有多个服务,可以使用up服务名启动服务容器。
默认情况下,up 使用 build:context 中的 Dockerfile 文件编译的镜像来启动容器。 [ k4] -build 强制映像重新编译并再次使用 Dockerfile 启动。 不过,--build 仍将使用现有的图像层缓存
使用 --force-recreate 重新编译。 不要使用镜像层缓存并完全重新编译。您将看到类似“bind: address already in use”的提示。 请更改端口绑定端口后重试。
docker-组合[docker-学习][--]构建][--强制-重新创建]
我看到您当前正在访问 127.0.0.1:8080。 phpinfo 仍然显示。
连接jenkins进行持续集成
更新
连接kubernetes
更新
完成
评论前必须登录!
注册