百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 博客教程 > 正文

偷偷爆料下Docker学习,看这一篇就够了!十分推荐!!

connygpt 2024-12-27 16:03 5 浏览

一. 什么是容器?

生活中常将一个能用来承载物料的装置称之为容器,比如碗、盘子,杯子等,容器内可放入各种各样的物料,每一个容器都相互独立,不相互干扰

而我们计算机领域所说的容器通常是指一个包含了完整的运行时环境:除了应用程序本身之外,这个应用所需的全部依赖、类库、其他二进制文件、配置文件等,都统一被打入了一个称为容器镜像的包中。通过将应用程序本身,和其依赖容器化,操作系统发行版本和其他基础环境造成的差异,都被抽象掉了。Docker 现在几乎是容器的代名词,是这个生态系统的基石,但完善的生态系统才是保障 Docker 以及容器技术能够真正健康发展的决定因素。

二. Docker简介

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口,Docker的logo是一个巨鲸,它上面托运了很多集装箱;可以把鲸鱼看成是货轮,相当于是一个平台,上面放的集装箱可以看成是容器,集装箱容器里面装的就是各种项目,而且集装箱与集装箱之间没有任何联系,它们是相互隔离的。

通俗点说,就是我们使用 Docker,使得运行在 Docker 容器上面的应用,配置好一次环境,换到别的机器上可以一键部署,大大简化了操作,实现了跨平台,跨服务器,由下而上打包,达到应用程式跨平台间的无缝接轨运作。一句话,Docker解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。

Docker 包括三个基本概念:

镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。

容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。 Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。

Docker

面向对象

容器

对象

镜像

三.Docker安装指导

以CentOS系统为例,进行安装指导。Docker 支持以下的 64 位 CentOS 版本:CentOS 7,CentOS 8以及更高版本。

安装docker准备工具:

sudo yum install yum-utils
  1. 1. 使用官方脚本自动安装curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun也可以使用国内 daocloud 一键安装命令:
    curl -sSL https://get.daocloud.io/docker | sh 2. 手动安装 1).卸载旧版本 较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序,请卸载它们以及相关的依赖项。yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine

安装 Docker Engine-Community

使用 Docker 仓库进行安装在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库。之后,您可以从仓库安装和更新 Docker。设置仓库安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。

使用以下命令来设置稳定的仓库。

使用官方源地址(比较慢)

sudo yum-config-manager  --add-repo   https://download.docker.com/linux/centos/docker-ce.repo

备注:如果出现yum-config-manager命令找不到,请先执行yum install yum-utils 安装yum工具。

可以选择国内的一些源地址:

阿里云

sudo yum-config-manager  --add-repo  http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

清华大学源

$ sudo yum-config-manager   --add-repo    https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo

安装最新版本的 Docker Engine-Community 和 containerd,或者转到下一步安装特定版本:

$ sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

如果提示您接受 GPG 密钥,请选择是。

有多个 Docker 仓库吗?

如果启用了多个 Docker 仓库,则在未在 yum install 或 yum update 命令中指定版本的情况下,进行的安装或更新将始终安装最高版本,这可能不适合您的稳定性需求。

Docker 安装完默认未启动。并且已经创建好 docker 用户组,但该用户组下没有用户。

要安装特定版本的 Docker Engine-Community,请在存储库中列出可用版本,然后选择并安装:

列出并排序您存储库中可用的版本。此示例按版本号(从高到低)对结果进行排序。

[root@iZuf62zo5nlme1u9q6ibrpZ ~]# yum list docker-ce --showduplicates | sort -r 
Loading mirror speeds from cached hostfile
Loaded plugins: fastestmirror
Installed Packages
docker-ce.x86_64            3:23.0.1-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:23.0.1-1.el7                     @docker-ce-stable
docker-ce.x86_64            3:23.0.0-1.el7                     docker-ce-stable 
docker-ce.x86_64            3:20.10.9-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.8-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.7-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.6-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.5-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.4-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.3-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.2-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.23-3.el7                   docker-ce-stable 
docker-ce.x86_64            3:20.10.22-3.el7                   docker-ce-stable 
docker-ce.x86_64            3:20.10.21-3.el7                   docker-ce-stable 
docker-ce.x86_64            3:20.10.20-3.el7                   docker-ce-stable

通过其完整的软件包名称安装特定版本,该软件包名称是软件包名称(docker-ce)加上版本字符串(第二列),从第一个冒号(:)一直到第一个连字符,并用连字符(-)分隔。例如:docker-ce-18.09.1。

sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

启动 Docker。

sudo systemctl start docker

配置开机启动docker

sudo systemctl enable docker

通过运行 hello-world 镜像来验证是否正确安装了 Docker Engine-Community 。

sudo docker run hello-world

卸载 docker

删除安装包:

yum remove docker-ce

删除镜像、容器、配置文件等内容:

rm -rf /var/lib/docker
rm -rf /var/lib/containerd

docker信息查看命令:

docker version 
docker info 
docker 命令--help #帮助命令

四. Docker组件及基本使用

  1. Docker镜像及其基本使用(Image)


1).概念

我们都知道,操作系统分为 内核 和 用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:18.04 就包含了完整的一套 Ubuntu 18.04 最小系统的 root 文件系统。

Docker 镜像 是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像 不包含 任何动态数据,其内容在构建之后也不会被改变。

2).基本使用

  • 列出镜像
[root@iZuf62zo5nlme1u9q6ibrpZ ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
nginx         latest    3f8a00f137a0   13 days ago     142MB
hello-world   latest    feb5d9fea6a5   17 months ago   13.3kB
  • 查询镜像
[root@iZuf62zo5nlme1u9q6ibrpZ ~]# docker search nginx
NAME                                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                                             Official build of Nginx.                        18131     [OK]       
bitnami/nginx                                     Bitnami nginx Docker Image                      152                  [OK]
bitnami/nginx-ingress-controller                  Bitnami Docker Image for NGINX Ingress Contr…   23                   [OK]
ubuntu/nginx                                      Nginx, a high-performance reverse proxy & we…   79                   
kasmweb/nginx                                     An Nginx image based off nginx:alpine and in…   4                    
rancher/nginx-ingress-controller                                                                  11                   
rancher/nginx-ingress-controller-defaultbackend                                                   2                    
bitnami/nginx-exporter                                                                            3                    
rancher/nginx                                                                                     2                    
rapidfort/nginx-ib                                RapidFort optimized, hardened image for NGIN…   0                    
ibmcom/nginx-ingress-controller                   Docker Image for IBM Cloud Private-CE (Commu…   4                    
rapidfort/nginx                                   RapidFort optimized, hardened image for NGINX   2                    
vmware/nginx-photon                                                                               1                    
ibmcom/nginx-ingress-controller-ppc64le           Docker Image for IBM Cloud Private-CE (Commu…   0                    
bitnami/nginx-ldap-auth-daemon                                                                    3                    
ibmcom/nginx-ppc64le                              Docker image for nginx-ppc64le                  0                    
vmware/nginx                                                                                      2                    
rancher/nginx-conf                                                                                0                    
rapidfort/nginx-official                          RapidFort optimized, hardened image for NGIN…   1                    
linuxserver/nginx                                 An Nginx container, brought to you by LinuxS…   186                  
privatebin/nginx-fpm-alpine                       PrivateBin running on an Nginx, php-fpm & Al…   72                   [OK]
bitnami/nginx-intel                                                                               1                    
rancher/nginx-ssl                                                                                 0                    
circleci/nginx                                    This image is for internal use                  2                    
continuumio/nginx-ingress-ws                                                                      0

通过收藏数来过滤

[root@iZuf62zo5nlme1u9q6ibrpZ ~]# docker search --filter stars=50 mysql
NAME                    DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                   MySQL is a widely used, open-source relation…   13837     [OK]       
mariadb                 MariaDB Server is a high performing open sou…   5279      [OK]       
percona                 Percona Server is a fork of the MySQL relati…   599       [OK]       
phpmyadmin              phpMyAdmin - A web interface for MySQL and M…   742       [OK]       
bitnami/mysql           Bitnami MySQL Docker Image                      80                   [OK]
databack/mysql-backup   Back up mysql databases to... anywhere!         81                   
  • 拉取镜像
docker pull [OPTIONS] NAME[:TAG|@DIGEST] #默认拉取最新版本的镜像

示例:

#拉取指定tag的镜像

docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
bb263680fed1: Pull complete 
258f176fd226: Pull complete 
a0bc35e70773: Pull complete 
077b9569ff86: Pull complete 
3082a16f3b61: Pull complete 
7e9b29976cce: Pull complete 
Digest: sha256:6650513efd1d27c1f8a5351cbd33edf85cc7e0d9d0fcb4ffb23d8fa89b601ba8
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

[root@iZuf62zo5nlme1u9q6ibrpZ ~]# docker pull mysql:5.7.25
  • 删除镜像
docker rmi 镜像:TAG#不带tag则是删除最新版本的镜像

示例:删除mysql:5.7.25

[root@iZuf62zo5nlme1u9q6ibrpZ ~]# docker rmi mysql:5.7.25
Untagged: mysql:5.7.25Untagged: mysql@sha256:dba5fed182e64064b688ccd22b2f9cad4ee88608c82f8cff21e17bab8da72b81Deleted: sha256:98455b9624a96e32b353297bb312913b6bbd62ac195cea2c7dd477209ba572d6Deleted: sha256:30864c1ff360a3d6f677a58fe78a89116f589c4dd7f32ff7b48e2b45786083d8Deleted: sha256:731b36653b532066f7a3ae9e75faae04f12bf8ecfcbc797e363b01e43a831b5fDeleted: sha256:a4e5266dadb79f3ca863edca18adc59d81c9fed24d84cf3afe1deef40292cfe6Deleted: sha256:a51fbd1cdea988462f1a7247165ea04238096905241b7fad673518e5617a5dc9Deleted: sha256:4e83d49f100fcd78f57b8f1844faad134d8328c5280be14d85a61ae7c7ffb981Deleted: sha256:11f5b5e11d25f08da50ca38993f02a3194565beaa516b66970adbbffa58141e0Deleted: sha256:2db1d1b89506973f51991ae03cb18e24f16aa2ef2b6cda4cf172b7ae4f8c15a7Deleted: sha256:31cd685e0a1656331ab15ee8aadf47ccb1580e80baef149a8e1dfa0e7283ce64Deleted: sha256:5f10b55a337d5bf432b0e44e22bd5730bde67251201b6890e923e3d2c641fa64Deleted: sha256:85c59144fcd7e0cba06a9ec8e502b993bcf75035c95524aa6c92b3072828ce94Deleted: sha256:5dacd731af1b0386ead06c8b1feff9f65d9e0bdfec032d2cd0bc03690698feda


2.Docker容器及其基本使用(Container)

  1. 1).概念 Docker容器:镜像的运行时实例,类似于一个轻量级的沙箱,它可以被启动,开始,停止,删除。容器间相互独立,不干扰。
    2).常用命令
  2. 启动容器
  3. docker run centos
    --name="Name" 容器名字 tomcat01 tomcat02,用来区分容器
    -d 后台方式运行
    -it 使用交互方式运行
    -p 指定容器端口,-p 8080:8080跟主机端口一致
    -p 主机端口:容器端口 -P 随机指定端口
    -e TZ=Asia/Shanghai 设置时区
    --privileged=true 让容器中的root用户拥有真正的root权限
    --name 容器名字,以后可以使用这个名字启动或者停止容器
    --restart=always docker启动时自动启动容器

    示例:启动nginx[root@iZuf62zo5nlme1u9q6ibrpZ ~]# docker run --name nginx -p 80:80 -d nginx
    035c0d6e48fa58137411f9beda8f6042d33b93a8b51efd20e0765b09bc023bd9#以交互方式运行centos
    docker run -it centos /bin/bash #以交互方式运行centos

    docker ps 列出运行中的容器
    ?-a 列出当前正在运行+历史运行的容器
    ?-n =? 显示最近的n个运行容器记录
    ?-q 只显示容器编号id


    [root@iZuf62zo5nlme1u9q6ibrpZ ~]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
    NAMES035c0d6e48fa nginx "/docker-entrypoint.…" 2 seconds ago Up 1 second 0.0.0.0:80->80/tcp nginx
  4. 关闭停止容器

  5. docker stop 容器名称:tag
    [root@iZuf62zo5nlme1u9q6ibrpZ ~]# docker stop nginx
    [root@iZuf62zo5nlme1u9q6ibrpZ ~]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

    停止所有容器docker stop $(docker ps -a -q)
  6. 删除容器

  7. docker rm 容器名称 或镜像名:TAG
    docker rm $(docker ps -a -q) 删除所有容器[root@iZuf62zo5nlme1u9q6ibrpZ ~]# docker rm nginx
    [root@iZuf62zo5nlme1u9q6ibrpZ ~]# docker rm $(docker ps -a -q)
    0bf6ca4e2c9cde9a7655e405e94908c79c0a8b71c62fb8b0e1b99922440add6cad409e9889
  8. 容器日志查询

  9. 语法:docker logs [OPTIONS] CONTAINER
    Options:
    --details 显示更多的信息
    -f, --follow 跟踪实时日志
    --since string 显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
    --tail string 从日志末尾显示多少行日志, 默认是all
    -t, --timestamps 显示时间戳
    --until string 显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)
    示例:查看最近30分钟的日志:
    docker logs --since 30m 4a20226c201d(容器ID)
    查看某时间之后的日志:
    docker logs -t --since="2023-02-08T13:23:37" CONTAINER_ID
    查看指定时间后的日志,只显示最后100行:
    docker logs -f -t --since="2023-02-08" --tail=100 CONTAINER_ID
    查看某时间段日志:
    docker logs -t --since="2023-02-08T13:23:37" --until "2018-02-09T12:23:37" CONTAINER_ID


