2020系统综合实践 第2次实践作业

1.实现一个自定义的web容器服务

拉取nginx镜像以获取它的默认配置文件

docker pull nginx

查看是否成功获取镜像

docker images

为了方便管理,先创建一个文件夹mydocker

mkdir mydocker


在正式开始编写Dockerfile之前,我们需要先准备好nginx配置文件和自己的网页

先用拉来的镜像运行一个nginx容器

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

vim在mydocker文件夹中创建一个default.conf文件,然后将默认配置文件复制进去

接下来修改配置文件,自定义监听端口和根目录

然后新建一个index.html文件,并编写一个最简单的网页以供测试

万事具备,现在我们可以开始编写Dockerfile了,vim新建一个名为Dockerfile的文件就可以往里写东西了

#基础镜像
FROM nginx

#镜像作者
MAINTAINER Tinor

#设置工作目录
WORKDIR /home/tinor/mydocker

#复制配置文件以及自己的web存放目录
COPY default.conf /etc/nginx/conf.d/
COPY index.html /home/tinor/mydocker/

#暴露端口
EXPOSE 8008

先删掉之前的nginx容器

docker ps #找到容器id
docker rm -f [容器id]


在存放Dockerfile的目录下构建镜像

docker build -t mynginx .

用自定义镜像运行容器

docker run --name tinor_nginx -d -p 8008:2333 mynginx

进入容器看看是会直接进入设定的工作目录下

sudo docker exec -it [容器id] /bin/bash
pwd

可以看到容器已经进入设定的工作目录中

最后是去浏览器查看之前准备的网页是否能正常访问

2.实现一个自定义的数据库容器服务

为了方便管理,依然先创建一个名为mysql的文件夹
然后在该文件夹中分别创建如下四个文本文件,用于编写MySQL的配置文件

1.编写Dockerfile

#基础镜像
FROM mysql:5.7
#镜像作者
MAINTAINER Tinor
#设置不允许免密登录并设置root密码
ENV MYSQL_ALLOW_EMPTY_PASSWORD no
ENV MYSQL_ROOT_PASSWORD=123456
#将配置文件放到容器中
COPY setup.sh /mysql/setup.sh
COPY schema.sql /mysql/schema.sql
COPY privileges.sql /mysql/privileges.sql
#设置容器启动时执行的命令
CMD ["sh", "/mysql/setup.sh"]

2、编写容器启动脚本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 < /mysql/schema.sql
echo '3.导入数据完毕....'

sleep 3
echo `service mysql status`

#重新设置mysql密码
echo '4.开始修改密码....'
mysql < /mysql/privileges.sql
echo '5.修改密码完毕....'

#sleep 3
echo `service mysql status`
echo 'mysql容器启动完毕,且数据导入成功'

tail -f /dev/null

3、需要导入数据的mysql脚本命令schema.sql

-- 创建数据库
create database `docker_mysql` default character set utf8 collate utf8_general_ci;
 
use docker_mysql;
 
-- 建表
DROP TABLE IF EXISTS Student;
 
CREATE TABLE Student (
 `Sno` bigint(20) NOT NULL,
 `Sname` varchar(255) DEFAULT "",
 `Ssex` varchar(10) DEFAULT "Male"
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
-- 插入数据
INSERT INTO Student (`Sno`, `Sname`,`Ssex`)
VALUES
  (031702441,'Tinor','Male');

4、mysql权限设置命令privileges.sql

use mysql;
select host, user from user;
-- 因为mysql版本是5.7,因此新建用户为如下命令:
create user docker identified by '123456';
-- 将docker_mysql数据库的权限授权给创建的docker用户,密码为123456:
grant all on docker_mysql.* to docker@'%' identified by '123456' with grant option;
-- 这一条命令一定要有:
flush privileges;

创建镜像

docker build -t tinor_mysql .

运行容器

docker run --name tinor_mysql -d -p 2441:2441 tinor_mysql

进入容器

docker exec -it [容器id] /bin/bash

使用docker用户登录数据库

mysql -u docker -p

切换至docker_mysql数据库

use docker_mysql

查看Student表中的数据

select * from Student;


测试根节点登录密码

exit
mysql -u root -p


可以看到使用root用户登录数据库的时候需要输入密码

最后是查看容器的配置信息

docker inspect [容器id]

信息很长,只截取了一部分

3.遇到的问题

(1)第一个问题

在第一个实验中
第一次运行容器

在浏览器访问自己的网页,但是发现不是我自己的网页

看了看这个网页的内容,应该是nginx的官方的一个欢迎界面,想起来为了获取配置文件的时候曾经运行过一个nginx的容器,应该是8080端口被那个容器占用了(但是我不明白我明明把那个容器删除掉了还会继续占用端口,而且还能继续访问那个网页)。看来这个端口暂时是用不了,此路不通,那咱就另寻他路。
于是我把自定义的镜像和由其生成的容器都删掉,然后修改Dockfile的端口为8008,重新构建重新运行容器。


然后再去浏览器访问,发现就可以了。

后来我在新运行的容器里面找到了nginx的欢迎页面的html文件

我以为是这两个文件占用了8080端口,于是我把这两个文件删了,但是在浏览器访问localhost:8080依然可以看到那个欢迎页面,没办法,不能再折腾了,这个问题就先放着吧。
(2)第二个问题
在第一个实验中,我没有按照老师要求“安装必要的工具以方便维护”,很大的原因就是我对不熟悉nginx和web开发,所以根本就不知道该安装说明工具,但是这不代表我就没有去学习这一方面的知识,我在B站看了一个视频,老师以自定义centos为例,初始的centos没有安装很多工具,甚至连vim都没有,如果希望centos容器运行的时候就有vim,只需要在Dockerfile中使用"RUN yun -y install vim"就可以。所以其实老师说的“安装必要的工具以方便维护”应该也是使用RUN指令让镜像在构造的时候就安装某些管理工具,但是我遇到的问题就是不知道应该安装什么工具,由于最近课业太多也没时间去深入研究,所以我希望在以后需要的时候再安装相关工具。

原文地址:https://www.cnblogs.com/Tinor/p/12762110.html