++++++++++++++++++++ # 8. 通过Dockerfile定制企业镜像 ## 8.1 Dockerfile的基本使用初体验(cent6.9_sshd) mkdir -p /opt/dockerfile/centos6.9_sshd vim Dockerfile #Centos6.9-SSHDV1.0 FROM centos:6.9 RUN mv /etc/yum.repos.d/*.repo /tmp && echo -e "[ftp]\nname=ftp\nbaseurl=ftp://172.17.0.1/centos6.9\ngpgcheck=0"> /etc/yum.repos.d/ftp.repo && yum makecache fast && yum install openssh-server -y RUN /etc/init.d/sshd start && /etc/init.d/sshd stop && echo "123456" | passwd root --stdin EXPOSE 22 CMD ["/usr/sbin/sshd","-D"] docker image build -t "dfsc/centos6.9_sshd" . ## . 表示当前目录,也可以写在 ./ 第一个非注释命令必须是 FROM ## 8.2 Dockerfile 常命令 FROM: 基础镜像 Syntax: FROM centos:6.9 ## 在那个镜像上操作 FROM centos@2199b8eb8390C #(镜像ID) ## 这种写法,更具有安全性。 RUN: 构建镜像过程中运行的命令 Syntax: RUN两种写法,第一种,基于 bash 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 -y RUN尽量将命令写在一行,因为dockerfile 执行的时候,每执行一行命令,都会生成一个容器。 另一种是非shell 命令的写法:第一个命令用引号,后面的参数,用引号,并用逗号分隔。 RUN ["mysqld","--initialize-insecure","--user=mysql","--basedir=/user/local/mysql","--datadir=/data/mysql/data"] EXPOSE: 向外暴露的端口 Syntax: EXPOSE 22 ### 多个端口,写多行。 CMD 使用镜像启动容器时运行的命令 Syntax: CMD ["/usr/sbin/sshd","-D"] docker rmi $(docker image ls -a |grep "none"| awk '{print $3}') # 8.3 通过例子学习其他指令 ## dockerfile 构建Lamp基础环境镜像 创建目录 mkdir -p /opt/dockerfile/lamp && cd /opt/dockerfile/lamp vim dockerfile ## 新版本的dockerfile d可以大写,可以小写。但是名字必须是dockerfile # Centos:6.9_sshd_LAMPM FROM centos:6.9 RUN mv /etc/yum.repos.d/*.repo /tmp && echo -e "[ftp]\nname=ftp\nbaseurl=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 COPY init.sh / ADD bbs.tar.gz /var/www/html/ EXPOSE 22 EXPOSE 80 EXPOSE 3306 CMD ["/bin/bash","/init.sh"] 保存退出。 准备文件: cd /opt/dockerfile/lamp vim init.sh #!/bin/bash /etc/init.d/mysqld start mysql -e "grant all on *.* to root@'%' identified by '123'; grant all on *.* to discuz@'%' identified by '123'; create database discuz charset utf8;" /etc/init.d/httpd start /usr/sbin/sshd -D [root@docker lamp]# cp /opt/vol/html/bbs.tar.gz ./ 构建镜像: docker build -t "dfsc/c69_bbs_lamp" .启动容器: docker container run -d -p 80 -p 22 -p 3306 2f45f30a53b6
说明: COPY命令:从Dockerfile的所在目录,拷贝文件到容器指定目录 Syntax: (可以有多个源,目标目录只有一个。) <src>... <dest> 从dockerfile所在目录,拷贝目标文件到容器的制定目录下。 可以支持通配符,如果拷贝的是目录,只会拷贝目录下的 子文件、子目录。 cp oldguo/* 容器目录/ ADD ##从Dockerfile的所在目录,拷贝文件到容器目录,如果对于tar压缩文件,会自动解压, .tar.gz .tar.bz .tar.xz .tar 假如 目标目录不存在,会自动创建。 Syntax: <src>... <dest> url <dest> 比COPY命令多的功能是,可以自动解压.tar*的软件包到目标目录下 可以指定源文件为URL地址,就是可以下载的URL地址。 ADD https://mirrors.aliyun.com/centos/7.6.1810/od/x86_64/Packages/centos-bookmarks-7-1.e17.noarch.rpm /tmp VOLUME ["/var/www/html","/data/mysql/data"] Dockerfile在制作 镜像的时候,自动挂载数据卷 WORKDIR 相当于cd 命令,只要你执行 了一次workdir ,后续的操作,都在这个目录,再换的话,只有用绝对路径。 ENV 设定变量 ENV CODEDIR /var/www/html ENV DATADIR /data/mysql/data ADD bbs.tar.gz ${CODEDIR} VOLUME ["${CODEDIR}","${DATADIR}"] ENTRYPOINT 和 CMD 命令类似,也是出现在最后。 #CMD ["/bin/bash","/init.sh"] ##容器启动时,运行的第一个进程,但是这个进程可以替换。 docker run -d -p 80 -p 22 -p 3306 0cd79dedcd60 /bin/bash 这时 启动容器时,/bin/bash 就替换了 init.sh ENTRYPOINT ["/bin/bash","init.sh"] ## 让容器启动时执行的第一个命令,不可替换。 说明: ENTRYPOINT 可以方式,在启动容器时,第一进程被手工输入的命令替换掉,防止容器秒起秒关。