3. Docker数据卷及常用命令(Volume)

1).数据挂载概念

在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束),需要将数据从宿主机挂载到容器中,目前Docker提供了三种不同的方式将数据从宿主机挂载到容器中:

(1)volumes:Docker管理宿主机文件系统的一部分,默认位于 /var/lib/docker/volumes 目录中;(最常用的方式

  由上图可以知道,目前所有Container的数据都保存在了这个目录下边,由于没有在创建时指定卷,所以Docker帮我们默认创建许多匿名(就上面这一堆很长ID的名字)卷。

  (2)bind mounts:意为着可以存储在宿主机系统的任意位置;(比较常用的方式

  但是,bind mount在不同的宿主机系统时不可移植的,比如Windows和Linux的目录结构是不一样的,bind mount所指向的host目录也不能一样。这也是为什么bind mount不能出现在Dockerfile中的原因,因为这样Dockerfile就不可移植了。

  (3)tmpfs:挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统;(一般都不会用的方式

  三种方式的示意图如下所示:


2).volume的基本使用


    • 管理卷
  • docker volume create nginx-vol // 创建一个自定义容器卷
    docker volume ls // 查看所有容器卷
    docker volume inspect nginx-vol // 查看指定容器卷详情信息
  • 例如,这里我们创建一个自定义的容器卷,名为"nginx-vol":创建使用指定卷的容器 docker run -d -it --name=nginx -p 8800:80 -v nginx-vol:/usr/share/nginx/html nginx有了自定义容器卷,我们可以创建一个使用这个数据卷的容器,这里我们以nginx为例:其中,-v代表挂载数据卷,这里使用自定数据卷nginx-vol,并且将数据卷挂载到 /usr/share/nginx/html (这个目录是yum安装nginx的默认网页目录)。如果没有通过-v指定,那么Docker会默认帮我们创建匿名数据卷进行映射和挂载。创建好容器之后,我们可以进入容器里面看看:可以看到有两个默认页,这时我们新启动一个SSH连接到宿主机去到刚刚创建的数据卷里边看看: 可以看到,我们可以访问到容器里面的两个默认页面,由此可知,volume帮我们做的类似于一个软链接的功能。在容器里边的改动,我们可以在宿主机里感知,而在宿主机里面的改动,在容器里边可以感知到。这时,如果我们手动stop并且remove当前nginx容器,我们会发现容器卷里面的文件还在,并没有被删除掉。 由此可以验证,在数据卷里边的东西是可以持久化的。如果下次还需要创建一个nginx容器,那么还是复用当前数据卷里面的文件。此外,我们还可以启动多个nginx容器实例,并且共享同一个数据卷,复用性和扩展性较强。
    • 清理卷
    • 如果不再使用自定义数据卷了,那么可以手动清理掉:
  • docker stop nginx // 暂停容器实例
    docker rm nginx // 移除容器实例
    docker volume rm nginx-vol // 删除自定义数据卷

3).Bind Mounts的基本使用

  • 创建一个容器
docker run -d -it --name=nginx -v /app/docker-nginx:/usr/share/nginx/html nginx

这里指定了将宿主机上的 /app/docker-nginx目录(如果没有会自动创建)挂载到 /usr/share/nginx/html (这个目录是yum安装nginx的默认网页目录)。

  这时我们再次进入容器内部看看:

可以看到,与volumes不同,bind mounts的方式会隐藏掉被挂载目录里面的内容(如果非空的话),这里是/usr/share/nginx/html 目录下的内容被隐藏掉了,因此我们看不到。

  但是,我们可以将宿主机上的文件随时挂载到容器中:

例如在/app/docker-nginx中新建一个index.html

然后在容器中查看:

验证绑定:

docker inspect nginx

同volumes一样,当我们清理掉容器之后,挂载目录里面的文件仍然还在,不会随着容器的结束而消失,从而实现数据持久化


4. Docker网络(network)

1).Dock网络模式

