容器架构下
- 6. Dockerfile
- 6.1 Docker自动化DIY镜像之Dockerfile
- 1) 环境准备
- 2) 书写Dockerfile内容
- 3) 运行Dockerfile生成镜像
- 4) 运行容器
- 5) 小结
- 6.2 案例14:Dockerfile-RUN指令
- 1) 书写Dockerfile
- 2) 构建镜像
- 3) 启动容器
- 4) 测试结果
- 6.3 Dockerfile指令
- 7. 容器数据持久化
- 1)演示:
- a)启动数据库容器
- b)连接容器创建库
- c)删除容器,重新创建容器检查数据是否还在?
- 2)数据持久化
- 3)小结:
- 8. 容器镜像的私有仓库
- 1) 拉取registry镜像与修改配置文件
- 2)启动镜像仓库
- 3) 上传镜像到私有的镜像仓库
- 4) 删除本地镜像
- 5) 重新拉取
- 6)小结
6. Dockerfile
6.1 Docker自动化DIY镜像之Dockerfile
- 通过上个案例(手动创建镜像)发现很麻烦所以用dockerfile自动化创建镜像
- 这里我们就可以使用Dockerfile文件方法把定义镜像的流程,根据Dockerfile指令指定,最终生成我们想要的自定义镜像。
- 目标:
- 1️⃣会使用Dockerfile
- 2️⃣掌握如何书写Dockerfile
- 任务要求:通过Dockerfile一键创建小鸟飞飞的镜像。
1) 环境准备
- 创建目录:
mkdir -p /server/dockerfiles/01-bird
- 上传文件:上传
bird.zip
到linux(/root/即可) - 解压:
unzip bird.zip
- 复制文件到目录中:
cp -a bird /server/dockerfiles/01-bird
2) 书写Dockerfile内容
- 梳理自定义bird镜像的流程(对镜像的操作)
自定义镜像流程 | 步骤 | Dockerfile指令 |
---|---|---|
1️⃣ | 选择基础镜像 nginx:1.24 | FROM nginx:1.24 |
2️⃣ | 把bird代码传输到 /usr/share/nginx/html/目录下。 通过Dockerfile处理的 文件或目录放在Dockerfile所在目录。 | ADD bird/ /usr/share/nginx/html/ ADD 宿主机目录或文件 镜像目录 |
3️⃣ | 完成 | CMD指令 |
- Dockerfile
#1. Dockerfile所在目录结构 drwxr-xr-x 3 root root 98 11月 16 2021 bird #Dockerfile需要的bird目录 -rw-r--r-- 1 root root 239 8月 14 09:31 Dockerfile #Dockerfile文件 #2. 编辑Dockerfile vim Dockerfile #指定基础镜像 FROM nginx:1.24 #镜像的说明信息 LABEL author=lidao996 url=www.oldboyedu.com #传输内容 ADD bird/ /usr/share/nginx/html/ #指定容器入口指令 #用于启动ngx服务 CMD ["nginx","-g","daemon off;"]
3) 运行Dockerfile生成镜像
- 进入Dockerfile所在目录:
cd /server/dockerfiles/01-bird/
- 生成镜像命令:
docker build -t oldboydir:lidao996_bird_diy_v2 .
- -t tag标签,用于指定新镜像的分类:名字_版本
.
指定Dockerfile就在当前目录
4) 运行容器
- 根据新的镜像启动容器:
docker run -d -p 12306:80 --name bird_diy_v2 oldboydir:lidao996_bird_diy_v2
- 检查容器运行情况:
docker ps |grep bird_diy_v2
- 浏览器检查:登录
10.0.0.62:12306
5) 小结
- Dockerfile作用与指令。
- 一般根据手动的步骤,把步骤转行为Dockerfile.
- 开头部分
- FROM
- LABEL
- 中间过程
- ADD/COPY
- 结尾部分
- CMD
6.2 案例14:Dockerfile-RUN指令
- 创建一个nginx自定义镜像,镜像首页文件内容要是oldboyedu.com.
- echo命令修改文件内容。
echo oldboyedu.com >/usr/share/nginx/html/index.html
- 创建自定义镜像的时候执行Linux命令。
1) 书写Dockerfile
mkdir -p /server/dockerfiles/02-ngx
cd /server/dockerfiles/02-ngx
vim Dockerfile
FROM nginx:1.24
LABEL author=lidao996 url=www.oldboyedu.com
RUN echo oldboyedu.com >/usr/share/nginx/html/index.html
CMD ["nginx","-g","daemon off;"]
2) 构建镜像
docker build -t oldboydiy:test_v2 .
3) 启动容器
docker run -d -p 10086:80 oldboydiy:test_v2
4) 测试结果
6.3 Dockerfile指令
Dockerfile指令 | 含义 | 应用 | 建议 |
---|---|---|---|
Dockerfile开头部分 | |||
FROM | 指定基本镜像类似于docker pull 下载镜像 | FROM ubuntu:20.04 | 尽量少写ubuntu或ubuntu:latest,尽量指定具体的版本. |
LABEL | 用于指定容器的属性信息,作者,个人联系方式(邮件)… | LABEL maintainer=“lidao996 youjiu_linux@qq.com” | 推荐使用LABEL,不推荐使用下面的MAINTAINER |
ENV | 用于创建Dockerfile中使用的变量 | ENV Tengine_Version空格2.3.3 | 软件版本可以创建使用变量. |
Dockerfile中间处理部分 | |||
RUN | 制作镜像过程中需要的执行命令,通常系统配置,服务配置,部署。 但不能出现阻塞当前终端的命令。 | RUN 系统命令即可. | 不建议使用连续多个RUN,合并连续多个RUN. |
ADD | 可以把指定文件或目录拷贝到容器中(指定目录),会解压压缩包. 相对于当前目录. | ADD restart.tar.gz空格/app/code/restart/ | 拷贝压缩包使用. |
COPY | 可以把指定文件或目录拷贝到容器中(指定目录),不支持自动解压. 相对于当前目录. | COPY nginx.conf空格 /etc/nginx/nginx.conf | 拷贝文件或目录. |
Dockerfile结尾部分书写的内容 | |||
CMD | 用于指定容器的入口命令.入口命令可以在docker run的时候替换.==运行镜像启动容器的时候,容器默认运行的命令是什么. | CMD [“命令”,“参数01”,“参数02”] CMD [“nginx”,“-g”,“daemon off;”] | 大部分都会使用CMD. |
7. 容器数据持久化
1)演示:
a)启动数据库容器
docker run -d -p 13306:3306 --name mysql_8.0_v3 -e MYSQL_ROOT_PASSWORD=1 mysql:8.0-debian
b)连接容器创建库
- 进入到数据库创建数据库
c)删除容器,重新创建容器检查数据是否还在?
- 数据丢失
2)数据持久化
- 把容器中的文件或目录连接到宿主机中。
- 把宿主机的/server/data/mysql/目录连接到容器中/var/lib/mysql/
- 准备宿主机的数据目录:
mkdir -p /server/data/mysql/
- 使用-v参数连接宿主机与容器(
-v 宿主机的目录或文件:容器中的目录或文件
,把宿主机中的目录或文件挂载(连接)到容器中。)docker run -d -p 13306:3306 --name mysql_8.0_v3 -e MYSQL_ROOT_PASSWORD=1 \ -v /server/data/mysql/:/var/lib/mysql/ mysql:8.0-debian
- 检查结果:
/server/data/mysql/
下增加了很多文件 - 进入容器创建库:
docker exec -it mysql_8.0_v3 mysql -uroot -p1
#这样可以直接进入数据库 - 创建库:
create database lidao996;
- 退出然后删除容器:
docer rm -f mysql_8.0_v3
- 重新创建容器并检查库是否还在
docker run -d -p 13306:3306 --name mysql_8.0_v3 -e MYSQL_ROOT_PASSWORD=1 \
-v /server/data/mysql/:/var/lib/mysql/ mysql:8.0-debian
docker exec -it mysql_8.0_v3 mysql -uroot -p1 #这样可以直接进入数据库
show databases; #数据库还在
3)小结:
- 理解什么是容器的数据持久化即可。为何要做持久化。
- docker run 加上-v选项
- 应用数据库数据目录做做持久化。
- 用于测试代码:nginx /usr/share/nginx/html/连接到宿主机的代码目录。
- 用于测试配置:nginx.conf ,my.cnf 配置文件。
8. 容器镜像的私有仓库
- registry仓库(简单,命令行),harbor仓库(复杂,web界面)。
1) 拉取registry镜像与修改配置文件
- 拉镜像:
docker pull registry
- 修改所有docker配置文件
cat > /etc/docker/daemon.json<<'EOF' { "registry-mirrors": ["https://bjjtv7cs.mirror.aliyuncs.com"], "insecure-registries": ["10.0.0.62:5000"] } EOF systemctl restart docker
2)启动镜像仓库
mkdir -p /server/data/images/
docker run -d --name "oldboy_registry" -p 5000:5000 \
-v /server/data/images/:/var/lib/registry \
--restart=always registry
3) 上传镜像到私有的镜像仓库
docker tag oldboydir:lidao996_bird_diy_v2 10.0.0.62:5000/oldboyedu/ngx:bird_diy_v2
#docker login -u用户名 -p密码
docker push 10.0.0.62:5000/oldboyedu/ngx:bird_diy_v2
4) 删除本地镜像
docker rmi 镜像名字
如果镜像使用中则需要删除镜像对应的容器,然后删除镜像。
5) 重新拉取
docker pull 10.0.0.62:5000/oldboyedu/ngx:bird_diy_v2
6)小结
-
未来使用内部私有镜像仓库。
-
会通过docker tag +docker push 上传。
-
会通过docker pull 下载即可。
-