目录
一.Dockerfile简述
- Docker在运行之前,需要以镜像作为基础环境,可以说镜像是整个Docker容器创建的关键,而创建镜像的三种方法中基于Dockerfile创建的方法使用最为灵活。
- Dockerfile可以看作是被Docker程序所解释翻译的脚本,是由一组命令集合而成,每条命令对应一条操作指令,由docker翻译为Linux下的具体命令。用户可以通过自定义其内容来快速创建镜像。
- Dockerfile指令
指令 | 含义 |
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 命令 | 指定所生成的镜像作为一个基础镜像时所要运行的命令 |
二.构建Nginx镜像
- 下载基础镜像
[root@cloud ~]# docker pull guyton/centos6
Using default tag: latest
latest: Pulling from guyton/centos6
9bfcefca2b8d: Pull complete
2f8ef7dd23e9: Pull complete
07f137504b02: Pull complete
Digest: sha256:4d85869d301e1e04f9c71084726c1a6c4a5cb149d56c0ca130a27515094c7390
Status: Downloaded newer image for guyton/centos6:latest
docker.io/guyton/centos6:latest
[root@cloud ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
guyton/centos6 latest 5f3e1df89d22 15 months ago 228MB
[root@cloud ~]#
- 建立工作目录
[root@cloud ~]# mkdir nginx
[root@cloud ~]# ls
nginx
[root@cloud ~]#
- 创建并且编写Dockerfile文件
[root@cloud ~]# cd nginx/
[root@cloud nginx]# vi Dockerfile
[root@cloud nginx]# cat Dockerfile
FROM guyton/centos6
MAINTAINER The Centos Project <cloud>
RUN yum install -y wget net-tools gcc gcc-c++ make openssl-devel
RUN yum install -y pcre-devel
RUN wget http://nginx.org/download/nginx-1.12.2.tar.gz
RUN tar xzvf nginx-1.12.2.tar.gz
RUN useradd -M -s /sbin/nologin nginx
WORKDIR nginx-1.12.2
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
EXPOSE 80
EXPOSE 443
##修改Nginx的配置文件,以非daemon的方式启动
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
WORKDIR /root/nginx
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
[root@cloud nginx]#
- 编辑执行脚本内容
[root@cloud nginx]# ls
Dockerfile
[root@cloud nginx]# vi run.sh
[root@cloud nginx]# cat run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx ##开启nginx服务
[root@cloud nginx]#
- 生成镜像
[root@cloud nginx]# docker build -t nginx:new .
Successfully built 1107f39d3712
Successfully tagged nginx:new
[root@cloud nginx]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx new 1107f39d3712 14 seconds ago 628MB
guyton/centos6 latest 5f3e1df89d22 15 months ago 228MB
- 启动容器并且测试
[root@cloud nginx]# docker run -d -P --name nginx1 nginx:new
32358fa7e5935581b13de80d68b7387a2130b8a1a334f544add37ea9896bb0dc
[root@cloud nginx]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
32358fa7e593 nginx:new "/run.sh" 4 seconds ago Up 4 seconds 0.0.0.0:32779->80/tcp, 0.0.0.0:32778->443/tcp nginx1
[root@cloud nginx]#
三.构建Tomcat镜像
- 建立工作目录
[root@cloud ~]# mkdir tomcat
[root@cloud ~]# ls
nginx tomcat
- 编辑Dockerfile文件
[root@cloud tomcat]# ls
apache-tomcat-9.0.30.tar.gz Dockerfile jdk-8u231-linux-x64.tar.gz
[root@cloud tomcat]# cat Dockerfile
FROM debian
ADD jdk-8u231-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.30.tar.gz /usr/local/
ENV JAVA_HOME /usr/local/jdk1.8.0_231
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.30
ENV PATH $JAVA_HOME/bin:$CATALINA_HOME/bin:$PATH
EXPOSE 8080
CMD ["catalina.sh", "run"]
[root@cloud tomcat]#
- 生成镜像
[root@cloud tomcat]# docker build -t tomcat:centos .
...
Successfully built 60a22a233fba
Successfully tagged tomcat:centos
[root@cloud tomcat]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat centos 6a2b79a7122b 11 seconds ago 646MB
nginx new af8413c98e31 2 hours ago 628MB
guyton/centos6 latest 5f3e1df89d22 15 months ago 228MB
[root@cloud tomcat]#
- 启动容器并且测试
[root@cloud tomcat]# docker run -d --name tomcat1 -P tomcat:centos &
[1] 25389
[root@cloud tomcat]# 753ea1c796746a4c2713a451861b323378ea0b8bd9701718f35b1de9f26163f4
[1]+ Done docker run -d --name tomcat1 -P tomcat:centos
[root@cloud tomcat]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
753ea1c79674 tomcat:centos "catalina.sh run" 9 seconds ago Up 8 seconds 0.0.0.0:32785->8080/tcp tomcat1
32358fa7e593 nginx:new "/run.sh" 2 hours ago Up 2 hours 0.0.0.0:32779->80/tcp, 0.0.0.0:32778->443/tcp nginx1
[root@cloud tomcat]#
四.构建MySQL镜像
- 建立工作目录
[root@cloud ~]# ls
nginx tomcat
[root@cloud ~]# mkdir mysql
[root@cloud ~]# cd mysql/
[root@cloud mysql]#
- 编辑Dockerfile文件
[root@cloud mysql]# cat Dockerfile
FROM guyton/centos6
MAINTAINER this is mysql images
RUN yum install mysql mysql-server -y
RUN /etc/init.d/mysqld start && \
mysql -e "grant all privileges on *.* to 'root'@'%' identified by '123456';" && \
mysql -e "grant all privileges on *.* to 'root'@'localhost' identified by '123456';"
EXPOSE 3306
CMD ["/usr/bin/mysql_safe","run"]
[root@cloud mysql]#
- 生成镜像
[root@cloud mysql]# docker build -t mysql:centos .
...
Successfully built f7ee0a485313
Successfully tagged mysql:centos
[root@cloud mysql]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql centos f7ee0a485313 18 seconds ago 453MB
tomcat centos 6a2b79a7122b 36 minutes ago 646MB
nginx new af8413c98e31 3 hours ago 628MB
guyton/centos6 latest 5f3e1df89d22 15 months ago 228MB
[root@cloud mysql]#
- 启动容器
[root@cloud mysql]# docker run -d --name mysql1 -P mysql:centos
9c0610eafa6b31f4c67abd3918dde18b28128b044b71dd61e8a80c4a675fa714
[root@cloud mysql]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9c0610eafa6b mysql:centos "/usr/bin/mysqld_saf…" 5 seconds ago Up 5 seconds 0.0.0.0:32789->3306/tcp mysql1
753ea1c79674 tomcat:centos "catalina.sh run" 48 minutes ago Up 48 minutes 0.0.0.0:32785->8080/tcp tomcat1
32358fa7e593 nginx:new "/run.sh" 3 hours ago Up 3 hours 0.0.0.0:32779->80/tcp, 0.0.0.0:32778->443/tcp nginx1
[root@cloud mysql]#
注:一般MySQL不会自定义镜像,会直接pull公有仓库的镜像,但是会自定义my.cnf的配置文件