Docker - 快速入门(一)
概念
下面这三个概念一开始可能不好理解,等大家跟着博客把例子做完了,再回头来看应该就能理解了。
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 weeks ago 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 ..." minutes ago Up minutes 0.0.0.0:->/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 ..." minutes ago Exited () 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 ..." seconds ago Up seconds 0.0.0.0:->/tcp elated_bose
47511fe91ce2 nginx "nginx -g 'daemon ..." minutes ago Exited () 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 seconds ago MB
docker.io/nginx latest 53f3fd8007f7 weeks ago 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 ..." minutes ago Up minutes 0.0.0.0:->/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 ..." seconds ago Up seconds 0.0.0.0:->/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 ..." minutes ago Up minutes 0.0.0.0:->/tcp vigilant_yalow
f784361b4344 nginx "nginx -g 'daemon ..." minutes ago Exited () minutes ago elated_bose
47511fe91ce2 nginx "nginx -g 'daemon ..." About an hour ago Exited () 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 ..." minutes ago Up minutes 0.0.0.0:->/tcp vigilant_yalow
47511fe91ce2 nginx "nginx -g 'daemon ..." About an hour ago Exited () 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 minutes ago MB
docker.io/nginx latest 53f3fd8007f7 weeks ago 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
Docker - 快速入门(一)的更多相关文章
- Docker快速入门(二)
上篇文章<Docker快速入门(一)>介绍了docker的基本概念和image的相关操作,本篇将进一步介绍image,容器和Dockerfile. 1 image文件 (1)Docker ...
- 【干货合集】Docker快速入门与进阶
收录待用,修改转载已取得腾讯云授权 Docker 在众多技术中,绝对是当红炸子鸡.这年头,如果你不懂一点容器,不学一些Docker,还怎么出去跟人炫耀技术? Docker 也是云计算技术中较为热门的一 ...
- Docker 快速入门(一)- 情况介绍和安装
欢迎您! 很高兴您想学习 Docker . 这个页面包含了如何开始使用 Docker 的循序渐进的说明. Docker 快速入门培训模块教你如何: 设置 Docker 环境(在本页) 构建并运行您的镜 ...
- Docker快速入门
Docker已经火了很长一段时间,最近打算在阿里云上好好熟悉一下Docker的相关应用,为今后的工作做准备. 基本概念 Docker是基于Go语言实现的云开源项目,诞生于2013年初,最初发起者是do ...
- Docker快速入门——Docker-Compose
一.Docker-Compose简介 1.Docker-Compose简介 Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排.Docker-Com ...
- (二)、Docker 快速入门
文档:https://docs.docker.com/install/linux/docker-ce/centos/ 中文文档:https://docs.docker-cn.com/engine/in ...
- 全面的Docker快速入门教程
前言: 都2021年了,你还在为了安装一个开发或者部署环境.软件而花费半天的时间吗?你还在解决开发环境能够正常访问,而发布测试环境无法正常访问的问题吗?你还在为持续集成和持续交付(CI / CD)工作 ...
- MinIO Docker 快速入门
官方文档地址:http://docs.minio.org.cn/docs/master/minio-docker-quickstart-guide 在Docker中运行MinIO单点模式 MinIO ...
- 进击的docker 二 : docker 快速入门
1.安装docker 1.1.安装环境 [root@docker ~]# cat /etc/redhat-release CentOS Linux release (Core) [root@docke ...
- docker快速入门+搭建javaweb环境
一.windows安装 不要安装旧的 boot2docker包,直接安装 DockerToolbox. 一路next,安装完成以后 试用 1.以管理员身份运行 docker quickstart te ...
随机推荐
- Java之Lambda表达式
函数式编程思想概述 面向对象过分强调“必须通过对象的形式来做事情”,而函数式思想则尽量忽略面向对象的复杂语法——强调做什么,而不是以什么形式做. 面向对象的思想: 做一件事情,找一个能解决这个事情的对 ...
- 2019年全国高校计算机能力挑战赛初赛C语言解答
http://www.ncccu.org.cn 2019年全国高校计算机能力挑战赛分设大数据算法赛,人工智能算法赛,Office高级应用赛,程序设计赛4大赛项 C语言初赛解答 1:编程1 16.现有一 ...
- Linux系统:centos7下搭建ElasticSearch中间件,常用接口演示
本文源码:GitHub·点这里 || GitEE·点这里 一.中间件简介 1.基础概念 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于R ...
- Django路由系统的简介与使用
Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL 与 为该URL调用的视图函数之间的映射表. ...
- java 实现文件下载中文名不显示
需要将指定字符串的编码转换成浏览器里面的ISO-8859-1编码 String name = new String(name.getBtes("utf-8"),"ISO- ...
- 彻底理解volatile,领悟其中奥妙
本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...
- javascript 模块化开发(一)
什么是模块化 将一组模块(及其依赖项)以正确的顺序拼接到一个文件(或一组文件)中的过程. 传统的模块化做法. 模块是实现特定功能的一组属性和方法的封装. 将模块写成一个对象,所有的模块成员都放到这个对 ...
- 如何判断Linux系统安装在VMware上?
如何判断当前Linux系统是否安装在VMware上面呢? 因为公司大部分服务器位于VMware上,也有小部分系统部署在物理机上面.今天老大要求统计一下VMware和物理机上服务器的数量,个人简单测试. ...
- Oracle 11gR2 RAC网络配置,更改public ip、vip和scanip
Oracle 11gR2 RAC网络配置,更改public ip.vip和scanip 转载黑裤子 发布于2018-10-30 01:08:02 阅读数 2898 收藏 展开 转载. https:/ ...
- 自己写的一个连数据库的音乐调用模块 MusicRj
#自己定义 class MusicRj: # 创音乐表t_music # sql = '''CREATE TABLE t_music1( # id INT PRIMARY KEY AUTO_INCRE ...