1.镜像的获取方式
pull from registry
:从registry拉取(online,可以是互联网也可以是内网)
- public(公有)
- private(私有):比如在公司内部搭建registry,仅限于公司内部使用。
build from Dockerfile
:从Dockerfile构建(online)load from file
:文件导入(offline)
2.镜像的获取查看和删除
镜像的获取:
docker image pull nginx
:获取nginx镜像,不加版本号默认拉取最新版本
docker image pull nginx:1.20.0
:拉取指定版本的镜像
镜像的查看:
docker image ls:查看拉取到本地的镜像
镜像的删除:
docker image rm d23
:删除指定镜像,rm后面加上IMAGE ID即可如果镜像正在被容器使用的时候,该镜像是无法删除的;如果停止该容器但是没有删除容器的话,还是无法删除镜像的。
3.镜像的导入导出
如果电脑没有联网,可以尝试从别的主机上导出镜像:
docker image save nginx:latest -o nginx.image
:选择指定版本的镜像(nginx:latest)导出到指定文件(当前目录下的nginx.image)
然后将该镜像传输到本机并导入:
docker image load -i ./nginx.image
:导入指定目录下的image文件
4.Dockerfile介绍
- Dockerfile是用于构建docker镜像的文件
- Dockerfile里面包含了构建镜像所需的指令
- Dockerfile有特定的语法规则
5. 镜像的构建和分享
5.1 镜像的构建:
假如要在一台ubuntu 21.04上运行hello.py(内容是"hello docker"),此时构建一个Dockerfile文件:
- 在当前目录下构建需要运行的py文件和Dockerfile文件,Dockerfile文件内容如下:
FROM ubuntu:21.04
:选择需要拉取的基础镜像
RUN apt-get ....
:下载需要的python依赖,和在本机ubuntu系统中下载python依赖一样。
ADD hello.py /
:将本机上的hello.py文件添加到镜像的根目录中
CMD ["python3", "/hello.py"]
:相当于执行"python3 /hello.py"命令
根据Dockerfile去构建镜像:
docker image build -t hello .
:hello表示构建的镜像的名称(没加版本号默认为hello:latest),后面的’.'表示执行的是当前目录下的Dockerfile文件此时会出现两个镜像,一个是ununtu21.04的镜像,一个是hello的镜像:
使用hello镜像去运行一个容器(进程):
docker run -it hello
:以交互式的方式运行容器,此时打印出"hello docker",并且容器会退出。
5.2 镜像的分享:
和普通镜像一样,可以使用
docker image save/load
去进行镜像的分享,更方便的方式是通过dockerhub去操作:
对需要分享的镜像指定tag:
①第一种方式是重新build一个image。如果修改了已经存在镜像的tag,尽管tag变化了,但是IMAGE ID不会变化:
如果此时执行
docker image rm 6b3
删除image是不行的,需要加上tag,即执行docker image rm hello:1.0
才能删除指定的image ②第二种方式是使用
docker image tag hello:1.0 hello:2.0
,hello:1.0表示被重新命名的镜像+TAG,hello:2.0表示新的镜像名+TAG
- 将镜像push到dockerhub:
- 首先使用
docker login
命令并输入dockerhub的账号和密码进行登录- 然后使用
docker image push pshijie/hello:3.0
命令进行push。注意这里的pshijie/hello:3.0是重新指定了名字和tag的镜像,因为需要push到dockerhub的镜像名字前面需要加上此时登录的dockerhub的ID号,否则无法push。
完成上述操作后,dockerhub便会出现push好的镜像,之后再进行pull操作即可。
6.通过commit创建镜像
在“镜像的获取方式”一节中,可以看到获取镜像还可以通过Containers进行commit操作实现。
假设使用nginx镜像启动一个容器,然后修改该容器中nginx的index.html,并将此修改保存为一个镜像:
- 后台启动nginx的容器。由于没有浏览器显示index.html页面,所以使用
curl 127.0.0.1
进行验证是否修改成功:
- 使用
docker container exec -it c52 sh
进入交互式shell,将nginx的index.html(在容器内的/usr/share/nginx/html下)进行修改。修改完后重新curl 127.0.0.1
会出现修改后的网页代码:
此时如果将容器删除,再使用nginx镜像创建新的容器,nginx的index.html会重新恢复为原来的页面。
- 使用
docker container commit c52 pshijie/nginx:2.0
创建镜像:c52是被使用创建镜像的容器ID号,后面的是新的镜像名称+TAG
7.参考
https://dockertips.readthedocs.io/en/latest/docker-image.html