前言
由于公司被并购,因此接触到docker,经过半个月的学习和使用,对docker算是有一点了解。因此写下这篇文章记录自己理解的docker。
docker简介
Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare
metal、OpenStack 集群和其他的基础应用平台。Docker通常用于如下场景:
- web应用的自动化打包和发布; 自动化测试和持续集成、发布;
- 在服务型环境中部署和调整数据库或其他的后台应用; 从头编译或者扩展现有的OpenShift或Cloud
- Foundry平台来搭建自己的PaaS环境。
以上这段话来自互联网,这里说说作者的理解:
- Docker是一个容器,而容器是为了解决“在切换运行环境时,如何保证软件能够正常运行”这一问题,因此docker也有该特性,这在上文也有提到,是一个可移植的容器。
- Docker改变了虚拟化的方式,使开发者可以直接将自己的应用放入Docker中进行管理。由于每个应用在docker中都是以一个单独的容器运行,因此无论是对应用的迭代更新还是进行横向拓展都非常方便。例如横向拓展,无非是将该容器复制一份。
- Docker对于自动化打包、自动化部署有着非常友好,使用docker你甚至能做到:代码提交到git后剩余的打包部署工作全部自动化进行了。如果再配合上自动化测试,也就是现在比较流行的DevOps开发模式了。
总的来说,可以把docker看作一个虚拟化的软件,它可以虚拟出很多“Linux虚拟机”——容器(实际上无论是性能还是体积都比虚拟机强很多很多)。同时,在做虚拟化时docker还支持你自定义一些容器的配置和环境,并且,每个容器只运行一个应用。因此理论上不可能出现“开发时没问题,部署时就出问题”的现象。
docker名词概念
名词 | 概念 |
---|---|
Docker 镜像(Images) | Docker 镜像是用于创建 Docker 容器的模板。 |
Docker 容器(Container) | 容器是独立运行的一个或一组应用。 |
Docker 客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 与 Docker 的守护进程通信。 |
Docker 主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
Docker 仓库(Registry) | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。 |
docker命令
以下内容引用自博客:https://www.cnblogs.com/edisonxiang/p/6068212.html
-
查看正在运行的容器
$ sudo docker ps
-
查看所有的容器
$ sudo docker ps -a
-
查看本地镜像
$ sudo docker images
-
从镜像中运行/停止一个新实例
$ sudo docker run/stop --help $ sudo docker run/stop container
-
避免输出Sudo
这里把当前用户加入到docker组就可以直接使用命令,而不用每次都加sudo
$ sudo groupadd docker #改完后需要重新登陆用户 $ sudo gpasswd -a ${USER} docker
-
Docker版本
$ sudo docker --version
-
搜索Docker Image
$ docker search tutorial
搜索网址是:index.docker.io [国内无法访问]
其他网址是:https://hub.docker.com/
-
通过docker命令下载tutorial镜像
$ docker pull learn/tutorial
-
从指定image里生成一个container并在其中运行一个命令
$ docker run [image] [cmd]
-
在container里运行交互式命令,比如shell
$ docker run -i -t [image] [cmd] $ docker run -i -t ubuntu /bin/bash
-
在container里运行后台任务
$ docker run -d [image] [cmd]
-
列出最近一个运行过的container
不加-l则只列出正在运行的container(比如后台任务)
$ docker ps -l
-
列出所有container
$ docker ps -a
-
查看container详情
$ docker inspect [container]
-
删除某个container
其中container_id不需要输入完整,只要能保证唯一即可。
运行中的Docker容器是无法删除的,必须先通过docker stop或者docker kill命令停止。
$ docker rm [container] $ docker rm `docker ps -a -q` 删除所有容器,-q表示只返回容器的ID
-
再次运行某个container
$ docker start [container]
-
查看某个container的运行日志
$ docker logs [container] $ docker logs -f [container] 类似tailf
-
切换到后台任务container, 需要当前容器正常运行
注意:切换到后台任务以后无法用Ctrl-C退出
$ docker attach [container]
-
中止后台任务container
$ docker stop [container]
-
将container保存为一个image
$ docker commit [container] [image_name]
-
将image上传到仓库
$ docker push [image_name]
-
删除images
$ docker rmi [image id]
-
为容器指定名称,容器的名称是唯一
$ docker run --name edison -i -t ubuntu /bin/bash
-
有三种方式可以唯一指代容器
短UUID: 716d3c16dc65(12位)
长UUID:716d3c16dc654230ada14f555faadd036474231dfca0ca44b597574a5c618565(64位)
名称: edison
-
当前Docker宿主机的信息
$ docker info
-
查看容器内部的进程信息
$ docker top [container]
-
在容器中运行后台任务,只对正在运行的容器有效。
$ docker exec -d [container] [cmd] $ docker exec -d edison touch /home/haha
-
在容器中运行交付式任务,只对正在运行的容器有效。
$ docker exec -t -i edison /bin/bash