一、编写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