Dockerfile

Posted longren

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dockerfile相关的知识,希望对你有一定的参考价值。

Dockerfile

dockerfile主要组成部分

1.创建一个所有项目的目录

2.创建项目名称

3.编辑dockerfile文件(必须是dockerfile,默认识别的)
FROM :初始来自于哪个基础系统镜像 如: FROM centos:6.9
RUN: 需要运行的命令,可以有多个run 如: RUN yum install openssh-server -y
CMD:初始构建的命令,需要【 】括起来 如: CMD ["/bin/bash"]

FROM  这个镜像的妈妈是谁?(指定基础镜像)
 
MAINTAINER 告诉别人,谁负责养它?(指定维护者信息,可以没有)
 
LABLE      描述,标签
 
RUN 你想让它干啥(在命令前面加上RUN即可)
 
ADD 给它点创业资金(会自动解压tar)  制作docker基础的系统镜像
 
WORKDIR 我是cd,今天刚化了妆(设置当前工作目录)
 
VOLUME 持久化,给它一个存放行李的地方(设置卷,挂载主机目录),很重要,将目录后面新增的文件(比如说用户上传的文件等)保持下来。设置好了之后,启动容器后,会随机生成一个数据卷
 
EXPOSE 它要打开的门是啥(指定对外的端口)(-P 随机端口),默认指定,比如 EXPOSE 80 22 意思是随机跳转80 和22,每次随机指定的时候,都会为这2个指定,docker ps --no-trunc 查看全部内容
 
CMD 奔跑吧,兄弟!(指定容器启动后的要干的事情)(容易被替换)
 
dockerfile其他指令: 
 
COPY 复制文件(不会解压)rootfs.tar.gz
 
ENV  环境变量,在docker run --ENV “NAME=123” --ENV “NAME1=1234” 外部授权变量NAME,可以简写成-e
 
在dockerfile里面也可以传参,但是优先级低。 
ENV NAME1=1234 将参数传进去
 
ENTRYPOINT  容器启动后执行的命令(无法被替换,启容器的时候指定的命令,会被当成参数),写一个脚本就不会被影响。/bin/bash 1.sh 
 

持久化的应用

VOLUME 持久化,给它一个存放行李的地方(设置卷,挂载主机目录),很重要,将目录后面新增的文件(比如说用户上传的文件等)保持下来。设置好了之后,启动容器后,会随机生成一个卷
使用docker inspect 容器名|grep -i volume |grep -i source,可以看到目录文件
 
docker inspect 8302ee4bc9a9|grep -i volume #可以根据查看到的目录改动数据卷,可以直接改动数据
改动之后可以直接查看到网站内容的变化
 
当容器损坏后,重新启动一个容器
docker run -d -p 80:80 --volumes-from xiaoniao2(损坏的容器名) xiaoniao:v2
 
[root@oldboy _data]# docker run -d -p 82:80 --volumes-from 8302ee4bc9a9 xiaoniao:v7

原理

1.将dockerfile发送给docker服务端

2.加载FROM指定的镜像

3.执行RUN的命令,启动一个临时的容器,运行RUN指定的命令,所以每个RUN都是启动一个临时容器,然后提交,删除多余的,再创建再提交,形成一个最终镜像.

这个时候每次启动一个容器,都会初始化hosts文件,所以没法做hosts劫持。

这个时候加入 --network=host,意思为使用宿主机网络,如果宿主机有hosts劫持,那么速度就快乐

4.CMD 指定执行的初始命令

制作dockerfile的流程

1.手动制作一个镜像,文档一步一步整理好,方便dockfile调用

这个步骤和手动制作镜像一样
  1. 根据文档来编写dockfile

举个栗子:

FROM centos:6.9  #指定基础目录
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
RUN yum install nginx unzip -y
WORKDIR /usr/share/nginx/html   #工作目录设定在/usr/share/nginx/html,不能使用cd,命令,这和RUN的原理有关
 
ADD xiaoniao .     #把xiaoniao文件夹下的文件,覆盖到当前目录下(上条命令的workdir中,不会拷贝目录本身)
 
#ADD xiaoniao /usr/share/nginx/html 和上面2条命令是一样的,注意:xiaoniao文件夹要放在项目目录下,还可以自动解压tar包到目录下,自动覆盖
 
EXPOSE 80 22  #如果没有指定端口映射,自动给这个两个分配
ENV NAME=123  #设置环境变量,当然可以在命令行-e 指定  
 
CMD ["nginx","-g","daemon off;"]

3.使用dockerfile命令来创建镜像

[root@oldboy nginx]# docker image build --network=host -t centos_nginx:v2 /root/dockerfile/nginx
 
