一.Dokerfile基础知识
Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令。docker程序将这些Dockerfile指令翻译真正的linux命令。Dockerfile有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系,类似于Makefile。Docker程序将读取Dockerfile,根据指令生成定制的image。
二.Dockerfile的书写规则及指令使用方法
Dockerfile的指令是忽略大小写的,建议使用大写,使用 # 作为注释,每一行只支持一条指令,每条指令可以携带多个参数。
Dockerfile的指令根据作用可以分为两种,构建指令和设置指令。构建指令用于构建image,其指定的操作不会在运行image的容器上执行;设置指令用于设置image的属性,其指定的操作将在运行image的容器中执行。
三.Dockerfile中重要参数介绍
1.FROM(指定基础image)
在dockfile其他指令的前面指定基础image,后面的指令都依赖于该指令指定的image。
格式为:
FROM <image>:<tag> ##tag不是必须指定,若不指定则默认为image的latest版本
2.MAINTAINER (指定镜像创建者的信息)
MAINTAINER <name>
3.RUN(安装软件用)
RUN可以运行任何被基础image支持的命令,如果基础image指定的是ubuntu,那么RUN中只能使用ubuntu的命令
格式为:
前者将在 shell 终端中运行命令,即 /bin/sh -c,后者则使用 exec 执行。
RUN <command>
RUN [“executable”, “param1”, “param2”] ##executable是一个可执行脚本
4.CMD(设置容器启动是执行的操作)
可以是自定义脚本,也可是系统命令,该指令只能出现一次,如果有多条,则只执行最后一条。
格式:
CMD [“executable”, “param1”, “param2”] ##使用 exec 执行
CMD command param1 param2 ##在 /bin/sh 中执行,提供给需要交互的应用
CMD [“param1”, “param2”] ##提供给 ENTRYPOINT 的默认参数
5.ENTRYPOINT(设置容器启动时执行的操作)
每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个 ENTRYPOINT 时,只有最后一个生效
格式为:
ENTRYPOINT [“executable”, “param1”, “param2”]
ENTRYPOINT command param1 param2 (shell 中执行)
6.USER(设置container容器的用户)
指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户
7.EXPOSE(指定容器需要影射到宿主机的端口)
该命令会将容器中的端口映射成宿主机的某个端口,当你需要访问容器的时候,可以直接访问宿主机的ip:映射过去的端口
EXPOSE <port> [<port>…]
EXPOSE port1 ## 映射一个端口
docker run -p port1 image ## 相应的运行容器使用的命令
EXPOSE port1 port2 port3 ## 映射多个端口
docker run -p port1 -p port2 -p port3 image ## 相应的运行容器使用的命令
docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image
## 还可以指定需要映射到宿主机器上的某个端口号
端口映射是docker比较重要的一个功能,原因在于我们每次运行容器的时候容器的IP地址不能指定而是在桥接网卡的地址范围内随机生成的。宿主机器的IP地址是固定的,我们可以将容器的端口的映射到宿主机器上的一个端口,免去每次访问容器中的某个服务时都要查看容器的IP的地址。对于一个运行的容器,可以使用docker port加上容器中需要映射的端口和容器的ID来查看该端口号在宿主机器上的映射端口。
8.ENV(用于设置环境变量)
在image中设置一个环境变量
格式:
ENV <key> <value>
9.ADD(从src复制文件到container的dest路径)
构建指令,所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0;如果是一个目录,那么会将该目录下的所有文件添加到container中,不包括目录;如果文件是可识别的压缩格式,则docker会帮忙解压缩(注意压缩格式);如果是文件且中不使用斜杠结束,则会将视为文件,的内容会写入;如果是文件且中使用斜杠结束,则会文件拷贝到目录下。
格式:
ADD <src> <dest>
四.搭建服务
1.创建所需基础镜像
[root@foundation6 docker]# docker run -it --name vm1 rhel7 bash ##新建镜像
bash-4.2# cd /etc/yum.repos.d/
bash-4.2# vi dvd.repo
[dvd]
name=rhel7
baseurl=http://192.168.10.1/rhel7.0 ##docker的ip,可以连接到宿主机
gpgcheck=0
bash-4.2# yum repolist
Skipping unreadable repository '///etc/yum.repos.d/rhel7.repo'
dvd | 4.1 kB 00:00
(1/2): dvd/group_gz | 134 kB 00:00
(2/2): dvd/primary_db | 3.4 MB 00:00
repo id repo name status
dvd rhel7 4305
repolist: 4305
bash-4.2# yum install -y vim iproute net-tools ##安装所需用的命令
bash-4.2# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
18: eth0@if19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 02:42:c0:a8:0a:03 brd ff:ff:ff:ff:ff:ff
inet 192.168.10.3/24 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:c0ff:fea8:a03/64 scope link
valid_lft forever preferred_lft forever
bash-4.2# [root@foundation6 docker]#
[root@foundation6 docker]# docker commit -m yum vm1 rhel7:v1##commit提交后才会被保存
sha256:4c7697ef1ed9cf6b4bbb66efea9e364102b1e5cbb280c893a0b49f459469a243
[root@foundation6 docker]# docker stop vm1
vm1
[root@foundation6 docker]# docker rm vm1 ##提交后容器已经保存,可以将容器删除
vm1
[root@foundation6 docker]# docker images rhel7 ##新的镜像创建成功
REPOSITORY TAG IMAGE ID CREATED SIZE
rhel7 v1 4c7697ef1ed9 About a minute ago 229.4 MB
rhel7 latest 0a3eb3fde7fd 3 years ago 140.2 MB
2.编写Dokerfile部署apache服务
[root@foundation6 ~]# mkdir /tmp/docker ##创建docker目录
[root@foundation6 ~]# cd /tmp/docker/
[root@foundation6 docker]# vim Dockerfile ##Dockerfile 编写
FROM rhel7:v1 ##指定基础镜像
MAINTAINER yakexi@westos.org ##作者信息
ENV HOSTNAME server1 ##设置容器主机名
EXPOSE 80
##由于内部服务会启动 Web 服务,我们需要把对应的 80 端口暴露出来,可以提供给容器间互联使用
RUN yum install -y httpd && yum clean all ##镜像操作命令
CMD ["/usr/sbin/httpd","-D","FOREGROUND"] ##镜像启动命令,默认只能启动一条
[root@foundation6 docker]# docker build -t rhel7:v2 .##利用上面的dockerfile文件构建镜像 rhel7:v2
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM rhel7:v1
---> 4c7697ef1ed9
Step 2 : MAINTAINER yakexi@westos.org
---> Running in be2eaf2ce0dd
---> 42f6dbffb0c1
Removing intermediate container be2eaf2ce0dd
Step 3 : ENV HOSTNAME server1
---> Running in 34e2cae2957e
---> f3c161b304ca
Removing intermediate container 34e2cae2957e
Step 4 : EXPOSE 80
---> Running in 90aa195a793b
---> 8ef480ffd06e
Removing intermediate container 90aa195a793b
Step 5 : RUN yum install -y httpd && yum clean all
---> Running in ef27bde81963
Skipping unreadable repository '///etc/yum.repos.d/rhel7.repo'
Resolving Dependencies
--> Running transaction check
---> Package httpd.x86_64 0:2.4.6-17.el7 will be installed
.......
Complete!
Skipping unreadable repository '///etc/yum.repos.d/rhel7.repo'
Cleaning repos: dvd
Cleaning up everything
---> 25393318ec77
Removing intermediate container ef27bde81963
Step 6 : CMD /usr/sbin/httpd -D FOREGROUND
---> Running in 87742c5bccba
---> c90716634969
Removing intermediate container 87742c5bccba
Successfully built c90716634969
查看镜像:
[root@foundation6 docker]# docker images rhel7
REPOSITORY TAG IMAGE ID CREATED SIZE
rhel7 v2 c90716634969 About a minute ago 258.7 MB
rhel7 v1 4c7697ef1ed9 9 minutes ago 229.4 MB
rhel7 latest 0a3eb3fde7fd 3 years ago 140.2 MB
查看镜像历史修改:
[root@foundation6 docker]# docker history rhel7:v2
IMAGE CREATED CREATED BY SIZE COMMENT
c90716634969 About a minute ago /bin/sh -c #(nop) CMD ["/usr/sbin/httpd" "-D" 0 B
25393318ec77 About a minute ago /bin/sh -c yum install -y httpd && yum clean 29.29 MB
8ef480ffd06e 2 minutes ago /bin/sh -c #(nop) EXPOSE 80/tcp 0 B
f3c161b304ca 2 minutes ago /bin/sh -c #(nop) ENV HOSTNAME=server1 0 B
42f6dbffb0c1 2 minutes ago /bin/sh -c #(nop) MAINTAINER yakexi@westos.or 0 B
4c7697ef1ed9 9 minutes ago bash 89.17 MB yum
0a3eb3fde7fd 3 years ago 140.2 MB Imported from -
[root@foundation6 docker]# docker run -d --name apache -p 8080:80 rhel7:v2
9393dbf69901b7428c315a2e8793f74c5501be478ba2f04649b971ecf2548014
[root@foundation6 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9393dbf69901 rhel7:v2 "/usr/sbin/httpd -D F" 42 seconds ago Up 39 seconds 0.0.0.0:8080->80/tcp apache
访问http://172.25.254.66:8080
apache的默认页面:
[root@foundation6 docker]# vim index.html
[root@foundation6 docker]# cat index.html
www.westos.org
[root@foundation6 docker]# docker cp index.html apache:/var/www/html/ ##编写容器的apache页面,为了确定我们访问的容器的apache服务,设置显示页面以示区别
[root@foundation6 docker]# docker stop apache
apache
[root@foundation6 docker]# docker rm apache
apache
3.Dockerfile 自启动 SSH 服务
[root@foundation6 docker]# vim Dockerfile ##编辑dockerfile文件
FROM rhel7:v1 ##指定基础镜像
MAINTAINER yakexi@westos.org ##作者
ENV HOSTNAME server2
EXPOSE 22 ##暴露端口
RUN yum install -y openssh-server openssh-clients initscripts && yum clean all
##安装服务
RUN /usr/sbin/sshd-keygen && echo root:westos | chpasswd
CMD ["/usr/sbin/sshd","-D"]
[root@foundation6 docker]# docker build -t rhel7:v3 . ##创建镜像
Sending build context to Docker daemon 3.072 kB
Step 1 : FROM rhel7:v1
---> 4c7697ef1ed9
Step 2 : MAINTAINER yakexi@westos.org
---> Using cache
---> 42f6dbffb0c1
Step 3 : ENV HOSTNAME server2
---> Running in cca251360a37
---> f2cdbd565cf7
Removing intermediate container cca251360a37
Step 4 : EXPOSE 22
---> Running in 663c50a116df
---> 7ff3fe1eba45
Removing intermediate container 663c50a116df
Step 5 : RUN yum install -y openssh-server openssh-clients initscripts && yum clean all
---> Running in 0ad3ae7bce32
Skipping unreadable repository '///etc/yum.repos.d/rhel7.repo'
Resolving Dependencies
--> Running transaction check
---> Package initscripts.x86_64 0:9.49.17-1.el7 will be installed
................................
Generating SSH2 RSA host key: [ OK ]
Generating SSH2 ECDSA host key: [ OK ]
---> 23f4467b9cb1
Removing intermediate container 4049cba1ec0e
Step 7 : CMD /usr/sbin/sshd -D
---> Running in 4b60b40c5273
---> c668ba993c6e
Removing intermediate container 4b60b40c5273
Successfully built c668ba993c6e
[root@foundation6 docker]# docker run -d --name ssh rhel7:v3
595c3647167811140f0c6a48391626555bcb6576d185780a80ad3a3e5791913d
##以rhel7:v3为镜像创建名为ssh容器
[root@foundation6 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
595c36471678 rhel7:v3 "/usr/sbin/sshd -D" 9 seconds ago Up 5 seconds 22/tcp ssh
[root@foundation6 docker]# ssh root@192.168.10.2 ##连接容器
The authenticity of host '192.168.10.2 (192.168.10.2)' can't be established.
ECDSA key fingerprint is 1f:5b:55:ad:6a:05:6d:4a:34:53:ef:e0:9d:26:fb:4c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.10.2' (ECDSA) to the list of known hosts.
root@192.168.10.2's password:
-bash-4.2# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
28: eth0@if29: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 02:42:c0:a8:0a:02 brd ff:ff:ff:ff:ff:ff
inet 192.168.10.2/24 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:c0ff:fea8:a02/64 scope link
valid_lft forever preferred_lft forever