第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中修改外部机器的数据库