一、 解决问题
解决因运行环境而导致系统不可用或者出现 bug 等问题。解决方法就是:提供一个统一的配置环境。
二、 虚拟机
虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,是全虚拟化的。
缺点:
(1)资源占用多
虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有 1MB,虚拟机依然需要几百 MB 的内存才能运行。
(2)冗余步骤多
虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录。
(3)启动慢
启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。
三、 Linux 容器
Linux 容器(Linux Containers,缩写为 LXC)不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。
由于容器是进程级别的,相比虚拟机有很多优势。
(1)启动快
容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。
(2)资源占用少
容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源。
(3)体积小
容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。
总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。
四、 docker 是什么?
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。
Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
五、docker 的用途
Docker 的主要用途,目前有三大类。
(1)提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
(2)提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
(3)组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。
六、 image 文件
Docker 把应用程序及其依赖,打包在 image 文件里面。这个 image 文件,就是一个镜像,可以通过它去创建若干容器对象。类似于 Java 中类与对象的关系。
# 列出本机的所有 image 文件。
$ docker image ls
# 删除 image 文件
$ docker image rm [imageName]
# 下载镜像
$ docker pull [imageName]
七、 容器文件
image 文件生成的容器实例,本身也是一个文件,称为容器文件。也就是说,一旦容器生成,就会同时存在两个文件: image 文件和容器文件。而且关闭容器并不会删除容器文件,只是容器停止运行而已。
# 列出本机正在运行的容器
$ docker container ls
# 列出本机所有容器,包括终止运行的容器
$ docker container ls --all
八、 Dockerfile 文件
学会使用 image 文件以后,接下来的问题就是,如何可以生成 image 文件?如果你要推广自己的软件,势必要自己制作 image 文件。
这就需要用到 Dockerfile 文件。它是一个文本文件,用来配置 image。Docker 根据 该文件生成二进制的 image 文件。
九、 容器操作
查看容器:
# 查看正在运行的容器
$ docker ps
-a 查看所有,-l 上一次运行,-f status=exited 退出的。
创建/运行容器:
docker run
-i 运行;
-t 启动后进入命令行;
-d 启动后创建一个守护进程进入后台运行;
--name 给容器命名;
-v 目录映射关系 本地目录:容器目录
;
-p 端口映射关系 本机端口:容器端口
。
# 使用 centos:7 镜像创建一个容器,名字为 mycentos,启动并进入命令行
docker run -it --name=mycentos centos:7 /bin/bash
使用 exit
退出。
# 使用 centos:7 镜像创建一个容器,名字为 mycentos,启动并进入后台运行
docker run -id --name=mycentos1 centos:7
使用 docker exec -it mycentos1 /bin/bash
进入命令行。 exit
退出,但是容器不会关闭。
守护式容器要停止运行,使用命令:docker stop mycentos1
即可。
容器创建后,使用命令 docker start mycentos1
启动。
目录映射
docker run -id --name=mycentos2 -v /usr/local/test:/user/local/test1 centos:7
这样在本地的 /usr/local/test
就映射到容器的 /user/local/test1
目录,本地的操作会自动同步到容器。
如果映射的是多级目录,可能出现权限不足的提示。可以在创建容器时需要添加参数:--privileged=true
。
端口映射
docker run -id --name=mycentos3 -p [宿主机端口]:[容器端口] centos:7
查看IP信息
docker inspect [容器名]
或者:
docker inspect --format='{{.NetworkSettings.IPAddress}}' [容器名]
删除容器
docker rm [容器名/容器id]
注意:无法删除正在运行的容器。
删除镜像
docker rmi [镜像 image id]
注意:无法删除挂载容器的镜像。
文件拷贝
docker cp
用于宿主机与容器进行文件/文件夹交换操作。
docker cp 源文件/文件夹 目标文件/文件夹
十、 国内镜像
https://lug.ustc.edu.cn/wiki/mirrors/help/docker
或者是用阿里云的镜像服务,可以创建私人仓库。
十一、 容器部署
部署一个mysql:
抽取 mysql
docker pull mysql
部署:
docker run -id --name=mymysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
初始化密码为123456,就可以通过宿主机ip、端口33306 去连这个容器里面的mysql 了,如果开了防火墙,需要将 33306开放为可访问。
部署一个 Nginx 容器。
抽取 Nginx
docker pull nginx
部署:
docker run -id --name=mynginx -p 80:80 nginx
配置文件在容器目录 /etc/nginx/nginx.conf
。
十二、容器备份与迁移
- 将容器保存为镜像:
docker commit [容器名] [镜像名]
使用 docker images
查看。
- 导出:
docker save -o my.rar [镜像名]
就会在当前目录导出这个文件。
- 导入
docker local -i my.rar