2.0 容器运行基础
镜像是 Docker 运行的基础, 就好比计算机硬件需要安装操作系统. 使用 Docker Images 命 令可以看到当前系统中存在的镜像。当运行容器时,使用的镜像如果在本地系统中不存 在,Docker 就会自动从 Docker 镜像仓库或者配置的私有仓库中下载;默认是从 Docker Hub 公共镜像源下载。
上节在 Docker C/S 架构逻辑图中提到了私有仓库。这节主要讲镜像的基本操作。
2.1 Docker 加载镜像流程
1)检查本地是否有与启动镜像相匹配的镜像。 2)查询与镜像地址中是否有启动镜像 3)如果在镜像地址中没有完整的地址,则从默认的 Docker Hub 下载。 Docker 加载镜像的两种方式: 公共仓库与私有仓库
2.2 Docker 镜像基本操作
2.2.1 搜索 Docker Hub 有哪些镜像
docker search [镜像名字] [root@master jdk]# docker search nginx
/
2.2.2 从 Docker Hub 下载镜像
/
下载镜像,(没有指定版本,默认会下载最新版 latest) docker pull nginx:latest = docker pull nginx [root@master jdk]# docker pull nginx:latest 从第三方docker 镜像仓库或者私有仓库下载镜像方法 [root@docker ~]# docker pull repo.abc.com/httpd:latest #地址不存在
2.2.3 镜像加速器
在下载 Docker Hub 镜像非常慢的情况下, 可以使用镜像加速功能。配置加速可以用官网 提供的, 也可以使用私有仓库。
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://plqjafsr.mirror.aliyuncs.com"] } EOF [root@master ~]# systemctl daemon-reload [root@master ~]# systemctl restart docker
2.2.4 基于容器创建镜像系统
- 类似虚拟机的克隆功能
- 在运行当中的容器基础上创建一个新的镜像(相当于 vm 的完整快照)
[root@docker ~]# docker ps -a #显示所有的容器, ps 只是显示正在运行的容器 [root@master ~]# docker run -d -P nginx #启动容器 [root@master /]# docker container commit 960d3f0e61eb centos-nginx:1.0 #容器运行 ID sha256:7af7ffdea5e8ef703fb7cb30baaff3b3e75a1297bfbc75bb15454dd7eb622215 #检查 [root@master /]# docker images REPOSITORY TAG centos-nginx 1.0 #不能删除原来的镜像(父镜像) [root@master /]# docker rmi 6678c7c2e56c Error response from daemon: conflict: unable to delete 6678c7c2e56c (cannot be forced) - image has dependent child images #使用快照镜像启动新容器 [root@master /]# docker run -d -p 8090:80 centos-nginx:1.0 1dabb29c5a87a4ec8d58040e6ea4a21dcb17dda006168ce56021fd232208c18d
2.2.5 删除镜像
[root@master ~]# docker image rm centos-nginx Error: No such image: centos-nginx [root@docker ~]# docker image rm 07ddb4d9a8ab Untagged: centos-nginx:latest Deleted: sha256:07ddb4d9a8abfd51849f6b2747c115a28e2dd9587a56af881c43cc890e874861 Deleted: sha256:41c4debe112f55832a841e976e96d61ad170c7646460560799313c82f9f36f44 [root@docker ~]# docker rmi fdf13fa91c6e Error response from daemon: conflict: unable to delete fdf13fa91c6e (must be forced) - image is being used by stopped container f30520fafcbf #注:如果镜像系统正在运行,需要停止进程才可以删除镜像系统,否则无法删除! 或者选择强制删除 (注意镜像之间的依赖关系) [root@docker ~]# docker rmi --force fdf13fa91c6e [root@docker ~]# docker rmi -f fdf13fa91c6e #缩写 -f 参数 == --force
2.2.6 导出镜像
#导出镜像为 tar 包 [root@master /]# docker image save nginx:latest > nginx.tar.gz
2.2.7 导入镜像
直接使用tar 包导入镜像,注意如果原来导出的源镜像还是在存在于系统中,那么新导入的 镜像在系统将不可见。
[root@master /]# docker image load -i nginx.tar.gz Loaded image: nginx:latest
#强制删除原来的镜像 [root@master /]# docker rmi nginx:latest --force #再执行导入 [root@master /]# docker image load -i nginx.tar.gz Loaded image: nginx:latest #最后查看 [root@master /]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 6678c7c2e56c 9 days ago 127MB
2.2.8 镜像tag标签
语法:docker image tag 源_IMAGE[:TAG] 目标_IMAGE[:TAG]
类似linux 硬链接,在推送镜像到私有仓库时,需要添加tag。
[root@docker01 ~]# docker image tag nginx:latest repo.abc.com/nginx:v1.0 [root@master /]# docker images REPOSITORY TAG nginx latest repo.abc.com/nginx v1.0 IMAGE ID 6678c7c2e56c 6678c7c2e56c CREATED 9 days ago 9 days ago SIZE 127MB 127MB #可以使用新的 tag 标签启动容器 [root@master /]# docker run -d -p 9091:80 repo.abc.com/nginx:v1.0 1f5f20b763ccb7661b41701b9319876a0bd074da12e4e77ba0ff7879c2b19627
2.2.9 构建Java基础镜像
之前使用为Docker自带镜像仓库中的镜像,现在我们自己来构建私有镜像 #在java 镜像中为什么要构建alpine-glibc ?
#在java 镜像中为什么要构建alpine-glibc ? #Java Dockerfile [root@master /]# mkdir -p /root/jdk/ [root@master /]# vim Dockerfile FROM frolvlad/alpine-glibc #模板镜像 MAINTAINER 地铁昌平线 #创建者 RUN echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.4/main/" > /etc/apk/repositories #修改源 RUN apk add --no-cache bash #安装 bash ADD jre1.8.0_211.tar.gz /usr/java/jdk/ #添加文件 ENV JAVA_HOME /usr/java/jdk/jre1.8.0_211 #设置环境变量 ENV PATH ${PATH}:${JAVA_HOME}/bin RUN chmod +x /usr/java/jdk/jre1.8.0_211/bin/java WORKDIR /opt
2.3.0 构建镜像
#需要把 jre1.8.0_211.tar.gz 放到与 Dockerfile 同级目录 [root@docker01 ~]# docker pull frolvlad/alpine-glibc #拉取镜像 [root@master jdk]# docker build -t jre8:1.0 . #编译镜像 #查看镜像 [root@master jdk]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE jre8 1.0 c65645093f97 16 seconds ago 136MB #添加 tag [root@master jdk]# docker tag jre8:1.0 repo.abc.com/jre8:v1.0
2.3.0.1 运行镜像
[root@docker01 ~]# docker run -it jre8:1.0 #启动并且进入容器 bash bash-4.3# java -version java version "1.8.0_211" Java(TM) SE Runtime Environment (build 1.8.0_211-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)
2.3.1 镜像构建过程
构建容器:通过父镜像上创建一个容器,重新封装成一个镜像,变成下一个新启动容器的只读层(LOWER)。 但是如果当前容器需要对镜像进行修改,就需要加载所有镜像的只读层到容器中进行修改。
#特别注意之前提到的容器启动,修改镜像内容是不会修改源镜像;只是修改启动容器的内容。在下一节将详细讲述镜像存储的原理。
#查看容器的构建历史
# missing 为当前镜像的源镜像构建历史 FROM frolvlad/alpine-glibc
# f83c32dc03f3 为当前镜像构建的历史
[root@master jdk]# docker history jre8:1.3 IMAGE CREATED CREATED BY SIZE COMMENT ea65e9cde677 About a minute ago /bin/sh -c #(nop) WORKDIR /opt 0B d0afad7e579e About a minute ago /bin/sh -c chmod +x /usr/java/jdk/jre1.8.0_2… 8.46kB 12d49a4a8a61 6 minutes ago /bin/sh -c #(nop) ENV PATH=/usr/local/sbin:… 0B 256df34ef73f 6 minutes ago /bin/sh -c #(nop) ENV JAVA_HOME=/usr/java/j… 0B dba16cec6c49 7 minutes ago /bin/sh -c #(nop) ADD file:d614f1012c68493ba… 116MB 22b0f5f4b551 17 minutes ago /bin/sh -c apk add --no-cache bash 3.56MB c97cdc4cfa33 17 minutes ago /bin/sh -c echo "https://mirror.tuna.tsinghu… 54B f26f217e4a3f 17 minutes ago /bin/sh -c #(nop) MAINTAINER Tony 0B f83c32dc03f3 2 days ago /bin/sh -c apk add --update curl && curl -… 11.7MB <missing> 2 days ago /bin/sh -c #(nop) ENV GLIBC_VERSION=2.31-r0 0B <missing> 2 days ago /bin/sh -c #(nop) MAINTAINER Jean Blanchard… 0B <missing> 7 weeks ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B <missing> 7 weeks ago /bin/sh -c #(nop) ADD file:e69d441d729412d24… 5.59MB
2.3.2 查询镜像详情
#存储信息
[root@master jdk]# docker image inspect jre8:1.3
2.4 Docker 镜像和 Overlay2 关系
Docker 需要OverlayFS文件系统存储
1)Docker中的镜像采用分层构建设计,每个层可以称之为"layer", 镜像文件默认存在目录:/var/lib/docker/overlay2
2) Docker支持的文件存储如下: AUFS、OverlayFS、VFS、Brtfs等。
3)通过Docker Info命令查看当前的存储驱动
[root@node-2 overlay2]# docker info | grep -E " Storage Driver|Server Version" Server Version: 19.03.4 Storage Driver: overlay2
4)通常ubuntu类的系统默认采用的是AUFS,centos7.1+系列采用的是OverlayFS。