Dockerfile 撰写

osc_qgfjs4a5 2020-11-11 14:12:55
其他 Dockerfile 开源中国 撰写


Dockerfile 撰写

 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 命令 | 指定所生成的镜像作为一个基础镜像时所要运行的命令 |
#怎么把shell脚本改成Dockerfile
1. 在shell命令前加RUN
2. 声明变量 把
例如echo 'PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH'>> /etc/profile
ENV PATH /usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
转换成这样就可以
3.ADD 从宿主机往容器传文件 ADD含压缩包解压功能 "ADD的文件一定在宿主机目录下创建"
4.COPY 和 RUN cp 是一样的,指的是容器内的复制
5.WORKDIR 和cd 差别不大
6.注意容器的自启动方式
如:ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]
如:CMD ["/usr/sbin/sshd","-D"] '//容器加载时启动sshd服务'
如:CMD ["/usr/sbin/init"]
如:CMD ["/run.sh"]
EOF
cat > run.sh <<EOF
#!/bin/bash
/usr/local/nginx/sbin/nginx
EOF
#一:------------------------------SSHD-Dockerfile
#1、创建目录,编写Dockerfile文件
mkdir sshd && cd sshd
cat > Dockerfile<<EOF
FROM centos:7 '//指定基础镜像'
MAINTAINER this is centos7-sshd project '//描述信息'
RUN yum -y update '//更新容器yum源'
RUN yum -y install openssh* net-tools losf telnet passwd '//部署环境工具'
RUN echo "123456"|passwd --stdin root '//设置root登录密码'
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config '//禁用ssh中的pam验证'
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key '//创建非对称密钥,并指定文件路径'
RUN sed -i '/^session\s\+required\s\+pam_loginuid.so/s/^/#/' /etc/pam.d/sshd '//禁用pam的ssh的pam会话模块'
RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh '//创建ssh工作目录和权限设置'
EXPOSE 22 '//开放22端口'
CMD ["/usr/sbin/sshd","-D"] '//容器加载时启动sshd服务'
EOF
#2.生成镜像
docker build -t sshd:test .
#3.启动容器,并指定端口号为1111
docker run -d -p 111:22 sshd:test
#4. 测试登陆
ssh 127.0.0.1 -p 111
#二.-------------------------------------Systemctl-Dockerfile
基于SSHD镜像继续构建
#1、创建目录,编写Dockerfile文件
mkdir systemctl && cd systemctl
cat > Dockerfile<<EOF
FROM sshd:new
MAINTAINER built image systemctl <tang>
ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *;do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*; \
rm -f /etc/systemd/system/*.wants/*; \
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*; \
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]
EOF
#2、生成镜像
docker build -t systemctl:test .
#3、创建容器
docker run --privileged -it --name systemctl -v /sys/fs/cgroup:/sys/fs/cgroup:ro systemctl:test sbin/init
'//–privateged 使container内的root拥有真正的root权限,不进行降权处理。否则,container内的用户只是外部的一个普通用户'
#4. 打开终端测试
docker exec -it systemctl /bin/bash
systemctl status sshd_config "检查docker内systemctl能否使用"
#三.-------------------Tomcat-Dockerfile
1、创建目录并编写Dockerfile文件,上传相关文件
mkdir tomcat && cd tomcat
cat > Dockerfile<<EOF
FROM centos:7
MAINTAINER this is tomcat <li>
ADD jdk-8u201-linux-x64.rpm /usr/local
WORKDIR /usr/local
RUN rpm -ivh jdk-8u201-linux-x64.rpm
ENV JAVA_HOME /usr/java/jdk1.8.0_201-amd64
ENV CLASSPATH $JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
ENV PATH $JAVA_HOME/bin:$PATH
ADD apache-tomcat-9.0.16.tar.gz /usr/local
WORKDIR /usr/local
RUN mv apache-tomcat-9.0.16 /usr/local/tomcat
EXPOSE 8080
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]
EOF
#注释
CMD ["/usr/local/src/tomcat.run.sh"]
#ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]
'//此处除了使用CMD,还可以使用ENTRYPOINT'
'//CMD与ENTRYPOINT的区别'
//ENRYPOINT指开启容器前镜像就已经执行了括号内的命令
//CMD是开启容器时,要执行的指令,设置容器启动后默认执行的命令及其参数,但 CMD 能够被 docker run 后面跟的命令行参数替换
//基于Dockerfile内有CMD或者ENTRYPOINT创建镜像时,docker run 后面就不要加指令(/bin/bash)了,会覆盖掉Dockerfile中的指令或者语法报错
####另外一个版本的,不同的jdk包,不用安装jdk,解压就能用
cat > Dockerfile<<EOF
FROM centos:7
MAINTAINER this is tomcat
#解压java到目录/usr/local下,搭建tomcat的环境
ADD jdk-8u91-linux-x64.tar.gz /usr/local/
WORKDIR /usr/local/
RUN mv jdk1.8.0_91 java
#设置环境变量
ENV JAVA_HOME /usr/local/java
ENV JRE_HOME /usr/local/java/jre
ENV CLASSPATH /usr/local/java/lib:/usr/local/java/jre/lib
ENV PATH /usr/local/java/bin:$PATH
#解压安装tomcat包
ADD apache-tomcat-9.0.16.tar.gz /usr/local/
#进入目录/usr/local/
WORKDIR /usr/local/
#重命名方便管理
RUN mv apache-tomcat-9.0.16 /usr/local/tomcat9
#放通tomcat服务的8080端口
EXPOSE 8080
#在这里我用的是catalina.sh文件启动,startup.sh文件也可以。
ENTRYPOINT ["/usr/local/tomcat9/bin/catalina.sh","run"]
EOF
ls
apache-tomcat-9.0.16.tar.gz Dockerfile jdk-8u201-linux-x64.rpm
2、生成镜像
docker build -t tomcat:test .
3、创建容器
docker run -d -P tomcat:test
4、测试
#四.-----------------Nginx-Dockerfile
#1、创建目录并编写Dockerfile文件
mkdir nginx && cd nginx
cat > Dockerfile<<EOF
FROM centos:7
MAINTAINER this is kgc-nginx image <li>
RUN yum -y update
RUN yum install pcre pcre-devel zlib-devel gcc gcc-c++ make -y
RUN useradd -s /sbin/nologin nginx -M
ADD nginx-1.12.0.tar.gz /usr/local/src
WORKDIR /usr/local/src/nginx-1.12.0
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
RUN ln -s /usr/local/nginx-1.12.0/sbin/ /usr/local/bin/
EXPOSE 80
EXPOSE 443
RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.conf
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
EOF
cat > run.sh <<EOF
#!/bin/bash
/usr/local/nginx/sbin/nginx
EOF
ls
//Dockerfile nginx-1.12.0.tar.gz run.sh
#2、生成镜像
docker build -t nginx:test .
#3、创建容器,指定端口
docker run -d -P nginx:test1
docker ps -a "查看端口号"
#4.浏览器测试
#五.------------------------Mysql5.7-Dockerfile
1、创建目录并编写Dockerfile文件
cat > Dockerfile<<EOF
FROM centos:7
MAINTAINER this is kgc-li
RUN yum -y update
RUN yum -y install gcc \
gcc-c++ \
make \
ncurses \
ncurses-devel \
bison \
cmake
RUN useradd -s /sbin/nologin mysql
ADD mysql-boost-5.7.20.tar.gz /usr/local/
WORKDIR /usr/local/mysql-5.7.20/
RUN cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=boost \
-DWITH_SYSTEMD=1
RUN make && make install
RUN chown -R mysql.mysql /usr/local/mysql
RUN rm -rf /etc/my.cnf
ADD my.cnf /etc/my.cnf
RUN chown mysql:mysql /etc/my.cnf
ENV PATH /usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
RUN echo 'export PATH' >> /etc/profile
RUN source /etc/profile
RUN /usr/local/mysql/bin/mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data
RUN cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /lib/systemd/system/
EXPOSE 3306
ADD run.sh /run.sh
RUN chmod 755 /run.sh
RUN chmod +x /run.sh
RUN sh /run.sh
CMD ["init"]
EOF
2、编写配置文件与脚本,上传源码包
cat > my.cnf<<EOF
[client]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock
[mysql]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
EOF
cat >run.sh<<EOF
#!/bin/bash
systemctl enable mysqld
EOF
ls
Dockerfile mysql-boost-5.7.20.tar.gz run.sh
3、生成镜像
docker build -t mysql:test .
4. 创建容器
docker run -d -P --privileged mysql:test
"不加--privileged 会报权限拒绝,不降权启动"
docker exec -it id /bin/bash
mysql -uroot -p
mysql> grant all privileges on *.* to 'root'@'%' identified by '123123';
mysql> grant all privileges on *.* to 'root'@'localhost' identified by '123123';
5. 测试
mysql -h 192.168.233.133 -uroot -p123123 -P 32776
"能正常登陆界面"
#----------------------------------------Mysql的脚本文件路径
mysql 5.6的service服务脚本 mysql.server
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
mysql 5.7 的systemctl服务脚本 systemd.service
/usr/local/mysql/bin/mysqld/usr/lib/systemd/system/mysqld.service
cp /usr/local/mysql/bin/mysqld/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
mysql 5.6 的启动脚本 mysql_safe
/usr/local/mysql/bin/mysqld_safe
mysql 5.7 的启动脚本
/usr/local/mysql/bin/mysqld
pide 文件
/usr/local/mysql/mysqld.pid
/usr/local/mysql/scripts/mysql_install_db 执行安装脚本
#CMD:是指定容器启动时默认执行的命令,会被docker run提供的参数覆盖
格式: CMD command param1 param2 (shell模式)
CMD ["executable","param1","param2"] (exec模式)推荐
CMD ["param1","param2"] 提供给ENTRYPOINT的默认参数
举例: CMD ["usr/sbin/nginx","-g","daemon off;"]
usr/sbin/nginx : nginx命令
-g :设置配置文件外的全局指令
daemon off; :后台守护程序开启方式 (关闭)
#ENTRYPOINT:是指定容器启动时默认执行的命令,但是不会被docker run提供的参数覆盖
格式: ENTRYPOINT command param1 param2 (shell模式)
ENTRYPOINT ["executable","param1","param2"] (exec模式)推荐 
版权声明
本文为[osc_qgfjs4a5]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/4301169/blog/4712837

  1. 【计算机网络 12(1),尚学堂马士兵Java视频教程
  2. 【程序猿历程,史上最全的Java面试题集锦在这里
  3. 【程序猿历程(1),Javaweb视频教程百度云
  4. Notes on MySQL 45 lectures (1-7)
  5. [computer network 12 (1), Shang Xuetang Ma soldier java video tutorial
  6. The most complete collection of Java interview questions in history is here
  7. [process of program ape (1), JavaWeb video tutorial, baidu cloud
  8. Notes on MySQL 45 lectures (1-7)
  9. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  10. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  11. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  12. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  13. 【递归,Java传智播客笔记
  14. [recursion, Java intelligence podcast notes
  15. [adhere to painting for 386 days] the beginning of spring of 24 solar terms
  16. K8S系列第八篇(Service、EndPoints以及高可用kubeadm部署)
  17. K8s Series Part 8 (service, endpoints and high availability kubeadm deployment)
  18. 【重识 HTML (3),350道Java面试真题分享
  19. 【重识 HTML (2),Java并发编程必会的多线程你竟然还不会
  20. 【重识 HTML (1),二本Java小菜鸟4面字节跳动被秒成渣渣
  21. [re recognize HTML (3) and share 350 real Java interview questions
  22. [re recognize HTML (2). Multithreading is a must for Java Concurrent Programming. How dare you not
  23. [re recognize HTML (1), two Java rookies' 4-sided bytes beat and become slag in seconds
  24. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  25. RPC 1: how to develop RPC framework from scratch
  26. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  27. RPC 1: how to develop RPC framework from scratch
  28. 一次性捋清楚吧,对乱糟糟的,Spring事务扩展机制
  29. 一文彻底弄懂如何选择抽象类还是接口,连续四年百度Java岗必问面试题
  30. Redis常用命令
  31. 一双拖鞋引发的血案,狂神说Java系列笔记
  32. 一、mysql基础安装
  33. 一位程序员的独白:尽管我一生坎坷,Java框架面试基础
  34. Clear it all at once. For the messy, spring transaction extension mechanism
  35. A thorough understanding of how to choose abstract classes or interfaces, baidu Java post must ask interview questions for four consecutive years
  36. Redis common commands
  37. A pair of slippers triggered the murder, crazy God said java series notes
  38. 1、 MySQL basic installation
  39. Monologue of a programmer: despite my ups and downs in my life, Java framework is the foundation of interview
  40. 【大厂面试】三面三问Spring循环依赖,请一定要把这篇看完(建议收藏)
  41. 一线互联网企业中,springboot入门项目
  42. 一篇文带你入门SSM框架Spring开发,帮你快速拿Offer
  43. 【面试资料】Java全集、微服务、大数据、数据结构与算法、机器学习知识最全总结,283页pdf
  44. 【leetcode刷题】24.数组中重复的数字——Java版
  45. 【leetcode刷题】23.对称二叉树——Java版
  46. 【leetcode刷题】22.二叉树的中序遍历——Java版
  47. 【leetcode刷题】21.三数之和——Java版
  48. 【leetcode刷题】20.最长回文子串——Java版
  49. 【leetcode刷题】19.回文链表——Java版
  50. 【leetcode刷题】18.反转链表——Java版
  51. 【leetcode刷题】17.相交链表——Java&python版
  52. 【leetcode刷题】16.环形链表——Java版
  53. 【leetcode刷题】15.汉明距离——Java版
  54. 【leetcode刷题】14.找到所有数组中消失的数字——Java版
  55. 【leetcode刷题】13.比特位计数——Java版
  56. oracle控制用户权限命令
  57. 三年Java开发,继阿里,鲁班二期Java架构师
  58. Oracle必须要启动的服务
  59. 万字长文!深入剖析HashMap,Java基础笔试题大全带答案
  60. 一问Kafka就心慌?我却凭着这份,图灵学院vip课程百度云