前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Dockerfile命令及实践构建一个网站

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

原创
作者头像
NeilNiu
发布2023-02-25 12:25:16
1.3K0
发布2023-02-25 12:25:16
举报
文章被收录于专栏:NeilNiu专栏NeilNiu专栏

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
  5. 开始vmware
  6. 运行虚拟机centos7
  7. 安装docker容器软件
  8. 获取mysql镜像即可,docker pull mysql:tag(你无法自由控制,该mysql的镜像是什么发行版,你获取的镜像,是别人定制好的,你下载使用的,你希望得到一个基于centos7.8的发行版,运行mysql)
  9. 直接运行该镜像,通过端口映射,运行mysql,docker run mysql:5.6 (容器能够运行,必须在容器内,有一个进程在前台运行,该容器内,有mysql正在前台运行)。
  10. 访问宿主机的一个映射端口,访问到容器内的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 '<meta charset=utf8>测试大佬' > /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框架。 本次实践:
  3. 用python语言,基于flask web框架,开发一个网站,写一个后端的 网站代码
  4. 开发dockerfile,部署该代码,生成镜像
  5. 其他人基于该镜像,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代码 创建好代码文件
  2. 编写dockerfile touch Dockerfile FROM centos:7.8.2003 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"3. 检查代码环境,及内容 代码文件 和 Dockerfile 在平级目录中
  3. 构建镜像 生成一个镜像 docker build -t 'test/my_flask' . 然后执行dockerfile里的命令 docker build --no-cache -t ‘test/my_flask’.
  4. 运行镜像,生成容器, -d 后台运行 --name 容器的名字 -p宿主机的90端口访问到容器内地8080 docker run -d my_flask -p 90:8080 test/my_flask
  5. 访问宿主机,看容器内flask web网站
  6. 如何修改该网站的内容 第一种修改宿主机的代码,以及dockerfile,重新构建 第二种可以进入到以及运行的容器内,修改代码,重启容器即可。 (1)进入容器 docker exec -it 容器id bash (2)修改容器内的程序 cat test_flask.py (3)退出容器,重启容器 exit docker restart 容器id

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档