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

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

要求:

#指定基础镜像
FROM   nginx

#设置镜像作者
MAINTAINER   hh

#安装必要的工具以方便维护
nginx不知道用什么工具维护
apache:
RUN apt-get update
&&apt-get install -y apache2
&&apt-get install -y apache2-utils
&&apt-get clean

#设置工作目录
WORKDIR /home/nginx

# 复制上下文的文件到容器的 app 目录下
# 不需要复制到镜像的文件可以使用 .dockerignore 进行忽略
COPY . /mynginx

#默认的监听端口80更改为自定义的端口
在default.conf中将listen 80改为listen 1234

#并且声明暴露的端口
EXPOSE 1234

#容器启动时,能直接进入web代码的存放目录

步骤:

1.获取nginx镜像

docker pull nginx

2.查看镜像中是否已有nginx

docker images

3.启动一个nginx容器

Docker run --name nginx1 -p 8080:80 -d nginx 

4.在user/nginx目录下拷贝需要修改的default.conf文件

docker cp <容器ID>:/etc/nginx/conf.d/default.conf .

在主目录中可看到default.conf文件

5.将监听的端口号listen修改为1234(原为80)

将Web默认目录root修改为/home/nginx(原为/usr/share/nginx/html)

6.将default.conf dockerfile index.html放在同一个文件夹下。直接编辑dockerfile和index.html

7.在创建的web目录下启动终端,构建自定义镜像

docker build -t [镜像名称:镜像标签] .

. :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。

如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。

8.运行一个容器

docker run -d  --name nginx1 -p 1000:1234 mynginx:v1 

9.检测结果,打开浏览器,输入网址0.0.0.0:1000

PS:也可通过docker network inspect bridge来查看网址

二、实现一个自定义的数据库容器服务

要求:

选择Mysql,要求标明镜像作者信息,为了方便维护,需要能够查看容器内的配置信息,包括但不限于网络、应用配置文件等。在环境变量中设置好数据库的root密码且不允许空密码登录,创建一个测试数据库,指定用户名和密码。

步骤:

看到群里有人反映问题:容器在创建成功之后就停止了,用docker logs查看日志发现unrecognized service错误

解决方法:把版本改为5.7

所以就直接在刚开始拉取版本号为5.7的mysql

1.创建mysql文件夹,里面有dockerfile,需要导入数据的mysql脚本命令schema.sql,mysql权限设置命令privileges.sql,容器启动脚本setup.sh,直接打开编写。



2.构建自定义镜像

docker build -t mymysql:v1 .

启动mysql1容器并将端口映射到本地的3306端口:

docker run --name mysql1 -p 3306:3306 -d mymysql:v1

3.docker ps查看容器状态

docker logs musql1查看容器的日志记录,启动过程与启动脚本setup.sh中所规范的步骤一致,数据导入和权限设置成功:

4.进入容器并使用privileges.sql中的指定用户名和密码进入数据库

docker exec -it mysql1 /bin/bash
mysql -u hh -p

5.查看已经存在的数据库

mysql>show databases;

分号不能拉下!

6.进入数据库并查表

use mysql1

select * from user;

三、小结

1.步骤9输入网址时 冒号写成/

(其实我心里是不愿意承认因为这个dockerfile和default.conf找错了找了半个多小时)

因为上面的错误,一直在尝试,最后开了很多容器,

下面的命令可以清理掉所有处于终止状态的容器。

$ docker container prune

2.Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。尽量少使用RUN

3.CMD 容器启动命令

shell 格式为 CMD <命令>

exec 格式为 CND ["可执行文件", "参数1", "参数2"]

使用 shell 格式的话,实际的命令会被包装成 sh -c 的形式进行执行,比如:

CMD echo $HOME 在实际执行中,将会变成 CMD [ "sh", "-c", "echo $HOME" ]

在使用 CMD 的时候一般推荐使用 exec 的格式,需要注意的是 exec 的格式会被解析成 JSON 数组,所以只能够使用双引号,而不能使用单引号。

4.CMD类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:

  • CMD 在docker run 时运行
  • RUN 是在 docker build

5.docker build -t [镜像名称:镜像标签] .

点号!不要忘记写了!

6.mysql>show databases;

分号不能拉下

7.schema.sql中的`和'这两个符号要分清,不然会出现语法错误。

原文地址:https://www.cnblogs.com/huang0926huang/p/12764886.html