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