四道Dockerfile练习

server/2025/3/18 20:09:09/

一、编写Dockerfile,ubuntu_18.04:v3

要求:
    1、基础镜像ubuntu:18.04。
    2、替换为国内的安装源(比如阿里或163)。
    3、安装openssh-server。
    4、允许root用户远程登录。
    5、暴露端口22。
    6、服务开机自启动。

思路:先将换源的命令和源网址写道一个脚本,上传到到容器执行,换源之后进行下载openssh。然后创建/var/run/sshd这个目录(/var/run/sshd用于存放ssh服务的运行时数据的目录,例如会话信息、认证密钥等,是必要的)。然后就是需要注释掉/etc/pam.d/sshd这个文件里面的pam_loginuid.so(pam_loginuid.so模块的功能是记录用户登录的UID到/proc/self/loginuid。这通常用于审计和跟踪用户登录活动。容器使用独立的PID命名空间和文件系统命名空间,而/proc文件系统通常与宿主机共享(或部分隔离)。容器内的进程可能无法正确访问宿主机/proc中的资源,导致pam_loginuid.so无法写入/proc/self/loginuid。)。需要免密登录的话,还需要在宿主机上面创建一份公私钥,将公钥上传。最后进入容器的时候需要执行,这条命令/usr/sbin/sshd -D

1.1操作:

建议每个dockerfile操作的内容都在同一个目录下面操作:mkdir ./dockerfileTest && cd dockerfileTest

换源脚本:

#!/bin/bash
mv -f /etc/apt/sources.list{,.bak} 2>/dev/null
cat > /etc/apt/sources.list.d/163.list << EOF
deb http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiversedeb http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiversedeb http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse
EOF
apt update

 使用sshkeygen生成公私钥对:

-f表示指定生成到目录,-P密钥的密码,-q抑制所有交互提示和非必要输出

ssh-keygen -f ./authorized_keys -P '' -q
#这里会生成authorized_keys和authorized_keys.pub文件

dockerfile脚本

ARG VERSION=18.04
FROM ubuntu:${VERSION}
MAINTAINER "SPIKE<ailun.sanli@foxmail.com>"
COPY test.sh /root/
RUN chmod +x /root/test.sh && /root/test.sh \&& apt install openssh-server -y \&& sed -i '/pam_loginuid.so/s/^/# /g' /etc/pam.d/sshd \&& mkdir -p /var/run/sshd /root/.ssh
COPY authorized_keys.pub /root/.ssh/authorized_keys
ENTRYPOINT ["/usr/sbin/sshd", "-D"]
EXPOSE 22

然后创建镜像:

docker build -t ubuntu/18.04/sshd .

1.2测试

[root@master dockerfile]# docker run -d --name test -p 2333:22 ubuntu/18.04/sshd
622df3788bd4b16e76a265e89f7ba3ad08726949e982c2e9c9ab680b91f39b16
[root@master dockerfile]# docker ps
CONTAINER ID   IMAGE               COMMAND               CREATED         STATUS         PORTS                                   NAMES
622df3788bd4   ubuntu/18.04/sshd   "/usr/sbin/sshd -D"   5 seconds ago   Up 4 seconds   0.0.0.0:2333->22/tcp, :::2333->22/tcp   test

ssh登录:ssh -i authorized_keys -p 2333 localhost 


二、编写Dockerfile制作Web应用系统nginx镜像,生成镜像名为nginx:v1.1

并推送其到私有仓库。具体要求如下: 
    1、基于Ubuntu基础镜像;
    2、指定作者为Chinaskill;
    3、安装nginx服务,将提供的dest目录传到镜像内,并将dest目录内的前端文件复制到nginx的工作目录;
    4、暴露80端口;
    5、设置服务自启动。

这个也比较简单同理上:nginx启动需要:/usr/sbin/nginx -g daemon off让nginx在前台运行

2.1操作

创建一个工作环境:mkdir -p nginxCentos7/dest && cd nginxCentos7

往dest目录里面写点东西:echo "This is a test page which from centos/nginx:v1.1" > dest/index.html

由于容器里面没有wget命令,所以这里使用curl进行替换:curl -o 目标文件 网址

换源脚本:vim test.sh

#!/bin/bash
rm -rf /etc/yum.repos.d/CentOS-Base.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.tencent.com/repo/centos7_base.repo
curl -o /etc/yum.repos.d/epel.repo https://mirrors.tencent.com/repo/epel-7.repo
yum clean all
yum makecache

