docker自动制作镜像三

手动docker镜像的缺点
相对于手动制作的docker镜像,使用dockerfile构建的镜像有以下优点:
1:dockerfile只有几kb,便于传输 --我只需给客户一个dockerfile文件即可
2:使用dockerfile构建出来的镜像,在运行容器的时候,不用指定容器的初始命令---初始命令已经写在dockerfile中了
3:支持更多的自定义操作

一、dockerfile制作镜像步骤

Dockerfile结构大致分为四个部分:

  1. 基础镜像信息
  2. 维护者信息
  3. 镜像操作指令
  4. 容器启动时执行指令

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 .

 

posted @ 2020-09-23 00:45  闲云野鹤cs  阅读(503)  评论(0编辑  收藏  举报