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来查看时,发现了一个问题,我发现我有好多个容器对应同一个数据库镜像,这会不会有可能导致资源的占用发生一些错误呢?反正现在我也没有办法了,我断然地把数据库镜像和对应的所有容器都删除了(真解气),然后按之前的步骤重新来,果然没问题了,能顺利进入到容器。。虽然我不能很确定这是解决问题的关键,但是至少过去了。