# 后面路径要指定到docker当前的目录,系统会自动识别,-t为指定镜像姓名
# --network=host 

4.测试镜像

[root@oldboy nginx]# docker run -d -p 80:80 centos_nginx:v2
1.查看CMD命令有没有写错,能不能夯住
要点:分开的命令需要使用“ ”,空格替换成, 以前的‘’ 整体命令,换成“ ”
 
#需要将sysctl内核转发打开

docker镜像的分层(dockerfile的书写规范)

镜像分层的好处:复用,节省磁盘空间,相同的内容只需加载一份到内存。 修改dockerfile之后,再次构建速度快
 
dockerfile 优化:
 
1:尽可能选择体积小linux,alpine
 
2:尽可能合并RUN指令,清理无用的文件(yum缓存,源码包)
 
3:修改dockerfile,把变化的内容尽可能放在dockerfile结尾
 
4: 使用.dockerignore,减少不必要的文件ADD . /html
#启动运行镜像(最好定义名称,为下面的主机引用提供方便)
docker run -d -p 80:80 nginx
#启动第2个镜像,link到第一个镜像,获得了第一个容器的ip地址(指向为web01)
docker run -it --link quirky_brown:web01 qstack/centos-ssh /bin/bash
#直接ping web01,可以获取到第一个容器的ip
ping 
 
应用实列:
 
#1.获取镜像包(做出的镜像)
 
docker-mysql-5.7.tar.gz  
zabbix-java-gateway.tar.gz  
zabbix-server-mysql.tar.gz  
zabbix-web-nginx-mysql.tar.gz
 
#2.执行命令
docker run --name mysql-server -t       -e MYSQL_DATABASE="zabbix"       -e MYSQL_USER="zabbix"       -e MYSQL_PASSWORD="zabbix_pwd"       -e MYSQL_ROOT_PASSWORD="root_pwd"       -d mysql:5.7       --character-set-server=utf8 --collation-server=utf8_bin
 
docker run --name zabbix-java-gateway -t       -d zabbix/zabbix-java-gateway:latest
 
docker run --name zabbix-server-mysql -t       -e DB_SERVER_HOST="mysql-server"       -e MYSQL_DATABASE="zabbix"       -e MYSQL_USER="zabbix"       -e MYSQL_PASSWORD="zabbix_pwd"       -e MYSQL_ROOT_PASSWORD="root_pwd"       -e ZBX_JAVAGATEWAY="zabbix-java-gateway"       --link mysql-server:mysql       --link zabbix-java-gateway:zabbix-java-gateway       -p 10051:10051       -d zabbix/zabbix-server-mysql:latest
 
docker run --name zabbix-web-nginx-mysql -t       -e DB_SERVER_HOST="mysql-server"       -e MYSQL_DATABASE="zabbix"       -e MYSQL_USER="zabbix"       -e MYSQL_PASSWORD="zabbix_pwd"       -e MYSQL_ROOT_PASSWORD="root_pwd"       --link mysql-server:mysql       --link zabbix-server-mysql:zabbix-server       -p 80:80       -d zabbix/zabbix-web-nginx-mysql:latest

docker的私有仓库

当有几百台宿主机,需要到官方的仓库docker hub上拉取,那么每台机器都需要使用带宽拉。
那么当有一台单独拉好之后,将它建立成私有仓库,其他的宿主机都到这上面来拉取,节省带宽。

首先从官方上面将镜像拉下来

docker pull registry (或者本地下载了,直接load )

仓库服务封装成了镜像

docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry #将/opt/myregistry 作为仓库
 
--restart=always docker服务启动,容器自己启动

为本地registry仓库加上basic认证(密码)

为了仓库的安全性,可以使用basic认证的方式

#安装basic,加密

yum install httpd-tools -y 


#创建密码目录

mkdir /opt/registry-var/auth/ -p

#将账号密码加密后放入指定密码文件

htpasswd -Bbn girl 123456 >> /opt/registry-var/auth/htpasswd

 
#运行registry仓库,以带密码的方式

docker run -d -p 5000:5000 --restart=always -v /opt/registry-var/auth/:/auth/ -v /opt/myregistry:/var/lib/registry -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" registry 

 
#设置好了以后,每次上传或者下载需要先登录

 
docker login 10.0.0.11:5000 (会提示输出账号和密码,如果不带后面的ip,是登录官网)

以上是关于Dockerfile的主要内容,如果未能解决你的问题,请参考以下文章

构建 Dockerfile 使用非零代码 139 执行

dockerfile部署goweb项目

dockerfile部署goweb项目

dockerfile部署goweb项目

Dockerfile的理解

当使用CICD的Conducto时,我必须创建自己的dockerfile吗?