#五、 dockerfile
##1. dockerfile 命令
指令 | 描述 |
---|---|
FROM | 构建的镜像是基于哪个镜像 例如,from centos:7 |
MAINTAINER | 镜像维护者姓名or email |
RUN | 构建镜像时运行的shell命令例如:RUN yum install httpd |
CMD | 运行容器时执行的命令,例如: |
CMD | [“-c”,”/start.sh”] |
CMD | [“/usr/sbin/sshd”,”-D”] |
CMD | /usr/sbin/sshd -D |
EXPOSE | 声明容器运行的服务端口 |
expose | 80 443 |
ENV | 设置容器内环境变量,例如:ENV MYSQL_ROOT_PASSWORD 123456 |
ADD | 拷贝文件或目录到镜像,如果是URL或压缩包会自动下载或自动解压(URL,不会自动解压!!!) |
… | 例1:ADD…… |
… | 例2:ADD https://xxx.com/html.tar.gz /var/www/html |
… | 例3:ADD html.tar.gz /var/www/html |
COPY | 拷贝文件或目录到镜像,用法同上 |
ENTRYPOINT | 运行容器时执行的shell命令 |
… | 例1:ENTRYPOINT ["/bin/bash","-c","/start.sh"] |
… | 例2:ENTRYPOINT /bin/bash -c ‘/start.sh’ |
VOLUME | 指定容器挂载点 到宿主机 自动生成的目录 ,或其他容器 |
… | 例1:VOLUME [“/var/lib/mysql”] |
USER | 为RUN、CMD、ENTRYPOINT 执行命令指定运行用户 |
… | 例1:USER : or USER : ,USER songyt |
WORDIR | 为RUN、CMD、ENTRYPOINT、COPY、ADD设置工作目录 |
… | 例1:WORKDIR /data |
HEALTHCHECK | 健康检查 |
… | 例1:HEALTHCHECK --interval=5m --timeout=3s\ |
… | 例2:CMD curl -f http://localhost/ |
ARG | 在构建镜像时指定一些参数 |
… | FROM centos:7 |
… | ARG user |
… | USER $user |
… | docker build --build-arg user=listening Dockfile |
run、cmd、entrypoint 区别
run 在build镜像时运行,可以写多条
cmd,entrypint,在运行容器时运行,只能写一条,如果写多条,最后一条生效
cmd,在run时,可以被command覆盖,entrypint不会被command覆盖,但可以指定–entrypint覆盖
##2 build dockerfile 镜像命令
docker build [options] PATH | URL | -
options
-t tag list #指定镜像名称
-f --file string #指定dockerfile 文件位置
例子:
docker build . #默认找当前目录 以Dockerfile为命名的文件
docker build -t shykes/myapp . #指定镜像名字、位置
docker build -t shykes/myapp -f /path/Dockerfile 上下文环境/path
docker build -t shykes/myapp http://www.example.com/Dockerfile
docker build -t shykes/myapp http://www.example.com/context.tar.gz
docker build -t shykes/myapp - < Dockerfile
docker build -t shykes/myapp - < contaxt.tar.gz
###2.1 构建PHP 镜像
cat Dockerfile
FROM centos:7
MAINTAINER songyt
RUN yum install -y httpd php php-gd php-mysql mysql mysql-server
ENV MYSQL_ROOT_PASSWORD 123456
RUN echo "<?php phpinfo() ?>" > /var/www/html/index.php
ADD start.sh /start.sh
RUN chmod +x /start.sh
ADD https://cn.wordpress.org/wordpress-4.7.4-zh_CN.tar.gz /var/www/html
COPY wp-config.php /var/www/html/wordpress
VOLUME [“/var/lib/mysql”]
CMD /start.sh
EXPOSE 80 3306
cat start.sh
service httpd start
service mysqld start
mysqladmin -uroot password $MYSQL_ROOT_PASSWORD
tail -f #为了防止容器退出,得有一个可持续运行的进程,容器就不退出了。
例1:
先注释掉那一行,copy config
vim Dockerfile
docker build -t wordpress:v1 .
docker run -itd --name wordpress -p 88:80 wordpress:v1
生成容器后,要看日志docker logs wordpress
用浏览器访问
虚拟机IP+端口(192.168.247.128:88),没有结果。
查看此容器日志:
重新修改(mysql -> mariadb)构建
构建镜像的时候会遇到,docker 网络问题,如下:
[WARNING]IPv4 forwarding is disabled.Networking will not work.
解决办法:
vi /etc/sysctl.conf 或者 # vi /usr/lib/sysctl.d/00-system.conf
添加如下代码:
net.ipv4.ip_forward=1
重启network服务 # systemctl restart network
查看是否修改成功 # sysctl net.ipv4.ip_forward
如果返回为“net.ipv4.ip_forward = 1”则表示成功了
###2.2 构建tomcat 镜像
臃肿版
开发可以自己ssh连接容器,然后直接运行restart命令,来重启tomcat(dockerfile里有ssh端口+密码,用户名root)。
cat Dockerfile-java
FROM docker.io/centos
ADD jdk-8u171-linux-x64.tar.gz /usr/local
ENV JAVA_HOME "/usr/local/jdk1.8.0_171"
RUN yum -y install openssh-server && \
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key && \
ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key && \
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key && \
echo "/usr/local/tomcat/bin/catalina.sh start && /usr/sbin/sshd -D" >/start.sh && \
chmod +x /start.sh && \
sed -i "/^#Port 22/cPort 1034" /etc/ssh/sshd_config && \
echo "root:3c05b98c6202e10ab65cfdcb" | chpasswd && \
yum clean all
CMD ["/bin/sh","/start.sh"]
build构建镜像
生成容器
docker build -t tomcat:v1 -f Dockerfile-java . #构建镜像
docker run -itd -e TZ=Asia/Shanghai --net host -v /data/project/02_tdt-xz/tomcat/:/usr/local/tomcat/ -v /var/log/:/var/log --name tdt-xz_20181025 tdt-xz:20181025
(dockerfile里已经有jdk了,-v /data/softWithDocker/jdk1.8.0_171/:/usr/local/jdk1.8.0_171/)
restart命令,放在/bin/下的restart文件
chmod +x /bin/restart
#!/bin/bash
#声明环境变量,可以写到/root/.bash_profile里,也可以写到restart脚本里
export JAVA_HOME=/usr/local/jdk1.8.0_171
ps -ef |grep tomcat |grep -v grep |awk '{print $2}' |xargs kill -9
/usr/local/tomcat/bin/catalina.sh start
用浏览器访问:虚拟机IP是192.168.247.128
192.168.247.128:89
Success!
缩减版:
1、vim Dockerfile-jian
FROM centos:7
MAINTAINER songyt
ENV JAVA_HOME /usr/java/jdk1.8.0_171
CMD ["/usr/local/tomcat/bin/catalina.sh","run"]
2、构建镜像
docker build -t tomcat -f Dockerfile-jian .
docker images #查看镜像 只有200MB
3、生成容器:
- 使用本地网络
- 映射本地jdk -> 到容器
- 映射本地tomcat + 代码 -> 到容器
docker run -itd --name tdt-xz --net=host -v /data/softWithDocker/jdk1.8.0_171:/usr/java/jdk1.8.0_171 -v /data/project/02_tdt-xz/tomcat:/usr/local/tomcat tomcat:tdt-xz
###3. 构建支持SSH服务的镜像
cat Dockerfile-ssh
FROM centos:7
MAINTAINER songyt
ENV ROOT_PASSWORD 123456
RUN yum install -y openssh-server
RUN echo $ROOT_PASSWORD | passwd --stdin root
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
CMD [“/usr/sbin/sshd”,”-D”]
EXPOSE 22
build构建镜像
docker build -t ssh:v1 -f ./Dockerfile-ssh .
docker run -itd --name ssh ssh:v1
测试是否成功,连接参数:
IP:虚拟机IP(192.168.247.128)
Port:2222
username/passwd:root/123456