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指令让镜像在构造的时候就安装某些管理工具,但是我遇到的问题就是不知道应该安装什么工具,由于最近课业太多也没时间去深入研究,所以我希望在以后需要的时候再安装相关工具。