dockerfile详解

dockerfile详解

  • Dockerfile文件构建镜像三种方式
  • Docker镜像的分层
  • Dockerfile操作指令
  • Dockerfile 安装apache
  • 用dockerfile安装tomcat
  • 用dockerfile安装nginx
  • 基于已有的镜像创建容器
  • 基于本地模板进行构建
  • 私有仓库创建
  • 宿主机的/data/registry自动创建挂载容器中的/tmp/registry,实现共享(自动创建挂载点)
  • 私有仓库下载
  • Docker数据卷
  • 数据卷容器
  • 容器互联

Dockerfile文件构建镜像三种方式

1、Dockerfile
2、基于已有的镜像容器进行创建镜像
3、基于本地模板进行构建

Docker镜像的分层

Dockerfile中的每个指令都会创建一个新的(临时)镜像层

镜像层将被缓存和复用

当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效

某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效

镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件

容器(可读,可写层)
服务本身镜像层(只读层,模板)
依赖环境镜像层(只读层,模板)
基础镜像镜像层(为以上的系统服务提供支持)
底层内核层

Dockerfile操作指令

  指令                                            含义
FROM 镜像                            指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令

MAINTAINER 名字                      说明新镜像的维护人信息

RUN命令                              在所基于的镜像上执行命令,并提交到新的镜像中

CMD [”要运行的程序”,”参数1,"参数2 "]   指令启动容器时要运行的命令或者脚本,Dockerfile只能有一条CMD命令, 如果指定多条则只能最后一条被执行

EXPOSE 端口号                         指定新镜像加载到Docker时要开启的端口

ENV  环境变量  变量值                  设置一个环境变量的值,会被后面的RUN使用

ADD 源文件/目录目标文件/目录            将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,或者是一个URL

COPY 源文件/目录目标文件/目录           将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中

