第一章
- docker得益于现代Linux内核特性,如控件组(control group),命名空间技术(namespace)技术。让容器和宿主机之间的隔离更加彻底,容器有独立的网络和存储栈,还拥有自己的资源管理能力,使得同一台宿主机中的多个容器可以友好地共存。
- docker依赖于写时复制模型,使修改应用程序也非常迅速。
- docker鼓励面向服务的架构和为服务架构。docker推荐单个容器只允许一个应用程序或进程,这样就形成了一个分布式的应用程序模型。
docker的核心组件有:
- docker客户端和服务器。
- docker镜像。
- registry。
- docker容器。
1:docker是cs架构的程序,docker客户端向docker服务器(通过网络连接)或守护进程(通过unix套接字连接)发出请求,docker服务器管理容器。
2:镜像是容器的源代码,一个容器是由这些源代码构建出来的,体积很小(就一个文本文件)。
3:regisry是用来保存镜像的仓库,可以使用公共的也可以自己搭建私有的。
4:容器是基于镜像启动的,是一个镜像格式,一系列的标准的操作或者一个执行环境。
利用docker,可以消除本地开发环境,测试环境和生产环境之间的部署障碍。
linux通过namespace,可以实现文件系统,进程,网络隔离,使用cgroups,可以让cpu和内存之类的资源独立分配给每个docker容器。
第二章
这本书第二章是讲怎么安装docker的。书上的内容可能比较老了,就去按照docker的官方文档安装的。
在wsl2的Ubuntu20.04系统中安装docker
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
gpg是一种加密工具,这个语句的作用其实是将公钥添加到apt信任中。这样才能连接到docker的apt仓库里。
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 docker-ce-cli containerd.io
service docker start
service docker status
这里如果看到Docker is running就说明docker服务已经启动啦~
sudo docker run hello-world
运行的时候他会先在本地查找一下有没有镜像,没有的话会去远程仓库拉取。
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete Digest: sha256:8c5aeeb6a5f3ba4883347d3747a7249f491766ca1caa47e5da5dfcf6b9b717c0
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
运行输出。
第三章 docker入门
docker info
显示docker信息。
docker run
docker run
提供了docker容器的创建到启动的功能。
参数
-i
保证容器中的stdin是开启的。
-t
告诉docker要为创建的容器分配一个伪tty的终端。
这样,-i -t就能为新创建的容器提供一个交互式的shell。
docker run -i -t ubuntu /bin/bash
通过这样就能生成一个镜像并运行。
这个命令会先检查本地是否存在Ubuntu镜像,没有的话会去官方的registry下载,下载完毕之后利用这个镜像创建一个新容器。最后告诉镜像要执行什么命令,在这个例子中,我们执行了/bin/bash命令,启动了一个Bash shell。
然后你就可以对这个镜像做任何自己想做的事情。比如你可以安装软件,当所有工作都结束时,输入exit,就退出镜像。
当你退出镜像时,就会发现这个镜像已经被关闭了。
而此时你重新
执行docker run -i -t ubuntu /bin/bash
,那会重新启动一个镜像,就会发现你之前执行的命令,安装的软件全部没有了。
--name
可以为容器命名,利用命名可以更好地区分我们的镜像。
-d
docker会把容器放到后台运行。
可以利用这个创建一个守护容器。
docker run --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
root@DESKTOP-3JK8RKR:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
60e7fecca197 ubuntu "/bin/sh -c 'while t…" 52 seconds ago Up 52 seconds daemon_dave
可以看到有个容器正在后台运行。
--restart
在容器退出时是否重启容器。
--restart=always
总是重启容器,不管退出代码是什么。
--restart=on-failure:5
只有退出代码非0时,才重启容器,最多重启5次。
docker start
可以用来启动一个容器。
然后光启动这个容器,是没有进去它的操作界面的。还需要附着到容器上。利用docker attact
可以看到进去了之前的镜像,安装的vim命令还在。
docker log
想看容器打印了什么,我们可以通过docker logs
来获取容器的日志。如果用-f参数,还能监控docker的日志。加上-t参数,会打印时间戳。
docker top
想看容器的进程。
docker exec
在容器内部执行命令。
docker exec -d daemon_dave touch /etc/new_config_file
然后我们进去也用exec进去容器里面。
docker exec -t -i daemon_dave /bin/bash
可以看到文件确实被创建了。
docker stop
用stop停止守护进程。
可以看出容器已经被停止了。
docker stop
是向容器发送sigterm信号,是比较温和的关闭方法,如果想快速关闭,可以用docker kill。
docker inspect
可以获得容器的详细信息,通过-f可以只看某部分的信息。
docker rm
可以删除容器,但是需要注意的是,运行中的容器是无法删除的。