容器
容器和镜像的区别
镜像可以理解为一种构建时(build-time)结构,而容器可以理解为一种运行时(run-time)结构。
容器和虚拟机的区别
虚拟机和容器最大的区别是容器更快并且更轻量级——与虚拟机运行在完整的操作系统之上相比,容器会共享其所在主机的操作系统/内核。
容器和虚拟机都依赖于宿主机才能运行。宿主机可以是笔记本,是数据中心的物理服务器,也可以是公有云的某个实例。
在下面的示例中,假设宿主机是一台需要运行 4 个业务应用的物理服务器。
-
虚拟机:需要创建 4 个虚拟机并安装 4 个操作系统,然后安装 4 个应用。
虚拟机模型将底层硬件资源划分到虚拟机当中。每个虚拟机都是包含了虚拟 cpu、虚拟 RAM、虚拟磁盘等资源的一种软件结构。因此,每个虚拟机都需要有自己的操作系统来声明、初始化并管理这些虚拟资源。
但是,操作系统本身是有其额外开销的。例如,每个操作系统都消耗一点 cpu、一点 RAM、一点存储空间等。每个操作系统都需要独立的许可证,并且都需要打补丁升级,每个操作系统也都面临被攻击的风险。 -
容器:服务器启动之后,所选择的操作系统会启动。在 Docker 世界中可以选择 Linux,或者内核支持内核中的容器原语的新版本 Windows
容器模型具有在宿主机操作系统中运行的单个内核。在一台主机上运行数十个甚至数百个容器都是可能的——容器共享一个操作系统/内核。
这意味着只有一个操作系统消耗 cpu、RAM 和存储资源,只有一个操作系统需要授权,只有一个操作系统需要升级和打补丁。同时,只有一个操作系统面临被攻击的风险。简言之,就是只有一份 OS 损耗。
启动容器
docker container run
#格式:
docker container run [OPTION] [REPOSITORY]:[TAG]
#option
-it #将当前终端连接到容器
-d #以后台启动方式启动容器
--name #重命名
-p #映射端口,[docker主机端口]:[容器端口],当有流量访问docker主机端口时,流量会映射到容器内的端口
#例如:
docker container run -it ubuntu:16.04
仔细观察上面命令的输出内容,会注意到每个实例中的提示符都发生了变化。这是因为 -it 参数会将 Shell 切换到容器终端——现在已经位于容器内部了!其中 -it 参数告诉 Docker 开启容器的交互模式并将读者当前的 Shell 连接到容器终端。接下来,命令告诉 Docker,用户想基于 ubuntu:latest 镜像启动容器。
使用Ctrl-PQ
组合键退出容器,可以再退出容器的同时还保持容器运行
查看运行状态的容器
docker container ls
连接到运行中的容器
#格式
docker container exec [opt] [容器NAME/ID] [ARG...]
#例如:
docker container exec -it strange_bouman bash
在示例中,将本地 Shell 连接到容器是通过 -it 参数实现的。本例中使用名称引用容器,并且告诉 Docker 运行 Bash Shell(在 Windows 示例中是 PowerShell)。
停止容器运行
docker container stop [容器NAME/ID]
#例如:
docker container stop strange_bouman
docker container stop 9dc53040fa41
删除容器
docker container rm [容器NAME/ID]
#例如:
docker container rm strange_bouman
注:删除容器只能删除不在运行下的容器,容器在运行时无法被删除。
- 我们可以通过
docker container ls -a
来确认容器是否已经被成功删除
win10中访问wsl2中的docker容器
以nigelpoulton/pluralsight-docker-ci为例子:
- 1、首先在wsl的linux环境中启动容器,并用-p对其映射端口(此处的映射端口是将docker所在的宿主机(即wsl中的linux)映射到容器
$ docker container run -d --name webserver -p 80:8080 nigelpoulton/pluralsight-docker-ci
Unable to find image 'nigelpoulton/pluralsight-docker-ci:latest' locally
latest: Pulling from nigelpoulton/pluralsight-docker-ci
729ec3a6ada3: Pull complete
f0a3eea3dca0: Pull complete
e07851c50ad6: Pull complete
f78e7cd1f8dc: Pull complete
7cad1fbd2f07: Pull complete
22835c51693f: Pull complete
Digest: sha256:61bc64850a5f2bfbc65967cc33feaae8a77c8b49379c55aaf05bb02dcee41451
Status: Downloaded newer image for nigelpoulton/pluralsight-docker-ci:latest
049b6ee85436549b11d457cf2903e2262067bd7ba5e5499c5ba9840fcdc9cf8d
- 2、通过命令
docker container ls
查看当前运行的容器以及端口映射情况
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
049b6ee85436 nigelpoulton/pluralsight-docker-ci "/bin/sh -c 'cd /src…" 29 minutes ago Up 29 minutes 0.0.0.0:80->8080/tcp, :::80->8080/tcp webserver
- 3、建立win10和wsl中的linux的端口映射关系
上述步骤只能在wsl中访问容器的8080端口,你可以通过 ifconfig 查看docker的ip,然后通过curl docker-ip即可看到服务的返回。但是直接在win10的浏览器上访问还是不行,因此需要建立映射。
以管理员身份打开powershell
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=8077 connectaddress=<wsl中的linux的eth0的ip> connectport=<wsl中linux映射的端口>
#例如:上面我是用wsl的ubuntu中的80端口映射到了容器的8080端口,所以我这边的connectport要填80,172.19.115.157是我ubuntu的eth0的ip
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=8077 connectaddress=172.19.115.157 connectport=80
- 4、建立映射后可以查看
netsh interface portproxy show all
侦听 ipv4: 连接到 ipv4:
地址 端口 地址 端口
--------------- ---------- --------------- ----------
0.0.0.0 50051 172.25.16.145 50051
0.0.0.0 8077 172.19.115.157 80
- 5、现在就可以通过win10本机的8077端口访问到容器的8080端口了