Docker实验报告

百般思念 提交于 2019-12-15 17:34:16

Docker安装

输入以下命令即可在Ubuntu18.04上配置Docker:

sudo apt-get install  apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce

容器运行

环境就绪,马上运行第一个容器,执行命令:

sudo docker run -d -p 1998:80 httpd

此时打开浏览器输入对应端口地址http://localhost:1998即可:
在这里插入图片描述

hello-world

输入以下命令即可运行hello-world:

sudo docker pull hello-world
sudo docker run hello-world

在这里插入图片描述

构建镜像

首先,新建Dockfile,其内容如下:

FROM ubuntu
RUN apt-get update && apt-get install -y --fix-missing vim

接着,在Dockfile同目录下运行以下命令:

sudo docker build -t ubuntu-with-vi-dockerfile .

然后便可查看新添的ubuntu-with-vi-dockerfile镜像:
在这里插入图片描述

使用镜像缓存

更改Dockerfile,其内容如下:

FROM ubuntu
RUN apt-get update && apt-get install -y --fix-missing vim
COPY testfile /

此时输入以下命令,可看到构建过程使用了缓存:
在这里插入图片描述

sudo docker build -t ubuntu-with-vi-dockerfile-2 .

输入sudo docker run -it ubuntu-with-vi-dockerfile-2 ,后输入ls查看文件,显示testfile文件存在于系统中:
在这里插入图片描述

RUN vs CMD vs ENTRYPOINT

修改Dockerfile为:

FROM ubuntu
RUN apt-get update && apt-get install -y --fix-missing vim
ENTRYPOINT ["/bin/echo","Hello"]
CMD ["world"]

输入以下命令构建新镜像:

sudo docker build -t ubuntu-with-vi-dockerfile-3 .

构建成功后,运行该镜像,有如下显示:
在这里插入图片描述
带参数"Cloudman"运行时,有如下显示:
在这里插入图片描述
可以看到,ENTRYPOINT 的 Exec 格式用于设置要执行的命令及其参数,同时可通过 CMD 提供额外的参数。

tag 的使用

以下操作为hello-world打上tag值1:

在这里插入图片描述

使用公共 Registry

登录docker账号:
在这里插入图片描述
修改镜像的 repository 使之与 Docker Hub 账号匹配:

sudo docker tag hello-world stories1998/hello-world:1

上传镜像:

sudo docker push stories1998/hello-world:1

登录 https://hub.docker.com,在Public Repository 中就可以看到上传的镜像:
在这里插入图片描述

进入容器

docker attach 直接进入容器启动命令的终端,不会启动新的进程。

docker exec 则是在容器中打开新的终端,并且可以启动新的进程。

容器常用操作

1.通过 docker stop 可以停止运行的容器
2.docker start 会保留容器的第一次启动时的所有参数
3.docker restart 可以重启容器,其作用就是依次执行 docker stopdocker start
4.有时我们只是希望暂时让容器暂停工作一段时间,比如要对容器的文件系统打个快照,或者 dcoker host 需要使用 CPU,这时可以执行 docker pause
5.处于暂停状态的容器不会占用 CPU 资源,直到通过 docker unpause 恢复运行
6.可以通过 docker rm 删除容器

限制容器对内存的使用

下面我们将使用 progrium/stress 镜像来学习如何为容器分配内存。该镜像可用于对容器执行压力测试。执行如下命令:

docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M

–vm 1:启动 1 个内存工作线程。

–vm-bytes 280M:每个线程分配 280M 内存。

运行结果如下:

在这里插入图片描述
如果让工作线程分配的内存超过 300M,结果如下:
在这里插入图片描述

限制容器对CPU的使用

比如在 host 中启动了两个容器:

docker run --name "container_A" -c 1024 ubuntu

docker run --name "container_B" -c 512 ubuntu

container_A 的 cpu share 1024,是 container_B 的两倍。当两个容器都需要 CPU 资源时,container_A 可以得到的 CPU 是 container_B 的两倍。

