Dockerfile命令及实践构建一个网站

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: dockerfile用于构建docker镜像的,部署一个用于运行你所需的容器环境。相当一个脚本,通过dockerfile自己的指令,来构建软件依赖、文件依赖、存储、定制docker镜像的方式有两种:手动修改容器内容,导出新的镜像基于Dockerfile自行编写指令,基于指令流程创建镜像。

dockerfile用于构建docker镜像的,部署一个用于运行你所需的容器环境。相当一个脚本,通过dockerfile自己的指令,来构建软件依赖、文件依赖、存储、

定制docker镜像的方式有两种:

手动修改容器内容,导出新的镜像

基于Dockerfile自行编写指令,基于指令流程创建镜像。

dockerfile简介
镜像都是多层存储的,每一层在前一层的基础上进行修改:

容器也是多层存储,以镜像为基础层,在其基础上加一层做为容器运行时的存储层。

镜像的创建有两种方式:

1、手动修改容器内容,然后docker commit提交容器为新的镜像

2、通过在dockerfile中定义一系列的命令和参数构成的脚本,然后这些命令应用于基础镜像,依次添加层,最终生成一个新的镜像,极大的简化了部署工作。

dockerfile主要组成部分:
基础镜像信息FROM centos:6.8

制作镜像操作指令RUN yum install openssh-server -y

容器启动时执行指令 CMD ["/bin/bash"]

举例:

安装一个mysql,且启动

如果是虚拟机部署形式的话,如下

  1. 开启vmare
  2. 运行某一个虚拟机,centos7
  3. centos7 安装mysql ,yum install mysql-server
  4. 通过脚本,或者命令,启动mysql即可

部署缓慢,且修改了宿主机的环境,删除较为麻烦,占用宿主机的3306端口

下面是基于容器运行mysql

  1. 开始vmware
  2. 运行虚拟机centos7
  3. 安装docker容器软件
  4. 获取mysql镜像即可,docker pull mysql:tag(你无法自由控制,该mysql的镜像是什么发行版,你获取的镜像,是别人定制好的,你下载使用的,你希望得到一个基于centos7.8的发行版,运行mysql)
  5. 直接运行该镜像,通过端口映射,运行mysql,docker run mysql:5.6 (容器能够运行,必须在容器内,有一个进程在前台运行,该容器内,有mysql正在前台运行)。
  6. 访问宿主机的一个映射端口,访问到容器内的mysql

想自定义镜像,就得自己写脚本,也就是dockerfile

dockerfile指令
FROM 这个镜像的妈妈是谁?

MAINTAINER(指定维护者信息,可以没有)

RUN你想让它干啥(在命令前面加上RUN即可)

ADD添加宿主机的文件到容器内,还多了个自动解压的功能。

COPY 作用和ADD是一样的,都是拷贝宿主机的文件到容器内

WORKDIR (设置当前工作目录)

VOLUME 设置卷,挂在主机目录

EXPOSE 指定对外的端口,在容器内暴露一个端口

CMD,指定容器启动后的要干的事情

dockerfile实践
需求,通过dockerfile,构建nginx镜像,且运行容器后,生成的页面是,“测试”。

  1. 创建Dockerfile,注意文件名,必须是这个cat Dockerfile

FROM nginx

RUN echo '测试大佬' >

/usr/share/nginx/html/index.html

2、构建Dockerfile

docker build .

3、修改镜像名字

docker tag b4200a856253 my_nginx

4、运行该镜像

docker run -d -p 80:80 my_nginx

5、查看宿主机的80端口

http://10.10.10.10:80

COPY指令

copy指令从宿主机复制文件/目录到新的一层镜像内如

copy test.py /home/

支持多个文件,以及通配符形式复制,语法要满足Golang的filepath.Match

copy test* /tmp/cc?.txt. /home/

COPY指令能够保留源文件的元数据,如权限,访问时间等等。

ADD

