-
每个不同服务的容器单独创建一个目录创建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命令。