创建镜像,创建自定义的镜像
包括配置文件,挂载点,对外暴露的端口,设置环境变量
docker的创建镜像的方式
1、基于已有的镜像进行创建,根据官方提供的镜像源,创建镜像,然后拉起容器,是一个白版,值能提供基础的功能,
扩展性的功能还是需要自定义(进入容器进行操作)
2、基于模版进行创建
导入镜像到本地
docker import 模版 -- 模版(Ubuntu:14)
3、dockerfile 联合文件系统(unionFS),docker镜像的基础(镜像通过分层来进行集成,特性:一次同时加载多个文件系统,但是从外面来看,就是一个文件系统)
docker镜像世纪上就是由一层一层的文件系统组成,这种层级的文件系统就是unionFS
每层都是layers,每一层都包含文件系统的一部分,这些层次叠加在一起,最终形成的就是rootfs
dockerfile形成(原理)
bootfs 宿主机的引导文件系统,启动操作系统的文件,启动容器需要的最基本的文件,包含宿主机的bootloader和kernel(提供内核)
rootfs 镜像的操作系统,拉取镜像会给镜像自动创建一恶搞操作系统(拉取镜像)
run add 创建容器时的命令
container
从而形成镜像
bootfs 宿主机提供的内核和引导程序
rootfs 就是容器的操作系统,在dockerfile中,我们可以自己指定(是多个基础镜像和应用镜像结合起来的只读层,镜像实际上就死一个只读文件)
容器基于镜像实例,运行起来之后,容器变成可读可写层
在dockerfile当中每创建一个指定都是一个镜像层
镜像层会被缓存和复用
一旦有一层镜像失败那么所有的镜像层都会失败,镜像也不会创建
镜像层是不可变的,你在某一层当中添加一个新的命令,但是下一层删除了指令,镜像中基于这个命令创建的文件依然存在,但是在容器中看不见
docker的核心作用
用户个性化定制docker的镜像
docker的文件结构
1、基础镜像信息
2、维护者信息
3、镜像的操作指令
4、容器启动时,执行的命令(nginx定义好了容器执行的命令,bin/bash,覆盖了容器内的标准输出)
dockerfile的语法
FROM:指定基础镜像信息,指定容器的操作系统
MAINTAINER:指定维护者信息(可有可无)
RUN:在基础的镜像上执行的命令,每个run就是一层,分层越多,镜像越大
ENTRYPOINT:设置容器运行时的默认命令(容器内部运行的主程序)
CMD:指定容器运行时的默认命令(docker run /bin/bash 后面加了其他的命令,CMD的指令将会被覆盖)
EXPOSE:暴漏端口(指定容器的运行端口)
ENV:设置环境变量,环境变量可以被run命令使用(声明容器运行需要的环境变量)
ADD:复制,解压,解压不支持.zip和.rar tar.gz tar.bz2 支持url地址解压和复制(解压)
COPY:复制文件,不能解压,只能复制本地文件,文件要和dockerfile在一个目录(官方推荐复制用copy)
VOLUME:创建一个容器内的挂载点,既可以为宿主机挂载,也可以供容器挂载
USER:设置运行镜像时使用的用户或者UID(可以不加)
WORKDIR:为后续指令设置的工作目录
ONBUILD:这个镜像可以被其他镜像引用,需要这个命令
ARG:传参,用于创建容器时,传递参数,ENV用于容器运行时设置环境变量
CMD和ENTRPOINT的区别
都是可以作为容器启动时的默认命令
创建dockerfile镜像
vim Dockerfile
FROM centos:7
MAINTAINER "this is my docker <xb>"
ENTRYPOINT ["echo","hello"]
CMD ["world"]
构建镜像
[root@docker1 test1]# docker build -t centos7:test .
[+] Building 17.0s (5/5) FINISHED docker:default
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 183B 0.0s
=> [internal] load metadata for docker.io/library/centos:7 4.5s
=> [1/1] FROM docker.io/library/centos:7@sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4 12.5s
=> => resolve docker.io/library/centos:7@sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4 0.0s
=> => sha256:2d473b07cdd5f0912cd6f1a703352c82b512407db6b05b43f2553732b55df3bc 76.10MB / 76.10MB 8.6s
=> => sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4 1.20kB / 1.20kB 0.0s
=> => sha256:dead07b4d8ed7e29e98de0f4504d87e8880d4347859d839686a31da35a3b532f 529B / 529B 0.0s
=> => sha256:eeb6ee3f44bd0b5103bb561b4c16bcb82328cfe5809ab675bb17ab3a16c517c9 2.75kB / 2.75kB 0.0s
=> => extracting sha256:2d473b07cdd5f0912cd6f1a703352c82b512407db6b05b43f2553732b55df3bc 3.8s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:95db50faac27607f675dd62ed2fd7a54e573f28c4b4c6b6b19f8c0718a71c0bc 0.0s
=> => naming to docker.io/library/centos7:test 0.0s
创建容器
[root@docker1 test1]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos7 test 95db50faac27 2 years ago 204MB
[root@docker1 test1]# docker run -it --name test1 centos7:test
hello world
[root@docker1 test1]#
区别
1、cmd可以把参数传给ENTRYPOINT
2、多个ENTRYPOINT和多个cmd只会运行最后一个(一个Dockerfile当中只会有一个ENTRYPOINT和CMD)
3、ENTRYPOINT的指令不会被覆盖,CMD的指令如果在docker run的后面加上输出,会被覆盖
4、ENTRYPOINT的指令在容器启动时启动时执行,都会成为容器的主进程,主进程负责接收信号,处理容器的生命周期,主进程退出,容器也将会终止运行
RUN命令的优化
主要是减少镜像的层数:把多个run命令写在一块
如何把run命令写在一块
&& 符号
RUN yum -y install nginx && make -j 4 && make install
前一个命令执行成功才会执行下一个命令
; 符号
RUN yum -y install nginx ; make -j 4 ; make install
不管前一个命令是否成功,后面的命令都会执行
|| 符号
RUN yum -y install nginx || make -j 4 || make install
如果前面的命令执行失败,才会执行后面的操作
反斜杠\ 换行 符号
RUN yum -y install nginx \
&& make j 4\
&& make install
可读性更高
copy和ADD区别
copy和add都可以吧本地文件复制到镜像中,但是官方推荐如果是复制使用copy
区别
add可以解压,如果是一个压缩文件,add在复制之后会自动解压(tar.gz和tar.bz2) 可以支持URL下载源文件,支持下载,但不能解压,通过URL拷贝的文件无法自动解压
copy只能复制,不能解压,而且只能是本地文件,不支持URL路径
centos7 构建Apache的dockerfile(编译安装)
把源码包拖到opt目录下
vim Dockerfile
#创建基础镜像
FROM centos:7
MAITAIENR "this is my apache <dn>"
RUN yum -y install gcc gcc-c++ make pcre pcre-devel expat-devel perl
ADD apr-1.6.2.tar.gz /opt
ADD httpd-2.4.29.tar.bz2 /opt
ADD apr-util-1.6.0.tar.gz /opt
RUN mv /opt/apr-1.6.2 /opt/httpd-2.4.29/srclib/apr && mv /opt/apr-util-1.6.0 /opt/httpd-2.4.29/srclib/apr-util &&\
cd /opt/httpd-2.4.29 &&\
./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi &&\
make -j 4 && make install
EXPOSE 80
CMD ["/usr/local/httpd/bin/apachectl","-D","FOREGROUND"]
docker build -t apache:centos .
docker run -itd --name httpd1 -p 50:80 apache:centos
基于镜像的二次构建
FROM centos:7 AS first
MAITAIENR "this is my apache <dn>"
RUN yum -y install gcc gcc-c++ make pcre pcre-devel expat-devel perl
ADD apr-1.6.2.tar.gz /opt
ADD httpd-2.4.29.tar.bz2 /opt
ADD apr-util-1.6.0.tar.gz /opt
RUN mv /opt/apr-1.6.2 /opt/httpd-2.4.29/srclib/apr && mv /opt/apr-util-1.6.0 /opt/httpd-2.4.29/srclib/apr-util &&\
./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi &&\
make -j 4 && make install
#二层构建
FROM centos:7
COPY --from=first /usr/local/httpd /usr/local/httpd
RUN yum -y cre pcre-devel expat-devel perl
EXPOSE 80
CMD ["/usr/local/httpd/bin/apachectl","-D","FOREGOUND"]
docker build -t apache1:centos .
docker run -itd --name httpd1 -p 50:80 apache:centos
页面访问
centos7 构建nginx的dockerfile(编译安装)
把源码包拖到opt/test目录下
vim Dockerfile
FROM centos:7
MAINTAINER "this is nginx <xb>"
ADD nginx-1.22.0.tar.gz /opt/test/
RUN yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel &&\
useradd -M -s /sbin/nologin nginx &&\
cd /opt/test/nginx-1.22.0/ &&\
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module &&\
make -j 4 && make install &&\
chown -R nginx.nginx /usr/local/nginx/ &&\
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
EXPOSE 80
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
[root@docker1 test]# docker build -t nginx:centos .
[+] Building 0.0s (8/8) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 791B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/centos:7 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 95B 0.0s
=> [1/3] FROM docker.io/library/centos:7 0.0s
=> CACHED [2/3] ADD nginx-1.22.0.tar.gz /opt/test/ 0.0s
=> CACHED [3/3] RUN yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel &&useradd -M -s /sb 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:5f90f4b42382377324edf884560f8118d6873889dd8179df68b47de39b6fb334 0.0s
=> => naming to docker.io/library/nginx:centos 0.0s
[root@docker1 test]# docker run -itd --name xiaobu -p 8080:80 nginx:centos
61beb14328b28a424a4c2e88d7e3a1f63e4ac55b551ec32a3656bcff3cb0711b
[root@docker1 test]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
61beb14328b2 nginx:centos "/usr/local/nginx/sb…" 5 seconds ago Exited (1) 4 seconds ago xiaobu
6068029975ff apache1:centos "/usr/local/httpd/bi…" 3 hours ago Up 3 hours 0.0.0.0:1314->80/tcp, :::1314->80/tcp httpd1
5b6c5af75176 apache:centos "/usr/local/httpd/bi…" 3 hours ago Exited (0) 3 hours ago http1
页面访问