Docker实验
1)写出你创建镜像、运行容器的所有操作,要求可复现(即遵循这些操作步骤,可以达到与你相同的实验结果)
sudo yum install docker-ce
docker version
sudo service docker start
docker version
sudo docker run hello-world
sudo docker ps -a
sudo usermod –aG docker master
exit
docker run hello-world
sudo systemctl enable docker
sudo systemctl start docker
sudo reboot
systemctl status docker
docker search centos
docker pull centos
docker run centos echo "Hello World"
docker run -it centos bash
docker run -d --cpus 0.05 centos /bin/sh -c "while true; do echo $((12+12/3*4/23334*343232)) ;sleep 0.01;done;"
2)运行同一个镜像的多个容器,分析它们之间是否存在相互影响,如果有,怎么解决?你的机器上可以同时运行几个容器(同镜像)?怎么限制这些容器对宿主机资源(CPU、内存、磁盘等)的使用?
运行同一个镜像的多个容器,它们之间不会相互影响,因为每个容器都有自己的隔离环境。但是,如果容器共享同一个网络或数据卷,那么它们之间可能会有一些通信或数据交换。
使用 docker run -d centos /bin/sh -c "while true; do echo $((12+12/3*4/23334*343232)) ;sleep 0.01;done;"
基于官方提供的centos基础镜像,创建一个守护式运行容器,并用shell脚本指定这个容器在内部进行一系列比较复杂的计算,一直循环。
输入docker stats查看容器状态。可以发现一个容器基本上要占到7%-8%,不考虑其他进程占用的情况下,顶多也就能运行12-13个,事实上创建到第六个的时候已经有一些卡顿了。
解决方法也很简单,运行容器时指定--cpus参数,来限制容器使用的cpu核数。这是网上的说法,但实际上这个更像是直接指定它的利用率,因为这个参数可以为小数。譬如我现在的虚拟机只有一个核,所以我将每个容器的使用比例设置为0.01,运行后可以看出来使用率降到了1%
使用--memory可以用来设置内存限制,但大量申请内存感觉比较危险,这里没有尝试。
(3)你的镜像多大?请精简,写出操作步骤。
这里使用dockerfile来创建镜像
我们写一个简单的C程序,命名为Hello.c
然后使用如下dockerfile进行制作
FROM gcc
COPY hello.c .
RUN gcc -o hello hello.c
CMD ["./hello"]
运行命令:docker build -f dockerfile_01 -t my_image:01 .
发现镜像大小达到了惊人的1.38GB,但这只是一个简单的Hello程序的容器而已。
主要原因是在构造镜像时,我们将完整的gcc编译工具链放入了容器中,但对于使用的用户来说这并不必要。
因此我们使用分阶段构建
FROM gcc AS mybuildstage
COPY hello.c .
RUN gcc -o hello hello.c
FROM ubuntu
COPY --from=mybuildstage hello .
CMD ["./hello"]
即存在一个中间过程,用来编译我们的Hello.c,不失一般性,对于其他的镜像而言,这一步就是在准备全部所需的内容。
然后将处理好的内容通过再次构建放入我们的基础镜像为ubuntud的镜像。
得到结果如下
大小缩小到了77.8MB,几乎缩小了20倍。
此外,还有一种方法可以精简镜像,那就是根据需求选择本身就比较小的基础镜像。这里选择一个很受欢迎的神奇镜像alpine。
制作之后大小如下
再次缩小了10倍。此时和原本的大小已经有了200倍的差距,精简很成功。
(4)你认为自己的镜像有共享价值吗?写出分享方法。
当然是没有的,没有人需要一个只会输出hello的镜像,尽管它挺小的。不过如果要分享的话也很简单,那就是push到docker hub上,这样大家就可以将它pull到本地,然后用它输出一个hello。
标签:容器,centos,sudo,hello,实验,镜像,Docker,docker From: https://www.cnblogs.com/czy-blogs/p/17471870.html