Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
IP | 操作系统 | 软件版本 |
---|---|---|
192.168.220.30 | Centos7.4 | 19.03.8 |
//安装网络源
[root@zzg yum.repos.d]# curl -o /etc/yum.repos.d/CentOS7-Base-163.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo
[root@zzg yum.repos.d]# sed -i 's/\$releasever/7/g' /etc/yum.repos.d/CentOS7-Base-163.repo
[root@zzg yum.repos.d]# sed -i 's/^enabled=.*/enabled=1/g' /etc/yum.repos.d/CentOS7-Base-163.repo
[root@zzg yum.repos.d]# yum -y install epel-release
//安装依赖关系,更新container-selinux包
[root@zzg yum.repos.d]# yum update
[root@zzg yum.repos.d]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@zzg yum.repos.d]# yum -y install container-selinux
//设置yum源
[root@zzg yum.repos.d]# yum -y install docker-ce
//安装docker
[root@zzg yum.repos.d]# yum -y install docker-ce
[root@zzg yum.repos.d]# systemctl start docker
//搜索镜像
docker search 镜像名称
//下载镜像
docker pull 镜像
//查看已安装镜像列表
docker images
//删除镜像
docker rmi 镜像id
//运行镜像生成新的容器
docker run -d -it 镜像名称:版本号
eg: docker run -d -it -p 8080:8080 tomcat:7
-p 端口映射,前者宿主机端口,后者容器端口,多个端口 -p 8080:8080 -p 9090:9090
-d 后台运行容器
-it 以交互模式运行容器
eg: docker run -d -it -p 8080:8080 --name test -v /opt:/opt tomcat:7
-v 数据挂载
//进入容器
docker exec -it 容器id /bin/bash
//容器的启动停止
docker start 容器id
docker stop 容器id
//删除容器
docker rm 容器id
//查看容器日志
docker logs 容器id -f
//将容器配置文件copy到本地
docker cp 容器id:容器文件路径 本地文件夹
我们可以通过以下命令查看容器运行的各种数据
docker inspect 容器名称(容器ID)
也可以直接执行下面的命令直接输出IP地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)
导出镜像
docker save image_name > /test.tar
导出容器
docker export 容器id/name >文件名.tar
导入容器
docker import test.tar test
导入镜像
docker load --input /test.tar
区别:
docker save保存的是镜像(image),docker export保存的是容器(container);
docker load用来载入镜像包,docker import用来载入容器包,但两者都会恢复为镜像;
docker load不能对载入的镜像重命名,而docker import可以为镜像指定新名称。
//拉取最新镜像
[root@zzg yum.repos.d]# docker search apache
[root@zzg yum.repos.d]# docker pull httpd
//运行容器
[root@zzg yum.repos.d]# docker run -itd -p 8080:80 --name nginx-test nginx
39d074f46d0a870c04713d790b5a1a164dbf8bc7ac1114e25367d59b4e16893a
[root@zzg yum.repos.d]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
39d074f46d0a nginx "nginx -g 'daemon of…" 59 seconds ago Up 57 seconds 0.0.0.0:8080->80/tcp nginx-test
//拉取centos最新镜像
[root@zzg yum.repos.d]# docker pull centos
//运行容器
[root@zzg yum.repos.d]# docker run -itd --privileged=true -p 8000:80 --name nginx centos /usr/sbin/init
//--privileged 使用该参数,container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限
[root@zzg yum.repos.d]# docker exec -it 2ceebdbab3a7 /bin/bash
//下载nginx
[root@2ceebdbab3a7 /]# yum -y install nginx
[root@2ceebdbab3a7 /]# systemctl start nginx
四种网络模式
我们在使用docker run创建Docker容器时,可以用–net选项指定容器的网络模式,Docker有以下4种网络模式:
· host模式,使用–net=host指定。
· container模式,使用–net=container:NAME_or_ID指定。
· none模式,使用–net=none指定。
· bridge模式,使用–net=bridge指定,默认设置。
1 host模式(主机)
众所周知,Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
例如,我们在10.10.101.105/24的机器上用host模式启动一个含有web应用的Docker容器,监听tcp80端口。当我们在容器中执行任何类似ifconfig命令查看网络环境时,看到的都是宿主机上的信息。而外界访问容器中的应用,则直接使用10.10.101.105:80即可,不用任何NAT转换,就如直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
2 container模式(容器)
在理解了host模式后,这个模式也就好理解了。这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。
3 none模式
这个模式和前两个不同。在这种模式下,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
4 bridge模式(默认模式)
(他是通过网桥进行交互,会去生成一个子网络,子网络的每个子网络中的ip都是一个单独的网络,一个自己的IP段)
bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。