Skip to content
On this page

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 概念之间关系

107dd630be438ee02a42ae2e922ced01

镜像和容器是一对多关系(类和对象的关系)

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容器中必须有一个前台进程,否则认为容器已经挂掉。

Date: 2023/2/23

Authors: 徐峰

Tags: Docker