系统综合实践第二次作业

一、Dockerfile

1.WEB容器

web容器是一种服务程序,在服务器一个端口就有一个提供相应服务的程序,而这个程序就是处理从客户端发出的请求,如JAVA中的Tomcat容器,ASP的IIS或PWS都是这样的容器。一个服务器可以有多个容器。

2.数据库容器服务

学习数据库, 肯定需要搭建所学习的数据库服务, 往往物理搭建数据库服务比较麻烦, 导致会浪费大量的时间用于搭建数据库, 所以我们可以用 docker 快速搭建MySQL、Redis、MongoDB 数据库,帮助我们学习、测试,甚至用于一些生产服务。

3.Dockerfile

Dockerfile是docker中镜像文件的的描述文件,文本内容包含了一条条构建镜像所需的指令和说明。一般分为四部分,基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

4.Dockerfile的关键字

关键字 作用 备注
FROM 指定父镜像 指定dockerfile基于那个image构建,必须为第一个命令。FROM /FROM :
MAINTAINER 作者信息 用来标明这个dockerfile谁写的。MAINTAINER
LABEL 标签 用来标明dockerfile的标签 可以使用Label代替Maintainer 最终都是在docker image基本信息中可以查看。LABEL = = = ...
RUN 执行命令 构建镜像时执行的命令。RUN <命令行命令> /RUN ["可执行文件", "参数1", "参数2"]
CMD 容器启动命令 提供启动容器时候的默认命令 和ENTRYPOINT配合使用。CMD ["executable","param1","param2"] (执行可执行文件,优先) /CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数) /CMD command param1 param2 (执行shell内部命令)
ENTRYPOINT 入口 一般在制作一些执行就关闭的容器中会使用。ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)/ENTRYPOINT command param1 param2 (shell内部命令)
COPY 复制文件 build的时候复制文件到image中。COPY ... /COPY ["",... ""]
ADD 添加文件 build的时候添加文件到image中 不仅仅局限于当前build上下文 可以来源于远程服务。ADD ... /ADD ["",... ""] 用于支持包含空格的路径
ENV 环境变量 指定build时候的环境变量 可以在启动的容器的时候 通过-e覆盖 。ENV /ENV = =...
ARG 构建参数 构建参数 只在构建的时候使用的参数 如果有ENV 那么ENV的相同名字的值始终覆盖arg的参数。ARG [=]
VOLUME 定义外部可以挂载的数据卷 用于指定持久化目录。VOLUME VOLUME [,...]
EXPOSE 暴露端口 定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露端EXPOSE [...]
WORKDIR 工作目录 指定容器内部的工作目录 如果没有创建则自动创建 如果指定/ 使用的是绝对地址 如果不是/开头那么是在上一条workdir的路径的相对路径。WORKDIR
USER 指定执行用户 指定build或者启动的时候 用户 在RUN CMD ENTRYPONT执行的时候的用户。USER [:]
HEALTHCHECK 健康检查 指定监测当前容器的健康监测的命令 基本上没用 因为很多时候 应用本身有健康监测机制
ONBUILD 触发器 当存在ONBUILD关键字的镜像作为基础镜像的时候 当执行FROM完成之后 会执行 ONBUILD的命令 但是不影响当前镜像 用处也不怎么大。ONBUILD [INSTRUCTION]
STOPSIGNAL 发送信号量到宿主机 该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。
SHELL 指定执行脚本的shell 指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shell

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

从 docker hub拉取nginx作为基础镜像。

通过查看可以发现nginx已经拉取成功。

使用 NGINX 默认的配置来启动。
其中,该命令的四个命令行参数的含义如下。
--rm:容器终止运行后,自动删除容器文件。
--name nginx-test:容器的名字叫做nginx-test,名字自己定义.
-p: 端口进行映射,将本地 8080 端口映射到容器内部的 80 端口
-d:容器启动后,在后台运行

查看启动的docker容器。

进入nginx容器并查看其配置信息。

在主目录中创建rae文件夹并在该文件下创建文件default.conf,修改配置文件监听端口和根目录。

在同一目录下创建dockerfile文件并编辑。

FROM nginx #镜像来源
MAINTAINER WRQ #拥有者
COPY default.conf /etc/nginx/conf.d/ #复制文件到镜像
COPY index.html /usr/myweb/ #复制文件到镜像
WORKDIR /home/system/web #设置工作目录
EXPOSE 4500 #设置暴露端口号

创建一个index.html文件。

