docker自动制作镜像三
手动docker镜像的缺点
相对于手动制作的docker镜像,使用dockerfile构建的镜像有以下优点:
1:dockerfile只有几kb,便于传输 --我只需给客户一个dockerfile文件即可
2:使用dockerfile构建出来的镜像,在运行容器的时候,不用指定容器的初始命令---初始命令已经写在dockerfile中了
3:支持更多的自定义操作
一、dockerfile制作镜像步骤
Dockerfile结构大致分为四个部分:
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时执行指令
Dockerfile每行支持一条指令,每条指令可带多个参数,支持使用以#号开头的注释
指令 | 对象 | 含义 |
---|---|---|
FROM | 镜像 | 指定新镜像所基于的镜像,必须为第一条指令 |
MAINTAINER | 名字 | 新镜像的维护人信息 |
RUN | 命令 | 在所基于的镜像上执行命令,并提交到新镜像中 |
EXPOSE | 端口号 | 指定新镜像加载到Docker时开启的端口号 |
ENV | 环境变量 变量值 | 设置一个环境变量的值,会被后面的RUN使用 |
ADD | 源文件/目录 目标文件/目录 | 将源文件复制到目标文件,源文件要与Docker位于同一目录下,或者为一个URL |
COPY | 源文件/目录 目标文件/目录 | 将本地主机上的源文件/目录复制到目标地点,源文件/目录要与Dockerfile在同一目录下 |
VOLUME | ["目录"] | 在容器中创建一个挂载点 |
USER | 用户名 /UID | 指定运行容器时的用户 |
WORKDIR | 路径 | 为后续的RUN、CMD、ENTRYPOINT指定工作目录 |
ONBUILD | 命令 | 指定所生成的镜像作为一个基础镜像时所要运行的命令 |
CMD | ["要运行的程序","参数1","参数2"] | 指定启动容器时运行的命令或脚本,只能有一条CMD命令,多条时只有最后一条被执行 |
.ADD
格式:ADD src dest
该命令将复制指定本地目录中的文件到容器中的dest中,src可以是是一个绝对路径,也可以是一个URL或一个tar文件,tar文件会自动解压为目录
ENV
格式为:EVN key value 。用于指定环境变量,这些环境变量,后续可以被RUN指令使用,容器运行起来之后,也可以在容器中获取这些环境变量
MAINTAINER ren<10******21@qq.com> #我的姓名和邮箱
ENV JAVA_HOME /usr/local/jdk1.8.0_131 #配置jdk和tomcat的环境变量 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.47 ENV CATALINA_BASH /usr/local/apache-tomcat-8.5.47
EXPOSE 80 22 #容器对外暴漏的端口
dockerfile常用指令:
FROM 这个镜像的妈妈是谁?(指定基础镜像)
MAINTAINER 告诉别人,谁负责养它?(指定维护者信息,可以没有,这只是一个标签,没有实际作用)
RUN 你想让它干啥(在命令前面加上RUN即可)
ADD 给它点创业资金(COPY文件,会自动解压)与COPY功能一样,但是copy不会自动解压
WORKDIR 我是cd,今天刚化了妆(设置当前工作目录)
VOLUME 给它一个存放行李的地方(设置卷,挂载主机目录)
EXPOSE 它要打开的门是啥(指定对外的端口)(-P 随机端口)
CMD 奔跑吧,兄弟!(指定容器启动后的要干的事情)(容易被替换)
dockerfile其他指令:
COPY 复制文件
ENV 环境变量
ENTRYPOINT 容器启动后执行的命令(无法被替换,启容器的时候指定的命令,会被当成参数)
1)第一个实例:
1、编写dockerfile
mkdir -p /opt/dockerfile/centos6_ssh && cd /opt/dockerfile/centos6_ssh
进入容器yum源可能会无效,需要在容器内设置下yum源,能用就不用设置了
[root@docker01 centos6_ssh]# cat >> dockerfile << 'EOF' > > FROM centos:6.9 > RUN sed -i "s|enabled=1|enabled=0|g" /etc/yum/pluginconf.d/fastestmirror.conf > RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup > RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://www.xmpan.com/Centos-6-Vault-Aliyun.repo > RUN yum clean all > RUN yum makecache > RUN yum -y install openssh-server > RUN /etc/init.d/sshd start > RUN echo 123456 | passwd --stdin root > CMD ["/usr/sbin/sshd","-D"] > > EOF
[root@docker01 ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search localdomain
nameserver 192.168.23.2
nameserver 233.5.5.5 这个能解析yum源
2、docker build构建镜像
[root@docker01 centos6_ssh]# docker build -t centos69-ssh:v2 . 在当前路径下生成一个镜像(.代表当前目录下有dockerfile文件,相当于执行这个文件)
3、启动容器来测试新构建的镜像
[root@docker01 centos6_ssh]# docker run -d --name ren2 -p 1322:22 centos69-ssh:v2
docker ps -a -l --no-trunc 显示全ID
登录创建好的容器:因为映射用的宿主机是1322端口
[root@docker01 centos6_ssh]# ssh root@192.168.23.144 -p 1322
查询容器网络IP:
[root@docker01 centos6_ssh]# docker inspect 3ed6edb9df0 | grep -i ipaddress
查询容器:docker ps -a
停掉容器:docker stop 3b83cf3faa0e
删除容器:docker rm -f 3b83cf3faa0e
删除所有容器:
[root@docker01 centos6_ssh]# docker rm `docker ps -a -q`
2)第二个实例:
手动制作支持ssh-http双服务的docker镜像
1、编写dockerfile
[root@docker01 centos6_ssh]# cat init.sh
cat >>init.sh << 'EOF' /etc/init.d/httpd start /usr/sbin/sshd -D EOF
[root@docker01 centos6_ssh]# cat >> dockerfile << 'EOF'
cat >> dockerfile << 'EOF'
FROM centos:6.9
RUN sed -i "s|enabled=1|enabled=0|g" /etc/yum/pluginconf.d/fastestmirror.conf
RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://www.xmpan.com/Centos-6-Vault-Aliyun.repo
RUN yum clean all
RUN yum makecache
RUN yum -y install openssh-server
RUN /etc/init.d/sshd start
RUN echo 123456 | passwd --stdin root
#安装Apache
RUN yum -y install httpd
#把当前路径下的init.sh(dockefile所在的路径)放到容器的根目录下
ADD init.sh /init.sh
CMD ["/bin/bash","/init.sh"]
EOF
2、docker build构建镜像
[root@docker01 centos6_ssh]# docker build -t centos69-ssh_http:v2 . 在当前路径下生成一个镜像
3、启动容器来测试新构建的镜像
[root@docker01 centos6_ssh]# docker run -d -p 1321:22 -p 85:80 centos69-ssh_http:v2
,因为docker镜像要开启80和22端口,宿主机做映射的端口是85、1321
docker ps -a -l --no-trunc 显示全ID
测试Apache是否OK:curl -I 192.168.23.144:85
ssh登录容器:
[root@docker01 centos6_ssh]# ssh root@192.168.23.144 -p 1321
停容器、删容器:
3)扩展
[root@bms-6e4a-0918 centos6_ssh_http]# cat dockerfile
FROM centos:6.9
RUN yum -y install openssh-server
RUN /etc/init.d/sshd start
RUN echo 123456 | passwd --stdin root
RUN yum -y install httpd
ADD init.sh /init.sh
EXPOSE 22 80 docker镜像开启容器的时候自动开启22、80端口
CMD ["/bin/bash","/init.sh"]
[root@bms-6e4a-0918 centos6_ssh_http]# cat >>init.sh << 'EOF'
> /etc/init.d/httpd start
> /usr/sbin/sshd -D
> EOF
[root@docker01 centos6_ssh]# docker build -t centos69-ssh_http:v3 . 构建镜像
宿主机会自动分配端口和容器的22、80做映射,通过docker ps -a -l查看,可知宿主机的49154和容器的22做映射,宿主机的49153和容器80端口映射
验证:
手动进入容器:exec方式
[root@docker01 centos6_ssh]#
[root@docker01 centos6_ssh]# docker exec -it flamboyant_kepler(容器NAMES或者容器ID) /bin/bash
现在进去容器,当前目录是/根目录,若想开启容器就进入/root目录。需要在dockerfile中加WORKDIR /root
ENV 环境变量
CMD ["/usr/sbin/sshd","-D"] 启动容器的初始命令
ENTRYPOINT 容器启动后执行的命令(无法被替换,启容器的时候指定的命令,会被当成参数)
[root@docker01 centos6_ssh]# docker run -d -P centos69-ssh_http:v3 sleep 10 当启动容器的时候手动写sleep 10的时候,会把dockefile中默认的CMD中的命令覆盖(也就是CMD指定的命令不被执行);docker ps -a查看的时候,COMMAND下面就变成sleep 10了.而不是/usr/sbin/sshd","-D.
若想dockerfile中写的CMD的命令不被覆盖,需要将CMD换成ENTRYPOINT(ENTRYPOINT ["/usr/sbin/sshd","-D"] ),这样docker ps -a查看的时候,COMMAND下面会有/usr/sbin/sshd","-D"和sleep 10两个
4把php项目封装成docker镜像的步骤
把可道云项目封装成docker镜像的步骤:
1:先运行一个基础容器,手动制作docker镜像,把制作命令记录下来
2:编写dockerfile,构建镜像
3:测试运行
项目下载地址: http://static.kodcloud.com/update/download/kodexplorer4.37.zip
项目官网:https://kodcloud.com/download/
先进容器:[root@docker01 ~]# docker run -it -p 8080:80 centos:6.9
进入已经启动容器命令:docker exec -it 775c7c9ee1e1 /bin/bash
[root@1e0bcbd68686 /]# sed -i "s|enabled=1|enabled=0|g" /etc/yum/pluginconf.d/fastestmirror.conf
[root@1e0bcbd68686 /]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
[root@1e0bcbd68686 /]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://www.xmpan.com/Centos-6-Vault-Aliyun.repo
[root@1e0bcbd68686 /]# yum -y install httpd unzip php-cli php php-gd php-mbstring
[root@1e0bcbd68686 /]# /etc/init.d/httpd start
[root@1e0bcbd68686 /]# cd /var/www/html/ --项目代码放这
[root@1e0bcbd68686 html]# curl -o kodbox.1.15.zip http://static.kodcloud.com/update/download/kodbox.1.15.zip
[root@44f9bad4114a html]# curl -o kodbox.4.37.zip http://static.kodcloud.com/update/download/kodexplorer4.37.zip --用这个
[root@44f9bad4114a html]# chmod -Rf 777 ./*
[root@44f9bad4114a html]# /etc/init.d/httpd restart
根据在容器中操作命令编写dockerfile文件
[root@44f9bad4114a html]# history 1 sed -i "s|enabled=1|enabled=0|g" /etc/yum/pluginconf.d/fastestmirror.conf 2 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 3 curl -o /etc/yum.repos.d/CentOS-Base.repo https://www.xmpan.com/Centos-6-Vault-Aliyun.repo 4 yum -y install httpd unzip php-cli php 5 /etc/init.d/httpd start 6 cd /var/www/html/ 7 curl -o kodbox.1.15.zip http://static.kodcloud.com/update/download/kodbox.1.15.zip 8 curl -o kodbox.1.15.zip http://static.kodcloud.com/update/download/kodexplorer4.37.zip 9 ls 10 curl -o kodbox.1.15.zip http://static.kodcloud.com/update/download/kodbox.1.15.zip 11 curl -o kodbox.4.37.zip http://static.kodcloud.com/update/download/kodexplorer4.37.zip 12 ls 13 unzip kodbox.4.37.zip 14 ls 15 chmod -Rf 777 ./* 16 yum -y install php-gd php-mbstring 17 /etc/init.d/httpd restart 18 ll 19 history
编写docketfile文件:
[root@docker01 dockerfile]# mkdir kod && cd kod [root@docker01 kod]# vim dockerfile [root@docker01 kod]# cat dockerfile FROM centos:6.9 RUN sed -i "s|enabled=1|enabled=0|g" /etc/yum/pluginconf.d/fastestmirror.conf RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://www.xmpan.com/Centos-6-Vault-Aliyun.repo RUN yum -y install httpd unzip php-cli php php-gd php-mbstring WORKDIR /var/www/html RUN curl -o kodbox.4.37.zip http://static.kodcloud.com/update/download/kodexplorer4.37.zip RUN unzip kodbox.4.37.zip RUN chmod -Rf 777 /var/www/html ADD init.sh /init.sh EXPOSE 80暴露容器的端口 CMD ["/bin/bash","/init.sh"] [root@docker01 kod]# vim init.sh [root@docker01 kod]# cat init.sh #! /bin/bash /etc/init.d/httpd start
tail -F /var/log/httpd/access_log 为了让服务hang住,哪怕路径不对也没问题 [root@docker01 kod]# ls dockerfile init.sh
[root@docker01 kod]# docker build -t kod:v1 .