Docker默认提供了3种网络模式,生成容器时不指定网络模式下默认使用bridge桥接模式。
使用命令查看当前Docker所有的网络模式。


  • host模式

如果启动容器时使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。


使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好

Namespace的简要说明:

Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。

一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的NetworkNamespace隔离一个Docker容器一般会分配一个独立的Network Namespace。


  • container模式

这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。

  • none模式,不与外界交流

使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过–network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性


  • bridge模式

bridge模式是docker的默认网络模式,不写–network参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。bridge模式如下图所示:

Docker容器完成bridge网络配置的过程如下:

(1).在主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备。

(2).Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0。另一端放在主机中,以veth5acbc2f这样类似的名字命名,并将这个网络设备加入到docker0网桥中。

(3).从Docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。

宿主机和Docker容器之间是可以进行网络连接的,同样的,Docker容器和容器之间也可以直接进行网络连接。


通过内部ip地址互联:

示例:启动两个busybox容器,默认bridge模式,互相ping

通过自创建network实现容器互联:

创建一个桥接网络test-network,然后让两个centos容器加入该网络。

进入centos1容器,测试centos2容器互通性:

进入centos2容器,测试centos1容器互通性:

五. DockerFile详解

1).概念理解

Docker推荐使用dockerfile的定义文件和docker build命令来构建镜像。dockerfile使用基本的基于DSL(面向领域语言)语法的指令来构建Docker镜像。另一种创建Docker镜像的方式是使用docker commit,不推荐使用。

  • Dockerfile是由一组指令组成的文件
  • Dockerfile结构四部分: 基础镜像信息、维护者信息、镜像操作指令、容器启动时执行指令
  • Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以““号开头的注释