查看容器进程

输入ps axf 即可
在这里插入图片描述
可以看到,所有容器的进程都挂在 dockerd 进程下,同时也可以看到容器自己的子进程。

查看网络

输入sudo docker network ls即可:
在这里插入图片描述
可以看到,Docker 安装时会自动在 host 上创建三个网络

自定义容器网络

输入sudo docker network create --driver bridge --subnet 172.22.16.0/24 --gateway 172.22.16.1 my_net2即可创建子网段为172.22.16.0/24,网关为172.22.16.1,名称为my_net2的容器网络:
在这里插入图片描述
接着查看网络情况:
在这里插入图片描述
显示创建成功。
为镜像指定子网:

sudo docker run -it --network my_net2  ubuntu-with-vi-dockerfile

在这里插入图片描述
该ubuntu容器自动分配ip为172.22.16.2,现尝试ping网关172.22.16.1:
在这里插入图片描述
说明该ubuntu容器与网关互通
再新建一ubuntu容器,分配ip为172.22.16.3,尝试与旧容器ping:
在这里插入图片描述
ping通,说明处于同一子网的两容器网络互通。
为 httpd 容器添加一块 net_my2 的网卡:
在这里插入图片描述
进入新ubuntu容器,ping http容器,显示可以获得http容器的返回内容:
在这里插入图片描述
说明两者网络互通。

docker DNS server

下面启动两个容器 bbox1 和 bbox2:

sudo docker run -it --network=my_net2 --name=bbox1 busybox

sudo docker run -it --network=my_net2 --name=bbox2 busybox

然后,bbox2 就可以直接 ping 到 bbox1 了:
在这里插入图片描述

joined 容器

先创建一个 httpd 容器,名字为 web1。

sudo docker run -d -it --name=web1 httpd

然后创建 busybox 容器并通过 --network=container:web1 指定 jointed 容器为 web1,并获取httpd容器的反馈:
在这里插入图片描述
可以看出,busybox 可以直接用 127.0.0.1 访问 web1 的 http 服务。

外部世界如何访问容器

docker 可将容器对外提供服务的端口映射到 host 的某个端口,外网通过该端口访问容器。容器启动时通过-p参数映射端口:
在这里插入图片描述
容器启动后,可通过 docker ps 或者 docker port 查看到 host 映射的端口。在上面的例子中,httpd 容器的 80 端口被映射到 host 32773 上,这样就可以通过 :<32773> 访问容器的 web 服务了。
在这里插入图片描述
以 0.0.0.0:32773->80/tcp 为例分析整个过程:

在这里插入图片描述
docker-proxy 监听 host 的 32773 端口,

当 curl 访问 10.0.2.15:32773 时,docker-proxy 转发给容器 172.17.0.3:80,

httpd 容器响应请求并返回结果。

查看 Ubuntu 的默认 driver

输入sudo docker info即可:
在这里插入图片描述

bind mount

例如 docker host 上有文件 ~/Docker/testfile:
在这里插入图片描述

通过 -v 将其 mount 到 ubuntu 容器:

在这里插入图片描述

-v 的格式为 :

docker managed volume

我们通过 -v 告诉 docker 需要一个 data volume,并将其 mount 到 /usr/local/123:
在这里插入图片描述

用 volume container 共享数据

volume container 是专门为其他容器提供 volume 的容器。它提供的卷可以是 bind mount,也可以是 docker managed volume。下面我们创建一个 volume container:
在这里插入图片描述
我们将容器命名为 vc_data(vc 是 volume container 的缩写)。
通过 docker inspect 可以查看到这个 volume:
在这里插入图片描述
其他容器可以通过 --volumes-from 使用 vc_data 这个 volume container:
在这里插入图片描述

volume 生命周期管理

docker 提供了 volume 子命令可以对 docker managed volume 进行维护。请看下面的例子:

在这里插入图片描述
如果想批量删除孤儿 volume,可以执行:

docker volume rm $(docker volume ls -q)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!