VOLUME [“目录"]                      在容器中创建一个挂载点

USER 用户名/UID                       指定运行容器时的用户

WORKDIR 路径(类似cd)                为后续的RUNCMDENTRYPOINT指定工作自录

ONBUILD 命令                         指定所生成的镜像作为一个基础镜像时所要运行的命令

HEALTHCHECK                         健康检查

Dockerfile 安装apache

创建apache目录
[root@server1 ~]# cd /opt/
[root@server1 opt]# mkdir apache


用dockerfile写apache

FROM centos   #使用的镜像
MAINTAINER song  #创建人
RUN yum -y update  #更新
RUN yum -y install httpd  #安装http
EXPOSE 80   # apache暴露的端口
ADD index.html /var/www/html/index.htm
l  #传入index.html文件到/var/www/htnl/index.htm
l 
ADD run.sh /run.sh  #传递一个脚本到run.sh
RUN chomd 755 /run.sh  #给权限
CMD ["/run.sh"]  #容器在启动时 启动的脚本



[root@server1 apache]# vim index.html

song  #网页展示的


[root@server1 apache]# vim run.sh

#!/bin/bash
rm -rf /run/httpd/*  #删除apache缓存
exec /usr/sbin/apachectl -D FOREGROUND  #exec执行,apachectl守护进程

[root@server1 apache]# docker build -t http:centos .  //生成镜像 一定要加. 
[root@server1 ~]# docker run -d -p 1216:80 http:centos    
-p(小写):表示指定内部容器端口映射的端口号,与外部通信
-P(大写): 表示随机端口

dockerfile详解_第1张图片
http://192.168.188.10:1216/

dockerfile详解_第2张图片

用dockerfile安装tomcat

[root@server1 ~]# cd
[root@server1 ~]# cd /opt/
[root@server1 opt]# mkdir tomcat
[root@server1 opt]# cd tomcat/
[root@server1 tomcat]# vim Dockerfile

FROM centos:7
MAINTAINER song
ADD jdk-8u91-linux-x64.tar.gz /usr/local
WORKDIR /usr/local
RUN mv jdk1.8.0_91 /usr/local/java
ENV JAVA_HOME /usr/local/java
ENV JAVA_BIN /usr/local/java/bin
ENV JRE_HOME /usr/local/java/jre
ENV PATH $PATH:/usr/local/java/bin:/usr/local/java/jre/bin
ENV CLASSPATH /usr/local/java/jre/bin:/usr/local/java/lib:/usr/local/java/jre/lib/charsets.jar
ADD apache-tomcat-8.5.16.tar.gz /usr/local
WORKDIR /usr/local
RUN mv apache-tomcat-8.5.16 /usr/local/tomcat8
EXPOSE 8080
ENTRYPOINT ["/usr/local/tomcat8/bin/catalina.sh","run"]


再把apache-tomcat-8.5.16.tar.gz   jdk-8u91-linux-x64.tar.gz 两个包放入/opt/tomcat文件夹里

[root@server1 tomcat]# ls
apache-tomcat-8.5.16.tar.gz  Dockerfile  jdk-8u91-linux-x64.tar.gz

[root@server1 tomcat]# docker build -t tomcat:centos .
[root@server1 tomcat]# docker run -d --name tomcata -P tomcat:centos 

dockerfile详解_第3张图片

在这里插入图片描述
dockerfile详解_第4张图片

用dockerfile安装nginx

[root@server1 tomcat]# cd
[root@server1 ~]# cd /opt/

[root@server1 opt]# mkdir nginx
[root@server1 opt]# cd nginx/
[root@server1 nginx]# vim Dockerfile

FROM centos:7                        
MAINTAINER this is nginx       
RUN yum -y update                  
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx    
ADD nginx-1.12.0.tar.gz /usr/local/src             
WORKDIR /usr/local/src
WORKDIR nginx-1.12.0                              
RUN ./configure \                  
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
EXPOSE 80                                         
EXPOSE 443
RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.conf      
ADD run.sh /run.sh                                
RUN chmod 755 /run.sh
CMD ["/run.sh"]



[root@server1 nginx]# ls
Dockerfile  nginx-1.12.0.tar.gz
[root@server1 nginx]# vim run.sh

#!/bin/bash
/usr/local/nginx/sbin/nginx


[root@server1 nginx]# docker build -t nginx:new . 

[root@server1 nginx]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
nginx         new       5cd808030c40   21 seconds ago   602MB
centos        latest    300e315adb2f   3 months ago     209MB
centos        7         8652b9f0cb4c   3 months ago     204MB
hello-world   latest    bf756fb1ae65   14 months ago    13.3kB
[root@server1 nginx]# docker run -d -P nginx:new
43da8d9f5653cbad1382c1e494f3ceab24d566733d5b4df2bcce2cb152b2bf11
[root@server1 nginx]# docker ps -a
CONTAINER ID   IMAGE       COMMAND     CREATED         STATUS         PORTS                                           NAMES
43da8d9f5653   nginx:new   "/run.sh"   5 seconds ago   Up 4 seconds   0.0.0.0:49157->80/tcp, 0.0.0.0:49156->443/tcp   competent_goldberg

http://192.168.188.10:49157/

dockerfile详解_第5张图片

基于已有的镜像创建容器

[root@server1 nginx]# docker create nginx:latest /bin/bash
[root@server1 nginx]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS    PORTS     NAMES
33d1a53c738c   nginx:latest   "/docker-entrypoint.…"   17 seconds ago   Created             objective_leavitt
[root@server1 nginx]# docker start 33d1a53c738c
[root@server1 nginx]# docker run -itd nginx:latest /bin/bash 
056a4a8701d7ff7ed591047b9b25d7a60764f4223ae4f0946a9dc938fe730473
[root@server1 nginx]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                      PORTS     NAMES
056a4a8701d7   nginx:latest   "/docker-entrypoint.…"   9 seconds ago    Up 7 seconds                80/tcp    objective_cohen
33d1a53c738c   nginx:latest   "/docker-entrypoint.…"   34 minutes ago   Exited (0) 33 minutes ago             objective_leavitt
[root@server1 nginx]# docker rm 33d1a53c738c
33d1a53c738c
[root@server1 nginx]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS              PORTS     NAMES
056a4a8701d7   nginx:latest   "/docker-entrypoint.…"   About a minute ago   Up About a minute   80/tcp    objective_cohen

[root@server1 nginx]# docker commit -m "new" -a "daoke" 056a4a8701d7 daoke:latest
-m:描述信息
-a:名称

dockerfile详解_第6张图片

基于本地模板进行构建

容器导入(生成镜像)
cat  导出的文件名(容器) | docker import - 指定镜像名称
cat nginx_a | docker import - nginx:latest

私有仓库创建

[root@server1 nginx]# docker pull registry 、、安装registry
Using default tag: latest
latest: Pulling from library/registry
0a6724ff3fcd: Pull complete 
d550a247d74f: Pull complete 
1a938458ca36: Pull complete 
acd758c36fc9: Pull complete 
9af6d68b484a: Pull complete 
Digest: sha256:d5459fcb27aecc752520df4b492b08358a1912fcdfa454f7d2101d4b09991daa
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest

[root@server1 nginx]# vim /etc/docker/daemon.json 

{
  "insecure-registries": ["192.168.188.10:5000"],
  "registry-mirrors": ["https://rwyi253w.mirror.aliyuncs.com"]

[root@server1 nginx]# systemctl restart docker
[root@server1 nginx]# docker images

dockerfile详解_第7张图片

[root@server1 nginx]# docker create registry /bin/bash
a9233a0068ceedf25c68f353e7d538beb5da6cce49883eb5e5c1c7f1dc2d48f0
[root@server1 nginx]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                      PORTS     NAMES
a9233a0068ce   registry       "/entrypoint.sh /bin…"   38 seconds ago   Created                               fervent_cartwright
056a4a8701d7   nginx:latest   "/docker-entrypoint.…"   23 minutes ago   Exited (137) 3 minutes ago            objective_cohen
[root@server1 nginx]# docker start a9233a0068ce
a9233a0068ce
[root@server1 nginx]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS                      PORTS     NAMES
a9233a0068ce   registry       "/entrypoint.sh /bin…"   About a minute ago   Exited (127) 4 secondsago             fervent_cartwright
056a4a8701d7   nginx:latest   "/docker-entrypoint.…"   24 minutes ago       Exited (137) 4 minutesago             objective_cohen


宿主机的/data/registry自动创建挂载容器中的/tmp/registry,实现共享(自动创建挂载点)

[root@server1 nginx]# docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
-v:挂载

dockerfile详解_第8张图片

查看仓库内容

[root@server1 nginx]# curl -XGET http://192.168.188.10:5000/v2/_catalog
{"repositories":[]}

更改标记,标签为192.168.188.10:5000/nginx

[root@server1 nginx]# docker tag nginx:latest 192.168.188.10:5000/nginx

dockerfile详解_第9张图片

上传


[root@server1 nginx]# docker push 192.168.188.10:5000/nginx
[root@server1 nginx]# curl -XGET http://192.168.188.10:5000/v2/_catalog

dockerfile详解_第10张图片

私有仓库下载

[root@server1 nginx]# docker images
[root@server1 nginx]# docker pull 20.0.0.10:5000/nginx
[root@server1 nginx]# docker images

dockerfile详解_第11张图片

Docker数据卷

数据卷是一个提供容器使用的特殊目录
宿主机中的目录和容器中目录实现挂载,共享空间

[root@server1 nginx]# docker images
[root@server1 nginx]# ls /
[root@server1 nginx]# docker run -v /var/abc:/data1 --name test1 -it centos:7 /bin/bash   /宿主机目录/var/www挂载容器中的/data1
[root@10a711a1eb7f /]# ls /
[root@10a711a1eb7f /]# cd data1/
[root@10a711a1eb7f data1]# touch a.txt  创建测试文件


返回宿主机进行查看


[root@server1 ~]# cd /var/
[root@server1 var]# ls 
[root@server1 var]# cd abc/
[root@server1 abc]# ls

dockerfile详解_第12张图片

数据卷容器

数据卷容器就是一个普通的容器
挂载web容器中的数据卷到新的容器

基于centos:7镜像去运行一个名称为test3的容器,提供两个对外暴露的挂载点

[root@server1 nginx]# docker run --name test3 -v /data1 -v /data2 -it centos:7 /bin/bash  
[root@2bea9544740b /]# ls /


打开一个终端
[root@server1 ~]# docker run -it --volumes-from test3 --name ddd centos:7 /bin/bash
[root@4070401b0b1a /]# ls /
[root@4070401b0b1a /]# cd data1/
[root@4070401b0b1a data1]# touch 11.txt
[root@4070401b0b1a data1]# cd ..
[root@4070401b0b1a /]# cd data2/
[root@4070401b0b1a data2]# touch 22.txt

进入test3容器查看

dockerfile详解_第13张图片

容器互联

[root@server1 ~]# docker run -itd -P --name song centos:7 /bin/bash
[root@server1 ~]# docker ps -a
[root@server1 ~]# docker exec -it 75cc275ea409 /bin/bash
[root@75cc275ea409 /]# yum -y install net-tools

dockerfile详解_第14张图片

新开一个新的会话窗口

[root@server1 ~]# docker run -itd -P --name song1 --link song:song centos:7 /bin/bash
[root@server1 ~]# docker exec -it 02da917545ba /bin/bash
[root@02da917545ba /]# yum -y install net-tools
[root@02da917545ba /]# ping 172.17.0.6

dockerfile详解_第15张图片

你可能感兴趣的:(docker,docker,dockerfile)