打开dockerfile文件存放目录。
其中,testrnginx是所要构建镜像的名称,. 表示上下文。

验证查看testrnginx是否构建成功。

启动webnginx容器并映射端口。

通过浏览器查看nginx网页(访问4500端口)。

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

首先从镜像库中获取mysql:5.7镜像。

验证查看是否pull成功。

pull成功后,创建dockerfile、setup.sh、schema.sql、privileges.sql,这四个文件都放在mysql文件夹下。

Dockerfile:
基础镜像
FROM mysql:5.7
维护者信息
MAINTAINER Yao
设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"]
setup.sh:
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
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(10) NOT NULL,
name varchar(10) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
插入数据
INSERT INTO user (id, name)
VALUES
('1','rae');
privileges.sql:
use mysql;
select host, user from user;
create user Yao identified by '123456';
-- 将docker_mysql数据库的权限授权给创建的用户rae,密码为123456:
grant all on docker_mysql.* to rae@'%' identified by '123456' with grant option;
-- 这一条命令一定要有:
flush privileges;

创建镜像。

执行docker images查看该镜像是否构建成功。

启动lrmysql容器并将端口映射到本地的3306端口。

查看容器的日志记录,启动过程是否与启动脚本setup.sh中的步骤一致。

验证结果:
执行exec命令进入lrmysql容器,使用rae用户登录数据库。

查看数据库。

切换至docker_mysql数据库。

查询user表并退出mysql。

查看lrmysql容器配置。

