#### LXC
Linux 容器(Linux Containers,缩写为 LXC)。
Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。
由于容器是进程级别的,相比虚拟机有很多优势。启动快占用资源少。
#### 什么是Docker?
Docker 是世界领先的软件容器平台。运维人员利用 Docker 可以在隔离容器中并行运行和管理应用,获得更好的计算密度。
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。
总体来说,Docker的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
#### 为什么要使用Docker
##### 更快速的交付和部署
对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。
##### 更高效的虚拟化
Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。
##### 更轻松的迁移和扩展
Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
##### 更简单的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
#### Docker vs VM
VM是一个运行在宿主机之上的完整的操作系统.**Docker不同于VM,只包含应用程序以及依赖库,基于libcontainer运行在宿主机上,并处于一个隔离的环境中,这使得Docker更加轻量高效,启动容器只需几秒钟之内完成**。
Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。
#### 相关概念
Docker是CS架构,主要有两个概念:
Docker daemon:
运行在宿主机上,Docker守护进程,用户通过Docker client(Docker命令)与Docker daemon交互
Docker client: Docker
命令行工具,是用户使用Docker的主要方式,Docker client与Docker daemon通信并将结果返回给用户,Docker client也可以通过socket或者RESTful api访问远程的Docker daemon
#### image container hub
Docker image:
镜像是只读的,镜像中包含有需要运行的文件。镜像用来创建container,一个镜像可以运行多个container;镜像可以通过Dockerfile创建,也可以从Dockerhub/registry上下载。
Docker container:
容器是Docker的运行组件,启动一个镜像就是一个容器,容器是一个隔离环境,多个容器之间不会相互影响,保证容器中的程序运行在一个相对安全的环境中。
Docker hub/registry:
共享和管理Docker镜像,用户可以上传或者下载上面的镜像,官方地址为https://registry.hub.docker.com/,也可以搭建自己私有的Docker registry。
镜像就相当于打包好的版本,镜像启动之后运行在容器中,仓库就是装存储镜像的地方。
#### 常用命令
##### 拉取docker镜像
**docker pull image_name**
查看宿主机上的镜像,Docker镜像保存在/var/lib/docker目录下:
**docker images**
##### 删除镜像
**docker rmi** docker.io/tomcat:7.0.77-jre7
或者
**docker rmi** b39c68b7af30
##### 查看当前有哪些容器正在运行
**docker ps**
查看所有容器
docker ps -a
##### 启动、停止、重启容器命令:
docker start container_name/container_id
docker stop container_name/container_id
docker restart container_name/container_id
##### 后台启动一个容器后,如果想进入到这个容器,可以使用attach命令:
docker attach container_name/container_id
##### 删除容器的命令:
docker rm container_name/container_id
##### 查看当前系统Docker信息
docker info
##### 从Docker hub上下载某个镜像:
docker pull centos:latest
执行docker pull
centos会将Centos这个仓库下面的所有镜像下载到本地repository
##### 启动一个容器
**docker run**
创建一个新的容器并运行一个命令
**docker run [OPTIONS] IMAGE [COMMAND] [ARG...]**
**OPTIONS说明:**
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-p: 端口映射,格式为:主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name="nginx-lb": 为容器指定一个名称;
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
-h "mars": 指定容器的hostname;
-e username="ritchie": 设置环境变量;
--env-file=[]: 从指定文件读入环境变量;
-v 把容器中的目录和宿主机中的目录做映射
-m :设置容器使用内存最大值;
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
--link=[]: 添加链接到另一个容器;
--expose=[]: 开放一个端口或一组端口;
#### docker使用mysql
##### 获取镜像 docker pull mysql
##### 启动mysql容器
当前目录先创建conf logs data目录
```
mkdir conf
mkdir logs
mkdir data
docker run -p 3306:3306 --name mysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql
```
-name 容器名字
-p 3308:3306 物理机端口:容器内部端口
-e 运行参数 初始化 root 用户的密码
-d 后台运行
-v 挂载一些主机目录
mysql:5.6 下载的镜像名字加标签
-v conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。//配置文件目录
-v logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。//日志目录
-v data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql
##### 进入容器
docker exec -it mysql bash
##### 连接mysql
mysql -u root
##### 权限修改
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
#### 用例
- 运行一个在后台执行的容器,同时,还能用控制台管理:docker run -i -t -d ubuntu:latest
- 运行一个带命令在后台不断执行的容器,不直接展示容器内部信息:docker run -d ubuntu:latest ping www.docker.com
- 运行一个在后台不断执行的容器,同时带有命令,程序被终止后还能重启继续跑,还能用控制台管理,docker run -d --restart=always ubuntu:latest ping www.docker.com
- 为容器指定一个名字,docker run -d --name=ubuntu_server ubuntu:latest
- 容器暴露80端口,并指定宿主机80端口与其通信(: 之前是宿主机端口,之后是容器需暴露的端口),docker run -d --name=ubuntu_server -p 80:80 ubuntu:latest
- 指定容器内目录与宿主机目录共享(: 之前是宿主机文件夹,之后是容器需共享的文件夹),docker run -d --name=ubuntu_server -v /etc/www:/var/www ubuntu:latest
- docker run -d --restart=always --name=ubuntu_server -p 80:80 ubuntu:latest
有疑问加站长微信联系(非本文作者))