Docker
Docker是一个开源的应用容器引擎,基于Go语言。
参考课程:【狂神说Java】Docker最新超详细版教程通俗易懂
容器与VM
容器直接在Linux上运行,同时还与其他容器共同宿主机的kernel,容器之间相互隔离,占用的内存小于其他任何可执行应用,这使得Docker轻量化。相反VM则需要以运行一个完整的客户机操作系统,并使用hypervisor通过虚拟路径访问主机资源。
Docker在Centos7的安装
若存在Docker,需要先卸载Docker:
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
1.安装yum-utils,yum-utils提供yum-config-manager。
yum install -y yum-utils
2.设置yum的镜像仓库,使用aliyun镜像仓库。
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.安装最新的Docker
yum install docker-ce docker-ce-cli containerd.io
# ce社区版 client
4.启动Docker
systemctl start docker
5.测试安装
docker run hello-world
成功结果:
同时可以使用镜像加速:使用不同的服务器可以使用不同的镜像加速,aliyun,tencentyun等等。
centos的配置:
vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com"
]
}
然后重启服务
systemctl daemon-reload
systemctl restart docker
其他相关命令
yum remove docker-ce docker-ce-cli containerd.io
#卸载Docker engine
rm -rf /var/lib/docker
# 删除镜像,容器,数据卷等,此路径为docker的工作目录
Docker工作流程
参照docker run hello-world
- 在本地寻找是否有对应镜像。
- 没有就会去仓库寻找并pull,如果厂库中没有就返回。
- 找到后下载安装并运行。
常用命令
docker version #docker版本信息
docker info #查看docker信息
docker images #查看本地镜像
docker images -q #只显示image ID
docker pull #下载image,默认下载latest
docker pull xxx:tag #下载指定版本image
docker search xxx #寻找image
docker rmi -f xxx #删除指定image
docker rmi -f xxx xxx xxx #删除多个image
dock rmi -f $(docker images -aq) #删除所有image
docker run [参数] xxx /bin/bash
#启动容器
--name="xxx" 给容器命名
-it 以交互方式启动并进入容器
-d 后台运行
-p 主机端口:容器端口
-p ip:主机端口:容器端口
-p 容器端口
-P 随机指定端口
docker exec -it xxx /bin/bash # 进入正在运行的容器,开启一个新终端
docker attach xxx # 进入正在运行的容器的终端
docker ps #显示正在运行的容器
docker ps -a #显示所有容器
docker rm xxx #删除指定容器,无法删除正在运行的,-f 强制删除
dcker rm -f $(docker ps -aq) #删除所有容器
docker start #启动容器
docker restart #重启
docker stop #停止
docker kill #强制停止
docker logs xxx #显示日志 -f 带上时间戳
docker logs -f -t --tail n xxx #显示logs的n行
docker top xxx #查下容器内部进程信息
dcoker inspect xxx #显示容器元数据
docker cp 容器id:路径 目的路径 #将文件从容器中拷贝到主机
Docker镜像原理
镜像采用分层的方式,每一层都是单独的文件系统,多个镜像之间可以复用同一层的文件,每次只需要下载没有的文件。
每当容器启动时,会加一层可以写层到镜像,这一层成为容器层,对镜像所有的修改都在这一层,容器层下都是镜像层。
提交镜像
docker commit [参数] 容器id 目标镜像名:[TAG]
-m="提交的描述信息"
-a="作者"
DockerFile
使用DockerFile构建镜像,必须都是大写字母,每一个指令都是一层镜像层。
FROM #基础镜像
MAINTAINER #镜像创作者 姓名+邮箱
ENV #设置环境变量
RUN #构建时所需要的命令
ADD #添加的压缩包,自动解压
WORKDIR #镜像工作目录
VOLUME ["volum01","volume02"] #设置容器卷,挂载的host目录
EXPOSE #暴露的端口
CMD #启动时运行的命令,只会执行最后一个CMD,会覆盖
容器数据卷
容器中的数据是会跟随容器的,删除掉容器,数据也会丢失,Docker volume可以使得容器中的数据持久化到host,同时还可以让容器之间实现数据共享。
docker run -it -v /主机目录:容器目录 镜像名 #指定挂载
可以使用inspect查看:
具名和匿名挂载
docker run -d -v 容器目录 #只指定容器目录,使用匿名挂载,volume name为乱码
docker run -d -v volume name:容器目录 #声明volume name
使用inspect可以查看挂载在host的目录路径,在没有指定host目录时,都是挂载在下图这个路径中,大多数都是使用具名挂载。
扩展
数据卷容器
实现多个容器之间的数据共享(只是共享挂载出来的)。
--volumes-from 父容器
Docker网络
Docker0
使用ip addr查看docker0,docker0是只要安装了docker就会分配的网卡。
在容器中查看ip addr,eth0261,与host中262是对应的,这是一对虚拟设备接口,host与容器之间就是使用veth-pair实现的通信。
实现容器之间的通信使用桥接模式。
link (很少使用)
docker run --name tomcat03 --link tomcat02 tomcat #使用link将两个容器连接
但是使用link需要配置两个方向,不然只能单向连通,使用link会让tomcat03的host中声明tomcat02的ip。
自定义网络(常用)
网络模式
bridge:桥接模式 默认(常用)。
none:无网络配置。
host:与host共享网络。
container:容器网络连通,几乎不使用。
docker run xxxx --net #可以指定网络模式或者自定义的网络名称
#使用默认模式,不能通过域名连通,在使用link后才可以
docker network create --driver bridge --subnet 192.168.0.0/16
--gateway 192.168.0.1 网络名称
docker network ls #查看docker网络