Docker-1.理论基础

Docker理论基础

Docker是一个开源的引擎,采用C/S架构,其可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。

使用go语言编写的基于LCX容器技术的开源解决方案,其三大理念是构建、运输和运行。

开源解决运行环境和代码,即将运行环境和代码整体打包进行部署,Docker是Docker.lnc公司开源的基于LXC技术之上构建的container容器引擎,云代码托管在github上,基于go语言并遵从apache 2.0协议。

Dcoker是通过内核虚拟化技术(namespace及cgroup等)来提供容器的资源隔离与安全保障等,由于Docker通过操作系统的虚拟化来实现隔离,所以Docke容器在运行时不需要类似虚拟机(空运行的虚拟机占用物理机6-8%性能)的额外资源开销,因此可以大幅提高资源利用率。

docker的组成:

镜像:启动一个docker需要有一个镜像,类似于虚拟机的镜像
容器:从镜像创建的实例称为容器,可以启动、停止和删除等。各容器之间是隔离的,但是不像虚拟机隔离的那么彻底
仓库:保存镜像的地方,类似于yum仓库和git仓库

1

Docker对比虚拟机:

2

安装docker客户端命令并查看网络:

安装docker命令:

[root@docker-server1 ~]# yum install docker
[root@docker-server1 ~]# systemctl start docker
[root@docker-server1 ~]# systemctl enable docker

查看网络:

会自动创建一个docker0的网络和IP地址段

3

关于docker 镜像:

在线搜索docker镜像:

1
[root@docker-server1 ~]# docker search centos

4

在线下载镜像

1
2
3
4
5
6
[root@docker-server1 ~]# docker pull docker.io/centos
Using default tag: latest
Trying to pull repository docker.io/library/centos ...
latest: Pulling from docker.io/library/centos
45a2e645736c: Downloading [========================================>]56.77 MB/70.39 MB
45a2e645736c: Pulling fs layer

镜像操作命令

1
2
3
4
5
[root@docker-server1 ~]# docker load -i centos-latest.tar.xz #导入本地镜像
[root@docker-server1 ~]# docker save -o /opt/centos.tar centos #导出镜像
[root@docker-server1 ~]# docker rmi 镜像ID/镜像名称 #删除指定ID的镜像,通过镜像启动容器的时候镜像不能被删除,除非将容器全部关闭
[root@docker-server1 ~]# docker rm 容器ID/容器名称 #删除容器
[root@docker-server1 ~]# docker rm 容器ID/容器名-f #强制删除正在运行的容器

查看镜像:

1
2
3
[root@docker-server1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 778a53015523 10 months ago 196.7 MB

REPOSITORY #镜像所属的仓库名称
TAG #镜像版本号(标识符)
IMAGE ID #镜像唯一ID标示
CREATED #镜像创建时间
VIRTUAL SIZE #镜像的大小

容器操作

从镜像启动容器:

1
2
3
[root@docker-server1 ~]# docker run [参数选项]  [镜像名称,必须在所有选项的后面] [/bin/echo 'hello wold']  #单次执行,没有自定义容器名称
[root@docker-server1 ~]# docker run centos /bin/echo 'hello wold' #启动的容器在执行完shel命令就退出了
[root@docker-server1 ~]# docker ps -a #显示所有正在运行和没有运行的进程,不加-a是显示正在运行的进程

启动容器的时候指定容器的名称:

1
2
3
4
5
6
[root@docker-server1 ~]# docker run --name mydocker  -t -i centos /bin/bash  #--name自定义容器名称,-t分配伪终端,-i 为容器打开标准输入,后面是打开shell
[root@16107c6187ec /]# #进入到了容器里面,执行exit就退出容器了
[root@16107c6187ec /]# ps -aux #第一个进程是/bin/bash,
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 11748 1920 ? Ss 14:12 0:00 /bin/bash
root 16 0.0 0.0 47420 1664 ? R+ 14:16 0:00 ps -aux

启动一个已经关闭的容器并进入到容器:

1
2
3
4
5
6
[root@docker-server1 ~]# docker start mydocker #启动已经关闭的容器
[root@docker-server1 ~]# docker stop mydocker #关闭一个正在运行的容器
[root@docker-server1 ~]# docker attach mydocker #所有使用此方式进入容器的操作都是同步的切exit后容器将被关闭,不推荐使用,推荐使用下面的方式
[root@docker-server1 ~]# yum -y install utils-linux #安装工具包
[root@docker-server1 ~]# docker inspect -f "{{.State.Pid}}" mydocker #获取到某个docker容器的PID,可以通过PID进入到容器内
[root@docker-server1 ~]# nsenter -t 5396 -m -u -i -n -p #进入到容器内部,这是比较推荐的方式因为退出后容器依然在运行,其他参数使用nsenter --help查看

通过脚本进入指定的容器::

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
docker_in(){
NAME_ID=$1
PID=$(docker inspect -f "{{.State.Pid}}" ${NAME_ID})
nsenter -t ${PID} -m -u -i -n -p
}

docker_in $1
###########执行测试##################
[root@docker-server1 ~]# ./docker.sh 16107c6187ec
[root@16107c6187ec /]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 11772 1660 ? Ss+ 05:58 0:00 /bin/bash
root 92 0.0 0.0 13372 1996 ? S 06:35 0:00 -bash
root 105 0.0 0.0 49020 1824 ? R+ 06:35 0:00 ps -aux

通过exec执行单词命令与进入容器:

1
2
3
4
5
[root@docker-server1 ~]# docker exec mydocker  ls /opt #不进入容器就执行命令
[root@docker-server1 ~]# docker exec -it mydocker /bin/bash #通过exec进入到容器,不推荐此方式,有bug
[root@16107c6187ec /]# ls /opt
123
[root@16107c6187ec /]# exit #退出后容器进程依然存在

容器的自动自动删除:

1
[root@docker-server1 ~]# docker run  --rm centos /bin/echo "test" #运行完成后自动删除

docker功能总结

docker具备的功能

简化配置-将运行环境和代码打包放在容器,方便环境管理
代码流水线管理-开发效率 (为开发人员瞬间顺被环境)-通过docker部署开发环境
应用隔离
服务器整合
debug能力
多租户
快速部署-部署速度大幅快于虚拟机

docker改变了什么?

面向产品: 快速的产品交付,以docker的方式交付,大幅提高了交付速度
面向开发: 简化环境配置,将环境打包在一起,简化环境配置
面向测试: 多版本测试,多版本并存
面向运维: 环境一致性,通过同一个docker镜像启动的容器都是一样的,一次构建到处运行
面向架构: 自动化扩容(微服务),扩容方便

为什么要使用docker?

做紧跟技术储备

互联网技术更新很快,一步跟不上步步跟不上

提升运维者自身技术能力

适应当前最流行的技术,相比其他人能力更强

符合企业部分业务需求

在公司将业务迁移到docker容器,可减小IT投入并方便业务扩展

无技术栈和技术债

结合虚拟化、saltstack、openstack等相关技术,实现架构符合SOA松耦合

注意:docker 是使用的C/S架构,如果Server挂掉,则所以运行在当前服务器的所有Docker容器都不能被正常访问,所以在使用docker 的时候要考虑做高可用,避免单机故障

0%