1、Docker的基本使用
镜像与镜像仓库的概念
为了更好的理解 Docker 是什么,我们先来讲个故事:
我需要盖一个房子,于是我搬石头、砍木头、画图纸、盖房子。一顿操作,终于把这个房子盖好了。
结果,住了一段时间,心血来潮想搬到海边去。这时候按以往的办法,我只能去海边,再次搬石头、砍木头、画图纸、盖房子。
烦恼之际,跑来一个魔法师教会我一种魔法。这种魔法可以把我盖好的房子复制一份,做成「镜像」,放在我的背包里。
等我到了海边,就用这个「镜像」,复制一套房子,拎包入住。
是不是很神奇?对应到我们的项目中来,房子就是项目本身,镜像就是项目的复制,背包就是镜像仓库。
如果要动态扩容,从仓库中取出项目镜像,随便复制就可以了。Build once,Run anywhere!
不用再关注版本、兼容、部署等问题,彻底解决了「上线即崩,无休止构建」的尴尬。
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker 技术的三大核心概念,分别是:
-
镜像 Image
-
容器 Container
-
仓库 Repository
-
核心概念如下: Build,Ship and Run(搭建、运输、运行)。 Build once,Run anywhere(一次搭建,处处运行)。 Docker 本身并不是容器,它是创建容器的工具,是应用容器引擎。 Docker 三大核心概念,分别是:镜像 Image,容器 Container、仓库 Repository。 Docker 技术使用 Linux 内核和内核功能(例如 Cgroups 和 namespaces)来分隔进程,以便各进程相互独立运行。 由于 Namespace 和 Cgroups 功能仅在 Linux 上可用,因此容器无法在其他操作系统上运行。那么 Docker 如何在 macOS 或 Windows 上运行?Docker 实际上使用了一个技巧,并在非 Linux 操作系统上安装 Linux 虚拟机,然后在虚拟机内运行容器。 镜像是一个可执行包,其包含运行应用程序所需的代码、运行时、库、环境变量和配置文件,容器是镜像的运行时实例。
2、Linux系统安装Docker
-
安装步骤:
-
1、检查内核版本,返回的值大于3.10即可。
-
输入指令: uname -r
2、确保yum是最新的
-
建议首先输入“yum check-update”更新包数据库。 添加 yum 仓库 输入指令: tee /etc/yum.repos.d/docker.repo<<-'EOF' [dockerrepo] name=Docker Repository baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/ enabled=1 gpgcheck=1 gpgkey=https://yum.dockerproject.org/gpg EOF 安装 Docker 输入指令:yum install -y docker-engine 启动docker 在启动之前可以查看是否安装成功. 输入指令: docker version或者docker -v 然后启动,输入指令:systemctl start docker 输入指令:systemctl status docker 查看状态 设置开机自启动 输入指令:systemctl enable docker 配置镜像加速 设置 Docker Engine 写入配置: { registry-mirrors: [ http://hub-mirror.c.163.com/, https://registry.docker-cn.com ], insecure-registries:[], experimental: false, debug: true }
3、制作Docker基础镜像
-
基础镜像制作方法常见的有两种:
1、第一种是本地直接打包然后导入:
-
#从本地端环境端打包镜像 # tar --exclude=/usr/lib32 --exclude=/sys -cPvf nk-base.tar /usr 此命令将本机运行的操作系统打成一个.tar包,可以使用--exclude参数将不需要的目录进行排除,可排除多个目录。文件打包支持的类型只有.tar, .tar.gz, .tgz, .bzip, .tar.xz等几种格式。打包完成后放在/usr目录下。 #导入镜像(需要运行端) # cat nk-base.tar | docker import - nk-base 将制作的tar包使用docker import镜像导入,并命令为:nk-base: #查看镜像 docker images #创建并启动镜像构成容器 # docker run -i -t nk-base /bin/bash 使用docker命令启动镜像。-i 以交互模式运行容器 -t 为容器重新分配一个伪输入终端,通常与 -i 同时使用 /bin/bash是指在容器启动后容器内执行的命令 #docker run -dit --name modis_seafog 9b5839a64119 /bin/bash 3、创建并启动容器 docker run -dit --name pythonFirst 镜像id /bin/ docker run -dit --name python3.8 942a6c3f7d5b /bin/sh #4、查看目前环境有多少容器 docker ps -a 5、进入容器 docker exec -it <NAMES> /bin/bash 此外还可以通过容器ID进入容器 docker container -it <容器ID> bash 6、退出容器exit 或者 ctrl+d 7、关闭、启动、重启容器 docker stop <容器ID> docker start<容器ID> docker restart<容器ID> 10、查看容器日志 docker logs -f -t --since="日期" --tail=数量 容器id或名称 说明: -f : 查看实时日志 -t : 查看日志产生的日期 --since : 即只输出指定日期之后的日志 --tail=5 : 查看最后的5条日志 11、容器备份和恢复 1、备份容器 docker commit -p <容器ID> 备份命名 12、接着将备份的镜像导出到本地 docker save 备份命名 > d:\备份命名.tar 导出和导入容器 导出容器 如果要导出本地某个容器,可以使用 docker export 命令。 $ docker export 1e560fca3906 > ubuntu.tar 导入容器快照 可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1: $ cat docker/ubuntu.tar | docker import - test/ubuntu:v1 13、恢复容器 docker load -i mypython.tar 2、拉取镜像 docker image pull <repository>:<tag> 或者 docker pull <repository>:<tag> 演示:拉取python镜像 #3、查看目前环境有多少容器 docker ps -a docker container ls 或者 docker ps #删除容器ID docker rm 2cbfe9bfaa89 需要删除所有容器,加上$(docker ps -a -q) docker rm $(docker ps -a -q) #删除镜像 docker rmi 800fdea41150
2、第二种方式也非常简单,直接使用脚本来制作:
-
# wget https://raw.githubusercontent.com/docker/docker/master/contrib/mkimage-yum.sh # chmod a+x ./mkimage-yum.sh # ./mkimage-yum.sh -y /etc/yum.conf nk-base
执行完成后,基础镜像就创建成功了,使用docker images查看一下:
[root@192 hxb]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nk-base 7.4 a1942dd1e289 1 hours ago 383 MB
3、拉取官方基础镜像仓库
上海区阿里云容器服务地址: https://cr.console.aliyun.com/cn-shanghai
#1、登录阿里云Docker Registry
docker login --username=liu13752614153 registry.cn-beijing.aliyuncs.com
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
您可以在访问凭证页面修改凭证密码。
#2、从Registry中拉取镜像
dockers pull registry.cn-shanghai.aliyuncs.com/tcc_public/python:3.8
#3、将镜像推送到Registry
docker push registry.cn-shanghai.aliyuncs.com/tcc_public/python:3.8
#4、镜像重命名
docker tag registry.cn-shanghai.aliyuncs.com/tcc_public/python:3.8 python3.8
4、创建Dockerfile
指令详解
4.1、ADD
ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:
- ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
- ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
4.2 、COPY
复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
格式:
COPY [--chown=<user>:<group>] <源路径1>... <目标路径> COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
[--chown=<user>:<group>]:可选参数,用户改变复制到容器内文件的拥有者和属组。
<源路径>:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。例如:
COPY hom* /mydir/ COPY hom?.txt /mydir/
<目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。
4.3、CMD
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
- CMD 在docker run 时运行。
- RUN 是在 docker build。
作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。
注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
格式:
CMD <shell 命令> CMD ["<可执行文件或命令>","<param1>","<param2>",...] CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
推荐使用第二种格式,执行过程比较明确。第一种格式实际上在运行的过程中也会自动转换成第二种格式运行,并且默认可执行文件是 sh。
什么是Dockerfile?
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),有了 Dockerfile,就可以创建我们所需要的镜像
touch Dockerfile