一起学习docker系列:
一起学docker-可视化管理01-Portainer
一起学docker-可视化管理02-Rancher
一起学习docker01-docker简介和安装
一起学习docker02-Registry私有仓库
一起学习docker03-harbor私有仓库搭建
一起学习docker04-docker镜像
一起学习docker05-docker容器
一起学docker06-docker网络
一、关于镜像
镜像是 Docker 的三大组件之一。
Docker 运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker 会从镜像仓库下载(默认是Docker Hub 公共注册服务器中的仓库)。一般公司内部会搭建私有仓库,公司自己的镜像会放到私有仓库里。
二、下载镜像,了解基本信息
1、先找一个镜像下载下来(选择一个较小的,下载快)
docker search java
![06ba174a59d7337d2a043f74f4098836.png](https://i-blog.csdnimg.cn/blog_migrate/bff328994bba66542d91e043576e3f49.jpeg)
下载,并运行确认版本
docker run -it java java -version
也可以通过docker pull下载docker pull docker.io/hello-world 然后执行其他命令
![4243bef5cdad0cd54bc33f1de767bfc8.png](https://i-blog.csdnimg.cn/blog_migrate/1660d34a839dc71688f59810e104eb9f.jpeg)
查看系统
docker run -it java uname
![d76e501ebe2d6eed7486d568a209c7d3.png](https://i-blog.csdnimg.cn/blog_migrate/bbbb5555154c2d2ea6409976a727f589.jpeg)
查看镜像ip
docker run java ip addr
![aa7f59887bc26e19df85ed3565b38a36.png](https://i-blog.csdnimg.cn/blog_migrate/0b753039177b2bef6646053fa22dedca.jpeg)
查看环境变量
docker run java env
![20d35ddf520c18b11bc0e923e748f0e4.png](https://i-blog.csdnimg.cn/blog_migrate/492a37584f833069c2c0e7bed234c7f0.jpeg)
以上了解镜像里面是什么。
以上了解了镜像内容后我们可以下载运行一个镜像,了解平时需要查看镜像的那些信息。
下载镜像
docker pull docker.io/hello-world
注意:仓库地址,docker.io,没有指明tag,默认就是latest.运行这个镜像
![3265c2a1382504a0af21fbf8ccf18ac2.png](https://i-blog.csdnimg.cn/blog_migrate/dcecbb2057a684dd5edb98fbadd22eac.jpeg)
查看镜像
docker images 查看是否下载
![820991953e55a58cd82e0c2c85dba0c9.png](https://i-blog.csdnimg.cn/blog_migrate/38470e3cd57f1966a60c531b6ba37859.jpeg)
运行镜像
docker run docker.io/hello-world
![ae34e1b6e1a73d5458f1f0bcc5a32858.png](https://i-blog.csdnimg.cn/blog_migrate/ce9390b77eb570781bb8c245c5f81d8a.jpeg)
查看镜像信息(这里信息较多)
docker inspect docker.io/hello-world
![4026ef14cb2138f4cda93f62bdef1f56.png](https://i-blog.csdnimg.cn/blog_migrate/3e1c31a57f1bcf7b38d14517e80e5217.jpeg)
删除镜像
docker rmi docker.io/hello-world -f
![2225abe4ee0680a952d4d53fc070bf9d.png](https://i-blog.csdnimg.cn/blog_migrate/f81cc225a6a1e0baa9995bc98a38aa09.jpeg)
删除所有未打标签的镜像 docker rmi $(docker images -q -f dangling=true) 删除所有镜像 docker rmi $(docker images -q)
三、手工制作镜像
一般情况下,公司内部使用的镜像都是经过内部情况进行优化处理的,所有需要进行修改,然后传到私有仓库。
我们这里先通过刚刚下载的java镜像来做我们自己需要的镜像
docker create --name wolfjava -it java /bin/bash
# docker create --name wolfjava -it java /bin/bash
271e96acb33a0afdc4b4101e00aa1cb343bb959b844db2817584cd499016d523
启动
#docker start wolfjava
#docker ps
![181b4bde75cef1685c3237775b45753e.png](https://i-blog.csdnimg.cn/blog_migrate/08e45820085c879929413fa7c6ca8749.jpeg)
进去查看一下
# docker exec -it 271e96acb33a /bin/bash
root@271e96acb33a:/#
我们这里创建一个wolf目录
![03514c6b25ec5b77b7ea546774ce4e16.png](https://i-blog.csdnimg.cn/blog_migrate/e5873e9db0bd41f2160df56ac6c5d114.jpeg)
打开另一个窗口,执行commit操作。
# docker commit 271e96acb33a wolfjava-01
sha256:31bb307101b0ee3e52a239ec1ca80df3b9e147d69e9a3b4bb43e5c1256e9674a
通过docker images查看是否成功,通过下图发现已经成功。
![1c93b93aa797ac6b767a4a7f98d2e0f6.png](https://i-blog.csdnimg.cn/blog_migrate/67cd05d974d8e2c01214e4d66e00096f.jpeg)
我们在通过我们制作的镜像来启动,看看里面是否有我们创建的wolf目录
docker run -it wolfjava-01 ls 这里发现有wolf目录存在,说明我们成功了。
![f551d74cd3c7440ecb9afe0e7c9367fb.png](https://i-blog.csdnimg.cn/blog_migrate/5a421b033cf1280f5b88a90dea43752e.jpeg)
我们昨天搭建了harbor,这里提交一下
docker tag 31bb307101b0 10.101.200.159/wolf/wolfjava-01
![978c70ba6fa2dee678b2e5170f2f5e95.png](https://i-blog.csdnimg.cn/blog_migrate/16a79824c52565a54c1a9b9dde717f75.jpeg)
上传到仓库
docker push 10.101.200.159/wolf/wolfjava-01
![46508585ed79ac9da10afacb5d067305.png](https://i-blog.csdnimg.cn/blog_migrate/5f356ed148ac60099e8ce03f9f98287d.jpeg)
看到这里说明,没问题,我们登录网页查看一下
![509c105ffea3cff8a5ff34a7b459cbff.png](https://i-blog.csdnimg.cn/blog_migrate/2a0bfce7d0b60e63a7b428038264bcb1.jpeg)
这里发现很快就创建了一个新的容器这种做法的优点:最方便、最快速,学习制作镜像更易理解这种做法的缺点:不规范、无法自动化(完全手工)、不科学
四、dockerfile制作镜像
Dockerfile的官方手册如下
https://docs.docker.com/engine/reference/builder/
在Dockerfile中用到的命令有FROM
FROM指定一个基础镜像, 一般情况下一个可用的 Dockerfile一定是 FROM 为第一个指令。至于image则可以是任何合理存在的image镜像。 FROM 一定是首个非注释指令 Dockerfile. FROM 可以在一个 Dockerfile 中出现多次,以便于创建混合的images。 如果没有指定 tag ,latest 将会被指定为要使用的基础镜像版本。
MAINTAINER 这里是用于指定镜像制作者的信息RUN
RUN命令将在当前image中执行任意合法命令并提交执行结果。命令执行提交后,就会自动执行Dockerfile中的下一个指令。
层级 RUN 指令和生成提交是符合Docker核心理念的做法。它允许像版本控制那样,在任意一个点,对image 镜像进行定制化构建。
RUN 指令缓存不会在下个命令执行时自动失效。比如 RUN apt-get dist-upgrade -y 的缓存就可能被用于下一个指令. --no-cache 标志可以被用于强制取消缓存使用。
ENV ENV指令可以用于为docker容器设置环境变量
ENV设置的环境变量,可以使用 docker inspect命令来查看。同时还可以使用docker run --env =来修改环境变量。
USER USER 用来切换运行属主身份的。
Docker 默认是使用 root,但若不需要,建议切换使用者身份,毕竟 root 权限太大了,使用上有安全的风险。
WORKDIR WORKDIR 用来切换工作目录的。Docker 默认的工作目录是/,只有 RUN 能执行 cd 命令切换目录,而且还只作用在当下下的 RUN,也就是说每一个 RUN 都是独立进行的。如果想让其他指令在指定的目录下执行,就得靠 WORKDIR。WORKDIR 动作的目录改变是持久的,不用每个指令前都使用一次 WORKDIR。
COPY COPY 将文件从路径 复制添加到容器内部路径 。 必须是相对于源文件夹的一个文件或目录,也可以是一个远程的url, 是目标容器中的绝对路径。 所有的新文件和文件夹都会创建UID 和 GID 。事实上如果 是一个远程文件URL,那么目标文件的权限将会是600。
ADD ADD 将文件从路径 复制添加到容器内部路径 。 必须是想对于源文件夹的一个文件或目录,也可以是一个远程的url。 是目标容器中的绝对路径。 所有的新文件和文件夹都会创建UID 和 GID。事实上如果 是一个远程文件URL,那么目标文件的权限将会是600。
VOLUME 创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
EXPOSE EXPOSE 指令指定在docker允许时指定的端口进行转发。
CMD Dockerfile.中只能有一个CMD指令。 如果你指定了多个,那么最后个CMD指令是生效的。 CMD指令的主要作用是提供默认的执行容器。这些默认值可以包括可执行文件,也可以省略可执行文件。 当你使用shell或exec格式时, CMD 会自动执行这个命令。ONBUILD ONBUILD 的作用就是让指令延迟执行,延迟到下一个使用 FROM 的 Dockerfile 在建立 image 时执行,只限延迟一次。 ONBUILD 的使用情景是在建立镜像时取得最新的源码 (搭配 RUN) 与限定系统框架。
ARG ARG是Docker1.9 版本才新加入的指令。 ARG 定义的变量只在建立 image 时有效,建立完成后变量就失效消失LABEL 定义一个 image 标签 Owner,并赋值,其值为变量 Name 的值。(LABEL Owner=$Name )ENTRYPOINT 是指定 Docker image 运行成 instance (也就是 Docker container) 时,要执行的命令或者文件。
我们来制作一个java镜像
#vi Dockerfile
FROM 10.101.200.159/wolf/wolfjava-01
MAINTAINER nimmis <1098331428@qq.com>
# disable interactive functions
ENV DEBIAN_FRONTEND noninteractive
# set default java environment variable
ADD hello.sh /bin/hello.sh
RUN /bin/hello.sh
开始执行制作
docker build -t 10.101.200.159/wolf/wolfjava-02 .
![5fd824992c0562eddef0dc6d5acc9e2f.png](https://i-blog.csdnimg.cn/blog_migrate/09dd2dab971c00e60d0a87a90494e283.jpeg)
制作成功,我们看一下docker iamges
![2662688125ffcb0d0200ee5503223485.png](https://i-blog.csdnimg.cn/blog_migrate/5036197a46822cbdbfa344983c17a333.jpeg)
上传到仓库
docker push 10.101.200.159/wolf/wolfjava-02
![2121350a070883b6982e48d7bf68acf0.png](https://i-blog.csdnimg.cn/blog_migrate/d6cfe58c16ef27869d963e3a408bdd33.jpeg)
![0a9052ec8fa33aa094f6e68dee4e637d.png](https://i-blog.csdnimg.cn/blog_migrate/74f827c419ba3d4078e698fce894365a.jpeg)
Dockerfile的命令,要多用,就熟悉了,后面我们会逐步使用,这里先熟悉一下制作过程。
五、导入备份生成镜像
我们这里随意导出一个(这里是到处一个容器快照)
docker export f393a847db63 >myimage.tar
![809ee42d9d35f24e1d3ab92aab245502.png](https://i-blog.csdnimg.cn/blog_migrate/2729d4aaca3e90b0272d1004d4bea51c.jpeg)
我们导入,导入容器快照,生成镜像
docker import myimage.tar import-test/myimage:v1.0
![623318570443c0234401cef0ee7cdca4.png](https://i-blog.csdnimg.cn/blog_migrate/931d0d4cc09340b007740300759ecb31.jpeg)
使用此外也可以使用url来 docker import
*注:用户既可以使用 docker load 来导入镜像存储文件到本地镜像库,也可以使用 docker import 来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息