文章目录
DockerFile
前面我们在绑定数据卷的时候,使用过dockerfile创建过镜像
是什么
DockerFile是用来构建Docker镜像的构建文件,是由一些列命令和参数构建的脚本
构建三步骤
- 编写DockerFile
- docker build
- docker run
既然Dockerfile可以构建成镜像,那么每个镜像就都是dockerfile构建的。
我们可以通过官网看到一些镜像的dockerfile
随着时间官网可能会发生变化
看到这里找到指定的镜像之后,可以去观看Dockerfile
FROM centos:7
ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
# 有的时候我们在执行镜像的时候在后面加上 /usr.sbin/init
# 如果dockerfile中有了,在我们执行镜像就默认在后面追加了
CMD ["/usr/sbin/init"]
下面会对该脚本进行描述
dockerFile的语法
-
每条保留字(关键字,和java中概念一致)都必须为大写
-
指令从上到下编写,顺序执行
-
#表示注解
-
每条指令都会创建一个新的镜像层并对镜像进行提交
这里和我们dockerfile是数据卷类似,我们编写一个dockerfile进行构建出一个新的镜像
dockerfile执行流程
- docker从基础镜像运行一个容器
- 编写一个dockerfile (对应上面每一个指令都会创建一个新的镜像)
- 执行docker buil 操作构建出一个新的镜像
- docker在通过新镜像创建出新容器。
- 执行dockerfile中的指令直到所有指令都结束
小结
从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,
- Dockerfile是软件的原材料
- Docker镜像是软件的交付品
- Docker容器则可以认为是软件的运行态。
Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。
-
Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;
-
Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时,会真正开始提供服务;
-
Docker容器,容器是直接提供服务的。
DockerFile的关键字
关键字 | 描述 |
---|---|
FROM | 基础镜像,当前镜像是基于那个镜像的 |
MAINTAINER | 镜像维护者的姓名和邮箱地址 |
RUN | 容器构建时候需要运行的命令。不如构建redis时候指定添加几个值 |
EXPOSE | 当前容器对外暴漏的端口 |
WORKDIR | 指定在创建容器后,终端默认登录的进来工作目录,一个落脚点 (centos例子) |
ENV | 用来构建镜像过程中设置环境变量 |
ADD | 将宿主机目录下的文件拷贝进镜像并且add命令会自动处理URL和解压tar压缩包 |
COPY | 类似ADD,拷贝文件和目录到镜像中 |
VOLUME | 容器数据卷,用来数据保存和持久化工作(数据卷案例) |
ONBUILD | 当构建一个被继承的DockerFile时候运行命令。父镜像在被子继承后父镜像的onbuild被触发 |
可以通过编写示例进行练习
Docker常用的安装
docker的基本步骤
- 搜索镜像
- 拉取镜像
- 查看镜像
- 启动镜像
- 停止容器
- 移除容器
Mysql测试
获取Mysql镜像
docker seaech mysql
docker pull mysql:5.6
docker run -id -p 3308:3306 -e MYSQL_ROOT_PASSWORD=111 dd3b2a5dcb48
docker run -id \
-p 330:3306 \
--name=c_mysql \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.6
参数说明:
- -p 3307:3306:将容器的 3306 端口映射到宿主机的 3307 端口。
- -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。配置目录
- -v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。日志目录
- -v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。数据目录
- **-e MYSQL_ROOT_PASSWORD=123456:**初始化 root 用户的密码。
使用window的sqlyong进行连接测试
注意可能会因为Mysql的版本问题连接不上去
但是基本操作就是这些
Redis测试
步骤基本上都是一致的。详细的是需要改变一点的
Docker镜像推送到阿里云仓库
首先要在阿里云上有一个镜像仓库
完成仓库之后就可以看到一些命令帮助文档
根据官网进行命令操作
发现上传成功