176. 编写dockerfile构建docker镜像

1. dockerfile介绍

类似ansible剧本,大小几kb 手动做镜像:大小几百M+
dockerfile 支持自定义容器的初始命令
docker images -a:显示所有镜像,包括失败的镜像
docker image prune:清除失败的镜像缓存
docker image prune -a:清除所有未被容器使用的镜像;极度危险!!!

2. dockerfile主要组成部分:

基础镜像信息 FROM centos:6.9 
制作镜像操作指令 RUN yum install openssh-server -y 
容器启动时执行初始命令 CMD ["/bin/bash"] dockerfile常用指令:
FROM		指定基础镜像
RUN			在执行的命令前加上即可
CMD			运行镜像时,默认执行的命令(容易被替换)
ADD			宿主机的文件添加到到容器中,tar包可自动解压   ///////////可自动解压tar包
MAINTAINER	指定维护者信息
LABEL		描述,标签
WORKDIR		指定工作目录,设定后,进入容器默认是在这个目录下
例子:
[root@docker01 nginx]# docker run -it --workdir /tmp centos:6.9 
[root@b1e8bb160c88 tmp]# exit

VOLUME		设置卷,使用卷可以将容器中的目录内容持久化,卷路径在/var/lib/docker/volumes/;写绝对路径可以挂载宿主机目录至容器目录
docker run --volume /opt/h5:/usr/share/nginx/html -d c6_nginx:v2.0

EXPOSE		可指定容器开放的端口,可启动容器时随机端口挂载到开放的端口
COPY		复制宿主机的文件到容器中
ENV			可设定环境变量(密码信息等),设定的变量可以在dockerfile中引用,而且会继承到容器中
ENTRYPOINT	容器启动执行的命令,无法被替换,写在启动命令位置的字符串会被当成命令的参数

3. 编写dockerfile思路:

思路:
1.手动制作docker镜像,保留历史命令
2.根据历史命令编写dockerfile
3.构建docker镜像
4.测试docker镜像

4. 实战一:基于c6编写dockerfile构建Nginx服务

