• 每个不同服务的容器单独创建一个目录创建dockerfile文件:

    [root@docker dockerfile]# mkdir -p /opt/dockerfile/lamp

  • dockerfile文件内容如下:

    [root@docker lamp]# cat dockerfile
    #FROM:基础镜像信息
    FROM centos:6.9
    # RUN:后面跟构建镜像过程中运行的命令
    RUN mv /etc/yum.repos.d/*.repo /tmp && echo -e "[ftp]\nname=ftp\nbaseusr=ftp://172.17.0.1/centos6.9\ngpgcheck=0"> /etc/yum.repos.d/ftp.repo && yum makecache fast && yum install openssh-server httpd mysql mysql-server php php-mysql -y
    RUN /etc/init.d/sshd start && echo "123456"|passwd root --stdin && /etc/init.d/mysqld start && /etc/init.d/httpd start
    RUN mysql -e "grant all on *.* to root@'%' identified by '123'; grant all on *.* to discuz@'%' identified by '123'; create database discuz charset utf8;"
    #COPY:从dockerfile所在目录,拷贝目标文件到容器的制定目录下。可以支持通配符,如果拷贝的是目录,只拷贝目录下的子文件子目录,docker官方推荐使用。
    COPY init.sh /
    #ADD:可以自动解压本地.tar*的软件包到目标目录下和指定源文件为URL地址,如果源文件是个压缩文件,则docker会自动帮解压到指定的容器中(无论目标是文件还是目录,都会当成目录处理)。
    ADD bbs.tar.gz /var/www/html/
    ADD https://mirrors.aliyun.com/centos/7.6.1810/od/x86_64/Packages/centos-bookmarks-7-1.e17.noarch.rpm /tmp
    # EXPOSE:当容器内安装有多个服务是指定向外暴露的端口,Docker为了安全,不会自动对外打开端口,如果需要外部提供访问,还需要启动容
    

器时增加-p或者-P参数对容器的端口进行分配。

  EXPOSE 22 80 
  #ENTRYPOINT:用于设定容器启动时第一个运行的命令及其参数,每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。
  ENTRYPOINT ["/bin/bash","/init.sh"]
  • 运行一个容器后边只能写一条命令,脚本内容如下:

    [root@docker lamp]# cat init.sh
    #!/bin/bash
    /etc/init.d/mysqld start
    /etc/init.d/httpd start
    /usr/sbin/sshd -D
    
  • 开始构建镜像:

    [root@docker lamp]# docker build [Dockerfile所在目录] --network=host -t [镜像名]:[版本号]

使用创建的镜像运行成为一个新容器:

docker run -d -p 80:80 --name yourname 构建的镜像名 
  • dockerfile常用命令说明:

    CMD:使用镜像启动容器时运行的命令
    VOLUME:设置数据卷,用来挂载文件目录。如果容器设置了卷则每次运行都会自动生成一个随机ID的卷在当前目录下,在dockerfile中设置可以达到备份数据的作用
    ENV:环境变量。在脚本定义了一个变量后运行容器是使用-e  “$VAR=VALUE”;在dockerfile中:$VAR VALUE指定默认值,或者 <key> <value>, <key>=<value>
    WORKDIR:切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录。 相当于cd命令。
    
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