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 ...
随机推荐
- 系统重装/装Anaconda后,Windows开始菜单缺少快捷方式解决方案
系统重装后,想把D盘的软件添加快捷方式 以下以anaconda3为例,提供两种方法 方法一: 参考: 装Anaconda后,Windows开始菜单缺少快捷方式解决方案 方法二: 1. 添加环境变量 ...
- ccf-csp201909题解
目录 ccf-csp201909题解 1. 201909-1 小明种苹果 题目描述 解析 通过代码 2. 201909-2 小明种苹果(续) 题目描述 解析 通过代码 3. 201909-3 字符画 ...
- Glide缓存流程
本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/cPLkefpEb3w12-uoiqzTig作者:连凌能 Android上图片加载的解决方案有多 ...
- 函数式编程 - Functional Programming
什么是函数式编程 函数式编程是一种编程范式. 编程范式又是什么? 编程范式是一种解决问题的思路. 命令式编程 把程序看作 一系列改变状态的指令: 函数式编程 把程序看作 一系列数学函数映射的组合. i ...
- 关于ASP.NET配置
字符串加密打开Vs的开发人员命令提示符 //加密web.config文件的连接字符串aspnet_regiis.exe -pef "connectionStrings" " ...
- 如何获得大学教材的PDF版本?
最近急需一本算法书的配套答案,这本配套单独出售,好像在市面上还买不到,在淘宝上搜索也只是上一个版本,并没有最新版本,让我很无奈.加上平时肯定会有这么一种情况,想看一些书,但买回来也看不了几次,加上计算 ...
- linux查看占用端口号的程序及pid
netstat -tunlp|grep 端口号 圈出来的就是pid
- 聊聊 Java8 以后各个版本的新特性
作者:ZY5A59 juejin.im/post/5d5950806fb9a06b0a277412 某天在网上闲逛,突然看到有篇介绍 Java 11 新特性的文章,顿时心里一惊,毕竟我对于 Java ...
- PlayJava Day015
今日所学: /* 2019.08.19开始学习,此为补档. */ StringBuffer 定义: 可变字符序列 - 线程安全的 作用:基本与String相同,也是用于描述字符串 与String的区别 ...
- 自学_JAVASCRIPT<四>
自学_JAVASCRIPT 什么是JAVASCRIPT HTML只是描述网页长相的标记语言,没有计算.判断能力,如果所有计算.判断(比如判断文本框是否为空.判断两次密码是否输入一致)都放到服务器端执行 ...