什么是Dockerfile?
Dockerfile是docker创建镜像的常用方式,Dockerfile是一个Docker镜像的描述文件,其中包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建
Dockerfile常用操作指令
- FROM 镜像
指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令 - MAINTAINER 名字
说明新镜像的维护人信息 - RUN命令
在所基于的镜像上执行命令,并提交到新的镜像中 - CMD[“要运行的程序”,“参数1,参数2”]
指令启动容器时要运行的命令或者脚本,Dockerfile只能有一条CDM命令,如果指定多条则只能最后一条被执行 - EXPOSE 端口号
指定新镜像加载到Docker时要开启的端口 - ENV 环境变量 变量值
设置一个环境变量的值,会被后面的RUN使用 - ADD 源文件/目录 目标文件/目录
将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,或者是一个URL - COPY 源文件/目录 目标文件/目录
将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中 - VOLUME [“目录”]
在容器中创建一个挂载点 - USER 用户名/UID
指定运行容器的用户 - WORKDIR 路径
为后续的RUN、CMD、ENTRYPOINT指定工作目录 - ONBUILD 命令
指定所生成的镜像作为一个基础镜像时所需要的运行的命令 - HEALTHCHECK
健康检查
镜像制作实战
1、创建sshd镜像
(1)编写Dockerfile文件
[root@docker sshd]# vim Dockerfile
#基础镜像
FROM centos:7
#用户信息
MAINTAINER this is sshd project
#基于基础镜像系统更新,软件安装
RUN yum -y update
RUN yum -y install openssh* net-tools lsof telnet passwd
#设置用户密码
RUN echo '123456' | passwd --stdin root
#关闭PAM认证
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
#添加非对称密钥
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
#关闭pam会话模块
RUN sed -i '/^session\s\+requied\s\+pam_loginuid.so/s/^/#/' /etc/pam.d/sshd
#创建ssh工作目录,设置权限
RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh
#设置端口号
EXPOSE 22
#启动容器时执行操作
CMD ["/usr/sbin/sshd","-D"]
(2)创建镜像
[root@docker sshd]# docker build -t sshd:new .
[root@docker sshd]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
sshd new 43e794cf8abd 19 seconds ago 585MB
centos 7 5e35e350aded 5 months ago 203MB
(3)创建容器验证
[root@docker sshd]# docker run -d -P sshd:new
[root@docker sshd]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
99cd8001ff28 sshd:new "/usr/sbin/sshd -D" 4 seconds ago Up 3 seconds 0.0.0.0:32768->22/tcp compassionate_beaver
#宿主机使用ssh登陆容器
[root@docker sshd]# ssh localhost -p 32768
The authenticity of host '[localhost]:32768 ([::1]:32768)' can't be established.
RSA key fingerprint is SHA256:DND5bet+Io1sjjiKpNS6BvoeJC+YD07ejhRcp7s8VtQ.
RSA key fingerprint is MD5:a4:0e:3d:5a:18:1e:b2:17:85:f6:df:a5:ce:ab:d2:82.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[localhost]:32768' (RSA) to the list of known hosts.
root@localhost's password:
[root@2a9bcdd7681f ~]#
2、创建systemctl镜像
- 创建完成sshd镜像后,无法使用
systemctl status sshd
命令查看ssh状态,可以根据sshd的镜像添加systemctl功能
(1)编写dockerfile文件
[root@docker systemctl]# vim Dockerfile
#基础镜像
FROM sshd:new
#设置环境变量
ENV container docker
#进入指定目录,用for循环遍历目录下所有文件并删除指定文件
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/*;
#挂载宿主机的cgrups卷,以便执行容器
VOLUME ["/sys/fs/cgroup"]
#执行初始化命令
CMD ["/usr/sbin/init"]
(2)创建镜像
[root@docker systemctl]# docker build -t systemctl:new .
[root@docker systemctl]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
systemctl new b029bbbd8a6b 9 minutes ago 585MB
sshd new 4b69240205be 33 minutes ago 585MB
centos 7 5e35e350aded 5 months ago 203MB
(3)创建容器验证
#
[root@docker systemctl]# docker run --privileged -it -v /sys/fs/cgroup/:/sys/fs/cgroup:ro systemctl:new /sbin/init
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d98f478ccaf3 systemctl:new "/sbin/init" 2 minutes ago Up 2 minutes 22/tcp practical_fermat
[root@docker ~]# docker exec -it d98f478ccaf3 bash
#可正常使用systemctl命令查看
[root@d98f478ccaf3 /]# systemctl status sshd
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:sshd(8)
man:sshd_config(5)
3、创建nginx镜像(手工编译安装)
(1)编写dockerfile文件
[root@docker nginx]# vim Dockerfile
#基础镜像
FROM centos:7
#用户信息
MAINTAINER This is Nginx test
#基于基础镜像系统更新,环境包安装
RUN yum -y update
RUN yum -y install make gcc gcc-c++ pcre-devel zlib-devel tar
#创建nginx用户
RUN useradd -M -s /sbin/nologin nginx
#上传nginx软件包,解压(使用ADD选项可以直接解压上传的包)
COPY nginx-1.12.2.tar.gz /opt/
RUN tar zxvf /opt/nginx-1.12.2.tar.gz -C /opt
#在指定目录下,开始编译安装nginx
WORKDIR /opt/nginx-1.12.2/
RUN ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
RUN make && make install
#设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH
#指定端口
EXPOSE 80
#修改Nginx配置文件,以非daemon方式启动
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
#添加运行脚本,设置权限
ADD run.sh /run.sh
RUN chmod 755 /run.sh
#指定容器开启时执行的脚本
CMD ["/run.sh"]
(2)编写run.sh启动脚本、将nginx软件包上传至当前目录
[root@docker nginx]# vim run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx
(3)创建镜像
[root@docker nginx]# docker build -t nginx:new .
[root@docker nginx]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx new 24b44e614799 14 seconds ago 585MB
centos 7 5e35e350aded 5 months ago 203MB
(4)创建容器并验证
#创建容器,随机生成映射端口
[root@docker nginx]# docker run -d -P nginx:new
#查看容器及映射的端口号
[root@docker nginx]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b51160232ad8 nginx:new "/run.sh" 4 seconds ago Up 3 seconds 0.0.0.0:32775->80/tcp sad_rhodes
- 使用浏览器访问
http://192.168.7.168:32775
即可访问容器的nginx服务
4、创建Tomcat镜像
(1)编写dockerfile文件,将所需安装包上传至当前目录下
[root@docker tomcat]# vim Dockerfile
#基础镜像
FROM centos:7
#用户信息
MAINTAINER Tomcat test
#基于基础镜像更新系统
RUN yum -y update
#安装java环境包
COPY jdk-8u201-linux-x64.rpm /opt/
RUN rpm -ivh /opt/jdk-8u201-linux-x64.rpm
#设置java的环境变量
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
#安装tomcat
ADD apache-tomcat-9.0.16.tar.gz /opt/tomcat
RUN mv /opt/tomcat/apache-tomcat-9.0.16/ /usr/local/tomcat
#指定端口
EXPOSE 8080
#指定容器启动时的操作,此处的ENTERYPOINT也可更换为CMD
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]
[root@docker tomcat]# ls
apache-tomcat-9.0.16.tar.gz Dockerfile jdk-8u201-linux-x64.rpm
(2)镜像制作
[root@docker tomcat]# docker build -t tomcat:new .
[root@docker tomcat]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat new 8b86bbc483a4 3 minutes ago 981MB
centos 7 5e35e350aded 5 months ago 203MB
(3)创建容器并验证
[root@docker tomcat]# docker run -d -P tomcat:new
[root@docker tomcat]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3d94d5eddca0 tomcat:new "/usr/local/tomcat/b…" 3 seconds ago Up 2 seconds 0.0.0.0:32776->8080/tcp optimistic_dubinsky
- 使用浏览器访问
http://192.168.7.168:32776
即可访问容器的tomcat服务
5、创建mysql(5.6版本)镜像
(1)编写dockerfile文件,将所需安装包上传至当前目录下
[root@docker mysql]# vim Dockerfile
#基础镜像
FROM centos:7
#用户信息
MAINTAINER This is MySQL Project
#基于基础镜像系统更新和环境包安装
RUN yum -y update
RUN yum install -y ncurses-devel autoconf cmake gcc gcc-c++ make pcre-devel expat-devel pcre
#添加mysql-5.6安装包
ADD mysql-5.6.26.tar.gz /opt
#进入指定目录编译安装mysql
WORKDIR /opt/mysql-5.6.26
RUN cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DEXTRA_CHARSETS=all \
-DSYSCONFIDIR=/etc \
-DMYSQL_DATADIR=/home/mysql/ \
-DMYSQL_UNIX_ADDR=/home/mysql/mysql.sock
RUN make && make install
#添加mysql配置文件
RUN rm -f /etc/my.cnf
RUN cp /opt/mysql-5.6.26/support-files/my-default.cnf /etc/my.cnf
#添加mysql的启动脚本,设置权限
RUN cp /opt/mysql-5.6.26/support-files/mysql.server /etc/init.d/mysqld
RUN chmod 755 /etc/init.d/mysqld
#设置环境变量
ENV PATH $PATH:/usr/local/mysql/bin
#创建mysql用户,更改mysql安装目录的权限
RUN useradd -s /sbin/nologin mysql
RUN chown -R mysql:mysql /usr/local/mysql/
#初始化数据库
RUN /usr/local/mysql/scripts/mysql_install_db \
--user=mysql \
--ldata=/var/lib/mysql \
--basedir=/usr/local/mysql \
--datadir=/home/mysql
#建立sock文件软连接,更改启动脚本文件
RUN ln -s /var/lib/mysql/mysql.sock /home/mysql/mysql.sock
RUN sed -i '46 s/basedir=/basedir=\/usr\/local\/mysql/' /etc/init.d/mysqld
RUN sed -i '47 s/datadir=/datadir=\/home\/mysql/' /etc/init.d/mysqld
#指定端口
EXPOSE 3306
#指定容器启动时的操作
CMD ["mysqld_safe"]
[root@docker mysql]# ls
Dockerfile mysql-5.6.26.tar.gz
(2)创建镜像
[root@docker mysql]# docker build -t mysqld:new .
[root@docker mysql]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysqld new 9b2703bd15c0 54 minutes ago 5.11GB
centos 7 5e35e350aded 5 months ago 203MB
(3)创建容器并验证
[root@docker mysql]# docker run -d -P mysqld:new
[root@docker mysql]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fff4ac6a524f mysqld:new "mysqld_safe" 4 seconds ago Up 3 seconds 0.0.0.0:32777->3306/tcp infallible_babbage
#进入容器设置mysql的权限账户
[root@docker mysql]# docker exec -it fff4ac6a524f /bin/bash
[root@fff4ac6a524f ~]# mysql -uroot -p
mysql> grant all privileges on *.* to 'root'@'localhost' identified by '123456';
mysql> grant all privileges on *.* to 'root'@'%' identified by '123456';
#在宿主机安装mysql客户端测试验证
[root@docker mysql]# yum install mariadb -y
[root@docker ~]# mysql -h 192.168.7.168 -uroot -p123456 -P 32777
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.26 Source distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]>