Dockerfile脚本

ARG VERSION=7
FROM centos:${VERSION}MAINTAINER "Chinaskill"
COPY test.sh /root/
RUN chmod +x /root/test.sh && /root/test.sh \&& yum install nginx -y
COPY dest/ /usr/share/nginx/html/
ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]
EXPOSE 80 443

 2.2测试

docker build -t centos/7/nginx .
docker run -d --name centosTest -p 80:80 centos/7/nginx:latest
[root@master nginxCentos7]# docker ps
CONTAINER ID   IMAGE                   COMMAND                  CREATED         STATUS         PORTS                                        NAMES
eec8f2dc1276   centos/7/nginx:latest   "/usr/sbin/nginx -g …"   4 seconds ago   Up 2 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp, 443/tcp   centosTest

[root@master nginxCentos7]# curl localhost
This is a test page which from centos/nginx:v1.1 

三、编写Dockerfile制作Redis镜像

生成镜像名为redis:v1.1,并推送到私有仓库。具体要求如下: 
    1、基于centos7基础镜像; 
    2、指定作者为Chinaskill;
    3、安装Redis服务,暴露6379端口;
    4、设置服务自启动。

配置逻辑:先换centos7为腾讯源,然后yum下载redis。将redis的配置内容上传到容器内部,最后启动的时候指定配置文件

3.1操作

创建一个工作目录:mkdir centos7Redis && cd centos7Redis

换源脚本:vim test.sh

#!/bin/bash
rm -rf /etc/yum.repos.d/CentOS-Base.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.tencent.com/repo/centos7_base.repo
curl -o /etc/yum.repos.d/epel.repo https://mirrors.tencent.com/repo/epel-7.repo
yum clean all
yum makecache

 redis.conf配置文件:

bind 0.0.0.0#监听ipv4地址
port 6379#监听端口
requirepass OPENlab123#客户端登录密码
protected-mode yes
daemonize no#非守护进程运行dir /data#数据目录
appendonly yes
save 100 1
maxmemory 1gb
maxmemory-policy volatile-lru

 dockerfile脚本,先上传换源脚本,然后添加执行权限,之后再执行它顺带创建redis数据目录。并下载redis,之后将数据目录的权限给到redis用户。将原本的redis.conf进行备份,最后上传我们自己的redis配置文件。

ARG VERSION=7
FROM centos:${VERSION}
MAINTAINER "SPIKE<ailun.sanli@foxmail.com>"COPY test.sh /root/
RUN chmod +x /root/test.sh && /root/test.sh \&& mkdir -p /data \&& yum install redis -y \&& chown -R redis:redis /data \&& mv /etc/redis.conf /etc/redis.conf.bak
COPY redis.conf /etc/redis.conf
ENTRYPOINT ["/usr/bin/redis-server", "/etc/redis.conf"]
EXPOSE 6379

 3.2测试

创建容器

docker run -d --name centosRedisTest -p 6379:6379 centos7redis/test:latest

 查看监听端口或者查看日志内容:

[root@master centos7Redis]# docker ps
CONTAINER ID   IMAGE                      COMMAND                  CREATED         STATUS         PORTS                                       NAMES
9b937600d8b4   centos7redis/test:latest   "/usr/bin/redis-serv…"   5 seconds ago   Up 4 seconds   0.0.0.0:6379->6379/tcp, :::6379->6379/tcp   centosRedisTest
[root@master centos7Redis]# netstat -lntup | grep 6379
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      2286490/docker-prox
tcp6       0      0 :::6379                 :::*                    LISTEN      2286495/docker-prox

 正常登录:

[root@master centos7Redis]# redis-cli -h localhost -p 6379 -a OPENlab123

 给镜像打上tag然后推送到自己搭建的harbor即可:

搭建Harbor见我的这一篇文章:基于Harbor构建docker私有仓库-CSDN博客

docker tag centos7redis/test:latest OpenLabTest/openlab/centos7/redis:3.2.12
docker login OpenLabTest#我自己搭建私有Harbor的域名,自己写道/etc/hosts文件下的域名解析
docker push OpenLabTest/openlab/centos7/redis:3.2.12

四、基于busybox搭建静态httpd

BusyBox等轻量级服务器-f 可能表示在前台运行(不转为守护进程)。

