Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
基本结构:一般分为四部分,基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
(1) 实现一个自定义的web容器服务
推荐apache或nginx,要求标明镜像作者信息,安装必要的工具以方便维护;设定你自己的web存放目录,安全起见,请将默认的监听端口80更改为你自定义的端口,并且声明暴露的端口,容器启动时,能直接进入web代码的存放目录。
首先我们查看一下本地拥有的镜像
sudo docker images
下载nginx镜像
sudo docker pull nginx
再次查看镜像以验证nginx是否下载成功
sudo docker images
启动nginx容器并查看其配置信息
sudo docker run --name nginx-test -p 8080:80 -d nginx
sudo docker exec -it [容器id] /bin/bash
cd /etc/nginx/conf.d
cat default.conf
得到default.conf的内容
在主目录中创建web文件夹并在该文件下创建文件,直接把终端里显示的内容复制到新文件中,命名为default.conf,修改配置文件监听端口为7777和根目录为/home/qinhonghao/web
在同一目录下创建dockerfile文件:
在同一目录创建自己的html文件:
打开dockerfile文件存放目录并构建镜像:
cd /home/qinhonghao/web
sudo docker build -t nginx_webtest .
要注意,nginx_webtest是所要构建镜像的名称,.表示上下文,千万不能漏掉,否则会错误。
验证查看nginx_webtest是否构建成功:
sudo docker images
可以看到,nginx_webtest已经构建成功。
运行nginx_webtest容器:
sudo docker run --name nginx_webtest -d -p 8080:7777 nginx_webtest
查看localhost:8080的显示
(2) 实现一个自定义的数据库容器服务
可选择Mysql,Mariadb等,要求标明镜像作者信息,为了方便维护,需要能够查看容器内的配置信息,包括但不限于网络、应用配置文件等。在环境变量中设置好数据库的root密码且不允许空密码登录,创建一个测试数据库,指定用户名和密码。
pull一个mysql镜像
cd /home/qinhonghao/web
sudo su
sudo docker pull mysql:5.7
创建构建mysql镜像所需的文件
Dockerfile:
#基础镜像
FROM mysql:5.7
#维护者信息
MAINTAINER qinhonghao 2648619171@qq.com
#设置不允许空密码登陆,且设置root密码
ENV MYSQL_ALLOW_EMPTY_PASSWORD no
ENV MYSQL_ROOT_PASSWORD=ymt123456
#将所需文件放到容器中
COPY setup.sh /home/qinhonghao/mysql/setup.sh
COPY schema.sql /home/qinhonghao/mysql/schema.sql
COPY privileges.sql /home/qinhonghao/mysql/privileges.sql
#设置容器启动时执行的命令
CMD ["sh", "/home/qinhonghao/mysql/setup.sh"]
容器启动脚本setup.sh
#!/bin/bash
set -e
#查看mysql服务的状态,方便调试,这条语句可以删除
echo `service mysql status`
echo '1.启动mysql....'
#启动mysql
service mysql start
sleep 3
echo `service mysql status`
echo '2.开始导入数据....'
#导入数据
mysql < /home/qinhonghao/mysql/schema.sql
echo '3.导入数据完毕....'
sleep 3
echo `service mysql status`
#重新设置mysql密码
echo '4.开始修改密码....'
mysql < /home/qinhonghao/mysql/privileges.sql
echo '5.修改密码完毕....'
#sleep 3
echo `service mysql status`
echo `mysql容器启动完毕,且数据导入成功`
tail -f /dev/null
Mysql的数据库脚本命令schema.sql
-- 创建数据库
create database `docker_mysql` default character set utf8 collate utf8_general_ci;
use docker_mysql;
-- 建表
DROP TABLE IF EXISTS user;
CREATE TABLE user (
`id` varchar(20) NOT NULL,
`name` varchar(20) DEFAULT NULL,
`sex` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- 插入数据
INSERT INTO user (`id`, `name`, `sex`)
VALUES
('1001','qhh','man');
Mysql权限设置命令privileges.sql
use mysql;
select host, user from user;
-- 因为mysql版本是5.7,因此新建用户为如下命令:
create user qaq identified by '123456';
-- 将docker_mysql数据库的权限授权给创建的qaq用户,密码为123456:
grant all on docker_mysql.* to qaq@'%' identified by '123456' with grant option;
-- 这一条命令一定要有:
flush privileges;
构建数据库
在工作目录下运行docker build命令
docker build -t xm_mysql .
docker images
运行容器并查看是否创建成功
docker run --name sqlqhh -p 3306:3306 -d xm_mysql
docker ps
进入容器,使用指定用户名和密码进入数据库
docker exec -it sqlqhh /bin/bash
mysql -u qaq -p
查看已经存在的数据库
show databases;
进入数据库并且查表,然后使用exit退出
use docker_mysql
select * from user;
exit
使用root密码登录并查看数据库
mysql -u root -p
show databases;
查看mysql的配置信息
show variables;
退出容器,查看日志信息
docker logs sqlqhh
查看这个容器的信息
sudo docker inspect sqlqhh
(3)实践小结
在本次实践作业我遇到了些许问题:
1、nginx和mysql镜像下载特别特别慢,我也没考虑加速,所以浪费了很多时间在下载方面,心态也受到了一些影响。
2、build指令建立镜像的时候,在任务一和任务二都忘记在最后面加“.”,以致于异常,下次一定不要忘记了。
3、在利用数据库镜像建立并运行容器时,进入容器目录经常会失败,百度查了一下原因发现可能是容器自动挂掉了没在运行,所以我用docker start 容器
来开启再进入容器,发现还是不行,然后我到班级群去问同学,然后又试了把Dockerfile和setup.sh文件的相对路径/mysql/xxx改为绝对路径/home/qinhonghao/mysql/xxx,再试也不行,后面又试着把镜像删除了再创建,但是仍然不见有用。然后我不得不静下心了(实在是没招),然后当我用docker ps -a
来查看时,发现了一个问题,我发现我有好多个容器对应同一个数据库镜像,这会不会有可能导致资源的占用发生一些错误呢?反正现在我也没有办法了,我断然地把数据库镜像和对应的所有容器都删除了(真解气),然后按之前的步骤重新来,果然没问题了,能顺利进入到容器。。虽然我不能很确定这是解决问题的关键,但是至少过去了。