docker入门笔记

docker入门笔记

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)

可以使用 topps -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
  • 更新并允许 apt 通过 HTTPS 使用存储库
1
2
3
4
5
6
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
  • d添加官方密钥
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 start -d)的容器
#如果是以attach进入,在exit时,会导致容器的停止,要保持后台运行,使用exec进入
docker exec <id> #to know more, use: docker exec --help

docker export <ID> > [name]
docker export 1eee1e1e1e1f > alpine.tar #导出容器快照到本地文件alpine.tar
cat docker/alpine.tar | docker import - test/alpine:v1
docker import http://example.com/exampleimage.tgz example/imagerepo #导入

docker top <container id>
docker top <container names> #查看容器进程
docker inspect <container id or names> #查看底层信息,配置、状态等,以json形式

docker rm <id or names>
docker container update --restart=<strategy> <container name> #重置重启策略

交互

端口映射

1
2
# -P 与 -p :-P :是容器内部端口**随机**映射到主机的端口。-p : 是容器内部端口绑定到**指定**的主机端口。
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
# 在name1内
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

作者

ivy

发布于

2021-09-28

更新于

2023-03-25

许可协议

CC BY-NC-SA 4.0

评论