镜像 (Image)
- 本质上由分层的文件系统组成,可以基于基础镜像通过文件系统分层进行继承
- 镜像是静态的概念,其每一层文件系统都是只读的
容器 (Container)
- 容器由镜像创建,容器被创建时本质上是在镜像分层文件系统的顶部,添加一个可读写的新层即容器层,容器层之下的为镜像层
- 一个镜像可以创建多个容器,新创建的容器层相互独立,共享镜像层资源
- 容器与镜像类似于对象和类的关系,镜像是用于创建容器的模板,容器是由镜像创建的实体
1.dockerfile指令
FROM FROM <image> #系统版本 FROM <image>:<tag> #系统版本+版本号
一般格式:FROM CentOS:7.2
在.netcore中一般是:FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
MAINTAINER #编辑作者的信息
RUN #基础镜像命令
RUN linux命令
一般使用&&连起来写防止镜像膨胀过大
ADD/COPY #从本地向制作的镜像中赋值文件,ADD可以复制url,可以赋值tar并解压。一般使用copy就行
ENTRYPOINT #容器启动后执行的命令
EXPOSE #声明的仅仅是端口,在使用docker run -p时,会自动随机映射EXPOSE的端口
WORKDIR /app #工作目录,必须是已经创建好的。docker build构建镜像的过程中每一个run都会新建一层,只用通过此指令指定的目录才会在每一层都存在
2.netcore单系统部署
2.1事例Dockerfile文件
FROM mcr.microsoft.com/dotnet/aspnet:5.0
WORKDIR /app
EXPOSE 5000
COPY . .
ENTRYPOINT ["dotnet", "testDocker.dll", "--urls", "http://*:5000;http://*:5001"]
2.2创建镜像
执行格式:docker build -t <要生成的镜像的名称> .
k8swebapi为镜像的名称
结尾的 . 指dockerfile路径(.是代表上下文路径,因为dockerfile就在当前目录下)
docker build -t imgtestdocker .
2.3创建容器并启动容器
使用docker run
-d代表是后台运行容器
--rm指定容器停止后自动删除容器, 用docker stop contriner 停止后自动删除该容器
--P(大写) 宿主主机自动分配端口并关联容器暴露的5000端口,外部使用宿主主机自动分配的端口访问web api服务
--name 容器名称
docker run -d --rm -P --name contTestDock imgtestdock

2.4.通过docker ps查看创建的容器,和宿主自动分配的端口49153。 容器内访问api服务端口5000, 容器外访问api服务端口49453
docker ps
PS:进入contTestDock容器,查看app目录,再请求api服务,如下所示:
docker exec -it dockerid bash
date #查看时间
docker exec -it 6a13d5065941 /bin/bash

访问结果
部署文件升级
1.将本地文件复制到容器中
docker cp 本地路径 容器Id或name:容器目录
2.将容器中的文件复制到本地文件
docker cp 容器Id或name:镜像路径 本地路径
docker cp /root/dsyzpapiupdate/ykdocker/ contTestDock:/
docker restart contTestDock
3.系统的伸缩部署和扩容
4.软件的docker部署方式,如mysql,gitlab。
5.时区问题
docker run -v /etc/localtime:/etc/localtime