2).常用的DockerFile操作指令

在编写 Dockerfile 时,有严格的格式需要遵循:第一行必须使用 FROM 指令指明所基于的镜像名称;之后使用 MAINTAINER 指令说明维护该镜像的用户信息;然后是镜像操作相关指令,如 RUN 指令。每运行一条指令,都会给基础镜像添加新的一层。最后使用 CMD 指令指定启动容器时要运行的命令操作。

指令

含义

FROM 镜像

指定新镜像所基于的镜像,第一条指令必须为FROM 指令,每创建一个镜像就需要一条 FROM 指令

MAINTAINER 名字

说明新镜像的维护人信息

RUN 命令

在所基于的镜像上执行命令,并提交到新的镜像中

CMD[“要运行的程序”,“参数 1”,“参数 2”]

启动容器时要运行的命令或者脚本,Dockerfile 只能有一条CMD 命令。如果指定多条命令,只执行最后一条命令

EXPOSE 端口号

指定新镜像加载到 Docker 时要开启的端口

ENV 环境变量 变量值

设置一个环境变量的值,会被后面的 RUN 使用

ADD 源文件/目录 目标文件/目录

将源文件复制到目标文件,源文件要与 Dockerfile 位于相同目录中,或者是一个 URL

COPY 源文件/目录 目标文件/目录

将本地主机上的文件/ 目录复制到目标地点, 源文件/ 目录要与Dockerfile 在相同的目录中

VOLUME [“目录”]

在容器中创建一个挂载点

USER 用户名/UID

指定运行容器时的用户

WORKDIR 路径

为后续的 RUN、CMD、ENTRYPOINT 指定工作目录

ONBUILD 命令

指定所生成的镜像作为一个基础镜像时所要运行的命令

HEALTHCHECK

健康检查

注意事项:

  • Dockerfile中所用的所有文件一定要和Dockerfile文件在同一级父目录下,可以为Dockerfile父目录的子目录
  • Dockerfile中相对路径默认都是Dockerfile所在的目录
  • D
  • ockerfile中一定要惜字如金,能写到一行的指令,一定要写到一行,原因是分层构建,联合挂载这个特性。
  • Dockerfile中每一条指令被视为一层。
  • Dockerfile中指明大写(约定俗成)。

指令介绍:

FROM指令:

FROM <image>
FROM <image>:<tag>
FROM <image>:<digest> 
三种写法,其中<tag>和<digest> 是可选项,如果没有选择,那么默认值为latest

MAINTAINER指令:

MAINTAINER <name>

RUN指令:

1. RUN <command>
2. RUN ["executable", "param1", "param2"]

第一种后边直接跟shell命令

  • 在linux操作系统上默认 /bin/sh -c
  • 在windows操作系统上默认 cmd /S /C