BusyBox的httpd中-h 可能用于指定服务器的根目录(文档根目录),因此服务器会从 /data/html 提供静态文件。

busybox和其他的那些系统不一样,busybox会自己带有httpd服务。因为busybox适用于嵌入式,用于现实页面,只能实现简单的静态httpd服务功能:

BusyBox 内置的 Shell 是 ash(Almquist Shell)或 hush(更轻量),而非功能更复杂的 bash

4.1操作

同理上:先创建一个工作目录:mkdir busyboxTest && cd mkdir busyboxTest,然后创建一个测试页面:echo "This is a test page" > index.html

dockerfile脚本:

ARG VERSION="latest"
FROM busybox:${VERSION}
RUN mkdir -p /data/html
COPY index.html /data/html/
ENTRYPOINT ["/bin/httpd", "-f", "-h"]
CMD ["/data/html"]
EXPOSE 80 

然后构建镜像:docker build -t busyboxTest/latest

4.2测试

运行容器:docker run -d --name busyboxyHttp -p 80:80 busyboxTest/latest:latest

检查监听端口:netstat -lntup | grep 80

[root@master busyboxTest]# netstat -lntup | grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      2279198/docker-prox
tcp6       0      0 :::80                   :::*                    LISTEN      2279203/docker-prox

 访问本地端口:curl localhost

[root@master busyboxTest]# curl localhost
This is a test page


http://www.ppmy.cn/server/176041.html

相关文章

c++图论(二)之图的存储图解

在 C 中实现图的存储时&#xff0c;常用的方法包括 邻接矩阵&#xff08;Adjacency Matrix&#xff09;、邻接表&#xff08;Adjacency List&#xff09; 和 边列表&#xff08;Edge List&#xff09;。以下是具体实现方法、优缺点分析及代码示例&#xff1a; 1. 邻接矩阵&…

双 Token 无感刷新机制在前后端分离架构中实现

在前后端分离的架构中&#xff0c;双 Token 无感刷新是一种常见的身份验证机制&#xff0c;用于在 Access Token 过期时&#xff0c;通过 Refresh Token 自动获取新的 Access Token&#xff0c;从而避免用户频繁登录。 1. 双 Token 无感刷新的核心流程 1.1 核心流程 用户登录&…

ElementUI 表格中插入图片缩略图,鼠标悬停显示大图

如何在 ElementUI 的表格组件 Table 中插入图片缩略图&#xff0c;通过鼠标悬停显示大图&#xff1f;介绍以下2种方式&#xff1a; 方法1&#xff1a;直接在模板元素中插入 <template><el-table :data"tableData"><el-table-column label"图片…

conda创建Python虚拟环境的原理

<Conda>在创建Python虚拟环境时&#xff0c;其背后的原理涉及到Conda包的版本管理和隔离。Conda是一个开源的包管理器和环境管理系统&#xff0c;它主要用于安装、运行和部署各种Python、R、Ruby、Node.js等语言的包、依赖和库。以下是创建Python虚拟环境的原理&#xff…

使用 Docker 部署前端项目全攻略

文章目录 1. Docker 基础概念1.1 核心组件1.2 Docker 工作流程 2. 环境准备2.1 安装 Docker2.2 验证安装 3. 项目配置3.1 项目结构3.2 创建 Dockerfile 4. 构建与运行4.1 构建镜像4.2 运行容器4.3 访问应用 5. 使用 Docker Compose5.1 创建 docker-compose.yml5.2 启动服务5.3 …

电脑如何录屏

以下是电脑录屏的常用方法总结&#xff0c;涵盖系统自带工具、第三方软件及进阶功能&#xff0c;结合不同场景需求推荐最佳方案&#xff1a; 一、系统自带工具 Xbox Game Bar&#xff08;Windows 10/11&#xff09; 操作步骤&#xff1a;按 WinG 打开游戏栏 → 点击录制按钮&am…

JVM调优关注的核心指标?

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

RabbitMQ 基本原理详解

1. 引言 在现代分布式系统中&#xff0c;消息队列&#xff08;Message Queue&#xff09;是实现异步通信、解耦系统组件、提高系统可靠性和扩展性的重要工具。RabbitMQ 作为一款开源的消息中间件&#xff0c;因其高性能、易用性和丰富的功能&#xff0c;被广泛应用于各种场景。…