首页 > 技术文章 > 系统综合实践2

lance-haha 2021-04-04 21:14 原文

系统综合实践——第2次实践作业:镜像定制

在实际应用中经常需要根据需求额外修改镜像,在docker中,可以使用 Dockerfile 实现自定义镜像。

一、实践记录

1.时间

  • 回答问题1:实践记录
    • 开始时间——2021/04/03 19:00
    • 结束时间——2021/04/04 21:00
    • 有效时长——8h

2.实验环境

  • VisualBox_6.1虚拟机
  • Ubuntu 18.04.5 Desktop amd64 的虚拟机系统;

【软件工具】

3.实验目的

完成Dockerfile实践,掌握编写Dockerfile的基本方法。 完成两个容器定制任务:
(1)定制Web容器镜像

(2)定制MYSQL数据库镜像



二、实践过程1——定制Web容器镜像

1.获取nginx镜像

sudo docker images //查看镜像列表
sudo docker pull nginx:latest

(1)运行nginx容器

sudo docker run --name nginx-test -p 8080:80 -d nginx
sudo docker ps	//查看运行中的容器

(2)通过浏览器访问8080端口查看

打开浏览器,在地址栏输入:

localhost:8080

2.定制web容器——032092135nginx

(1)自定义目录

创建一个新目录,并进入目录:

mkdir /home/lancl/docker_build/nginx_docker
cd lancl/docker_build/nginx_docker	//进入目录

(2)配置并修改default.conf

把nginx容器的默认配置default.conf复制进文件夹中:

sudo docker ps -a
sudo docker cp <ID>:/etc/nginx/conf.d/default.conf .

如:

sudo docker cp 9d93ad4161d0:/etc/nginx/conf.d/default.conf .	//小点点别忘记了!!!

修改default.conf文件:

sudo nano default.conf
//更改端口号(2333)和location/下的root目录(自定义工作目录/web/html)- ctrl+o --> enter --> ctrl + x

(3)在自定义目录下新增其它配置文件

① 欢迎界面

sudo nano index.html

<index.html >

<!DOCTYPE html>
<html>

<head>
<meta charset="utf-8" />
<title>032092135-lancl</title>
</head>

<body>
	<p>hello_world</p>
	<p>this is nginx docker test</p>
</body>

② 镜像文本

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

sudo nano Dockerfile

//Dockerfile>

#基础镜像
FROM nginx
#维护人信息
MAINTAINER 032092135

#添加文件(自定义工作目录:/web/html/)
COPY default.conf /etc/nginx/conf.d/
COPY index.html /web/html/
#暴露端口
EXPOSE 2333

(4)在该目录下构建镜像

sudo docker build -t 92135nginx:v1 .
    // --tag, -t: 镜像的名字及标签

(5)测试容器效用

运行容器

sudo docker run --name 032092135nginx -d -p 2333:2333 92135nginx:v1    
    // -d: 后台运行容器,并返回容器ID;
    // -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
sudo docker ps

打开浏览器,在地址栏输入:

localhost:2333

挂载工作目录

sudo mkdir volume
sudo cp index.html ./volume
// --volume , -v: 给容器挂载【存储卷】,挂载到容器的某个目录/【工作目录】
sudo docker run --name nginx_volume_test1 -it -v /home/lancl/docker_build/nginx_docker/volume:/web/html -d -p 2325:2333 92135nginx:v1

打开浏览器,在地址栏输入:

localhost:2325

三、实践过程2——定制MYSQL数据库镜像

编写Dockerfile,实现一个自定义的MySQL数据库镜像——版本不限,主流使用MySQL 5.7和8

1.创建文件目录,添加配置文件

cd lancl/docker_build
mkdir mysql_docker
cd lancl/docker_build/mysql_docker

(1)创建Dckerfile

sudo nano Dockerfile

//Dockerfile>

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

(2)编写容器启动脚本

sudo nano 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 < /lancl/docker_build/mysql_docker/schema.sql
echo '3.导入数据完毕....'

sleep 3
echo `service mysql status`

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

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

tail -f /dev/null

(3)导入数据的mysql脚本命令

sudo nano schema.sql

<schema.sql>

-- 创建数据库
create database `docker_mysql` default character set utf8 collate utf8_general_ci;
 
use docker_mysql;
 
-- 建表
DROP TABLE IF EXISTS test;
 