1. 编写dockerfile
[root@docker01 nginx]# cat dockerfile 
FROM centos:6.9
RUN  rm -rf /etc/yum.repos.d/* && \
	curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo && \
	curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo && \
	yum install nginx -y
ADD init.sh /init.sh
CMD ["/bin/bash","/init.sh"]

2. 准备脚本
[root@docker01 nginx]# cat init.sh 
#!/usr/bin/sh
service php-fpm start
nginx -g 'daemon off;'

3. 构建镜像
docker build -t c6_nginx:v2.0 --network=host .

4. 测试镜像
docker run -d -p 82:80 c6_nginx:v2.0

参数补充:
[root@docker01 nginx]# cat dockerfile 
FROM centos:6.9
RUN  rm -rf /etc/yum.repos.d/* && \
	curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo && \
	curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo && \
	yum install nginx -y
WORKDIR /usr/share/nginx/html  #默认进入该目录
ADD xiaoniao .					#添加代码至html
ADD init.sh /init.sh
EXPOSE 80						#指定容器端口
CMD ["/bin/bash","/init.sh"]

[root@docker01 nginx]# cat dockerfile 
FROM centos:6.9
RUN  rm -rf /etc/yum.repos.d/* && \
	curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo && \
	curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo && \
	yum install nginx -y
WORKDIR /usr/share/nginx/html
ADD xiaoniao .		#还可以使用COPY;ADD可以解压tar包
ADD init.sh /init.sh
EXPOSE 80
VOLUME /usr/share/nginx/html	#设置卷
CMD ["/bin/bash","/init.sh"]

5. 实战二:基于alpine编写dockerfile构建Nginx服务

1. 编写dockerfile
FROM alpine:3.9
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories && \
    apk update && \
    apk add nginx && \
    mkdir -p /run/nginx/
CMD ["nginx","-g","daemon off;"]

6. 实战三:基于alpine编写dockerfile部署可道云项目

1. 编写dockerfile
FROM alpine:3.9
MAINTAINER cheng	
LABEL maintainer="alpine nginx"

RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories && \
    apk update && \
    apk add nginx php7-intl php7-openssl php7-pdo_mysql 		php7-common php7-fpm php7-mysqlnd php7-mbstring php7-opcache 		php7-session php7-gd php7-json php7 php7-iconv php7-curl 		php7-pecl-igbinary php7-pecl-memcached php7-pdo php7-mysqli	
    
WORKDIR /code	

ADD www.conf /etc/php7/php-fpm.d/www.conf
ADD default.conf /etc/nginx/conf.d/default.conf
ADD code /code
ADD init.sh /init.sh	

EXPOSE 80/tcp		

RUN mkdir -p /run/nginx
RUN chown -R nginx:nginx /code	

ENTRYPOINT ["/bin/sh","/init.sh"]

7. 实战四:自己制作alpine系统镜像

1.下载系统文件
[root@docker01 alpine]# wget https://mirrors.tuna.tsinghua.edu.cn/lxc-images/images/alpine/3.9/amd64/default/20200122_13%3A00/rootfs.tar.xz
[root@docker01 alpine]# tar xf rootfs.tar.xz 
[root@docker01 alpine]# echo "chengyinwu" > version

[root@docker01 alpine]# tar czf ../alpine.tar.gz *

2. 编写dockerfile
[root@docker01 alpine]# cat dockerfile 
FROM scratch
ADD alpine.tar.gz /

CMD ["/bin/sh"]

3. 构建镜像
[root@docker01 dockerfile]# docker build -t alpine:cheng .

4. 测试镜像

在这里插入图片描述

8. 实战五:基于c7安装sshd服务,指定端口可ssh连接

1. 编写dockerfile
[root@docker01 sshd]# cat dockerfile 
FROM centos:7
ENV version: 7.4p1
RUN rm -rf /etc/yum.repos.d/* && \
	curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \
	curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo && \
	yum install initscripts openssh-server-$version -y && \
	/usr/sbin/sshd-keygen

ADD init.sh /init.sh
CMD ["/bin/bash","/init.sh"]

2. 准备脚本
[root@docker01 c7]# cat init.sh 
#!/usr/bin/bash

echo $1 |passwd --stdin root
/usr/sbin/sshd -D 

3. 构建镜像
[root@docker01 c7]# docker build -t c7_ssh:v1.0 .

4. 测试镜像
[root@docker01 c7]# docker run  -d -p 1024:22 c7_ssh:v1.0 /bin/bash /init.sh 1qaz2wsx

9. 实战六:ENTRYPOINT应用

1. 编写dockerfile
[root@docker01 c7]# cat dockerfile 
FROM centos:7
ENV version 7.4p1
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \
	yum install initscripts openssh-server-$version -y && \
	/usr/sbin/sshd-keygen

ADD init.sh /init.sh
ENTRYPOINT ["/bin/bash","/init.sh"]

2. 构建镜像
[root@docker01 c7]# docker build -t c7_ssh:v2.0 .

3. 测试镜像
[root@docker01 c7]# docker run -d -p 1025:22 c7_ssh:v2.0 fsgssghs     //传入的参数不会覆盖,反而成为命令的参数
ssh root@10.0.0.11 1025   //本地通过1025连接测试;密码fsgssghs

10. 实战七:基于c6部署可道云

1. 编写dockerfile
[root@docker01 kdy]# cat dockerfile 
FROM c6_nginx:v2.1
RUN yum install php-fpm php-gd php-mbstring unzip -y
ADD www.conf /etc/php-fpm.d/www.conf
RUN rm -rf /etc/nginx/conf.d/*
ADD kdy.conf /etc/nginx/conf.d/kdy.conf
ADD code /code
ADD init.sh /init.sh

EXPOSE 80
RUN chown -R nginx.nginx /code

ENTRYPOINT ["/bin/sh","/init.sh"]


2. 准备文件
[root@docker01 kdy]# docker cp c4e2dc2ef0bb004:/etc/php-fpm.d/www.conf .
[root@docker01 kdy]# docker cp c4e2dc2ef0bb004:/etc/nginx/conf.d/kdy.conf .

3. 构建镜像
[root@docker01 kdy]# docker build -t kdy:3.0 .

4. 测试镜像
[root@docker01 kdy]# ls
code  dockerfile  init.sh  kdy.conf  www.conf
[root@docker01 kdy]# docker run -d -p 88:80 kdy:3.0 

在这里插入图片描述

发布了184 篇原创文章 · 获赞 72 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/chengyinwu/article/details/104076695