第二种是类似于函数调用。

  • 可将executable理解成为可执行文件,后面就是两个参数。

CMD指令:

功能为容器启动时默认命令或参数

语法有三种写法

CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2

第三种比较好理解了,就时shell这种执行方式和写法

第一种和第二种其实都是可执行文件加上参数的形式

举例说明两种写法:

  • CMD [ "sh", "-c", "echo $HOME"

  • CMD [ "echo", "$HOME" ]


补充细节:这里边包括参数的一定要用双引号,就是",不能是单引号。千万不能写成单引号。

原因是参数传递后,docker解析的是一个JSON array

ENTRYPOINT:

功能是:容器启动时运行得启动命令

语法如下:

 ENTRYPOINT ["executable", "param1", "param2"]  
 ENTRYPOINT command param1 param2

如果从上到下看到这里的话,那么你应该对这两种语法很熟悉啦。

第二种就是写shell (shell执行)

第一种就是可执行文件加参数(EXEC调用,可在docker run启动时传递参数)

与CMD比较说明(这俩命令太像了,而且还可以配合使用):

相同点:

  • 只能写一条,如果写了多条,那么只有最后一条生效
  • 容器启动时才运行,运行时机相同

不同点:

  • ENTRYPOINT不会被运行的command覆盖,而CMD则会被覆盖
  • 如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD指令不是一个完整的可执行命令,那么CMD指定的内容将会作为ENTRYPOINT的参数

如下:

FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]

如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD是一个完整的指令,那么它们两个会互相覆盖,谁在最后谁生效

如下:

FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ls -al

VOLUME:

可实现挂载功能,可以将宿主机目录挂载到容器中

说的这里大家都懂了,可用专用的文件存储当作Docker容器的数据存储部分

语法如下:

VOLUME ["/data"]

说明:

[“/data”]可以是一个JsonArray ,也可以是多个值。所以如下几种写法都是正确的


VOLUME ["/var/log/"]
VOLUME /var/log
VOLUME /var/log /var/db


一般的使用场景为需要持久化存储数据时:

容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。

所以当数据需要持久化时用这个命令。

DockerFile构建实战:

  • 使用dockerFile构建一个centos镜像
FROM centos #基础镜像
MAINTAINER luzongfeng 957633749@qq.com #作者
ENV MYPATH /usr/local #环境配置
WORKDIR $MYPATH #工作目录,就是以交互方式进去之后的默认目录,正常默认是根目录,现在进入容器之后直接就到了MYPATH目录
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 vim #构建镜像时让其安装vim命令 ,精简版的centos是没有这些命令的通过重新构建添加这些命令包
RUN yum -y install net-tools #同上安装telnet工具
EXPOSE 80
CMD echo $MYPATH
CMD ECHO "……buid end…."
CMD /bin/bash

开始构建镜像:

docker build -f DockerFile路径 镜像名:tag . #注意最后的.不能丢掉,默认在当前路径
docker build -t mycentos:1.0 .
  • 使用dockerFile构建一个tomcat镜像
FROM centos:7
MAINTAINER yanghao<2634723687@qq.com>


COPY readme.txt /usr/local/readme.txt


ADD jdk-8u202-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-8.5.9.tar.gz /usr/local/


RUN yum -y install vim


ENV MYPATH /usr/local
WORKDIR $MYPATH


ENV JAVA_HOME /usr/local/jdk1.8.0_202
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.9
ENV CATALINA_BASE /usr/local/apache-tomcat-8.5.9
ENV PATH $PATH:$JAVA_HOME/bin:$CLASSPATH:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-8.5.9/bin/startup.sh && tail -f /usr/local/apache-tomcat-8.5.9/logs/catalina.out

六. 制作镜像并发布

演示案例: 发布镜像到阿里云容器镜像仓库

1.登陆阿里云容器云镜像平台,可创建个人实例进行测试。

执行docker登陆命令,登陆到阿里云镜像仓库:

docker login --username=luzongf*******@163.com registry.cn-shanghai.aliyuncs.com

操作指令:

$ docker login --username=luzongf*******@163.com registry.cn-shanghai.aliyuncs.com

$ docker tag [ImageId] registry.cn-shanghai.aliyuncs.com/luzongfeng/mytomcat:[镜像版本号]

$ docker push registry.cn-shanghai.aliyuncs.com/luzongfeng/mytomcat:[镜像版本号]

给镜像打上仓库标记&推送到镜像仓库:

2.从镜像仓库拉取指定镜像

docker pull registry.cn-shanghai.aliyuncs.com/luzongfeng/mytomcat:1.0