CREATE TABLE test (
 `id` bigint(20) NOT NULL,
 `name` varchar(255) DEFAULT "",
`gender` varchar(10) DEFAULT "Male"
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
-- 插入数据
INSERT INTO test (`id`, `name`, `gender`)
VALUES
  (032092135,'lancl','Male'),
  (032092188,'liuyer','Female');

(4)mysql权限设置命令

sudo nano privileges.sql

<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;

2.创建MySQL镜像

cd lancl/docker_build/mysql_docker	//进入自定义目录
sudo docker build -t 92135mysql:v1 .

3.启动容器并映射窗口

sudo docker run --name 032092135mysql -d -p 3306:3306 92135mysql:v1

sudo docker exec -it 032092135mysql /bin/bash	// 进入容器

// 使用docker用户登录数据库 ,使用的密码为之前设置的123456,切换至docker_mysql数据库
mysql -u docker -p
use docker_mysql	
select * from test;		// 查表测试
quit	// 退出MySQL数据库

exit	// 退出容器

4.查看容器的配置信息

sudo docker ps	//查询容器ID
sudo docker inspect 032092135mysql		// 或者用ID:370abc4d6386
sudo docker stop 370abc4d6386
sudo docker rm -f 370abc4d6386

查看dockerfile-032092135mysql容器的配置信息

《Tips》

针对实践任务中遇到的各类问题和解决办法进行总结(不少于5条)。

1.实验心得

(1)Nginx

  • Nginx(“ engine x”)是一个由俄罗斯的程序设计师Igor Sysoev所开发的高级Web和反向代理服务器,也是一个IMAP / POP3 / SMTP代理服务器。在高连接并发的情况下,Nginx是Apache服务器不错的替代品。

(2)Mysql

  • MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。

2.问题记录

(1)为什么容器stop之后,localhost:2333的index.html还可以继续访问?

  • 过一大段时间,不行了
  • 关闭后,再重启容器看看:可行

(2)文件目录不能一次性按照绝对路劲创建?

  • 一个一个mkdir倒是可以?

(3)index.html修改——重启才有效?

  • 双击HTML文件,浏览器会自动打开
    file:///home/ubuntu/lancl/docker_build/nginx_docker/index.html

① 尝试重启容器

sudo docker stop 92f50503e3be
sudo docker restart 92f50503e3be?
sudo docker start 92f50503e3be
  • 再运行容器报错:You have to remove (or rename) that container to be able to reuse that name.

② 删除容器——再运行

sudo docker rm -f 92f50503e3be
  • 还是没效果?

③ 删除镜像,再构建——可行!

容器运行中,删除镜像可以吗?——不行

sudo docker rm -f 86f27227f3ea
sudo docker rmi 032092135nginx
sudo docker build -t 032092135nginx .
sudo docker run --name 032092135nginx -d -p 2333:2333 032092135nginx

(4)docker cp :用于容器与主机之间的数据拷贝。

sudo docker cp /home/ubuntu/lancl/docker_build/nginx_docker/index.html 343622f084ae:/home/lancl/docker_build/nginx_docker

(5)设置挂载点

docker本身提供了一种机制,可以将主机上的某个目录与容器的某个目录(称为挂载点、或者叫卷)关联起来;修改主机上该目录的内容时,不需要同步容器,对容器来说是立即生效的;并且,挂载点可以让多个容器共享。

① 通过docker run命令

注:-v标识创建的挂载点只对创建的该容器有效。(本地目录:挂载工作目录)

sudo docker run --name nginx_volume_test1 -it 
-v /home/ubuntu/lancl/docker_build/nginx_docker:/home/lancl/docker_build/nginx_docker  
-d -p 2325:2333 032092135nginx:v1

② 容器共享卷(挂载点)

sudo docker run --name nginx_volume_test2 -it --volumes-from  nginx_volume_test1 -d -p 2332:2333 032092135nginx:v1

③ Dockerfile- VOLUME 指令

VOLUME ["/data1","/data2"]

通过dockerfile的 VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点。通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。

查看容器的配置信息

sudo docker inspect 【容器ID】

"Destination" 值是容器的挂载点,"Source"值是对应的主机目录。

cd /var/lib/docker/volumes
【报错:】ls: cannot open directory '.': Permission denied

文件管理器可以进入,需要输入两次密码:12345;所以,
考虑以root用户操作:

sudo su
su ubuntu //切换回普通用户

类似问题:

centOS 权限问题-selinux小结:https://blog.csdn.net/mjlfto/article/details/80547974
https://www.cnblogs.com/awakenedy/articles/10941764.html

3.实验要求

(1)标明镜像作者(学号);
(2)进入容器后,要能够查看容器内的配置信息,包括但不限于网络、应用配置文件等;
(3)将Web服务默认的监听端口80更改为其他端口;- 2333
(4)设置你自己的web存放目录,且容器启动时能直接进入该目录,便于查看; ???——/home/lancl/docker_build/nginx_docker
(5)数据库要设置root密码且不允许空密码登录; ——123456
(6)创建一个数据库,新建数据库用户admin,并设置密码(自定义);——docker,123456
(7)编写一个简单的html文件,测试web服务。
(8)为了更好地测试数据库容器,编写SQL语句,在创建的测试数据库内,新建至少2张表,表中字 段包含外键,插入自定义数据(例如:人员表、部门表和聘用关系表)。
(9)启动数据库容器后,可自动导入库表数据。

p.s.实验报告文档质量高,描述清晰,条理清楚。

推荐阅读