一, Dockerfile
Dockerfile 是 docker 中镜像文件的的描述文件, 说的直白点就是镜像文件到底是由什么东西一步步构成的.
例如: 你在淘宝上买了一个衣架, 但是卖家并没有给你发一个完整的衣架, 而是一些组件和一张图纸, 你按照这个图纸一步一步将衣架组装起来, 就成了你所需要的样子. 那么 Dockerfile 就是这张图纸, 镜像文件就是你需要的这个衣架, Dockerfile 不建议随便命名, 就用 Dockerfile.
因此, Dockerfile 其内部包含了一条条的指令, 每一条指令构建一层, 因此每一条指令的内容, 就是描述该层应当如何构建.
Docker 执行 Dockerfile 的大致流程:
(1)docker 从基础镜像运行一个容器;
(2) 执行一条指令并对容器作出修改;
(3) 执行类似 docker commit 的操作提交一个新的镜像层;
(4)docker 再基于刚提交的镜像运行一个新容器;
(5) 执行 dockerfile 中的下一条指令直到所有指令都执行完成.
不同阶段:
1,Dockerfile : 是软件的原材料, 需要定义一个 Dockerfile,Dockerfile 定义了进程需要的一切东西. Dockerfile 涉及的内容包括执行代码或者是文件, 环境变量, 依赖包, 运行时环境, 动态链接库等等;
2,Docker 镜像 : 是软件的交付品, 用 Dockerfile 定义一个文件之后, docker build 时会产生一个 Docker 镜像, 当运行 Docker 镜像时, 会真正开始提供服务;
3,Docker 容器 : 则可以认为是软件的运行态, 容器是直接提供服务的.
Dockerfile 各参数详解:
FROM: 指明构建的新镜像是来自于哪个基础镜像;
MAINTAINER: 指明镜像维护者及其联系方式;
RUN: 执行什么命令;
CMD: 指定一个容器启动时要运行的命令, Dockerfile 中可以有多个 CMD 指令, 但只有最后一个生效, CMD 会被 docker run 之后的参数替换;
EXPOSE: 声明容器运行的服务端口;
ENV: 构建镜像过程中设置环境变量;
ADD: 将宿主机上的目录或者文件拷贝到镜像中 (会帮你自动解压, 无需额外操作);
COPY: 作用与 ADD 类似, 但是不支持自动下载和解压;
ENTRYPOINT: 指定一个容器启动时要运行的命令, 用法类似于 CMD, 只是有由 ENTRYPOINT 启动的程序不会被 docker run 命令行指定的参数所覆盖, 而且, 这些命令行参数会被当作参数传递给 ENTRYPOINT 指定的程序;
VOLUME: 容器数据卷, 指定容器挂载点到宿主机自动生成的目录或者其他容器 (数据保存和持久化工作, 但是一般不会在 Dockerfile 中用到, 更常见的还是命令 docker run 的时候指定 -v 数据卷.);
WORKDIR: 相当于 cd 命令, 切换目录路径;
二, Dockerfile 实战:
(1) 构建 sshd 镜像:
1, 先创建一个目录:
- [[email protected] ~]# cd /opt/
- [[email protected] opt]# mkdir sshd
- [[email protected] opt]# cd sshd/
2, 编辑 dockerfile 文件
- [[email protected] sshd]# VIM Dockerfile
- FROM CentOS
- MAINTAINER this is sshd <wwj>
- RUN yum -y update
- RUN yum -y install openssh* net-tools lsof telnet passwd
- RUN echo '123456' | passwd --stdin root
- 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
- RUN sed -i '/^session\s\+required\s\+pam_loginuid.so/s/^/#/' /etc/pam.d/sshd
- RUN mkdir -p /root/.SSH && chown root.root /root && chmod 700 /root/.SSH
- EXPOSE 22
- CMD ["/usr/sbin/sshd" , "-D"]
3, 创建镜像
- [[email protected] sshd]# docker build -t sshd:new .
- 89432272695ab560b18de75a064428e4a7c4a52dfce223afd2e85132ae6c3c72
- [[email protected] sshd]# docker ps -a // 查看最近状态
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 89432272695a sshd:new "/usr/sbin/sshd -D" 7 seconds ago Up 6 seconds 0.0.0.0:32768->22/tcp sad_fermi
4, 启动容器; 修改密码
- [[email protected] sshd]# docker run -d -P sshd:new
- [[email protected] sshd]# SSH localhost -p 32768
(2) 构建 Systemctl 镜像:
基于上面的 sshd:new 这个镜像, 我们再创建一个 systemctl 镜像:
1, 创建独立目录:
- [[email protected] ~]# cd /opt/
- [[email protected] opt]# mkdir systemctl
- [[email protected] opt]# cd systemctl/
2, 编辑 dockerfile
- [[email protected] systemctl]# VIM Dockerfile
- FROM sshd:new
- 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"]
3, 创建镜像:
[[email protected] systemctl]# docker build -t systemd:lasted .
4, 启动镜像:
- [[email protected] systemctl]# docker run --privileged -it -v /sys/fs/cgroup/:/sys/fs/cgroup:ro systemd:lasted /sbin/init
- //privateged container 内的 root 拥有真正的 root 权限, 否则, container 内的 root 只是外部的一个普通用户权限.
docker ps -a 查看状态:
5, 进入容器
- [[email protected] ~]# docker exec -it 23a50d568c75 bash
- [[email protected] /]# systemctl status sshd
此时可以使用 systemctl 和 sshd 两条命令
(3) 构建 Nginx 镜像:
1, 创建目录:
- [[email protected] ~]# cd /opt/
- [[email protected] opt]# mkdir nginx
- [[email protected] opt]# cd nginx/
2, 编辑 Dockerfile :
- [[email protected] nginx]# VIM Dockerfile
- FROM CentOS:7
- MAINTAINER The is nginx <wwj>
- RUN yum install -y proc-devel gcc gcc-c++ zlib zlib-devel make openssl-devel wget
- RUN wget http://nginx.org/download/nginx-1.9.7.tar.gz
- RUN tar zxvf nginx-1.9.7.tar.gz
- WORKDIR nginx-1.9.7/
- RUN ./configure --prefix=/usr/local/nginx && make && make install
- EXPOSE 80
- EXPOSE 443
- 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"]
3, 创建 run.sh 脚本:
- [[email protected] nginx]# VIM run.sh
- #!/bin/bash
- /usr/local/nginx/sbin/nginx
4, 创建镜像:
[[email protected] nginx]# docker build -t nginx:new .
5, 启动镜像
- [[email protected] nginx]# docker run -d -P nginx:new
- 228c1f5b8070d52c6f19d03159ad93a60d682a586c0b1f944dc651ee40576a3e
- [[email protected] nginx]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 228c1f5b8070 nginx:new "/run.sh" 9 seconds ago Up 8 seconds 0.0.0.0:32769->80/tcp, 0.0.0.0:32768->443/tcp busy_booth
6, 验证一下: 浏览器访问: http://192.168.220.131:32769/
(4) 构建 Tomcat 镜像:
需要用到 apache-tomcat-9.0.16 和 jdk1.8.0_91 这两个包, 可以通过远程挂载到本地, 再拷贝到 tomcat 文件夹中.
- [[email protected] tomcat]# ls
- apache-tomcat-9.0.16 Dockerfile jdk1.8.0_91
1, 编辑 Dockerfile:
- FROM CentOS:7
- MAINTAINER this is tomcat
- # 安装 JDK 环境, 设置其环境变量
- ADD jdk1.8.0_91 /usr/local/java
- ENV JAVA_HOME /usr/local/java
- ENV JAVA_BIN /usr/local/java/bin
- ENV JRE_HOME /usr/local/java/jre
- ENV PATH $PATH:/usr/local/java/bin:/usr/local/java/jre/bin
- ENV CLASSPATH /usr/local/java/jre/bin:/usr/local/java/lib:/usr/local/java/jre/lib/charsets.jar
- ADD apache-tomcat-9.0.16 /usr/local/tomcat8
- EXPOSE 8080
2, 生成镜像:
[[email protected] tomcat]# docker build -t tomcat:CentOS .
3, 生成容器:
- [[email protected] tomcat]# docker run --name tomcat01 -p 1234:8080 -it tomcat:CentOS /bin/bash
- // 指定端口号为 1234
4, 进入容器后, 启动服务:
- [[email protected] /]# cd /usr/local/tomcat8/bin/
- [[email protected] bin]# ./startup.sh
验证: 浏览器访问 192.168.220.131:1234
(5) 构建 MySQL 镜像:
MySQL 工作目录中包含以下文件:
- my.cnf Dockerfile MySQL-boost-5.7.20.tar.gz
- VIM my.cnf
- [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
- VIM Dockerfile
- FROM CentOS:7
- RUN yum -y install ncurses ncurses-devel bison cmake make gcc gcc-c++
- RUN useradd -s /sbin/nologin MySQL
- ADD MySQL-boost-5.7.20.tar.gz /usr/local/src
- WORKDIR /usr/local/src/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 && make && make install
- RUN chown -R MySQL:MySQL /usr/local/MySQL/
- RUN rm -rf /etc/my.cnf
- ADD my.cnf /etc
- RUN chown MySQL:MySQL /etc/my.cnf
- ENV PATH=/usr/local/MySQL/bin:/usr/local/MySQL/lib:$PATH
- WORKDIR /usr/local/MySQL/
- RUN 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 /usr/lib/systemd/system/
- EXPOSE 3306
- RUN echo -e "#!/bin/sh \nsystemctl enable mysqld"> /run.sh
- RUN chmod 755 /run.sh
- RUN sh /run.sh
- CMD ["init"]
1, 创建容器:
[[email protected] MySQL]# docker build -t CentOS:MySQL .
2, 运行容器:
- [[email protected] MySQL]# docker run --name=mysql_server -d -P --privileged CentOS:MySQL
- 998dc97971022135b822b8b29154df3eaaf5dc977b2a91eaf8afc2b3cea7e
3, 查看容器状态:
- [[email protected] MySQL]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 998dc9797102 CentOS:MySQL "init" About a minute ago Up About a minute 0.0.0.0:32768->3306/tcp mysql_server
4, 进行数据库提权:
- [[email protected] MySQL]# docker exec -it 998dc9797102 /bin/bash
- [[email protected] MySQL]# MySQL
- MySQL> grant all privileges on *.* to 'root'@'%' identified by 'abc123';
- MySQL> grant all privileges on *.* to 'root'@'localhost' identified by 'abc123';
5, 测试: 打开另外一个虚拟机, 用 yum 安装 MySQL 服务, 并连接:
- [[email protected] ~]# MySQL -h 192.168.220.131 -u root -P 32768 -pabc123
- Welcome to the MariaDB monitor. Commands end with ; or \g.
- Your MySQL connection id is 4
- Server version: 5.7.20 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)]>
来源: http://www.bubuko.com/infodetail-3361419.html