dockerfile实践学习
2024-10-21 15:43:19
一、dockerfile简介
镜像是分层存储的,每一层在前一层的基础上进行修改。
容器也是分层存储,已经向为基础层,在其他基础上加一层作为容器运行的存储层。
创建镜像的另种两种方法
- 手动修改容器内容,然后docker commit 提交容器作为新的进想
- 通过修改dockerfile中定义一系列的命令和参数构成脚本,然后这些命令用于基础镜像,一次添加层,最终生成一个新的镜像,极大的简化了部署工作。
官方提供的dockerfile实例
https://github.com/CentOS/CentOS-Dorkerfiles
dockerfile的组成部分
基础镜像信息 FROM centos:7.8.2003
制作镜像操作指令 RUN yum install openssh-server -y
容器启动时执行指令 CMD ["/bin/bash"]
传统虚拟机安装软和docker使用dockerfile创建镜像安装软件的对比
1.传统虚拟机
- 开启VMware,运行某个虚拟机,centos7
- centos7安装mysql
yum install mysql-server
- 通过脚本或者命令,启动mysql即可
- 缺点:部署缓慢,需要修改宿主机环境,删除麻烦,占用宿主机3306端口
2.基于docker安装mysql
- 运行虚拟机centos7(宿主机)
- 安装docker容器
- 获取mysql镜像
docker pull mysql:tag
你无法自由控制,该mysql的基础镜像是什么发行版,你获取的镜像是别人指定好的,默认使用的是Debian,但是你希望得到一个基于centos7.8的发行版运行的mysql) - 直接运行该镜像,通过端口映射,运行mysql。
docker run mysql:5.7
(容器能够运行,必须在容器内有一个进程在前台,该容器内有mysql在前台运行) - 访问宿主机的一个映射端口,访问到容器内的mysql
想自定义镜像就需要自己写脚本,也就是dockerfile了
dockerfile指令
FROM 这个镜像的妈是谁?(指定基础镜像)
MAINTAINER 告诉别人,谁负责养它?(指定维护者信息,可以没有)
RUN 你想让他干啥(在命令前面加上RUN即可)
ADD 给点创业资金(添加宿主机文件到容器内,还多了一个自动解压的功能)
COPY 作用和ADD是一样的,都是拷贝宿主机文件到容器内,COPY仅仅是拷贝
WORKDIR 我是cd,今天刚花了妆,是不是不认识了?(设置当前工作目录)
VOLUME 给他一个存行李的地方(设置卷,挂载宿主机主机目录)
EXPOSE 他要打开的门是啥(指定对外端口),在容器内暴露一个窗口,端口
CMD 奔跑吧,兄弟!(指定容器启动后要干的事情)
dockerfile其他指令
- COPY 复制文件
- ENV 环境变量
- ENTRYPOINT 容器启动后执行的命令
dockerfile实践小案例
需求:通过dockerfile,构建nginx镜像,且运行容器后,生成页面,是"一起学docker"
# 1、创建Dockerfile,注意文件名必须是这个
[root@localhost ~]# cd /
[root@localhost /]# mkdir /learn_docker
[root@localhost /]# cd /learn_docker
[root@localhost learn_docker]# vim Dockerfile
[root@localhost learn_docker]# cat Dockerfile
FROM nginx
RUN echo '<meta charset=utf8>老司机带你用docker运行nginx服务.</meta>' > /usr/share/nginx/html/index.html
# 2、构建Dockerfile
[root@localhost learn_docker]# docker build .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM nginx (这里查找本地镜像,如果有的话就直接使用本地镜像,没有的话去下载)
---> 605c77e624dd (本地nginx的镜像id)
Step 2/2 : RUN echo '<meta charset=utf8>老司机带你用docker运行nginx服务.</meta>' > /usr/share/nginx/html/index.html (根据指令进行更改操作)
---> Running in 53e1c900bb71
Removing intermediate container 53e1c900bb71
---> 395727c27ac3 (生成新的新的nginx的镜像id)
Successfully built 395727c27ac3 (出现这个表示新镜像构建成功)
# 3、修改新的镜像的名字,因为新生成的镜像的默认是没有版本和名字的
[root@localhost learn_docker]# docker tag 395727c27ac3 my_nginx
# 构建出的新镜像如下
[root@localhost learn_docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my_nginx latest 395727c27ac3 8 minutes ago 141MB
# 4、运行该镜像
docker run -d -p 80:80 my_nginx
# 5、查看宿主机镜像运行情况如下图所示
最新文章
- A=AUB
- 使用yum时,保留下载包设置
- 使用NHibernate(3)-- 用代码代替配置文件
- 演练:使用Xamarin.Forms开发产品介绍性质的应用(VB版)
- Android内存Context泄露:Handler&;内部类
- Java 虚拟机体系结构
- centos 安装ss-QT5
- Torch vs Theano
- iOS 在 Xcode 中重命名项目名称
- python高级编程之描述符与属性03
- ubuntu连接无线网
- IEEE1588 verision2 报文介绍
- python中使用递归实现反转链表
- Android ORM 框架之 greenDAO
- thinkphp 自动生成模块目录结构
- 关于Retrofit网络请求URL中含有可变参数的处理
- git checkout -b mybranch和git checkout mybranch
- Vue extend 学习
- POJ2061 Subsequence 2017-05-25 19:49 83人阅读 评论(0) 收藏
- Linux中断(interrupt)子系统之一:中断系统基本原理【转】
热门文章
- CF1137F Matches Are Not a Child&#39;s Play 题解
- 你有了解过无服务器架构(Serverless)数据库吗?
- ChatGPT is at capacity right now.ChatGPT Plus subscriber login Add your email for a personalized login link的解决办法
- pictrue类的练习
- ubuntu docker pull 失败 Error response from daemon: Get https://registry-1.docker.io/v2/
- python threading.Thread暂停、唤醒、退出 不消耗cpu
- [JavaScript]内置对象Number初识
- loader的原理
- 【CDH】cdh搭建遇到的坑和解决过程
- element-ui组件Table排序(sort-by),某些数据无需排序