特性和COPY基本一致,不过多些功能

  1. 源文件是一个url,此时docker引擎会下载该链接,放入目标路径,且权限自动设为600,若这不是期望结果,还得增加一层
  2. 源文件是一个url,且是一个压缩包,不会自动解压,也得是单独用RUN指令解压
  3. 源文件是一个压缩文件,且是gzip、bzip2、,ADD指令会自动解压缩文件到目标路径。

Dockerfile 官方推荐使用COPY,ADD会使构建缓存失效,导致镜像构建失败缓慢。

CMD在容器内运行某个命令,启动

用法,注意是双引号

CMD["参数1","参数2"]

在制定了entrypoint指令后,用CMD指令具体的参数

docker 不是虚拟机,容器就是一个进程,既然是进程那么程序在启动的时候需要制定运行参数,这就是CMD指令作用。

例如centos 镜像默认的CMD是/bin/bash,直接docker run -it centos 会直接进入bash解释器。

也可以启动容器时候,指定参数,docker run -it centos cat /etc/os-releasea

CMD运行shell 命令,也会被转化为shell形式

例如

CMD echo $PATH

会被转化为

CMD ["sh", "-c","echo "]

容器内运行程序
这里需要注意,docker不是虚拟机的概念,虚拟机里的程序运行,基本上都是在后台运行,利用systemctl 运行,但是容器内没有后台进程的概念,必须前台运行。

容器就是为了主进程而存在的,主进程如果退出了,容器也就失去意义了,自动退出。

CMD systemctl start nginx

这种写法是错误的,容器会自动退出

因为 systemctl star nginx 是希望以守护进程形式启动nginx,且CMD命令会转化为

CMD ["sh","-c","systemctl start nginx"]

这样的命令主进程是sh解释器,执行完毕后立即结束了,因此容器也就退出了

因此正确的写法是CMD ["nginx","-g","daemon off;"]

ENTRYPOINT 和 CMD的区别及用法

ENTRYPOINT 和CMD的区别及用法

ENV和ARG都是给容器设置环境变量

区别在于ENV无论是在镜像构建时,还是容器运行时,该变量都可以使用

ARG只是用于构建镜像需要设置的变量,容器运行时就消失了。

VOLUME

容器再运行时,应该保证在存储层不写入任何数据,运行在容器内产生的数据,我们推荐是挂载,写入到宿主机上,进行维护。

VOLUME /data #将容器内的/data文件夹,在容器运行时,该目录自动挂载为匿名卷,任何向该目录中写入数据的操作,都不会被容器记录,保证的容器存储层无状态理念。

EXPOSE ,制定容器运行时对外提供的端口服务,

帮助使用该镜像的人,快速理解该容器的一个端口业务,

docker port 容器

docker run -p 宿主机端口:容器端口

docker run -p #作用是随机宿主机端口:容器内端口

WORKDIR
用于在dockerfile中,目录的切换,更改工作目录,

WORKDIR /opt

USER
用于改变环境,用于切换用户

USER root

USER test

构建一个网站镜像

  1. nginx,修改首页内容,html
  2. web framework ,web框架,一般由开发,通过某个开发语音,基于某个web框架,自己去开发一个web站点,python、django框架。

本次实践:

  1. 用python语言,基于flask web框架,开发一个网站,写一个后端的 网站代码
  2. 开发dockerfile,部署该代码,生成镜像
  3. 其他人基于该镜像,docker run就可以在电脑跑起来你这个网站

比如安装一个etcd、nacos,都是比较复杂的一些软件

需要依赖于go语言环境,比如需要依赖于java环境,在自己的机器安装好对应的开发环境,以及对应的版本,以及个各种依赖。

tomcat、jdk环境

当有了docker

docker pull nacos 打包好了各种依赖环境

docker pull tomcat 这些主流的镜像都可以直接找到,并且该镜像中,就已经打包好了Java环境

docker run tomcat xxxx 可以直接访问tomcat了

  1. 在宿主机上准备一个目录,准备好dockerfile

写一个flask 的python代码

创建好代码文件

  1. 编写dockerfile

touch Dockerfile

RUN curl -o /etc/    ;
RUN curl -o /etc/    ;
RUN yum makecache fast;
RUN yum install python3-devel python3-pip -y
RUN pip install flask
COPY test_flask.py /opt
WORKDIR /opt
EXPOSE 8080
CMD ["python","app.py"]
  1. 检查代码环境,及内容

