生活中常将一个能用来承载物料的装置称之为容器,比如碗、盘子,杯子等,容器内可放入各种各样的物料,每一个容器都相互独立,不相互滋扰。
而我们打算机领域所说的容器常日是指一个包含了完全的运行时环境:除了运用程序本身之外,这个运用所需的全部依赖、类库、其他二进制文件、配置文件等,都统一被打入了一个称为容器镜像的包中。通过将运用程序本身,和其依赖容器化,操作系统发行版本和其他根本环境造成的差异,都被抽象掉了。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. 利用官方脚本自动安装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 hostfileLoaded plugins: fastestmirrorInstalled Packagesdocker-ce.x86_64 3:23.0.1-1.el7 docker-ce-stable docker-ce.x86_64 3:23.0.1-1.el7 @docker-ce-stabledocker-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/dockerrm -rf /var/lib/containerd
docker信息查看命令:
docker version docker info docker 命令--help #帮助命令
四. Docker组件及基本利用
Docker镜像及其基本利用(Image)1).观点我们都知道,操作系统分为 内核 和 用户空间。对付 Linux 而言,内核启动后,会挂载 root 文件系统为其供应用户空间支持。而 Docker 镜像(Image),就相称于是一个 root 文件系统。比如官方镜像 ubuntu:18.04 就包含了完全的一套 Ubuntu 18.04 最小系统的 root 文件系统。Docker 镜像 是一个分外的文件系统,除了供应容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像 不包含 任何动态数据,其内容在构建之后也不会被改变。
2).基本利用列出镜像[root@iZuf62zo5nlme1u9q6ibrpZ ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEnginx latest 3f8a00f137a0 13 days ago 142MBhello-world latest feb5d9fea6a5 17 months ago 13.3kB
查询镜像
[root@iZuf62zo5nlme1u9q6ibrpZ ~]# docker search nginxNAME DESCRIPTION STARS OFFICIAL AUTOMATEDnginx 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 mysqlNAME DESCRIPTION STARS OFFICIAL AUTOMATEDmysql 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: latestlatest: Pulling from library/nginxbb263680fed1: Pull complete 258f176fd226: Pull complete a0bc35e70773: Pull complete 077b9569ff86: Pull complete 3082a16f3b61: Pull complete 7e9b29976cce: Pull complete Digest: sha256:6650513efd1d27c1f8a5351cbd33edf85cc7e0d9d0fcb4ffb23d8fa89b601ba8Status: Downloaded newer image for nginx:latestdocker.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.25Untagged: 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).观点 Docker容器:镜像的运行时实例,类似于一个轻量级的沙箱,它可以被启动,开始,停滞,删除。容器间相互独立,不滋扰。2).常用命令启动容器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 nginx035c0d6e48fa58137411f9beda8f6042d33b93a8b51efd20e0765b09bc023bd9#以交互办法运行centosdocker run -it centos /bin/bash #以交互办法运行centosdocker ps 列出运行中的容器-a 列出当前正在运行+历史运行的容器-n =? 显示最近的n个运行容器记录-q 只显示容器编号id[root@iZuf62zo5nlme1u9q6ibrpZ ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES035c0d6e48fa nginx "/docker-entrypoint.…" 2 seconds ago Up 1 second 0.0.0.0:80->80/tcp nginx关闭停滞容器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) 删除容器docker rm 容器名称 或镜像名:TAGdocker rm $(docker ps -a -q) 删除所有容器[root@iZuf62zo5nlme1u9q6ibrpZ ~]# docker rm nginx[root@iZuf62zo5nlme1u9q6ibrpZ ~]# docker rm $(docker ps -a -q)0bf6ca4e2c9cde9a7655e405e94908c79c0a8b71c62fb8b0e1b99922440add6cad409e9889容器日志查询语法:docker logs [OPTIONS] CONTAINEROptions:--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_ID3. 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所在的目录Dockerfile中一定要惜字如金,能写到一行的指令,一定要写到一行,缘故原由是分层构建,联合挂载这个特性。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 ubuntuENTRYPOINT ["top", "-b"]CMD ["-c"]
如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD是一个完全的指令,那么它们两个会相互覆盖,谁在末了谁生效
如下:
FROM ubuntuENTRYPOINT ["top", "-b"]CMD ls -al
VOLUME:
可实现挂载功能,可以将宿主机目录挂载到容器中
说的这里大家都懂了,可用专用的文件存储当作Docker容器的数据存储部分
语法如下:
VOLUME ["/data"]
解释:
[“/data”]可以是一个JsonArray ,也可以是多个值。以是如下几种写法都是精确的
VOLUME ["/var/log/"]VOLUME /var/logVOLUME /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 makecacheRUN yum update -yRUN yum -y install vim #构建镜像时让其安装vim命令 ,精简版的centos是没有这些命令的通过重新构建添加这些命令包RUN yum -y install net-tools #同上安装telnet工具EXPOSE 80CMD echo $MYPATHCMD ECHO "……buid end…."CMD /bin/bash
开始构建镜像:
docker build -f DockerFile路径 镜像名:tag . #把稳末了的.不能丧失落,默认在当前路径docker build -t mycentos:1.0 .
FROM centos:7MAINTAINER yanghao<2634723687@qq.com>COPY readme.txt /usr/local/readme.txtADD jdk-8u202-linux-x64.tar.gz /usr/local/ADD apache-tomcat-8.5.9.tar.gz /usr/local/RUN yum -y install vimENV MYPATH /usr/localWORKDIR $MYPATHENV JAVA_HOME /usr/local/jdk1.8.0_202ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarENV CATALINA_HOME /usr/local/apache-tomcat-8.5.9ENV CATALINA_BASE /usr/local/apache-tomcat-8.5.9ENV PATH $PATH:$JAVA_HOME/bin:$CLASSPATH:$CATALINA_HOME/lib:$CATALINA_HOME/binEXPOSE 8080CMD /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:3306volumes: 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存储卷详解》