docker 的入门笔记。时至今日,容器化技术已经不是什么新鲜东西了,docker 作为开源的应用容器引擎,易于部署,使用方便,一次打包,开箱即用,是值得学习一下的。不求精通,会用就够,记记流水帐。
docker 介绍 容器化技术已经发展应用了很多年了,这里只简单记录一下 docker 。docker 早期使用的是 Linux 的 LXC 容器技术,而后转为自研的开源 runc 。相比于虚拟机,交付快,消耗低,管理方便。
namespace 宿主机内运行了很多的容器,每个容器都要有类似于虚拟机一样的相互隔离的运行空间,但是容器技术是在一个进程内实现运行指定服务的运行环境,并且还可以保护宿主机内核不受其他进程的干扰和影响,如文件系统空间、网络空间、进程空间等,docker 是通过 Namespace 技术实现隔离的。
如 MNT Namespace 提供磁盘挂载点和文件系统的隔离能力,在容器里面是不能访问宿主机的资源,宿主机是使用了chroot技术把容器锁定到一个指定的运行目录里面。在宿主机里启动不同环境的容器,检查运行目录和内核就知道,共享内核但限制了运行目录。
PID Namespace:在每个容器内,同 Linux 系统一样,有 PID 为1的进程作为进程的父进程,PID Namespace 则是实现容器间进程隔离的技术(编号重复,主进程生成、子进程回收)如在宿主机中,父进程1下有debian容器, pid 为5777,容器内的父进程也是 pid 1,但对宿主机而言,debian容器的父进程的 pid 是5788。
1 2 3 4 5 6 7 8 9 systemd(1)─┬─ModemManager(969)─┬─{ModemManager}(991) │ └─{ModemManager}(998) ├─colord(1681)─┬─{colord}(1690) │ └─{colord}(1701) ├─containerd(992)─┬─{containerd}(1029) │ ├─{containerd}(1030) │ ├─{containerd}(1107) │ ├─{containerd}(1114) │ └─{containerd}(5705)
可以使用 top
、ps -ef | grep [process]
、ps -ef | grep [PID]
等来在宿主机、容器内进行 PID 追踪验证。
还有 IPC 、UTS、Net、User 等 Namespace 技术,以后再写吧。
docker 组成 docker 由主机、服务端、客户端、仓库、镜像、容器等组成。
Docker 主机(Host):一个物理机或虚拟机,用于运行Docker服务进程和容器,也称为宿主机,node节点
Docker 服务端(Server):Docker守护进程,运行docker容器
Docker 客户端(Client):客户端使用docker 命令或其他工具调用docker API
Docker 镜像(Images):镜像可以理解为创建实例使用的模板
Docker 容器(Container):容器是从镜像生成对外提供服务的一个或一组服务
docker 安装 以 ubuntu 为例,其他 Linux 发行版也差不多,出错就看文档。Windows 下的 docker 安装直接下载一个包即可,还带桌面,实在没什么好说的。
1 sudo apt-get remove docker docker-engine docker.io containerd runc
1 2 3 4 5 6 sudo apt-get update sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release
1 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
1 2 3 echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
1 2 sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
1 sudo docker run hello-world
命令帮助 1 2 3 4 5 6 7 8 9 10 11 12 13 14 man docker docker --help docker COMMAND --help man docker -COMMAND docker version docker info docker search docker pull docker run docker ps docker rm docker logs
镜像命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Usage: docker image COMMAND Manage images Commands: build Build an image from a Dockerfile history Show the history of an image import Import the contents from a tarball to create a filesystem image inspect Display detailed information on one or more images load Load an image from a tar archive or STDIN ls List images prune Remove unused images pull Pull an image or a repository from a registry push Push an image or a repository to a registry rm Remove one or more images save Save one or more images to a tar archive (streamed to STDOUT by default) tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE Run 'docker image COMMAND --help' for more information on a command.
列出的都是比较常用的。
1 2 3 4 5 docker image ls #和 docker images 一样 docker search [image] docker pull [image] docker run -it ubuntu:20.04 /bin/bash #i交互操作,t终端,/bin/bash 进入交互式shell docker commit
容器命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 docker ps docker start <id > docker run -d docker stop <id > docker stop <name> docker attach <id > docker exec <id > docker export <ID> > [name] docker export 1eee1e1e1e1f > alpine.tar cat docker/alpine.tar | docker import - test /alpine:v1docker import http://example.com/exampleimage.tgz example/imagerepo docker top <container id > docker top <container names> docker inspect <container id or names> docker rm <id or names> docker container update --restart=<strategy> <container name>
交互 端口映射 1 2 docker run -d -p 5000:5000 --name [name] [repository] [command ]
容器互联 可以创建新的网络,令多个容器之间互联
1 2 3 4 5 docker network create -d bridge [net-name] docker run -itd --name [name1] --network [net-name] [image] /bin/bash docker run -itd --name [name2] --network [net-name] [image] /bin/bash ping name2
dockerfile Dockerfile 是一个用来构建镜像的文本文件,创建 dockerfile ,官方文档
1 2 FROM [base image] RUN [command]
构建镜像
1 docker build -f /path/dockerfile
参考 docker 官网
docker 文档
docker 中文网站
docker manuals
运维派docker
dockerfile reference