七. Docker-compose容器编排

1).安装

github的地址下载太慢了,国内可以使用http://get.daocloud.io/#install-compose网站上面的地址。

首先下载docker-compose:

curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

然后赋权限:

chmod +x /usr/local/bin/docker-compose

最后查看版本:

docker-compose -v

2) .概念理解

Docker-Compose项目是Docker官方的开源项目, 负责实现对Docker容器集群的快速编排。

Docker-Compose将所管理的容器分为三层, 分别是工程(project),服务(service)以及容器(containner)

Docker-Compose运行目录下的所有文件(docker-compose.yml文件、extends文件或环境变量等)组成一个工程,如无特殊指定,工程名即为当前目录名。

一个工程当中,可以包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。

一个服务中可以包括多个容器实例,Docker-Compose并没有解决负载均衡的问题。因此需要借助其他工具实现服务发现及负载均衡,比如consul。

Docker-Compose的工程配置文件默认为docker-compose.yml可以通过环境变量COMPOSE_FILE -f 参数自定义配置文件,其自定义多个有依赖关系的服务及每个人服务运行的容器。

使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况,例如要实现一个web项目,除了web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。

compose允许用户通过一个单独docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器为一个项目(project)

docker-compose项目由pypthon编写,调用docker服务提供的API来对容器进行管理,因此, 只要所操作的平台支持docker-API,就可以在其上利用conpose来进行编排管理。

简单来说:就是来管理多个容器的,定义启动顺序的,合理编排,方便管理。


3)、Docker Compose配置常用字段

字段

描述

build

指定Dockerfile文件名(要指定的Dockerfile文件需要在build标签的子级标签中用dockefile标签指定)

dockerfile

构建镜像上下文路径

context

可以是dockerfile路径,或者时执行git仓库的url地址

images

指定镜像(已存在)

command

执行命令,会覆盖容器启动后默认执行的命令(会覆盖dockefile中的CMD指令)

container_name

指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale指定容器数量。

deploy

指定部署和运行服务相关配置,只能在swarm模式使用

environment

添加环境变量

networks

加入网络,引用顶级networks下条目

network-mode

设置容器的网络模式

ports

暴露容器端口,与-p相同,但是端口不能低于60

volumes

挂载一个宿主机目录或命令卷到容器,命令卷要在顶级volumes定义卷名称

volumes_from

从另一个服务或容器挂载卷,可选参数:ro和rw(仅版本‘2’支持)

hostname

在容器内设置内核参数

links

连接诶到另一个容器,- 服务名称[ : ]

privileged

用来给容器root权限,注意是不安全的,true


示例:

version: '3'
services:
  redis:
    image: redis:5.0.4
    restart: always
    container_name: redis
    ports:
      - "6379:6379"
    volumes:
      - "redis-volume:/data"
    command: redis-server --appendonly yes
    environment:
      - TZ=Asia/Shanghai
  elasticsearch:
    image: elasticsearch:7.6.2
    restart: always
    container_name: elasticsearch
    environment:
      ES_JAVA_OPTS: -Djava.net.preferIPv4Stack=true -Xms1g -Xmx1g
      transport.host: 0.0.0.0
      discovery.type: single-node
      bootstrap.memory_lock: "true"
      discovery.zen.minimum_master_nodes: 1
      discovery.zen.ping.unicast.hosts: elasticsearch
    ports:
      - "9200:9200"
      - "9300:9300"
  kibana:
    image: kibana:7.6.2
    restart: always
    container_name: kibana
    environment:
      ELASTICSEARCH_URL: http://elasticsearch:9200
    links:
      - elasticsearch:elasticsearch
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch
  mysql:
    image: mysql:5.7.16
    restart: always
    container_name: mysql
    volumes:
      - mysql-volume:/var/lib/mysql
    environment:
      - "MYSQL_ROOT_PASSWORD=root"
      - "MYSQL_DATABASE=root123"
      - "TZ=Asia/Shanghai"
    ports:
      - 3306:3306
volumes:
  mysql-volume:
  redis-volume:

4)、Docker-compose常用命令

运行这些命令需要结合docker-compose一起使用。

且必须要在含有docker-compose.yml文件的目录中才可以使用,不然报错。

命令

描述

build

重新构建服务

ps

列出容器

up

创建和启动容器

exec

在容器里面执行命令

scale

指定一个服务容器启动数量

top

显示正在运行的容器进程

logs

查看服务容器的输出

down

删除容器、网络、数据卷和镜像