代码文件 和 Dockerfile 在平级目录中

  1. 构建镜像

生成一个镜像

docker build -t 'test/my_flask' .

然后执行dockerfile里的命令

docker build --no-cache -t ‘test/my_flask’.

  1. 运行镜像,生成容器, -d 后台运行 --name 容器的名字 -p宿主机的90端口访问到容器内地8080

docker run -d my_flask -p 90:8080 test/my_flask

  1. 访问宿主机,看容器内flask web网站
  2. 如何修改该网站的内容

第一种修改宿主机的代码,以及dockerfile,重新构建

第二种可以进入到以及运行的容器内,修改代码,重启容器即可。

(1)进入容器

docker exec -it 容器id bash

(2)修改容器内的程序

cat test_flask.py

(3)退出容器,重启容器

exit

docker restart 容器id

目录
相关文章
|
4月前
|
Ubuntu Docker 容器
深入理解Dockerfile:构建镜像的详细解释与常用命令(下)
Docker 是一种流行的容器化平台,可将应用程序和其依赖项打包到一个独立的、可移植的容器中。Dockerfile 是构建 Docker 镜像的文本文件,它包含了一系列的指令和配置,用于定义镜像的构建过程。本文将深入解释 Dockerfile 的工作原理,并介绍常用的 Dockerfile 指令和构建命令,以帮助读者更好地理解和使用 Docker。
|
7月前
|
存储 分布式计算 Hadoop
基于docker的Hadoop环境搭建与应用实践(脚本部署)
本文介绍了Hadoop环境的搭建与应用实践。对Hadoop的概念和原理进行了简要说明,包括HDFS分布式文件系统和MapReduce计算模型等,主要通过脚本的方式进行快捷部署,在部署完成后对HDFS和mapreduce进行了测试,确保其功能正常。
|
7月前
|
缓存 Ubuntu Shell
关于Dockerfile的最佳实践技巧
关于Dockerfile的最佳实践技巧
|
4月前
|
Java 持续交付 Docker
Docker 项目如何使用 Dockerfile 构建镜像?
Docker 简介:讲述 Docker 的起源、它是如何革新现代软件开发的,以及它为开发者和运维团队带来的好处。重点强调 Docker 的轻量级特性和它在提高应用部署、扩展和隔离方面的优势。
|
6月前
|
Java 应用服务中间件 Linux
Docker学习重点(7)~DockerFile
Docker学习重点(7)~DockerFile
963 0
|
4月前
|
应用服务中间件 nginx Docker
深入理解Dockerfile:构建镜像的详细解释与常用命令(上)
Docker 是一种流行的容器化平台,可将应用程序和其依赖项打包到一个独立的、可移植的容器中。Dockerfile 是构建 Docker 镜像的文本文件,它包含了一系列的指令和配置,用于定义镜像的构建过程。本文将深入解释 Dockerfile 的工作原理,并介绍常用的 Dockerfile 指令和构建命令,以帮助读者更好地理解和使用 Docker。
340 0
|
7月前
|
应用服务中间件 Shell nginx
Dockerfile企业实战教程
Dockerfile企业实战教程
|
8月前
|
缓存 JavaScript Go
Dockerfile 最佳实践
Dockerfile 最佳实践
72 0
|
10月前
|
缓存 网络协议 Linux
Dockerfile构建镜像过程中的错误记录及解决方法
本文记录了在一次使用Dockefile构建镜像的途中遇到的问题,以及后续的解决方法。
4546 0
|
运维 Cloud Native 网络协议
【云原生】Docker—Dockerfile写法与用法以及dockerfile简介与构建镜像详解【附加实战】
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令(Instruction)和操作命令;每一条指令构建一层镜像,因此每一条指令的内容,就是描述该层镜像应当如何构建(也就是你要执行的操作命令)。
456 0
【云原生】Docker—Dockerfile写法与用法以及dockerfile简介与构建镜像详解【附加实战】