云计算之 docker 03 DockerFile

++++++++++++++++++++
# 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 可以方式,在启动容器时,第一进程被手工输入的命令替换掉,防止容器秒起秒关。