Docker第二招
一、docker镜像操作
docker run hello-world
run :
pull dockerhub 仓库中项目/库/镜像
start hello-world-image
注释:
1、docker client客户端连接到了服务端(服务端是以一个守护进程的形式跑在操作系统里的)restful api典型的C/S架构
2、由docker服务端的守护进程从docker hub上下载了镜像(服务端会先检查本地系统是否有这个镜像)
3、服务端创建了一个新的容器,然后从拉去的这个镜像启动了一个容器,容器执行了脚本/可执行程序让我们可以查看/使用
4、docker 服务端把这些信息流(传递)返回到客户端并展示出来, (展示在终端上)
docker client 可以是多种形式,比如"docker"命令工具所在的终端
二、docker命令—镜像
1、查看docker版本
docker -v
docker version
decker info 可以查看所有运行容器的镜像数量,运行容器的版本,可以分配的CPU,总的内存等信息.docker的工作目录 /var/lib/decker
2、搜索镜像
docker search nginx
docker search centos:7
——》自己制作镜像,然后上传到docker hub 上
优化:有效减少镜像大小,dockerfile 优化方向
3、下载镜像(默认是从docker hub)
docker pull 镜像名称
例如:docker pull nginx
4、查看镜像列表
docker images 查看当前docker下的所有下载镜像信息
5、获取镜像信息,封装镜像的详细信息
docker inspect 镜像ID
6、添加镜像标签
docker tag hello-world:latest hello-world:lamp
7、删除镜像
docker rmi 镜像名称
docker rmi 镜像标签
docker rmi `docker images -q` -q 列出镜像ID
8、镜像导出
docker save -o 文件名 镜像名
示例:
docker save -o centos_7 centos:7
docker save -o nginx_docker nginx:latest
9、镜像导入
到另一台虚拟机上
docker load < nginx_docker
使用场景:有的生产环境,企业不直接使用docker私有仓库,而是存放在一个ftp服务器中,按需上传下载。
docker ps -aq 只过滤出容器ID
docker rm `docker ps -aq` 批量删除=
CONTAINER ID:容器ID
IMAGE:镜像版本
CRATED:创建的时间
STATUS:运行的时间
PORTS:暴露的端口
NAMES:名称(可定义)
三、docker命令—容器操作
1、查询容器
docker ps -a
docker ps -aq 只过滤出容器ID
docker rm `docker ps -aq` 批量删除(运行过程中要加rm -f 强制删除)
2、创建容器
docker create -it nginx:latest /bin/bash
-i 让容器的标准输入保持打开
-t 分配一个伪终端
-d 后台守护进程的方式运行
3、启动容器
docker start 容器id
4、启动容器(一次性执行)
docker run centos:7 /usr/bin/bash -c ls /
5、停止容器
docker stop 容器ID
状态码0:正常退出,非0值表示非正常退出,137表示主动停止退出
6、容器持续后台运行
docker run -d centos:7 /usr/bin/bash -c "while true;do echo hello;done"
watch -n 2 docker ps -a
docker rm `docker ps -aq` #不会删除正在运行的
7、进入容器
①使用run
docker run -it nginx:latest /bin/bash #一次性的,退出则关闭
②exec(容器必须为开启状态)
docker exec -it 容器ID /bin/bash
PS:
docker run -it 会创建前台进程,但是会在输入exit后终止进程。
docker attach 会通过连接stdin,连接到容器内输入输出流,会在输入exit后终止进程.
docker exec -it 会连接到容器,可以像SSH一样进入容器内部,进行操作,可以通过exit退出容器,不影响容器运行。
8、容器导出
docker export 容器ID > 文件名
示例:
docker export 容器ID > nginx_02
9、容器导入,生成镜像
①docker import 导出的文件名(容器) 指定镜像名称
示例:
docker import nginx_02 nginx:latest
②cat 文件名(容器)| docker import - nginx : latest
cat nginx_02 | docker import - nginx : latest #- nginx 中间加空格
10、删除容器
docker rm 容器ID
11、强制删除容器
docker rm -f 容器ID
12、批量删除容器
docker ps -a | awk '{print "docker rm "$1}' | bash
13、批量删除"exit"状态的容器
for i in 'docker ps -a | grep -i exit | awk '{print $1}'`; do docker rm -f $i; done
四、docker网络模式
容器网络
docker0网络
docker容器的虚拟网关
loopback :回环网卡、TCP/IP网卡是否生效
virtual bridge: linux
白身继承了一个虚拟化功能(kvm架构),是原生架构的一一个虚拟化平台,安装了一个虚拟化平台之后就会系统就会自动安
装虚拟网卡
(示例:安装workstation ( 虚拟化平台)之后,会在网络适配器中会多H出VMnet1 VMnet8 VMnet0)
docker 0 :容器的网关,绑定物理网卡,负责做NAT地址转换、端口映射
docker 0本身也是一种容器
Docker四种模式:
1、Host模式
host容器将不会虚拟出自己的刚卡,配置自己的IP等等,而是使用宿主机的IP和端口
如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network
Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,
配置自己的IP等等,而是会使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进
程列表等还是和宿主机隔离的。
使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可
以使用宿主机的端口,不需要进行NAT, host 最大的优势就是网络性能比较好,但是docker
host上已经使用的端口就不能再用了,网络的 隔离性不好。
2、container模式
container创建的容器不会创建自己的网卡、设置IP等,而是和一个指定地容器共享IP、
端口范围
这个模式指定新创建的容器和已经存在的一个容器共享一个network namespace,而不是和
宿主机共享,新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定地容器共
享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表还是隔离
的。(两个容器的进程可以通过loo网卡设备通信)
3、None模式:该模式关闭了容器的网络功能
这种网络模式下容器只有lo回环网口,并没有其他的网卡。none模式可以在容器创建时通过
-network=none参数指定
这种类型的网络无法联网,但是封闭的网络能很好的保证容器的安全性。
4、Bridge模式:
此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker虚拟网桥,通过docker 0 网桥及iptables的nat,表配置与宿主机通信
当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就可以通过交换机连在了一个二层网络中。
从docker0子网中分配一个IP给容器使用,并设置docker0 的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair 设备,Docker 将 veth pair 设备的一端放在新创建的容器中,并命名etho(容器的网卡),另一端放在主机中,以vethxxx,这样类似的名字命名,并将这个网络设备加入到docker0 网桥中。可以通过brctl show命令查看。
bridge模式是docker 的默认网络模式,不写-net参数,就是 bridge模式。使用docker run -p时, docker实际是在iptables,做了DNAT规则,实现端口转发功能。可以使用jptables. -t nat -vnL查看。