• 主页
  • 相册
  • 随笔
  • 目录
  • 存档
Total 244
Search AboutMe

  • 主页
  • 相册
  • 随笔
  • 目录
  • 存档

Dockerfile实验

2020-07-12

1. 实验内容

  • 使用容器技术重构FTP、NFS、DHCP、DNS、Samba服务器的自动安装与自动配置
  • 将编写好的dockerfile传到docker hub,自动构建

2. 实验原理

2.1. 常用命令

1
2
3
4
5
$ docker ps // 查看所有正在运行容器 
$ docker stop containerId // containerId 是容器的ID
$ docker ps -a // 查看所有容器 $ docker ps -a -q // 查看所有容器ID
$ docker stop $(docker ps -a -q) // stop停止所有容器
$ docker rm $(docker ps -a -q) // remove删除所有容器

2.2. 镜像构成

2.2.1. docker exec

1
2
3
4
$ docker exec -it webserver bash
root@3729b97e8226:/# echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
root@3729b97e8226:/# exit
exit

2.2.2. docker diff

在docker exec交互式终端中修改了容器的文件,也就是改动了容器的存储层。我们可以通过 docker diff 命令看到具体的改动

1
$ docker diff webserver

2.2.3. docker commit

当我们运行一个容器的时候(如果不使用卷的话),我们做的任何文件修改都会被记录于容器存储层里。而 Docker 提供了一个docker commit命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ docker commit \
--author "Tao Wang <twang2218@gmail.com>" \
--message "修改了默认网页" \
webserver \
nginx:v2
sha256:07e33465974800ce65751acc279adc6ed2dc5ed4e0838f8b86f0c87aa1795214


$ docker image ls nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v2 07e334659748 9 seconds ago 181.5 MB
nginx 1.11 05a60462f8ba 12 days ago 181.5 MB
nginx latest e43d811ce2f4 4 weeks ago 181.5 MB


$ docker history nginx:v2
IMAGE CREATED CREATED BY SIZE COMMENT
07e334659748 54 seconds ago nginx -g daemon off; 95 B 修改了默认网页
e43d811ce2f4 4 weeks ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon 0 B
<missing> 4 weeks ago /bin/sh -c #(nop) EXPOSE 443/tcp 80/tcp 0 B
<missing> 4 weeks ago /bin/sh -c ln -sf /dev/stdout /var/log/nginx/ 22 B
<missing> 4 weeks ago /bin/sh -c apt-key adv --keyserver hkp://pgp. 58.46 MB
<missing> 4 weeks ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.11.5-1 0 B
<missing> 4 weeks ago /bin/sh -c #(nop) MAINTAINER NGINX Docker Ma 0 B
<missing> 4 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B
<missing> 4 weeks ago /bin/sh -c #(nop) ADD file:23aa4f893e3288698c 123 MB

2.2.4. Dockerfile

Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。有了 Dockerfile,当我们需要定制自己额外的需求时,只需在 Dockerfile 上添加或者修改指令,重新生成 image 即可,省去了敲命令的麻烦。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 1、第一行必须指定 基础镜像信息
FROM ubuntu

# 2、维护者信息
MAINTAINER docker_user docker_user@email.com

# 3、镜像操作指令
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf

# 4、容器启动执行指令
CMD /usr/sbin/nginx

2.3. 构建镜像

docker build 命令会根据 Dockerfile 文件及上下文构建新 Docker 镜像。构建上下文是指 Dockerfile 所在的本地路径或一个URL(Git仓库地址)。构建上下文环境会被递归处理,所以构建所指定的路径还包括了子目录,而URL还包括了其中指定的子模块

1
docker build -t nginx:v1 .
  • -t参数指定构建成镜像的仓库、标签

2.4. Dockerfile指令

