Appearance
Docker 基础入门
为什么要学习Docker
最近几年容器技术异常火热,作为容器技术代表的Docker自然也炙手可热,简直就是软件界的网红,这么火的Docker早就已经应用在生产环境中,国内容器圈内最具代表性的大厂就是阿里和京东。
京东从14年开始在生产环境进行容器化部署,15年618,京东跑了15万个Docker实例,到目前为止已经实现了100%应用容器化部署,根据CNCF(Cloud Native Computing Foundation)数据统计,世界上最大的Docker集群部署在京东!
京东首席架构师刘海锋:京东是Kubernetes最早期采用者之一。公司目前管理世界上最大的Kubernetes集群,多集群超过20,000多个裸机服务分布在多个地区的数据中心。
Docker 是什么
百度百科:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
精简版linux主机集合
精简版linux = 容器
为什么使用Docker
微服务或者SOA的时候就使用Docker
单机时代缺点
1、环境冲突
2、端口冲突
原因:部署耦合
虚拟机时代缺点
1、耗资源
2、启动非常耗时
3、使用困难
容器时代
1、Docker 是一个开源的应用容器引擎
2、资源复用技术
3、容器之间完全隔离
4、容器性能开销极低
Docker如何使用?
Docker概念介绍
1、容器 : 标准化的应用,真正干活的对象 (集装箱)
2、镜像 : 文件,创建容器的模板(集装箱模板)
3、仓库 :存储镜像(码头)
4、Docker主机 :管理容器和镜像(集装箱和大船)
5、Docker客户端:操作容器和镜像(码头工人)
Docker 概念之间关系
镜像和容器是一对多关系(类和对象的关系)
Docker下载安装
1、windows 安装
条件
1、windows 10 及以上
2、开启Hyper-V
3、安装Toolbox
最新版 Toolbox 下载地址: https://www.Docker.com/get-Docker
点击 Download Docker Desktop,并下载 Windows 的版本
2、linux安装
1、centos7.0 以上的版本
2、安装Docker 版本仓库 Docker版本
2.1 设置仓库
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
2.2 稳定仓库
sudo yum-config-manager --add-repo https://download.Docker.com/linux/centos/Docker-ce.repo
3、安装Docker(默认安装最新版本)
sudo yum install Docker-ce Docker-ce-cli containerd.io
如果要安装其他版本
要安装特定版本的 Docker Engine-Community,请在存储库中列出可用版本,然后选择并安装:
1、列出并排序您存储库中可用的版本。此示例按版本号(从高到低)对结果进行排序。
yum list Docker-ce --showduplicates | sort -r
Docker-ce.x86_64 3:18.09.1-3.el7 Docker-ce-stable
Docker-ce.x86_64 3:18.09.0-3.el7 Docker-ce-stable
Docker-ce.x86_64 18.06.1.ce-3.el7 Docker-ce-stable
Docker-ce.x86_64 18.06.0.ce-3.el7 Docker-ce-stable
2、通过其完整的软件包名称安装特定版本,该软件包名称是软件包名称(Docker-ce)加上版本字符串(第二列), 从第一个冒号(:)一直到第一个连字符,并用连字符(-)分隔。例如:Docker-ce-18.09.1。
sudo yum install Docker-ce-<VERSION_STRING> Docker-ce-cli-<VERSION_STRING> containerd.io
4、Docker启动
sudo systemctl start Docker
5、Docker 运行(判断是否安装成功)
sudo Docker run hello-world
3、Docker管理命令 Docker
4、Docker镜像命令 Docker image
5、Docker容器命令 Docker container
Docker运行应用
1、配置Dockerfile
FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /publish
EXPOSE 80
EXPOSE 443
COPY publish/ /publish
ENTRYPOINT ["dotnet", "ProductService.dll"]
2、生成镜像
Docker build -t productservice .
3、运行服务镜像
Docker run -p 5001:80 --name productservice productservice
Dockerfile
Dockerfile是什么
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
Dockerfile文件指令
FROM:指定基础镜像(FROM是必备的指令,并且必须为第一条指令)。
RUN: 用来执行命令行命令。其基本格式:
shell格式: RUN <命令> ,输入在bash环境中的命令即可,一个Dockerfile允许使用RUN不得超过127层,所以,使用一次RUN, 使用 ‘ \ ’ 换行,使用‘ && ’执行下一条命令。一般使用此种格式;
exec格式: RUN <"可执行文件", "参数1", "参数2">,此种方式像是函数调用中的格式;
COPY: 复制文件。 其基本格式:
格式1:COPY <源路径>...<目标路径>
格式2:COPY [“<源路径1>”,....."<目标路径>"]
ADD: 更高级的复制文件,在COPY的基础上增加了一些功能,如果复制的是压缩包的话,会直接解压,而不需要在使用RUN解压;
CMD:容器启动命令。其基本格式:
shell格式: CMD <命令>
exec格式: CMD ["可执行文件", "参数1", "参数2"...]
参数列表格式: CMD [“参数1”, “参数2”...],在指定了ENTRYPOINT指令后,用CMD指定具体的参数
ENTRYPOINT: 入口点。其基本格式分为exec和shell,
ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数。ENTRYPOINT在运行中可以替代,不过比CMD繁琐,需要通过Docker run 的参数--entrypoint 来指定。当指定了ENTRYPOINT后,CMD的含义就发生了改变,不在是直接运行其命令,而是将CMD的内容作为参数传递给ENTRYPOINT指令。其执行时就变成了: <ENTRYPOINT> "<CMD>"
ENV: 设置环境变量。(都可以使用这里使用的变量)其基本格式:
格式1:ENV <key> <value>
格式2:ENV <key1>=<value1> <key2>=<value>...
ARG: 构建参数。构建参数和ENV的效果一样,都是设置环境变量,所不同的是ARG所构建的环境变量在将来容器运行时是不存在的。其基本格式:
格式1: ARG <参数名> [=<默认值>]
格式2: 该默认值可以在构建命令 Docker build 中用 --build-arg <参数名>=<值> 来覆盖
VOLUME: 定义匿名卷。 其基本格式:
格式1: VOLUME ["<路径1>", "<路径2>"...]
格式2: VOLUME <路径>
EXPOSE: 暴露端口。EXPOSE指令是声明运行时容器所提供的端口,在启动容器时不会在因为这个声明而开启端口。 其基本格式:
格式1: EXPOSE <端口1> [<端口2>...]
WORKDIR: 指定工作目录。其基本格式:
格式1: WORKDIR <工作目录路径>
USER: 指定当前用户。USER是帮助你切换到指定用户。 其基本格式:
格式1: USER <用户名>
HEALTCHECK: 健康检查,判断容器的状态是否正常。 其基本格式:
格式1: HEALTCHECK [选项] CMD <命令> :设置检查容器健康状况的命令
格式2: HEALTCHECK NONE: 如果基础镜像有健康检查指令,使用此格式可以屏蔽掉其健康检查指令
Dockerfile文件核心指令
FROM 指定基础镜像构建
写法:
FROM 指定基础镜像
COPY 复制命令。从上下文目录中复制文件或者目录到容器里指定路径。
写法:
COPY 源路径,目标路径
COPY ["源路径","目标路径"]
RUN运行指令。构建的时候运行的指令
主要在于镜像构建的时候运行,运行build命令的时候
后面接的命令就是shell输入的命令
写法
RUN shell命令 参数1 参数2
RUN ["shell命令 ","参数1"," 参数2"]
例如:
RUN ["echo",">"," /usr/share/index.html"]
CMD运行指令。运行容器时候运行的指令
主要在于镜像运行容器的时候生成,运行run的时候运行
写法
CMD <shell 命令>
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
例如:
CMD ["dotnet","productservice.dll"]
缺点:在run 命令后面可以进行覆盖
Docker run -d -P productservice dotnet productservice.dll 进行覆盖掉
ENTRYPOINT运行指令。运行容器时候运行的指令(不会被覆盖)
写法
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
可以和CMD动态结合,设置动态的配置参数
例如
ENTRYPOINT ["nginx", "-c"] 定参
CMD ["/etc/nginx/nginx.conf"]变参
EXPOSE暴露端口指令
仅仅声明端口,就是指定镜像暴露的端口
在run 的时候,通过Docker run -p 会自动随机映射到EXPOSE端口
写法
EXPOSE 端口
EXPOSE 端口
例如
EXPOSE 5000
EXPOSE 5001
WORKDIR工作目录指令
用于应用在容器内的工作目录,就好比:ruanmou目录
写法
WORKDIR <工作目录路径>
例如
WORKDIR /service
或者
WORKDIR /nginx
Docker如何构建nginx镜像?
1、配置Dockerfile
nginx安装命令
1 安装 nginx需要工具
yum -y install gcc make pcre-devel zlib-devel tar zlib
2 下载nginx
wget http://nginx.org/download/nginx-1.15.2.tar.gz
3 nginx解压/nginx目录
tar -zxvf nginx-1.15.2.tar.gz
4 切换到/nginx/nginx-1.15.2
执行./configure
make
make install 进行安装
5 切换到/usr/local/nginx/sbin
执行 ./nginx 启动nginx
Dockerfile文件配置nginx
FROM centos
RUN cd /etc/yum.repos.d/
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
RUN yum makecache
RUN yum update -y
RUN yum -y install gcc make pcre-devel zlib-devel tar zlib
WORKDIR /nginx
COPY nginx-1.20.2.tar.gz /nginx
RUN tar -zxvf nginx-1.20.2.tar.gz
RUN cd nginx-1.20.2 && ./configure && make && make install
EXPOSE 80
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
2、Dockfile构建镜像
Docker build -t nginx .
3、运行nginx镜像
Docker run -p 8088:80 --name nginx nginx
4、浏览器进行访问
http://localhost:8088/
Docker容器必须要有前台进程
Docker 容器默认会把容器内部第一个进程,也就是pid=1
的程序作为Docker容器是否正在运行的依据,如果Docker容器中 pid = 1 的进程挂了,那么Docker容器便会直接退出,也就是说Docker容器中必须有一个前台进程,否则认为容器已经挂掉。