Dockerfile构建镜像
-
构建镜像的三种方法:
基于Dockerfile构建
基于已有的镜像容器进行创建镜像
基于本地模板进行构建 -
构建三步骤:
编写Dockerfile文件 -----> 创建镜像docker build -----> 启动容器docker run
构建apache镜像
- 编写Dockerfile文件
[root@docker ~]# mkdir apache '//创建目录,存放Dockerfile文件'
[root@docker ~]# cd apache/
[root@docker apache]# vi Dockerfile
FROM centos:7 '//基于的基础镜像'
MAINTAINER this is apache '//维护镜像的用户信息'
RUN yum -y update '//更新yum仓库'
RUN yum -y install httpd '//安装apache软件'
EXPOSE 80 '//开启端口80'
ADD index.html /var/www/html/index.html '//复制网站首页文件'
ADD run.sh /run.sh '//将执行脚本复制到镜像中'
RUN chmod 755 /run.sh '//给脚本设置755权限'
CMD ["/run.sh"] '//启动容器时执行脚本'
[root@docker apache]# vi index.html '//编写网站页面'
This is apache!
[root@docker apache]# vi run.sh '//编写执行脚本'
#!/bin/bash
rm -rf /run/httpd/* #删除apache缓存
exec /usr/sbin/apachectl -D FOREGROUND #exec执行,apachectl -D 守护进程,FOREGROUND启动
- 创建新镜像,并启动容器
[root@docker apache]# docker build -t httpd:centos . '//创建apache镜像'
[root@docker apache]# docker run --name httpd -d -p 80:80 httpd:centos '//启动容器httpd'
- 验证测试
[root@docker apache]# docker ps '//列出正在运行的容器'
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6a352e31820f httpd:centos "/run.sh" 4 seconds ago Up 4 seconds 0.0.0.0:80->80/tcp httpd
访问网址指定端口得
- http://192.168.140.22:80/
构建nginx镜像
- 编写Dockerfile文件
[root@docker ]# mkdir nginx
[root@docker ]# cd nginx '//导入nginx压缩软件包'
[root@docker nginx]# vim Dockerfile
FROM centos:7
MAINTAINER this is nginx
ADD nginx-1.12.2.tar.gz /usr/local/src '//复制并解压nginx软件包'
RUN yum -y update
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make '//安装nginx依赖包环境'
RUN useradd -M -s /sbin/nologin nginx
WORKDIR /usr/local/src/nginx-1.12.2 '//指定工作目录'
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
EXPOSE 80
ADD index.html /usr/local/nginx/html/index.html
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
[root@docker nginx]# vim index.html '//编写网站页面'
this is nginx!!
[root@docker nginx]# vim run.sh '//编写执行脚本'
#!/bin/bash
/usr/local/nginx/sbin/nginx
- 创建新镜像,并启动容器
[root@docker nginx]# docker build -t nginx:new . #注意命令最后带有一个小数点
[root@docker nginx]# docker run -d -P nginx:new #启动容器
- 验证测试
[root@docker nginx]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
95b690a3c8bf nginx:new "/run.sh" 7 seconds ago Up 5 seconds 0.0.0.0:49156->80/tcp, 0.0.0.0:49155->443/tcp compassionate_mahavira
访问网址指定端口得
- http://192.168.140.22:49156/
构建tomcat镜像
- 创建目录,存放Dockerfile文件
[root@docker ~]# mkdir tomcat
[root@docker ~]# cd tomcat/
[root@docker tomcat]#
#此时将jdk-8u91-linux-x64.tar.gz、apache-tomcat-9.0.16.tar.gz放在目录里
[root@docker tomcat]# ls
apache-tomcat-8.5.16.tar.gz jdk-8u91-linux-x64.tar.gz
- 编写 tomcat 的 Dockerfile 文件
[root@docker tomcat]# vi Dockerfile
FROM centos:7
MAINTAINER this is tomcat
ADD jdk-8u91-linux-x64.tar.gz /usr/local/
WORKDIR /usr/local/
RUN mv 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-8.5.16.tar.gz /usr/local/
WORKDIR /usr/local/
RUN mv apache-tomcat-8.5.16 /usr/local/tomcat8
EXPOSE 8080
ENTRYPOINT ["/usr/local/tomcat8/bin/catalina.sh","run"]
#cmd ["/usr/local/tomcat8/bin/catalina.sh","run"]
- 创建新镜像,并启动容器
[root@docker tomcat]# docker build -t tomcat:centos .
...//省略部分信息
Successfully built c932dd81fac3
Successfully tagged tomcat:centos
[root@docker tomcat]# docker run --name tomcat -d -P tomcat:centos
0385b8a787442061d7005ff9acea7fa9def4d8cb991bea9c320e9b8ff9209ff4
- 验证测试
[root@docker tomcat]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0385b8a78744 tomcat:centos "/usr/local/tomcat8/…" 4 seconds ago Up 3 seconds 0.0.0.0:49155->8080/tcp tomcat
访问网址指定端口得
- http://192.168.140.22:49155/
构建mysql镜像
- 创建目录存放Dockerfile文件,并导入 mysql 软件包
[root@docker ~]# mkdir mysql && cd mysql
[root@docker mysql]# ls '//导入mysql软件包'
mysql-boost-5.7.20.tar.gz
- 编写 Dockerfile 文件
[root@docker mysql]# vi Dockerfile
FROM centos:7
MAINTAINER this is MySQL
EXPOSE 3306
ADD mysql-boost-5.7.20.tar.gz /usr/local/src
WORKDIR /usr/local/src/mysql-5.7.20
RUN useradd mysql -M -s /sbin/nologin
RUN yum -y install gcc gcc-c++ make ncurses ncurses-devel bison cmake
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 $PATH:/usr/local/mysql/bin:/usr/local/mysql/lib
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/
ADD run.sh /usr/local/src
RUN chmod 755 /usr/local/src/run.sh
RUN sh /usr/local/src/run.sh
CMD ["init"]
[root@docker mysql]# vi my.cnf '//配置MySQL系统 /etc/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
[root@docker mysql]# vim run.sh
#!/bin/bash
/usr/local/mysql/bin/mysqld
systemctl enable mysqld
[root@docker mysql]# ls
Dockerfile my.cnf mysql-boost-5.7.20.tar.gz run.sh
- 创建镜像和容器
[root@docker mysql]# docker build -t mysql:test . '//创建MySQL镜像,编译时间较久,需要耐心等待'
# docker system prune 清除docker缓存命令
[root@docker mysql]# docker run --name mysql --privileged -d -P mysql:test
'//创建mysql容器,进入容器不降权'
4086047bf07c11c7fb15ee4c5d089c52e7c3d26f4681fba526f60deddaa7df34
[root@docker mysql]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4086047bf07c mysql:test "init" 6 seconds ago Up 5 seconds 0.0.0.0:49156->3306/tcp mysql
- 进入mysql,授权登录用户
[root@docker mysql]# docker exec -it 4086047bf07c /bin/bash
[root@4086047bf07c mysql-5.7.20]# mysql -uroot -p
Enter password: //按回车即可
...
mysql> grant all privileges on *.* to 'root'@'%' identified by '111222';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> grant all privileges on *.* to 'root'@'localhost' identified by '111222';
Query OK, 0 rows affected, 1 warning (0.00 sec)
- 在宿主系统中安装mairadb客户端连接mysql容器
[root@docker mysql]# yum install mariadb -y
[root@docker mysql]# mysql -h 192.168.140.22 -uroot -p111222 -P49156
- 验证资源共享
在宿主机中进入数据库,并创建数据库
MySQL [(none)]> create database ping;
Query OK, 1 row affected (0.00 sec)
MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| ping |
| sys |
+--------------------+
5 rows in set (0.00 sec)
进入容器,查看结果
[root@docker mysql]# docker exec -it 4086047bf07c /bin/bash
[root@4086047bf07c mysql-5.7.20]# mysql -uroot -p111222
...
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| ping |
| sys |
+--------------------+
5 rows in set (0.00 sec)
//此时表示mysql数据库容器搭建完成