docker学习2--镜像、容器、仓库

1.镜像

   docker镜像是一个Linux的文件系统(root fileSystem),这个文件系统里面包含可以运行在Linux内核的程序以及相应的数据。 

   一般而言,Linux分为两个部分,Linux内核和用户空间,而真正的Linux操作系统,是指Linux内核,常用的centos、ubuntu等操作系统是不同厂商在Linux内核基础上添加自己的软件与工具集形成的发布版本。

   我们可以把镜像看出上面说的用户空间,docker通过镜像创建一个容器时,就是将镜像定义好的用户空间作为独立隔离的进程运行在宿主机的Linux内核之上。

    镜像的两个特征:

  • 分层:即一个镜像可以由多个中间层组成,多个镜像可以共享同一个中间层,我们也可以通过在镜像添加一层来生成一个新的镜像
  • 只读:镜像在构建完成后,便不可以再修改。上面说的添加一层构建新的镜像,实际是通过创建一个临时的容器,在容器上增加或删除文件,从而形成新的镜像,因为容器可以动态改变的

下图展示了docker镜像和Linux的关系

1)操作镜像的命令

    docker中与镜像操作相关的命令都在docker image这条命令下,可以通过docker image --help进行查看

Usage:  docker image COMMAND

Manage images

Commands:
  build       Build an image from a Dockerfile(构建镜像的命令)
  history     Show the history of an image(显示镜像构建历史过程)
  import      Import the contents from a tarball to create a filesystem image(导入一个由容器导出的镜像)
  inspect     Display detailed information on one or more images(显示一个镜像的详细信息)
  load        Load an image from a tar archive or STDIN(从一个文件或标准输入流中导入镜像)
  ls          List images(查看镜像列表)
  prune       Remove unused images(删除虚悬镜像)
  pull        Pull an image or a repository from a registry(从仓库拉取镜像)
  push        Push an image or a repository to a registry(推送镜像到仓库)
  rm          Remove one or more images(删除镜像)
  save        Save one or more images to a tar archive (streamed to STDOUT by default)(保存镜像到文件)
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE(给镜像打标签)

2)获取镜像

   安装docker之后,本地没有任何镜像,我们可以自己构建,更方便的是从docker官方提供的仓库服务docker hub上拉取官方或第三方已经构建好的镜像

   拉取镜像可以使用:

docker pull imageName

///如拉取nginx镜像
qihoodeMacBook-Pro:~ root# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
a330b6cecb98: Pull complete 
e0ad2c0621bc: Pull complete 
9e56c3e0e6b7: Pull complete 
09f31c94adc6: Pull complete 
32b26e9cdb83: Pull complete 
20ab512bbb07: Pull complete 
Digest: sha256:853b221d3341add7aaadf5f81dd088ea943ab9c918766e295321294b035f3f3e
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

3)查看本地镜像

   将镜像拉取到本地之后,可以通过docker images进行查看

qihoodeMacBook-Pro:~ root# docker images
REPOSITORY                           TAG        IMAGE ID       CREATED         SIZE
nginx                                latest     ad4c705f24d3   13 hours ago    133MB

4)删除镜像

如删除镜像nginx 使用docker rmi 镜像ID即可 ad4c705f24d3

qihoodeMacBook-Pro:~ root# docker rmi ad4c705f24d3
Untagged: nginx:latest
Untagged: nginx@sha256:853b221d3341add7aaadf5f81dd088ea943ab9c918766e295321294b035f3f3e
Deleted: sha256:ad4c705f24d392b982b2f0747704b1c5162e45674294d5640cca7076eba2865d
Deleted: sha256:cf45bd1acd3159a35178bfe8a63f910f010990175050ea6c8c333ba3afaf5123
Deleted: sha256:a9e7419d7f7c4fe55c85ce08c4f0a8b45abe9b714aa19880f553859797e0332c
Deleted: sha256:13184aa93ccd585fade03704e048828c29eed86090e7399b208edbe022aaf563
Deleted: sha256:3161f310d154031dbd57f90c07715335a25a31bcf20a4abf3e040ab86bcac633
Deleted: sha256:88f95677408c5f02b15064ad1f41a2c74e40e1800cd3536f8fb45b9e6939704b
Deleted: sha256:d000633a56813933cb0ac5ee3246cf7a4c0205db6290018a169d7cb096581046

注意:

删除时可能提示无法删除,因为容器正在被使用,此时步骤如下:

1)查看本地所有的容器,找到对应的容器ID

docker container ls

2)终止运行对应的容器

docker stop contain_id

3)再次删除

2.容器

1)新建并启动容器

docker run -it ubuntu:20.04 /bin/bash

///
qihoodeMacBook-Pro:~ root# docker run -it ubuntu:20.04 /bin/bash
root@d5e1e58ee5db:/# 

这是最常用的一种方式,该命令启动一个bash终端,允许用户交互。其中-t表示Docker分配一个伪终端并绑定到容器的标准输入上,-i则使容器的标准输入保持打开

使用docker run时,docker后台做的操作为:

  • 检测本地是否存在指定的容器,不存在就从仓库下载
  • 使用镜像创建并启动一个容器
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
  • 从宿主主机配置的网桥接口桥接一个虚拟接口到容器中
  • 从地址池配置一个IP地址给容器
  • 执行用户指定的应用程序
  • 执行完毕容器终止

2)关闭容器

docker stop containerID

3)启动容器

可以启动已经stop的容器

docker start containerID

4)查看容器列表