指令作用其他
FROM整个Dockerfile的入口,必须是第一条指令,代表新制作镜像的基础镜像FROM scratch:不以任何基础镜像为基准
RUN执行命令行上的命令shell格式:RUN<命令>,类似于直接在终端输入命令 / exec格式:RUN [“可执行文件”, “参数1”, “参数2”]
MAINTAINER指定作者MAINTAINER
LABEL为镜像添加标签LABEL===…
COPY将宿主机文件拷贝至镜像内的指定路径COPY <源路径>… <目标路径> 或 COPY [“<源路径1>”,… “<目标路径>”]
ADD高级复制本质作用类似于COPY,但是其更复杂
WORKDIR用于指定Dockerfile中该指令下面的操作所在的工作目录类似 cd 命令
CMD服务启动指令制定一些你想自动启动的服务
ENV设置环境变量,在前面定义,后面可以通过 $ 取值进行使用ENV==…
EXPOSE声明运行时容器提供服务端口

2.5. 仓库管理

1
2
3
4
5
6
7
8
9
10
11
docker login

docker logout

# 拉取镜像
docker search ubuntu
docker pull ubuntu

# 推送镜像
# username 请替换为你的 Docker 账号用户名
docker tag ubuntu:18.04 username/dockername
1
sudo docker build -t ftp:1.0 .

2.6. 端口映射

EXPOSE:功能为暴漏容器运行时的监听端口给外部,但是EXPOSE并不会使容器访问主机的端口,如果想使得容器与主机的端口有映射关系,必须在容器启动的时候加上 -P参数。

  • -P:大写P为自动映射,会将EXPOSE暴露出来的端口随机映射到宿主机的端口上,如果没有暴露端口,就不会有映射。
  • -p:小写p为手动映射,需要自己指定宿主机的端口和容器的端口,形式为:
    • -p 宿主机端口:容器端口

2.7. docker和虚拟机区别

操作系统分为内核和用户程序,进而存在内核空间(kernel space)和用户空间(user Space)。简单说,Kernel Space 是 Linux 内核的运行空间,User space 是用户程序的运行空间。Kernel space 可以执行任意命令,调用系统的一切资源;User space 只能执行简单的运算,不能直接调用系统资源,必须通过系统接口(又称 system call),才能向内核发出指

而容器事实上就是一个用户程序,它同样通过调用系统接口实现功能。对于 docker 而言,如果宿主机是 linux,它就直接使用宿主机内核

  • 虚拟机完整虚拟了内核和用户空间,而 docker 仅仅虚拟了用户空间,那么 docker 必然更轻量、更快
  • 虚拟机建立在虚拟硬件层之上,每个虚拟机都有独立的内核和用户程序以及依赖库;而 docker 容器建立在宿主机内核和 docker 服务之上,使用共同的内核,每个容器仅仅是用户程序、依赖库不同

3. 实验内容

3.1. FTP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
FROM ubuntu:18.04

MAINTAINER hejueyun

USER root

COPY sources.list /etc/apt/

RUN apt update

RUN apt install vsftpd -y

ARG d="/etc/vsftpd.conf"

RUN cp /etc/vsftpd.conf /etc/vsftpd.conf.$(date +%s).bak

ARG anon_path=/var/ftp/pub

RUN mkdir -p $anon_path

RUN chown nobody:nogroup $anon_path

RUN echo "vsftpd test file" | tee "$anon_path/test.txt"

RUN sed -i 's/^[# ]*anonymous_enable=[a-zA-Z]*$/anonymous_enable=yes/g' $d

RUN sed -i 's/^[# ]*anon_upload_enable=[a-zA-Z]*$/anon_upload_enable=yes/g' $d

RUN sed -i 's/^[# ]*anon_mkdir_write_enable=[a-zA-Z]*$/anon_mkdir_write_enable=yes/g' $d

RUN grep -q "anon_root=" $d && sed -i 's/[# ]*anon_root=[a-zA-Z]*$/anon_root=\/var\/ftp\/pub/g' $d || echo "anon_root=/var/ftp/pub"| tee -a $d

RUN grep -q "no_anon_password=" $d && sed -i 's/^[# ]*no_anon_password=[a-zA-Z]*$/no_anon_password=YES/g' $d || echo "no_anon_password=YES" | tee -a $d

RUN echo "listen_port=2100 | tee -a $d

RUN service vstfpd restart

