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访问的私有仓库。