docker ps -a

5)删除容器

docker rm containerID

6)进入容器--方式1--常用

docker exec -it containerID /bin/bash

退出之后,不会导致容器停止

7)进入容器--attach方式

docker attach  containerID 


qihoodeMacBook-Pro:~ root# docker attach  d5e1e58ee5db 
root@d5e1e58ee5db:/# 

退出之后,会使得容器停止

8)查看docker容器日志

docker logs containerID

9)导出容器

docker export containerID > name.tar


//如下,导出之后目录下多了一个ubuntu.tar文件
qihoodeMacBook-Pro:~ root# docker export d5e1e58ee5db > ubuntu.tar
qihoodeMacBook-Pro:~ root# ls
.CFUserTextEncoding	.bash_history		.docker			.oracle_jre_usage	ubuntu.tar
.Trash			.cisco			.forward		Library
qihoodeMacBook-Pro:~ root# 

可以将容器快照导出为本地文件

10)导入容器快照

使用docker import将容器快照文件导入为镜像

cat ubuntu.tar | docker import - my/ubuntu.tar


///导入后的名字可以自行指定

qihoodeMacBook-Pro:~ root# cat ubuntu.tar | docker import - my/ubuntu.tar
sha256:fa0c144464205a3ab1d12fafeb5b02f89d3955b1a14098b39242039f26f7ecb7
qihoodeMacBook-Pro:~ root# docker images
REPOSITORY                           TAG        IMAGE ID       CREATED         SIZE
my/ubuntu.tar                        latest     fa0c14446420   4 seconds ago   72.8MB
ubuntu                               20.04      fb52e22af1b0   10 days ago     72.8MB

3仓库

仓库(repository)是存放镜像的地方,与之不同的是注册服务器(registry)。注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。

3.1Docker Hub

docker官方维护的一个公共仓库,大部分需求需要的镜像都可以在docker hub里直接下载。

拉取镜像的命令的docker pull,其命令格式为:

docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

选项可以通过docker pull --help进行查看

docker 镜像仓库地址:地址的格式一般为  域名/IP :端口号。默认地址是Docker Hub

仓库名:这里的仓库名是两段式名称,即用户名/软件名。对于Docker hub,如果不给出用户名,默认是library,即官方镜像

如###官方仓库获取Ubuntu镜像
docker pull ubuntu:20.04  

3.2私有仓库

有时使用Docker hub这样的公共仓库不方便,可以创建一个本地私有仓库。官方提供docker-registry用于构建私有的镜像仓库。

1)本地主机安装docker-registry

docker run -d -p 5000:5000 --restart=always --name registry registry


///如下
qihoodeMacBook-Pro:~ root# docker run -d -p 5000:5000 --restart=always --name registry registry
Unable to find image 'registry:latest' locally
latest: Pulling from library/registry
6a428f9f83b0: Pull complete 
90cad49de35d: Pull complete 
b215d0b40846: Pull complete 
429305b6c15c: Pull complete 
6f7e10a4e907: Pull complete 
Digest: sha256:265d4a5ed8bf0df27d1107edb00b70e658ee9aa5acb3f37336c5a17db634481e
Status: Downloaded newer image for registry:latest
a76980460c38c7c90415acb8c1a87e7a70eae34aa43732d998d3283e4658724f

使用官方的registry镜像启动私有仓库。默认情况下,仓库被创建在容器的/var/lib/registry目录下。如果要把镜像文件存放在本地的指定路径,可以通过-v 参数,如将上传的镜像存放在本地的/opt/data/registry目录下

docker run -d     -p 5000:5000     -v ~/opt/data/registry:/var/lib/registry     registry

问题:

出现mounts denied错误的主要原因是,默认情况下只有/Users,/Volume,/private,/tmp,/var/folders目录是共享的,如果共享这些目录之外的,必须添加到列表中。

解决方法:

点击docker图标选择preferences,然后选择resources,将对应的路径添加到列表中,然后apply即可。如无对应的路径,则手动创建

此时再次执行,发现命令成功

2)本地私有仓库上传,搜索,下载镜像

创建好镜像之后,可以使用docker tag标记一个镜像,然后把他推送到仓库。以ubuntu20.04为例

给ubuntu镜像打标记

docker tag ubuntu:20.04 localhost:5000/ubuntu:20.04

此时使用docker images查看发现多了一个localhost:5000/ubuntu:20.04镜像

上传镜像

docker push localhost:5000/ubuntu:20.04


///如下
qihoodeMacBook-Pro:~ root# docker push localhost:5000/ubuntu:20.04
The push refers to repository [localhost:5000/ubuntu]
4942a1abcbfa: Pushed 
20.04: digest: sha256:10cbddb6cf8568f56584ccb6c866203e68ab8e621bb87038e254f6f27f955bbe size: 529

查看仓库中的镜像

curl localhost:5000/ubuntu:20.04

删除本地localhost:5000/ubuntu:20.04镜像

从本地私有仓库中下载

docker pull localhost:5000/ubuntu:20.04

配置非HTTPS仓库地址

     如果不想使用localhost:5000或127.0.0.1:5000作为仓库地址,如想让本网段的其他主机也能把镜像推送到私有仓库。你需要把如172.45.0.3:5000这样的内网地址作为仓库地址,但你会发现无法成功推送镜像。

  这是因为docker默认不允许非HTTPS方式推送镜像,可以通过docker的配置选项来取消这个限制,或者配置能通过HTTPS访问的私有仓库。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值