第2次实践作业

一、实现一个自定义的web容器服务(部署nginx)

(1)获取最新版的nginx镜像

sudo docker pull nginx:latest

(2)查看当前所有镜像

sudo docker images

(3)创建并启动以nginx为镜像的容器

docker run 参数

  • -i:保持容器运行。通常与 -t 同时使用。加入it这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭。
  • -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用。
  • -d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。退出后,容器不会关闭。
  • -it:创建的容器一般称为交互式容器,-id 创建的容器一般称为守护式容器
  • --name:为创建的容器命名
  • -p 8080:80: 将容器的80端口映射到宿主机的8080端口
sudo docker run --name zzq_nginx -p 8080:80 -d nginx

(4)查看所有容器

sudo docker ps -a

值得注意的是STATUS状态表示容器是否开启,UP表示开启,EXIT表示关闭

(5)验证浏览器可以直接访问nginx服务

接着配置属于自己的镜像容器

(6)先进入nginx容器获取其默认的配置信息

sudo docker exec -it 0663d22d52a0 /bin/bash
cd /etc/nginx/conf.d
cat default.conf 

(7)接下来需要创建三个文件,分别为default.conf, index.html, dockerfile

先创建目录nginx,然后进入该目录,并获取该目录的路径,开始写default.conf

①default.conf

使用命令 cat default.conf 查看修改的内容

  • listen表示侦听端口

  • location表示路径,‘/’代表不管访问主页还是子路径都进入这个location进行访问,‘root’是存放首页的路径,‘index’用来指定首页文件,首选index.html,如果没有找到就选index.htm(类似DNS的主备)

②index.html

表示要展示的网页内容,这里我只写了一句话

③Dockerfile
具体解释参考下面表格

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

(8)一切工作准备完毕,开始创建镜像my_nginx

sudo docker build -t my_nginx .

注意最后有一个点,表示在当前路径的Dockerfile进行构建

(9)查看所有镜像

sudo docker images

(10)创建并启动以my_nginx为镜像的容器my_nginx

sudo docker run --name c_nginx -p 2223:2223 -d nginx

(11)查看容器状态

sudo docker ps -a

由图可以看出两个容器都在运行状态,并且my_nginx容器端口是以2223与宿主机的端口2223互相映射

(12)最后,验证结果


 

  总结:其实整个过程就是对nginx的部署,使用default.conf来配置nginx,而index.html用来显示网页,最后通过dockerfile文件来构建这个镜像。

  还有一种方法可以通过docker容器的数据卷,把容器目录和数据卷目录绑定后,可以直接修改docker容器,这种方法的好处就是使容器数据持久化、外部机器和容器间直接通信、容器之间也可以进行数据交换。例如:

sudo docker run -id --name=c_nginx \
> -p 2223:2223 \
> -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
> -v $PWD/logs:/var/log/nginx \
> -v $PWD/html:/usr/share/nginx/html \
> nginx

参数说明:

  • -p 2223:2223:将容器的2223端口映射到宿主机的2223端口。
  • -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:将主机当前目录下的 /conf/nginx.conf 挂载到容器的 :/etc/nginx/nginx.conf。配置目录
  • -v $PWD/logs:/var/log/nginx:将主机当前目录下的 logs 目录挂载到容器的/var/log/nginx。日志目录

 


 

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

首先创建mysql文件夹mkdir mysql,然后进入该目录 cd mysql

(1)拉取版本为5.7mysql镜像

sudo docker pull mysql:5.7

(2)查看所有镜像

sudo docker images

(3)接下来开始编写四个文件,分别是dockerfile、setup.sh、schema.sql、privileges.sql

①dockerfile

文件有很多可选项,题目要求设置数据库的root密码,且不允许空密码登录,故而有

  • ENV MYSQL_ROOT_PASSWORD 123456
  • ENV MYSQL_ALLOW_EMPTY_PASSWORD no

这两项分别表示root密码,和不允许空密码。root密码在创建容器时需要用到。

②setup.sh

是一个对数据库进行操作的脚本

③schema.sql

在该文件中配置数据库的一系列信息,例如创建数据的名称,建表,插入数据等操作

④privileges.sql

主要是对权限的管理

(4)所有文件填写完毕,开始创建镜像zzq_mysql

sudo docker build -t zzq_mysql .

(5)构建完,查看镜像

sudo docker images

(6)创建并启动以zzq_mysql为镜像的容器zzq_mysql

sudo docker run --name zzq_mysql -p 3306:3306 -d -e MYSQL_ROOT_PASSWORD=123456 zzq_mysql

(7)查看所创建的容器状态

sudo docker ps -a

(8)查看日志记录

脚本完美执行~,数据导入和数据库的权限设置都成功

(9)进入zzq_mysql容器

sudo docker exec -it zzq_mysql /bin/bash

(10)登录mysql

用户名是kingdom, 密码是123456

mysql -u kingdom -p

(11)查看所有数据库

注意:对数据库的操作都要以冒号结尾

show databases;

(12)进入我们创建的docker_mysql数据库中

use docker_mysql;

(13)查询结果

select * from test;


 

  总结:部署mysql的过程和部署nginx的过程相似,都是通过一系列文件完成配置。

  所以部署mysql同样可以利用容器数据卷实现一些额外的功能,例如:实现外部机器和容器的通信功能

  • 创建容器、设置端口映射、目录映射

    docker run -id \
    -p 3306:3306 \
    --name=c_mysql \
    -v $PWD/conf:/etc/mysql/conf.d \
    -v $PWD/logs:/logs \
    -v $PWD/data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=123456 \
    mysql:5.7
    
    • -p 3306:3306:将容器的 3306 端口映射到宿主机的 3306 端口。
    • -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。配置目录
    • -v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。日志目录
    • -v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。数据目录
    • -e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。
  • 进入容器,操作mysql

    docker exec –it c_mysql /bin/bash
    
  • 使用外部机器连接容器中的mysql

  • 之后便可以在外部机器中修改容器mysql的内容,也可以在容器mysql中修改外部机器的数据库
     


 

  两个实验的总结:万事开头难,刚开始的时候第一个实验就是一点都不懂,然后慢慢学下来的,看别人都是顺利流畅做下来,但到自己做的时候就完全不一样的感觉了,比如一个命令或者名字啥的敲错,可能就让你找半个小时的错误。到第二实验就轻松了许多,但拉取最新版的mysql时就是不行,只好使用5.7版本,所幸也完成了这次作业

  同时,我发现一个很有趣的现象,在拉取centos镜像的时候,只有200MB,而一个centos操作系统的iso文件要几个G。在拉取mysql镜像的时候,有500MB,而一个mysql安装包却比500M小,相信随着这门课的深入学习,会得到一个较好的解答!

posted @ 2020-04-24 21:32  诶嘿,你喜欢河马吗?  阅读(237)  评论(1编辑  收藏  举报