概念
下面这三个概念一开始可能不好理解,等大家跟着博客把例子做完了,再回头来看应该就能理解了。
docker image # docker镜像
镜像就是一个只读的模板。镜像可以用来创建Docker容器。Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
docker container # docker容器
容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
docker repository # docker仓库
仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。当然,用户也可以在本地网络内创建一个私有仓库。当用户创建了自己的镜像之后就可以使用push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上pull下来就可以了。
docker安装
系统要求(下段英文截取至官方文档)
OS requirements
To install Docker CE, you need a maintained version of CentOS 7. Archived versions aren’t supported or tested.
可能有些文章说centos6也能运行,不过我没有测试,我这里使用的是CentOS7
[root@dockhost ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
使用yum安装
[root@dockhost ~]# yum -y install docker-io
开机自动启动
[root@dockhost ~]# systemctl enable docker
启动docker
[root@dockhost ~]# systemctl start docker
查看docker信息
[root@dockhost ~]# docker --version
Docker version 1.13.1, build b2f74b2/1.13.1
查看更加详细的信息
[root@dockhost ~]# docker info
查看帮助文档
[root@dockhost ~]# docker # 查看所有命令帮助
[root@dockhost ~]# docker container --help # 如果想知道container的有哪些命令,可以使用这个帮助
docker使用
接下来使用一个例子(简单nginx服务)来演示如何使用docker,为避免混乱全部使用英文,image:镜像,container:容器
查看docker image
[root@dockhost ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
因为docker才安装,所以没有任何image,docker image ls与docker images命令等价
查看正在运行的docker container
[root@dockhost ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
连image都没有,当然也就没有container了,因为只有运行了image才会产生container,docker container ls与docker ps命令等价
查看所有container,包括没有运行的container
[root@dockhost ~]# docker container ls --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
该命令与上一条命令的区别就是,加--all会把所有container显示出来,docker container ls --all与docker ps -a命令等价
下载nginx image
[root@dockhost ~]# docker pull nginx
Using default tag: latest Trying to pull repository docker.io/library/nginx ... latest: Pulling from docker.io/library/nginx 743f2d6c1f65: Pull complete 6bfc4ec4420a: Pull complete 688a776db95f: Pull complete Digest: sha256:23b4dcdf0d34d4a129755fc6f52e1c6e23bb34ea011b315d87e193033bcd1b68 Status: Downloaded newer image for docker.io/nginx:latest
此时再来查看docker image,就能看到当前主机上有一个nginx image了
[root@dockhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/nginx latest 53f3fd8007f7 3 weeks ago 109 MB
运行nginx image
[root@dockhost ~]# docker run -p 8080:80 -d nginx
47511fe91ce243583e7300bb143f9d15755c175b3a33405db92158e596d61f68
这里的参数-p表示端口映射,前面的8080为我自定义的主机端口,后面的80是docker里面的nginx服务默认端口,docker里面的端口只有映射出来,本机或其它机器才能访问得到。具体是8080还是其它端口,这个自己定义。
-d表示把命令放到后台执行,前端返回一个数字,具体数字表示什么含义后面有介绍
再来查看docker container,可以看到有一个正在运行的container了,而CONTAINER ID就是上一步中返回的数字的截断
[root@dockhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 47511fe91ce2 nginx "nginx -g 'daemon ..." 9 minutes ago Up 9 minutes 0.0.0.0:8080->80/tcp stoic_easley
打开浏览器,输入你docker运行的主机ip:8080,显示了nginx的欢迎界面。到这儿大家就应该知道docker的作用了,docker就是把别人做好的一段程序或应用打包,你拿来直接使用。
接下来我通过更改container里面的nginx欢迎界面文件,来介绍如何修改别人的image
新建一个index.html,下面三行为index.html的内容
<html>
<p1>hello, I change index file.</p1>
</html>
上传到container中,命令有点类似于scp
[root@dockhost ~]# docker cp index.html 47511fe91ce2:/usr/share/nginx/html # 47511fe91ce2为前面docker ps命令显示的CONTAINER ID
刷新浏览器,显示"hello, I change index file.",表示刚才做了的更改生效了
停止docker container
[root@dockhost ~]# docker stop 47511fe91ce2 # 47511fe91ce2为前面docker ps命令显示的CONTAINER ID
47511fe91ce2
查看container,此时发现无任何container运行
[root@dockhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
使用docker ps -a可以看到所有container,包括前面stop掉的
[root@dockhost ~]# docker ps –a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 47511fe91ce2 nginx "nginx -g 'daemon ..." 24 minutes ago Exited (0) About a minute ago stoic_easley
重新运行nginx image
[root@dockhost ~]# docker run -p 8080:80 -d nginx
f784361b43448453cbf646b2fc1eb52d943baca3848dbc08fa6d0446b2942d03
查看docker container
[root@dockhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f784361b4344 nginx "nginx -g 'daemon ..." 56 seconds ago Up 55 seconds 0.0.0.0:8080->80/tcp elated_bose 47511fe91ce2 nginx "nginx -g 'daemon ..." 27 minutes ago Exited (0) 4 minutes ago stoic_easley
发现有两个container,从status这列中可以看到,第一个是正在运行,第二个是四分钟前退出,每次运行image,都会创建一个新的container。
再刷新浏览器,竟然又显示了nginx的欢迎界面
也就是说之前所做的修改,重启之后就失效了,原因是因为修改是针对container的,重新运行image,container id就变了,是个新的container了。如果想永久保存这些变化,可以使用下面的命令
重新将index.html上传到container中,注意这里是正在运行的CONTAINER ID
[root@dockhost ~]# docker cp index.html f784361b4344:/usr/share/nginx/html
此时你可以刷新浏览器看下,现在应该显示"hello, I change index file."
保存修改
[root@dockhost ~]# docker commit -m 'change html' f784361b4344 'new_nginx'
sha256:f7de2c5040239142857aa9fdc6f4ed55bf2462fe9be97d8139978965f7a8065c
这个命令放到下一步解释
再来查看docker image
[root@dockhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE new_nginx latest f7de2c504023 40 seconds ago 109 MB docker.io/nginx latest 53f3fd8007f7 3 weeks ago 109 MB
可以看到这时候多了一个image,现在解释下docker commit这个命令
-m 'change html','change html'是描述符,实际意义不大
f784361b4344,需要保存更改的container id
'new_nginx',实际上永久更改container,就是重新创建了一份image文件,new_nginx就是一个新的image文件名字。可以看文章最开始的image介绍,image是个只读的模板,运行image就启动了container,更改container就重新创建image
现在停掉前面的container
[root@dockhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f784361b4344 nginx "nginx -g 'daemon ..." 11 minutes ago Up 11 minutes 0.0.0.0:8080->80/tcp elated_bose
[root@dockhost ~]# docker stop f784361b4344
f784361b4344
再打开new_nginx image
[root@dockhost ~]# docker run -p 8080:80 -d new_nginx
ebbba295fe241012325564872a90c8537d431e3f13ea154c7faec6b7c142d42e
[root@dockhost ~]# docker ps # 查看正在运行的container
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ebbba295fe24 new_nginx "nginx -g 'daemon ..." 6 seconds ago Up 5 seconds 0.0.0.0:8080->80/tcp vigilant_yalow
刷新浏览器,显示"hello, I change index file.",也就是说改动生效了,不过不是在nginx image中,而是后面创建的new_nginx image。
删除container使用docker rm <CONTAINER ID>
[root@dockhost ~]# docker ps -a # 查看所有的container
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ebbba295fe24 new_nginx "nginx -g 'daemon ..." 2 minutes ago Up 2 minutes 0.0.0.0:8080->80/tcp vigilant_yalow f784361b4344 nginx "nginx -g 'daemon ..." 55 minutes ago Exited (0) 36 minutes ago elated_bose 47511fe91ce2 nginx "nginx -g 'daemon ..." About an hour ago Exited (0) 59 minutes ago stoic_easley
[root@dockhost ~]# docker rm f784361b4344 # 删除id为f784361b4344的container
f784361b4344
[root@dockhost ~]# docker ps -a # 可以看到id为f784361b4344的container已经被删除了
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ebbba295fe24 new_nginx "nginx -g 'daemon ..." 4 minutes ago Up 4 minutes 0.0.0.0:8080->80/tcp vigilant_yalow 47511fe91ce2 nginx "nginx -g 'daemon ..." About an hour ago Exited (0) About an hour ago stoic_easley
这里需要注意的是不能删除一个正在运行的container
[root@dockhost ~]# docker rm ebbba295fe24
Error response from daemon: You cannot remove a running container ebbba295fe241012325564872a90c8537d431e3f13ea154c7faec6b7c142d42e. Stop the container before attempting removal or use -f
删除image
[root@dockhost ~]# docker images # 列出所有镜像
REPOSITORY TAG IMAGE ID CREATED SIZE new_nginx latest f7de2c504023 49 minutes ago 109 MB docker.io/nginx latest 53f3fd8007f7 3 weeks ago 109 MB
[root@dockhost ~]# docker rmi nginx # 这里提示不能删除nginx image,由于有container与其绑定,即使该container已经停掉了
Error response from daemon: conflict: unable to remove repository reference "nginx" (must force) - container 47511fe91ce2 is using its referenced image 53f3fd8007f7
[root@dockhost ~]# docker rm 47511fe91ce2 # 删除nginx image相关的container
47511fe91ce2
[root@dockhost ~]# docker rmi nginx
Untagged: nginx:latest
Untagged: docker.io/nginx@sha256:23b4dcdf0d34d4a129755fc6f52e1c6e23bb34ea011b315d87e193033bcd1b68
[root@dockhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE new_nginx latest f7de2c504023 54 minutes ago 109 MB
这时nginx的镜像就已经被删除了
好了,docker常用的操作就都演示完了,下面来个总结
docker pull 获取image
docker build 创建image # 这个命令本文没讲,篇幅有限,感兴趣可以搜其它的文章
docker images 列出image
docker run 运行container
docker ps 列出container
docker rm 删除container
docker rmi 删除image
docker cp 在host和container之间拷贝文件
docker commit 保存改动为新的image
其它命令
向容器里面执行命令:docker exec -it <CONTAINER_ID> bash
如:[root@dockhost ~]# docker exec -it ebbba295fe24 ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
容器与本地服务器互拷文件或文件夹
从容器到本地:docker cp <containerId>:/file/path/within/container /host/path/target
从本地到容器:docker cp filename <containerId>:/file/path/within/container
删除docker安装程序
rpm -qa | grep docker | xargs rpm -ev --nodeps
rm -rf /var/lib/docker