标签:from 规范 dock his err user star group ima
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模式)推荐
标签:from 规范 dock his err user star group ima
原文地址:https://blog.51cto.com/14625831/2548597