stop/start/restart

停止/启动/重启服务

执行docker-compose创建和启动容器命令:

docker-compose up -d
docker-compose stop


参考资料及文献:

(1)李振良,《Docker Volume详解》

(2)CloudMan,《每天5分钟玩转Docker容器技术》

(3)阿龙,《Docker存储卷详解》

相关推荐

vue3 组件初始化流程

学习完成响应式系统后,咋们来看看vue3组件的初始化流程既然是看vue组件的初始化流程,咋们先来创建基本的代码,跑跑流程(在app.vue中写入以下内容,来跑流程)import{h,ref}...

Context的典型使用场景

获取应用文件路径基类Context提供了获取应用文件路径的能力,ApplicationContext、AbilityStageContext、UIAbilityContext和ExtensionCon...

web技术分享|AudioContext 实现音频可视化

要实现音频可视化,实现一些炫酷的效果需要借助WebAudioAPI提供的一些方法AudioContext。AudioContext接口表示由链接在一起的音频模块构建的音频处理图,每个模块由一个...

2023-03-21:音视频解混合(demuxer)为MP3和H264,用go语言编写

2023-03-21:音视频解混合(demuxer)为MP3和H264,用go语言编写。答案2023-03-21:#步骤1:安装github.com/moonfdd/ffmpeg-gogoget...

如何在微信小程序中加入音频或视频?

要在微信小程序中加入音频或视频,可以使用以下步骤:1.在小程序页面中引入wx.createInnerAudioContext()或wx.createVideoContext()方法。2.创建音频或...

使用RKE的方式快速部署K8S集群

RKE是一款经过CNCF认证的开源Kubernetes发行版,可以在Docker容器内运行。它通过删除大部分主机依赖项,并为部署、升级和回滚、节点扩容提供一个稳定的路径,从而解决了Kubernetes...

Rancher(k8s)的持久存储卷Volumes(PV/PVC)的使用方法

1.介绍1.1介绍在上一节课里面福哥带着大家学会了使用k8s的负载均衡LoadBalancing(LB)发布集群内部的服务的方法,今天我们要讲讲k8s的持久存储卷Volumes(PVC)的使用方...

基于 Sealos 的镜像构建能力,快速部署自定义 k8s 集群

Sealos是一个快速构建高可用k8s集群的命令行工具,该工具部署时会在第一个k8smaster节点部署registry服务(sealos.hub),该域名通过hosts解析到第一...

Docker、Containerd、RunC分别是什么

什么是RunC上一遍文章《真正运行容器的工具:深入了解runc和OCI规范》已经讲清楚了Runc与OCI。这里再讲解一下概念。Docker、Google、CoreOS和其他供应商创建了开放容...

偷偷爆料下Docker学习,看这一篇就够了!十分推荐!!

一.什么是容器?生活中常将一个能用来承载物料的装置称之为容器,比如碗、盘子,杯子等,容器内可放入各种各样的物料,每一个容器都相互独立,不相互干扰。而我们计算机领域所说的容器通常是指一个包含了完整的运...

Docker网络优化方案,你认为哪种将引爆未来?

ICT架构师技术交流微信号分析和交流ICT行业最前沿技术,分享更多存储、服务器、数据中心、网络、软件定义和虚拟化等相关知识,旨在知识交流、开放共享和共同进步。上一篇文章Docker原生网络和实现原...

Docker容器和存储系统 云舒网络

江松:1986开始接触到苹果电脑,不是MacBook,是APPLEII.用Basic编程序。1999年去欧洲爱尔兰做存储,从并行SCSI协议开始做,到FC1G,4G,8G。2009年回国后进...

基于docker的跨主机WEB容器管理

前言由于我们的一部分服务器,分布在不同的公共网络环境。而且,这些服务器程序,发布都使用了docker,但并没有使用k8s这样的工具。处于离散的管理状态。也考虑过rancher这样的工具,但对于我们来说...

Kubernetes(k8s)docker 和 Containerd 区别

Kubernetes(k8s)、Docker和Containerd都是容器技术领域的重要工具,但它们各自有不同的角色和功能。Docker:Docker是一个开源的容器化平台,它允许开发者将应...

从 Docker 快刀到 K8s 剑法:程序员的云原生武功秘籍

前言在当今云计算的浪潮中,Docker和Kubernetes(K8s)已成为每位程序员必备的核心工具。Docker,如同一把锐利的快刀,能够迅速、简洁地将应用及其依赖封装成镜像,实现便捷的打包与发...