一、 实现一个自定义的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中的`和'这两个符号要分清,不然会出现语法错误。