系列链接
Docker系列之一:Docker介绍及在Ubuntu上安装
Docker系列之五:Volume 卷的使用——以Redis为例
Docker系列之六:Volume 卷的使用——在Dockerfile中的用法
Docker系列之七:Docker 网络(内部网络、容器之间的连接)
Docker系列之八:在Dockerfile中使用多段构建Muti-stage build
Docker系列之九:Docker用于持续集成,构建Jenkins和Docker服务器
Docker的联合文件系统
在Docker中,root文件系统只能是只读状态,它利用联合加载技术在root文件系统层上加载更多的只读文件系统。联合加载指的是一次同时加载多个文件系统,将各层文件系统叠加到一起,这样最终的文件系统会包含所有底层的文件和目录。
Docker的镜像
像上面这样的联合文件系统叠加到一起就是镜像了,位于下面的镜像称为父镜像,最底部的是基础镜像。
列出所有镜像,tag表示docker镜像的标签
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest ea4c82dcd15a 7 days ago 85.8MB
公共镜像仓库,俗称docker hub,Docker公司自己运营的开放的registry。使用下面的命令拉取nginx镜像,这个镜像就是从docker hub上拉取下来的。拉取特定版本的镜像可以使用docker pull nginx:v2
root@iZbp13z6cxj72rb7bxf0smZ:~# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
f17d81b4b692: Pull complete
d5c237920c39: Pull complete
a381f92f36de: Pull complete
Digest: sha256:b73f527d86e3461fd652f62cf47e7b375196063bbbd503e853af5be16597cb2e
Status: Downloaded newer image for nginx:latest
查找镜像
root@iZbp13z6cxj72rb7bxf0smZ:~# docker search microsoft/dotnet
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
microsoft/dotnet Official images for .NET Core and ASP.NET Co… 1220 [OK]
microsoft/mssql-server-linux Official images for Microsoft SQL Server on … 995
microsoft/aspnet ASP.NET is an open source server-side Web ap… 783 [OK]
microsoft/windowsservercore 550
microsoft/aspnetcore Official images for running compiled ASP.NET… 526 [OK]
创建docker hub账号,从https://hub.docker.com/ 上去注册,注册里需要你填入用户名和密码
如何构建镜像
之前一直是拉取其他人的镜像去运行,那我们如何将自己的应用程序打包成镜像呢? 打包镜像会用到Dockerfile,先参考官网,之后会在另外章节介绍。
先创建一个文件夹DockerDemo,创建如下两个文件。注意Dockerfile文件没有后缀名。
文件内容分别是:
执行如下命令,生成镜像
root@iZbp13z6cxj72rb7bxf0smZ:/home/cong/DockerDemo# docker build -t mynginx:v1 .
Sending build context to Docker daemon 3.072kB
Step 1/4 : FROM nginx
---> dbfc48660aeb
Step 2/4 : WORKDIR /usr/share/nginx/html
---> Running in ca45a4396161
Removing intermediate container ca45a4396161
---> 49eb0195ae40
Step 3/4 : COPY . .
---> da56839ce084
Step 4/4 : EXPOSE 80
---> Running in d28c3be3625b
Removing intermediate container d28c3be3625b
---> 51dfb7e10e15
Successfully built 51dfb7e10e15
Successfully tagged mynginx:v1
查看镜像,可以看标签是v1,接下来用的时候必须要指定,标签为latest可以不指定。
root@iZbp13z6cxj72rb7bxf0smZ:/home/cong/DockerDemo# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mynginx v1 51dfb7e10e15 2 minutes ago 109MB
ubuntu latest ea4c82dcd15a 7 days ago 85.8MB
nginx latest dbfc48660aeb 10 days ago 109MB
运行此镜像后就会创建一个新的容器, 镜像与容器的关系就像类与实例的关系,容器里运行着我们的应用程序。
root@iZbp13z6cxj72rb7bxf0smZ:/home/cong/DockerDemo# docker run -itd -p 5002:80 --name mynginx01 mynginx:v1
1f7caa8d6d563f33c49692c4af127b32ae10b4252b7928d6f6eea7e850ab115c
root@iZbp13z6cxj72rb7bxf0smZ:/home/cong/DockerDemo# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1f7caa8d6d56 mynginx:v1 "nginx -g 'daemon of…" 4 minutes ago Up 4 minutes 0.0.0.0:5002->80/tcp mynginx01
root@iZbp13z6cxj72rb7bxf0smZ:/home/cong/DockerDemo# curl localhost:5002
<h1>Hello world</h1>
从上可以看出,访问localhost:5002就可以正常访问我们刚创建的网页了,这里-p表示端口的意思,5002表示你本机的端口,80表示容器(可暂时把容器简单的理解为轻量级的虚拟机)里的端口,这里会作一个端口映射,当我们从本机访问5002端口的时候,请求会自动请求容器里的80端口。可以使用如下命令查看端口的映射情况,也可以使用docker inspect mynginx01
root@iZbp13z6cxj72rb7bxf0smZ:/home/cong/DockerDemo# docker port mynginx01
80/tcp -> 0.0.0.0:5002
推送镜像到Docker hub
推送到镜像仓库前必须要登录,登录之后呢,需要对镜像打标签,因为我们docker hub要求你的镜像名格式为<youruser/yourimage>,只有这样的才算合法的镜像名,然后再推送到docker hub上。见如下命令
#登录到docker hub
root@iZbp13z6cxj72rb7bxf0smZ:/home/cong/DockerDemo# docker login -u wucong60
Password:
Login Succeeded
#对镜像打标签
root@iZbp13z6cxj72rb7bxf0smZ:/home/cong/DockerDemo# docker tag mynginx:v1 wucong60/mynginx:v1
#打标签后会出现一个新的镜像,名为wucong60/mynginx,TAG为v1
root@iZbp13z6cxj72rb7bxf0smZ:/home/cong/DockerDemo# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mynginx v1 51dfb7e10e15 19 minutes ago 109MB
wucong60/mynginx v1 51dfb7e10e15 19 minutes ago 109MB
ubuntu latest ea4c82dcd15a 7 days ago 85.8MB
nginx latest dbfc48660aeb 10 days ago 109MB
#推送到docker hub,之后你可以在https://hub.docker.com/上找到这个镜像
root@iZbp13z6cxj72rb7bxf0smZ:/home/cong/DockerDemo# docker push wucong60/mynginx:v1
The push refers to repository [docker.io/wucong60/mynginx]
7e4e4f8dff83: Pushed
86df2a1b653b: Mounted from library/nginx
bc5b41ec0cfa: Mounted from library/nginx
237472299760: Mounted from library/nginx
v1: digest: sha256:3da939d0060d15e4c83831ac4ce5c182c60774553e05d7e7e0d89d7950f05f09 size: 1155
删除本地镜像,如果有此镜像生成的容器正在运行,加上-f强制删除此镜像,对应的容器也会删除。删除所有镜像用docker rmi $(docker images -aq) -f
root@iZbp13z6cxj72rb7bxf0smZ:/home/cong/DockerDemo# docker rmi mynginx:v1
Untagged: mynginx:v1
root@iZbp13z6cxj72rb7bxf0smZ:/home/cong/DockerDemo# docker rmi wucong60/mynginx:v1 -f
推送镜像到其它镜像仓库,比如xxx.register.io
docker login -u my xxx.register.io
docker tag mynginx:v1 xxx.register.io/my/mynginx:v1
docker push xxx.register.io/my/nginx:v1