博文大纲
Dockerfile简介
Dockerfile文件编写时常用的指令
实验接触Dockerfile
一、简介
Docker项目提供了构建在Linux内核功能之上,协同在一起的的高级工具。其目标是帮助开发和运维人员更容易地跨系统跨主机交付应用程序和他们的依赖。Docker通过Docker容器,一个安全的,基于轻量级容器的环境,来实现这个目标。这些容器由镜像创建,而镜像可以通过命令行手工创建或 者通过Dockerfile自动创建。
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。Dockerfile从FROM命令开始,紧接着跟随者各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像。
二、Docker语法
什么是语法?
非常简单,在编程中,语法意味着一个调用命令,输入参数去让应用执行程序的文法结构。这些语法被规则或明或暗的约束。程序员遵循语法规范以和计算机 交互。如果一段程序语法不正确,计算机将无法识别。Dockerfile使用简单的,清楚的和干净的语法结构,极为易于使用。这些语法可以自我释义,支持注释。
Dockerfile文件编写时,常用的指令:
1.*FROM:构建镜像基于哪个镜像
例如:FROM centos:7
2.MAINTAINER:镜像维护者姓名或邮箱地址。
例如:MAINTAINER adam
3.*RUN:构建镜像时运行的shell命令
例如:RUN ["yum","install","httpd"]
RUN yum -y install httpd
4.*CMD:运行容器时执行的shell命令
例如:CMD ["/bin/bash"] #注意如果基础镜像是服务镜像,不支持/bin/bash。只支持/bin/sh。
5.*EXPOSE:声明容器的服务端口
例如:EXPOSE 80 443
6.*ENV:设置容器环境变量
例如:EVN MYSQL_ROOT_PASSWORD 123.com
7.*ADD:拷贝文件或目录到镜像,如果是URL或者压缩包会自动下载或自动解压
例如:ADD <源文件>... <目标目录>
ADD ["源文件"..."目标目录"]
8.*COPY:拷贝文件或目录到镜像容器内,跟ADD类似,但不具备自动下载或解压功能
9.ENTRYPOINT:运行容器时执行的shell命令
例如:ENTRYPOINT ["/bin/bash","-c","command"]
ENTRYPOINT /bin/bash -c 'command'
10.*VOLUME:指定容器挂载点到宿主机自动生成的目录或其他容器
例如:VOLUME ["/var/lib/mysql"]
相当于 docker run -itd --name xxx -v /var/lib/mysql #相当于--volume,挂载到某个目录。
11.USER:为RUN、CMD、和ENTRYPOINT执行命令指定运行用户
12.*WORKDIR:为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录,意思为切换目录
例如:WORKDIR: /var/lib/mysql
13.HEALTHCHECK:健康检查
14.ARG:构建时指定的一些参数
例如:FROM centos:7
ARG user
USER $user
注意:
1.RUN在building时运行,可以写多条
2.CMD和ENTRYPOINT在运行container时运行,只能写一条,如果写多条,最后一条生效。
3.CMD在run时可以被COMMAND覆盖,ENTRYPOINT不会被COMMAND覆盖,但可以指定–entrypoint覆盖。
4.如果在Dockerfile里需要往镜像内导入文件,则,此文件必须在Dockerfile所在目录或子目录下。
接下来通过一个小实验来接触Dockerfile
(1)使用dockerifle制作一个镜像,基于centos:7镜像部署安装nginx服务。
(2)将制作的镜像运行一个容器,使容器运行时自动开启nginx服务。验证服务正常运行。
(3)运行一个私有仓库,将自制镜像上传到私有仓库,且开启另外一台虚拟机同样加入私有仓库,在docker02上下载私有仓库镜像并运行一个容器,验证服务正常运行。
(1)首先创建一个目录用于创建Dockerfile文件。
[root@localhost ~]# mkdir test
(2)上传nginx源码包,这注意上传的包是需要往镜像内导入的文件,所以文件必须在Dockerfile所在目录或子目录下。
[root@localhost ~]# cd test/
[root@localhost test]# rz
[root@localhost test]# ls
nginx-1.14.0.tar.gz
(3)进行编写Dockerfile(这里注意编写时,创建的Dockerfile必须大写)
FROM centos:7 #设置基础镜像。
RUN yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel #解决nginx依赖环境,安装依赖包。
ADD nginx-1.14.0.tar.gz /usr/src/ #将本地的nginx源码包复制到镜像中并解压。
RUN useradd -M -s /sbin/nologin nginx #创建nginx服务需要的用户。
WORKDIR /usr/src/nginx-1.14.0 #切换源码包目录,进行编译安装。
RUN ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
RUN make && make install #编译安装。
RUN ln -s /usr/local/nginx/sbin/* /usr/local/sbin/ #对nginx执行命令文件做软链接。
RUN nginx -t #检查配置是否有误。
RUN nginx #启动服务。
EXPOSE 80 #开启容器的80端口。
(4)编写完成后保存,生成镜像,这注意千万不要忽略“.”
[root@localhost test]# docker build -t lbhweb .
(5)执行完成后,查看镜像:
[root@localhost test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
lbhweb latest 853830f1b771 34 minutes ago 376MB
centos 7 5e35e350aded 4 weeks ago 203MB
(6)运行容器:
[root@localhost test]# docker run -itd --name lbh-nginx -p 90:80 --restart=always lbhweb:latest nginx -g "daemon off;"
参数说明:
-itd:提供一个可交互的伪终端,并且保存后台运行。
–name:为容器取名。
-p:端口映射,宿主端口:容器端口
–restart=always:始终保持运行(随着docker开启而运行) nginx -g “daemon off;” :保证容器运行之后,nginx服务就直接开启,不必手动开启。
(7)访问测试,访问本地的IP:90
构建私有仓库:
(1)首先下载私有仓库镜像:
[root@localhost test]# docker pull registry:2
(2)查看镜像:
[root@localhost test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
lbhweb latest 853830f1b771 34 minutes ago 376MB
centos 7 5e35e350aded 4 weeks ago 203MB
registry 2 f32a97de94e1 9 months ago 25.8MB
(3)运行容器:
[root@localhost test]# docker run -itd --name registry --restart=always -p 5000:5000 -v /registry:/var/lib/registry registry:2
参数:前面重复的略。
-v:挂载目录。宿主机的目录:容器内的目录。 #也可以自动创建目录。
(4)将Dockerfile创建的镜像重命名:
[root@localhost test]# docker tag lbhweb 192.168.2.60:5000/nginx
(5)查看镜像是否成功:
[root@localhost test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.2.60:5000/nginx latest 853830f1b771 34 minutes ago 376MB
lbhweb latest 853830f1b771 34 minutes ago 376MB
centos 7 5e35e350aded 4 weeks ago 203MB
registry 2 f32a97de94e1 9 months ago 25.8MB
(6)上传镜像到私有仓库。在上传之前修改docker配置文件:
[root@localhost ~]# vim /usr/lib/systemd/system/docker.service
#这个目录systemd是用来可以使用systemctl命令启动/停止/重启
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.2.60:5000
--insecure-registry:不安全的仓库。
(7)重载后台进程和重启docker服务:
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
(8)上传镜像:
[root@localhost ~]# docker push 192.168.2.60:5000/nginx
#可以指定标签,加冒号后加标签。
开启第二台服务器,从私有仓库上进行下载镜像。
(1)第二台服务器修改docker配置文件,注意这里修改跟第一台一样,其实就是指向了私有仓库。
[root@localhost ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.2.60:5000
(2)重载后台进程和重启docker服务:
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
(3)下载镜像:
[root@localhost ~]# docker pull 192.168.2.60:5000/nginx
(4)运行容器:
[root@localhost ~]# docker run -itd --name lbh-web3 -p 90:80 192.168.2.60:5000/nginx:latest nginx -g "daemon off;"
(5)访问测试,第二台服务器的IP:90
成功访问。
本博文结束,感觉观看。