一.简介
开发当中比较麻烦的问题在于软件配置,每个人的机械以及系统都不尽相同,程序需要运行在系统当中需要配置好相应的系统以及各种依赖的组件,但是很多时候由于各种软件依赖包的版本,系统兼容性问题会导致程序运行出现问题,人们便寻求一种可以解决这种问题的方法。
虚拟机
而虚拟机技术就是其中的一种解决方法,众所周知,虚拟机技术允许一种操作系统之上运行另一种操作系统,如win系统安装linux的虚拟机,而里面的运行程序却认为自己依旧运行在linux里面,因此用户只需要打包整个自己的运行环境,就可以在不同的系统利用虚拟机技术完美运行程序所需要的系统,而里面的程序更不在话下,且打包好的系统对于运行的系统而言只是一个文件,可以轻松管理。
但是虚拟机技术却有一种比较大的问题,那就是用户明明只需要运行某个程序,却需要引入该程序所处的整个系统,不但占用的空间很大,且启动速度也比较慢,毕竟需要启动整个系统。
容器技术
由于虚拟机存在这些缺点,Linux发展出了另一个虚拟技术:Linux容器,相对于虚拟机,Linux容器不是模仿一个完整的操作系统,而是对进程进行隔离。在这个容器里面,它接触到的资源都是虚拟的,他只需要它本身所需要的组件,相对于虚拟机技术而言,更轻量级,而docker就是对Linux容器的一种封装,提供给我们简单易用的接口,将应用程序以及依赖打包在一个文件里面。
二.安装docker
我是ubuntu系统,安装docker可以使用官方的快捷安装脚本进行安装。
$ wget -qO- https://get.docker.com/ | sh
但是我安装起来有点问题,在添加gbp的时候,所以我是安装教程一步步安装的。
# 添加gbp,但是我按照官方教程执行有点问题,去掉最后一个-符号就可以执行
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 添加APT资源
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt-get update
# 查看源是否已经生效
$ apt-cache policy docker-ce
# 这时候应该输出类似于这种东西,如果没有这些输出的话,下面的安装就会找不到软件包了
# docker-ce:
# Installed: (none)
# Candidate: 17.03.1~ce-0~ubuntu-xenial
# Version table:
# 17.03.1~ce-0~ubuntu-xenial 500
# 500 https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
# 17.03.0~ce-0~ubuntu-xenial 500
# 500 https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
# 最后安装docker
$ sudo apt-get install -y docker-ce
# 安装之后执行以下命令有信息输出即证明成功。
$ sudo systemctl status docker
之后我们可以通过下载一个镜像来尝试运行hello world。
docker run ubuntu echo "Hello world"
三.使用国内源
我们的docker在国内下载镜像并不会很流畅,所以我选择使用国内官方的景象。
我直接新建文件:/etc/docker/daemon.json,然后添加如下json,重启docker即可永久选择国内镜像。
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
四.docker的基本概念
1.image(镜像)
docker把应用程序以及其依赖,打包在image文件里面,docker容器是通过运行image生成的实例,同一个image文件可以生成多个容器实例。
2.container(容器)
container是一个docker的运行实例,也叫做容器,本身也是一个文件,可以理解容器实例就是通过渲染运行image镜像之后才产生的。值得注意的是生成容器之后,关闭容器不会删除该容器文件,该容器文件之后停止运行了而已。
至于镜像以及容器之间拥有镜像分层结构,详解可以看出我写的这篇文章。
五.基本命令
镜像操作
# 查看当前本地镜像列表
$ docker images
# 查看远程相关镜像镜像
$ docker search 镜像名字
# 拉取镜像到本地
$ docker pull 镜像名字
# 删除镜像(当存在多个名字一样的镜像时候,可以通过指定tag方式来操作,如ubuntu:16.04)
$ docker rmi 镜像名字
容器的基本操作
# 创建一个docker容器,返回容器的id
$ docker create 镜像名字
# 运行docker容器
$ docker start 容器id
# 新建容器且运行,也就是上面两步一块执行。
# 值得注意的是如果该镜像在本地不存在,会自动从源那里去拉取
$ docker run 镜像名字
# 停止容器
$ docker stop 容器id
# 查看当前运行的docker容器
$ docker ps
# 查看全部的docker容器
$ docker ps -a
# 删除容器
$ docker rm 容器id
新建容器(docker run 镜像)常见可选参数:
- p:指定映射端口,如运行一个nginx服务,那么我可以设置 -p 8080:80来把本地的8080端口映射到容器里的80端口。
- d:容器作为一个守护进程去进行运行,也就是保持后台运行,运行后会返回cotainer id。
容器与镜像间的操作
# 终端连接到容器
$ docker exec -i -t 容器id bash
# 复制文件到容器里面
$ docker cp index.html 镜像id://usr/share/nginx/html
# 保存更改并生成为一个新的image文件
$ docker commit -m "mess" 镜像id 镜像名字