一、Dockerfile创建镜像理论
-
Dockerfile是由一组指令组成的文件
-
Dockerfile结构四部分 基础镜像信息 维护者信息 镜像操作指令 容器启动时执行指令
-
Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以““号开头的注释
二、常用的 Dockerfile 操作指令
-
在编写 Dockerfile 时,有严格的格式需要遵循:第一行必须使用 FROM 指令指明所基于的镜像名称;之后使用 MAINTAINER 指令说明维护该镜像的用户信息;然后是镜像操作相关指令,如 RUN 指令。每运行一条指令,都会给基础镜像添加新的一层。最后使用 CMD 指令指定启动容器时要运行的命令操作。
指令 | 含义 |
---|---|
FROM 镜像 | 指定新镜像所基于的镜像,第一条指令必须为FROM 指令,每创建一个镜像就需要一条 FROM 指令 |
MAINTAINER 名字 | 说明新镜像的维护人信息 |
RUN 命令 | 在所基于的镜像上执行命令,并提交到新的镜像中 |
CMD[“要运行的程序”,“参数 1”,“参数 2”] | 启动容器时要运行的命令或者脚本,Dockerfile 只能有一条CMD 命令。如果指定多条命令,只执行最后一条命令 |
EXPOSE 端口号 | 指定新镜像加载到 Docker 时要开启的端口 |
ENV 环境变量 变量值 | 设置一个环境变量的值,会被后面的 RUN 使用 |
ADD 源文件/目录 目标文件/目录 | 将源文件复制到目标文件,源文件要与 Dockerfile 位于相同目录中,或者是一个 URL |
COPY 源文件/目录 目标文件/目录 | 将本地主机上的文件/ 目录复制到目标地点, 源文件/ 目录要与Dockerfile 在相同的目录中 |
VOLUME [“目录”] | 在容器中创建一个挂载点 |
USER 用户名/UID | 指定运行容器时的用户 |
WORKDIR 路径 | 为后续的 RUN、CMD、ENTRYPOINT 指定工作目录 |
ONBUILD 命令 | 指定所生成的镜像作为一个基础镜像时所要运行的命令 |
HEALTHCHECK | 健康检查 |
三、基于Dockerfile创建镜像实验
# 书写Dockerfile镜像生成文件 vim Dockerfile # Dockerfile生成镜像 docker build -t 镜像名:标签 Dockerfile位置路径 docker build -t nginx:centos7 . # 查看镜像 docker images # 创建容器 docker run -dit --name ngixn nginx:centos7
3.1 Dockerfile创建实操
1.定制基于centos:7.6.1810的nginx服务镜像
# 编辑Dockerfile镜像生成文件 vim /root/Dockerfile # 第一行必须指明基于的基础镜像 FROM centos:7.6.1810 COPY nginx-1.15.2.tar.gz /root RUN yum -y install pcre-devel zlib-devel gcc gcc-* make RUN tar zxf /root/nginx-1.15.2.tar.gz -C /usr/src Run cd /usr/src/nginx-1.15.2 \ && ./configure --prefix=/usr/local/nginx \ && make && make install \ && ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin EXPOSE 80 CMD ["nginx","-g","daemon off;"] # 将Dockerfile文件生成镜像 docker build -t nginx:centos7 . # 创建容器 docker run -itd --name nginx -P nginx:centos7 22fa42371543e822d394e52f85b4f8beb98292607ee67b2ca54ede26c933d92e # 查看容器 docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 22fa42371543 nginx:centos7 "nginx -g 'daemon of…" 9 seconds ago Up 8 seconds 0.0.0.0:49153->80/tcp, :::49153->80/tcp nginx
2.创建基于centos:7.6.1810的可ssh登陆的容器
#第一行必须指明基于的基础镜像 FROM centos:7.6.1810 #作者信息(可选)MAINTAINER name #镜像的操作指令 RUN yum -y install initscripts openssh-server \ && mkdir -p /sshd \ && echo "root:123456" | chpasswd \ && echo '#!/bin/bash' > /sshd/run.sh \ #生成主机密钥 && echo '/usr/sbin/sshd-keygen -A' >>/sshd/run.sh \ && echo '/usr/sbin/sshd -D' >>/sshd/run.sh \ && chmod -R 755 /sshd/run.sh #取消pam限制 RUN sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd #开放端口 EXPOSE 22 CMD ["/sshd/run.sh"] # 将Dockerfile文件生成镜像 docker build -t ssh:centos7 . # 创建容器 docker run -itd --name ssh -P nginx:centos7
3.创建基于centos:7.6.1810的lnmp平台容器
vim Dockerfile # 基础镜像 FROM centos:7.6.1810 ## 配置nginx源 COPY nginx.repo /etc/yum.repos.d/ ## 初始化RPM数据库并安装nginx RUN yum -y install nginx ## 修改 nginx 配置文件,使之支持 php RUN sed -i '/^user/s/nginx/nginx\ nginx/g' /etc/nginx/nginx.conf COPY default.conf /etc/nginx/conf.d/default.conf ## 安装 mariadb 和 php RUN rpm --rebuilddb && yum -y install mariadb-server mariadb-devel mariadb php-mysql php php-fpm ## 修改php-fpm配置文件 RUN sed -i '/^user/s/apache/nginx/g' /etc/php-fpm.d/www.conf RUN sed -i '/^group/s/apache/nginx/g' /etc/php-fpm.d/www.conf ## 声明Mariadb的用户以及密码 ENV MARIADB_USER root ENV MARIADB_PASS 123456 ## 支持中文 ENV LC_ALL en_US.UTF-8 ## 添加并运行脚本 ADD db_init.sh /root/db_init.sh RUN chmod 775 /root/db_init.sh RUN /root/db_init.sh ADD run.sh /root/run.sh RUN chmod 775 /root/run.sh ADD index.php /usr/share/nginx/html/index.php ## 开放的端口 EXPOSE 80 EXPOSE 3306 EXPOSE 443 EXPOSE 9000 ## 每次创建容器运行此脚本 CMD ["/root/run.sh"] ## default.conf文件 cat default server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.php index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name; include fastcgi_params; } } ## db_init.sh文件 cat db_init.sh #!/bin/bash mysql_install_db --user=mysql sleep 3 mysqld_safe & sleep 3 mysqladmin -u "$MARIADB_USER" password "$MARIADB_PASS" mysql -u "$MARIADB_USER" -p"$MARIADB_PASS" -e "use mysql;grant all privileges on *.* to '$MARIADB_USER'@'%' identified by '$MARIDB_PASS' with grant option;" mysql -u "$MARIADB_USER" -p"$MARIADB_PASS" -e "grant all privileges on *.* to '$MARIADB_USER'@'localhost' identified by '$MARIDB_PASS';" h=$(hostname) mysql -u "$MARIADB_USER" -p"$MARIADB_PASS" -e "use mysql;update user set password=password('$MARIDB_PASS') where user='$MARIADB_USER' and host='$h'" ## run.sh文件 cat run.sh #!/bin/bash mysqld_safe & /usr/sbin/nginx & /usr/sbin/php-fpm ## index.php文件 <?php echo date("Y-m-d H:i:s")."<br />\n"; $link=mysql_connect("localhost","root","123456"); if(!$link) echo "FAILD!"; else echo "MySQL is OK!"; phpinfo(); ?> ## nginx.repo文件 cat nginx.repo [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key # 将Dockerfile文件生成镜像 docker build -t lnmp:centos7 . # 创建容器 docker run -dit --name lnmp lnmp:centos7
4 .创建基于centos:7.6.1810的httpd容器并挂载httpd日志文件
# 创建dockerfile文件 vim Dockerfile FROM centos:7.6.1810 RUN yum -y install httpd COPY run.sh /root/run.sh RUN chmod +x /root/run.sh EXPOSE 80 CMD ["/root/run.sh"] # /root/run.sh脚本 vim run.sh #!/bin/bash /usr/sbin/httpd ping 172.16.10.1 # 将Dockerfile文件生成镜像 docker build -t httpd:centos7 . # 创建容器并挂载容器httpd日志 mkdir /root/httpd/log docker run -dit -v /root/httpd/log:/var/log/httpd --name httpd -P httpd:centos7