- 一、手动构建镜像
- 1.创建mynginx容器
- 2.下载阿里epel
- 3.安装nginx
- 4.修改配置文件
- 5.保存镜像
- 6.启动容器
- 7.网页访问
- 二、Dockerfile
- 2.创建目录
- 3.编写Dockerfile
- 4.执行Dockerfile
- 5.启动容器
- 6.测试
一、手动构建镜像
1.创建mynginx容器
[root@docker-server ~]# docker run --name mynginx -it centos
[root@cb7a657353d2 /]#
2.下载阿里epel
[root@cb7a657353d2 /]# rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
Retrieving https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
warning: /var/tmp/rpm-tmp.LPjLyH: Header V3 RSA/SHA256 Signature, key ID 352c64e5: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:epel-release-7-11 ################################# [100%]
3.安装nginx
[root@cb7a657353d2 /]# yum install nginx -y
4.修改配置文件
[root@cb7a657353d2 /]# vi /etc/nginx/nginx.conf
4 daemon off;###让nginx在前台运行,docker需要有进程在运行,否则自动关闭容器。
[root@cb7a657353d2 /]# exit
exit
5.保存镜像
[root@docker-server ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cb7a657353d2 centos "/bin/bash" 10 minutes ago Exited (130) 39 seconds ago mynginx
[root@docker-server ~]# docker commit -m "My Nginx" cb7a657353d2 liang/mynginx:v1
===》
sha256:294120fff6a468ac7f458d24dc878e3bbdd4bc5c7f75269df9daa7210ab96eb9
[root@docker-server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
liang/mynginx v1 294120fff6a4 31 seconds ago 408MB
nginx latest 06144b287844 7 days ago 109MB
centos latest 5182e96772bf 5 weeks ago 200MB
6.启动容器
[root@docker-server ~]# docker run -d -p 81:80 --name nginxv1 liang/nginx:v1 nginx
6057e6ef29715d88ebec64e86d8405baf3bc8e070761eb5a64ac3a0f46913611
[root@docker-server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6057e6ef2971 liang/nginx:v1 "nginx" 3 seconds ago Up 2 seconds 0.0.0.0:81->80/tcp nginxv1
7.网页访问
二、Dockerfile
1.Dockerfile指令详解(转)
1. FROM
格式:FROM<image>或FROM<image>:<tag>。
解释:FROM是Dockerfile里的第一条指令(必须是),后面跟有效的镜像名(如果该镜像你的本地仓库没有则会从远程仓库Pull取)。然后后面的其它指令FROM的镜像中执行。
2. MAINTAINER
格式:MAINTAINER <name>
解释:指定维护者信息。
3. RUN:在镜像构建过程中运行。
格式:RUN <command>或 RUN[“executable”, “param1”, “param2”](exec模式)
解释:运行命令,命令较长使可以使用\来换行。推荐使用上面数组的格式
例如: shell模式:RUN echo hello 执行的方式是用shell来执行,实际效果是 /bin/sh -c echo hello
exec模式:可以指定其他形式的shell来执行指令
RUN ["/bin/bash", "-c", "echo hello"]
两条RUN指令可以合并成一条, 例如:RUN apt-get update && apt-get -y nginx
docker build -t="镜像名" . 在当前目录构建镜像,注意后面的 点 表示当前目录
4. CMD:指定容器启动时的默认行为
格式:
CMD [“executable”,”param1″,”param2″] 使用 exec 执行,推荐方式;
CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;
CMD [“param1″,”param2”] 提供给ENTRYPOINT的默认参数,和ENTRYPOINT搭配使用
解释:
CMD指定容器启动时执行的命令,每个Dockerfile只能有一条CMD命令,如果指定了多条,只有最后一条会被执行。如果你在启动容器的时候也指定的命令,那么会覆盖Dockerfile构建的镜像里面的CMD命令。
例如:使用exec方式
在dockerfile中添加 CMD ["/usr/sbin/nginx", "-g", "daemon off;"] 启动容器时运行nginx, 并且以前台方式运行。
这样使用命令docker build -t="home/hong"(给镜像起名) . 构建一个home/hong的镜像后,
启动容器:docker run -d -p 80 --name cmd_test1 home/hong ---------不用再写容器启动的命令nginx -g "daemon off;")
之前不加CMD时,
启动容器:docker run -p 80 -d home/hong nginx -g "daemon off;"
如果使用命令docker run -d -p 80 --name cmd_test2 home/hong /bin/bash来启动一个容器,
再用docker ps -l 查看(显示最后一次创建的容器,包括未运行的),发现COMMAND列显示的内容已经变化为/bin/bash, 之前是/usr/sbin/nginx -g
可以用docker top cmd_test1来查看容器的进程。
5. ENTRYPOINT
格式:
ENTRYPOINT [“executable”, “param1″,”param2”]
ENTRYPOINT command param1 param2(shell中执行)。
例如:ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]
解释:和CMD类似,区别:不可被 docker run 提供的参数覆盖。
每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。ENTRYPOINT没有CMD的可替换特性,也就是你启动容器的时候增加运行的命令不会覆盖ENTRYPOINT指定的命令。
所以生产实践中我们可以同时使用ENTRYPOINT和CMD,使用ENTRYPOINT来指定命令,用CMD来指定命令默认的参数。
例如在dockerfile中写入如下命令来构建镜像后:
ENTRYPOINT ["/usr/sbin/nginx"]
CMD ["-h"]
启动容器:docker run -d -p 80 --name ep_test1 home/hong -g "daemon off"
使用docker ps查看,显示的COMMAND参数为 /usr/sbin/nginx -g,表示CMD的默认参数被-g参数覆盖了
6. USER --这个用户不会自动创建
格式:USER daemon
例如:USER user USER uid
USER user:group USER uid:gid
USER user:gid USER uid:group
解释:指定运行容器时的用户名和UID,后续的RUN指令也会使用这里指定的用户,默认会使用root用户
7. EXPOSE
格式:EXPOSE<port> [<port>…] :指定运行该镜像的容器使用的端口,只是告诉别人我要用某个端口,但是并不会自动打开此端口,所以启动容器是还需要用参数-p或者-P来指定开启的端口号
例如:dockerfile中 EXPOSE 80
在容器运行时 docker run -p 80 -d home/hong nginx -g "daemon off;"
8. ENV
格式:ENV<key> <value>
ENV <key>=<value> …
解释:设置环境变量,可以在RUN之前使用,然后RUN命令时调用,容器启动时这些环境变量都会被指定
9. ADD
格式:
ADD <src>… <dest>
ADD [“<src>”,… “<dest>”]
例子: ADD index.html /usr/share/nginx/html/ 使用本地编写的网页,替换nginx的默认页面
解释:将指定的<src>复制到容器文件系统中的<dest>,
1. 一般来说src地址为本机dockerfile所在的目录,目标路径要使用容器中的绝对路径,
2. 所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0
3. 如果文件是可识别的压缩格式,则docker会帮忙解压缩,还有一个COPY指令,和ADD用法完全一样,只是没解压缩功能,如果是纯拷贝,使用COPY好。
10. VOLUME
格式:VOLUME [“/data”]
解释:可以将本地文件夹或者其他container的文件夹挂载到container中。
11. WORKDIR:容器内部设置工作目录
格式:WORKDIR/path/to/workdir
解释:切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录。
可以多次切换(相当于cd命令),
也可以使用多个WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
则最终路径为 /a/b/c。
12. ONBUILD:为镜像添加触发器
ONBUILD 指定的命令在构建镜像时并不执行, 而是在它的子镜像中执行;
只有当一个镜像被其他镜像作为基础镜像时才会执行,会在构建过程中插入指令
例子,dockerfile文件如下
FROM ubuntu:14.04
RUN apt-get update
RUN apt-get install -y nginx
ONBUILD COPY index.html /usr/share/nginx/html/ #使用本地编写的网页,替换nginx的默认页面
EXPOSE 80
ENTRYPOINT ["/usr/sbin/nginx","-g",daemon off;"]
构建此镜像 docker build -t "home/hong" .
然后按此镜像运行容器docker run -d -p 80 --name test0 home/hong
curl http://127.0.0.1:49169来查看页面,发现默认页面并没有改变
再写一个dockerfile文件
FROM home/hong
EXPOSE 80
ENTRYPOINT ["/usr/sbin/nginx","-g",daemon off;"]
再构建镜像docker build -t "test 1" . 在构建过程中发现触发了ONBUILD指令。
13. ARG
格式:ARG<name>[=<default value>]
解释:ARG指定了一个变量在docker build的时候使用,可以使用–build-arg <varname>=<value>来指定参数的值,不过如果构建的时候不指定就会报错。
2.创建目录
[root@docker-server ~]# mkdir /opt/dockerfile/nginx -p
[root@docker-server ~]# cd /opt/dockerfile/nginx/
3.编写Dockerfile
[root@docker-server nginx]# cat Dockerfile
# This Dockerfile
#Base image
FROM centos
#Maintarner
MAINTAINER linag xxx@mail.com
#Commands
RUN rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
RUN yum install nginx -y && yum clean all
RUN echo "daemon off;" >>/etc/nginx/nginx.conf
ADD index.html /usr/share/nginx/html/index.html
EXPOSE 80
CMD ["nginx"]
[root@docker-server nginx]# echo "Dockfile test" >index.html
4.执行Dockerfile
[root@docker-server nginx]# docker build -t mynginxv2 .
[root@docker-server nginx]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mynginxv2 latest 8d8392ece54b About a minute ago 293MB
liang/nginx v1 231d125c908f 45 minutes ago 271MB
nginx latest 06144b287844 7 days ago 109MB
centos latest 5182e96772bf 5 weeks ago 200MB
5.启动容器
[root@docker-server nginx]# docker run -d -p 80:80 --name dockerfile-nginx mynginxv2
[root@docker-server nginx]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d572196d9764 mynginxv2 "nginx" 5 seconds ago Up 4 seconds 0.0.0.0:80->80/tcp dockerfile-nginx
6.测试