[
{
"Id": "sha256:5c3a657abb9cea2b943ccf5088fdb28a3c535623b7246fe7f84b7ff477763bf3",
"RepoTags": [
"testrmysql:latest"
],
"RepoDigests": [],
"Parent": "sha256:3f1a15dad9229bdb248c1ed6da18eed83a29c81ba41b2d2b8f90fd5a4836df57",
"Comment": "",
"Created": "2020-04-23T13:04:02.203170749Z",
"Container": "16591b6331236c0afad14ede3d48169c66c91005ebef941460f05c1ed600229c",
"ContainerConfig": {
"Hostname": "16591b633123",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"3306/tcp": {},
"33060/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"GOSU_VERSION=1.12",
"MYSQL_MAJOR=5.7",
"MYSQL_VERSION=5.7.29-1debian10",
"MYSQL_ALLOW_EMPTY_PASSWORD=no",
"MYSQL_ROOT_PASSWORD=123456"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD ["sh" "/mysql/setup.sh"]"
],
"Image": "sha256:3f1a15dad9229bdb248c1ed6da18eed83a29c81ba41b2d2b8f90fd5a4836df57",
"Volumes": {
"/var/lib/mysql": {}
},
"WorkingDir": "",
"Entrypoint": [
"docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": {}
},
"DockerVersion": "19.03.8",
"Author": "Yao",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"3306/tcp": {},
"33060/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"GOSU_VERSION=1.12",
"MYSQL_MAJOR=5.7",
"MYSQL_VERSION=5.7.29-1debian10",
"MYSQL_ALLOW_EMPTY_PASSWORD=no",
"MYSQL_ROOT_PASSWORD=123456"
],
"Cmd": [
"sh",
"/mysql/setup.sh"
],
"Image": "sha256:3f1a15dad9229bdb248c1ed6da18eed83a29c81ba41b2d2b8f90fd5a4836df57",
"Volumes": {
"/var/lib/mysql": {}
},
"WorkingDir": "",
"Entrypoint": [
"docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": null
},
"Architecture": "amd64",
"Os": "linux",
"Size": 455220563,
"VirtualSize": 455220563,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/fb48672a7436088cb2e9e5ac7c692de74af14b87f9bc642ceb4fc648a801d52a/diff:/var/lib/docker/overlay2/4ecac78190f1af8b5e31e79abb34a5b8286a0674cba8588dfef56417fae1997a/diff:/var/lib/docker/overlay2/0e3873c99382489397983a70b78e8dbdee7917d5273deca0cff3d654964bb591/diff:/var/lib/docker/overlay2/75425f9f4ad12f5715bdfc2e27705135150163703c095272d2ab8e1561c18574/diff:/var/lib/docker/overlay2/765d005062534f066eb7f517353fc602eee240084a8905f35d36bbfb3dadc31b/diff:/var/lib/docker/overlay2/7eda67c9cde9a9c9dd550f0b5539ed1f4fec43c7e61c100f4abea80f57585a64/diff:/var/lib/docker/overlay2/feec49e778e95338e733d52c46ede542dd5a3511af2225809e6e4a5188e4d0dc/diff:/var/lib/docker/overlay2/07e2641bea62e35582af808093bdbfd5acf5ee1f8f6910e561d7ad929ec9bceb/diff:/var/lib/docker/overlay2/16c8a731ad3cea46dced0a4f08876d00e157bb873cb079defe3ef7927420adeb/diff:/var/lib/docker/overlay2/c91380ec744e9a75407ee2a215726bcc0d0cdcffad88648e64d13ba2b88b2e54/diff:/var/lib/docker/overlay2/c4c344d161d29d07b88695f5e800de6b4367ee5b48301f45fe79baff7854d357/diff:/var/lib/docker/overlay2/f6377a2a47f38c76ee89302053b6fafeea2aeb2597c72a1a8aa781201a8b1e85/diff:/var/lib/docker/overlay2/f8378da354b8323aa2aed4fd5d7a7ad85f74c6174eae84d39ac9a7cf73bbc0a1/diff",
"MergedDir": "/var/lib/docker/overlay2/81b7d99513d28c3c250531993a1da4d507f7d361ed40d76938782402b6b30bbe/merged",
"UpperDir": "/var/lib/docker/overlay2/81b7d99513d28c3c250531993a1da4d507f7d361ed40d76938782402b6b30bbe/diff",
"WorkDir": "/var/lib/docker/overlay2/81b7d99513d28c3c250531993a1da4d507f7d361ed40d76938782402b6b30bbe/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:c2adabaecedbda0af72b153c6499a0555f3a769d52370469d8f6bd6328af9b13",
"sha256:49003fe88142d189c33a6e52b97081c8d62b67e0d04e9e7421ca6a2495b0d766",
"sha256:8d3b3830445d713c580008a547de7398ab721a083fda915526ce2cc557c4f40a",
"sha256:49baacc63c3bb5a7ab5077ef6458d6e246710195d7794cb704940f3a40495c23",
"sha256:24bd91e7be374167e51e37faa31e7ce143921afb0b968415c749625319386fdb",
"sha256:d84f8cf1dc236ea2ddbc0393b0c33099bedb20fffbe68bdf170d2df161a1ca16",
"sha256:ace74cb61ec0a3fd2847dc3a0b8b0cad349c95ce02732982e258fc1a337d073f",
"sha256:b95bdae56125bb1f1bab7a358a00afc12410db42e95a4c68e4c0e7268ea02679",
"sha256:d480fcc12a00df2a01e865d1085ed7a6a9d6a6090f13f20ea093ab65005c0def",
"sha256:83daf8b472c1cf148d48b033053044da7930498814263961eed24235bbef2baa",
"sha256:bb45db375972c4b769db3c73b78e4f7c48232331edbec9aacc92d9a2b7f7c28d",
"sha256:b4670b7f641b3200166b3efa06e1349d8ebf55d29f28ddf2a3f3772811c10c90",
"sha256:0f15c7311e04ea72d0dd0f99c5c033609c1f585b9574e1116fc03fd435be1fcd",
"sha256:df2edbb794f98925d2ec8764045cd3a18a2db56b0143ab351a8e129d55593e99"
]
},
"Metadata": {
"LastTagTime": "2020-04-23T21:04:02.292469486+08:00"
}
}
]

四、问题记录

1.初看题目的时候有点懵,于是对题目里一些基本概念进行了初步了解和学习,以及归纳总结了一下Dockerfile的关键字,算是做了实验前准备。然后看了有同学推荐的教程视频:https://www.bilibili.com/video/BV167411g7Lg?p=14。
2.创建镜像时出现错误提示:

找了很久,百度了很久才发下,有网友说自己是dockerfile里的nginx写成了nignx,本来还想说自己应该不会是这么低级的错误,结果看了一下还真的是。虽然只是一个小错误,但是卡了很久,还是要注意。
3.做web容器的时候,镜像构建成功后连接还是失败。和同学交流以后了解到在配置文件default.conf改变了根目录,要在dockerfile中添加一条命令COPY index.html /home/system/usr。改完以后还是不行,检查了很久以后发现,前后有做了几次有改了设置的端口,但是dockerfile里面写的端口忘记改了,dockerfile里面写的端口和设置的端口不一样,这个失误找了很长时间,还是要注意细节。

原文地址:https://www.cnblogs.com/RAEQI/p/12768459.html