EXPOSE 20:20

EXPOSE 21:21

上传

下载

1
sudo docker run -ti --net="host" --ulimit='stack=-1:-1' hejueyun/ftp:1.0

3.2. NFS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
FROM ubuntu:18.04

MAINTAINER hejueyun

USER root

COPY sources.list /etc/apt/

RUN apt update

RUN apt install nfs-common -y

RUN apt install netbase

RUN rpcbind

RUN ps ax | grep rpcbind

RUN mkdir /mnt/public

RUN mkdir /mnt/protected

RUN mount -t nfs -o nfsvers=3 192.168.50.129:/public /mnt/public

RUN mount -t nfs -o nfsvers=3 192.168.50.129:/protected /mnt/protected

EXPOSE 2049 2049

3.3. DHCP

搭建dhcp服务器(在/etc/docker/daemon.json中固定docker0地址)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
FROM ubuntu:18.04

MAINTAINER hejueyun

USER root

COPY sources.list /etc/apt/

RUN apt update

RUN apt install isc-dhcp-server -y

COPY dhcpd.conf /etc/dhcp/dhcpd.conf

RUN echo "INTERFACESv4=docker0"| tee -a /etc/default/isc-dhcp-server

RUN service isc-dhcp-server start

3.4. DNS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
FROM ubuntu:18.04

MAINTAINER hejueyun

USER root

COPY sources.list /etc/apt/

RUN apt update

RUN apt install bind9 -y

COPY named.conf.default-zones /etc/bind/named.conf.default-zones

COPY db.test.com /etc/bind/db.test.com

RUN service start bind9

EXPOSE 53 53

  • 报错,目前还不知道如何解决

3.5. Samba

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FROM ubuntu:18.04

MAINTAINER hejueyun

USER root

COPY sources.list /etc/apt/

RUN apt update

RUN apt install samba -y
RUN apt install smbclient -y
RUN adduser samba
RUN mkdir /samba
RUN chmod o+w /samba

COPY smb.conf /etc/samba/

RUN service smbd start

4. 常见问题

  • 啟用vsftpd,出現500 OOPS錯誤
  • amazon ec2 - “500 Illegal PORT command” using command-line ftp - Server Fault
  • centos在 Docker 容器内安装nfs共享_docker_酷徒编程知识库
  • How to fix “Job for docker.service failed because the control process exited with error code” - Stack Overflow

5. 参考

  • Docker(二):Dockerfile 使用介绍 - 纯洁的微笑博客
  • Docker 仓库管理 | 菜鸟教程
  • 由浅入深docker系列:(4)容器与虚拟机 - 知乎
  • dockerfile——EXPOSE和端口映射参数-p、-P总结_DotWait的博客-CSDN博客_dockerfile expose
  • Docker删除/停止容器 - 挑战者V - 博客园
  • (4条消息)修改docker0默认ip_zyd_15221378768的博客-CSDN博客_linux docker 默认接口ip
  • Lab
  • Operating System
  • Linux
  • Lab
模糊测试实验
ansible实验
  1. 1. 1. 实验内容
  2. 2. 2. 实验原理
    1. 2.1. 2.1. 常用命令
    2. 2.2. 2.2. 镜像构成
      1. 2.2.1. 2.2.1. docker exec
      2. 2.2.2. 2.2.2. docker diff
      3. 2.2.3. 2.2.3. docker commit
      4. 2.2.4. 2.2.4. Dockerfile
    3. 2.3. 2.3. 构建镜像
    4. 2.4. 2.4. Dockerfile指令
    5. 2.5. 2.5. 仓库管理
    6. 2.6. 2.6. 端口映射
    7. 2.7. 2.7. docker和虚拟机区别
  3. 3. 3. 实验内容
    1. 3.1. 3.1. FTP
    2. 3.2. 3.2. NFS
    3. 3.3. 3.3. DHCP
    4. 3.4. 3.4. DNS
    5. 3.5. 3.5. Samba
  4. 4. 4. 常见问题
  5. 5. 5. 参考
© 2024 何决云 载入天数...