1. Docker简单介绍
1.1 什么是container
容器是一种快速的打包技术 Package Software into Standardized Units for Development, Shipment and Deployment
- 标准化
- 轻量级
- 易移植
1.2 容器技术和docker的联系
容器container是指的一种技术,而Docker只是一个容器技术的实现,或者说让容器技术普及开来的最成功的实现
1.3 为什么容器技术会出现
容器技术出现之前
容器技术出现之后
2. Docker cli 相关知识
2.1 docker version(os/arch)
$ docker version
Client: Docker Engine - Community
Cloud integration: 1.0.12
Version: 20.10.5
API version: 1.41
Go version: go1.13.15
Git commit: 55c4c88
Built: Tue Mar 2 20:14:53 2021
OS/Arch: windows/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.5
API version: 1.41 (minimum version 1.12)
Go version: go1.13.15
Git commit: 363e9a8
Built: Tue Mar 2 20:15:47 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.4.4
GitCommit: 05f951a3781f4f2c1911b05e61c160e9c30eaa8e
runc:
Version: 1.0.0-rc93
GitCommit: 12644e614e25b05da6fd08a38ffa0cfe1903fdec
docker-init:
Version: 0.19.0
GitCommit: de40ad0
2.2 Image vs Container 镜像 vs 容器
image镜像
- Docker image是一个
read-only文件 - 这个文件包含文件系统,源码,库文件,依赖,工具等一些运行application所需要的文件
- 可以理解成一个模板
- docker image具有分层的概念
container容器
- “一个运行中的docker image”
- 实质是复制image并在image最上层加上一层
read-write的层 (称之为container layer,容器层) - 基于同一个image可以创建多个container
3. docker 命令小技巧
3.1 批量停止容器
$ docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cd3a825fedeb nginx "/docker-entrypoint.…" 7 seconds ago Up 6 seconds 80/tcp mystifying_leakey
269494fe89fa nginx "/docker-entrypoint.…" 9 seconds ago Up 8 seconds 80/tcp funny_gauss
34b68af9deef nginx "/docker-entrypoint.…" 12 seconds ago Up 10 seconds 80/tcp interesting_mahavira
7513949674fc nginx "/docker-entrypoint.…" 13 seconds ago Up 12 seconds 80/tcp kind_nobel
方法1: $ docker container rm cd3 269 34b 751 方法2:-p代表列出id
$ docker container stop $(docker container ps -q)
cd3a825fedeb
269494fe89fa
34b68af9deef
7513949674fc
$ docker container ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cd3a825fedeb nginx "/docker-entrypoint.…" 30 seconds ago Exited (0) 2 seconds ago mystifying_leakey
269494fe89fa nginx "/docker-entrypoint.…" 32 seconds ago Exited (0) 2 seconds ago funny_gauss
34b68af9deef nginx "/docker-entrypoint.…" 35 seconds ago Exited (0) 2 seconds ago interesting_mahavira
7513949674fc nginx "/docker-entrypoint.…" 36 seconds ago Exited (0) 2 seconds ago
3.2 批量删除
和批量停止类似 把stop换成rm docker container rm $(docker container ps -aq)
note: docker system prune -a -f 可以快速对系统进行清理,删除停止的容器,不用的image,等等
3.3 连接容器的shell
docker container run -it 创建一个容器并进入交互式模式
~ docker container run -it busybox sh
/ #
/ #
/ # ls
bin dev etc home proc root sys tmp usr var
/ # ps
PID USER TIME COMMAND
1 root 0:00 sh
8 root 0:00 ps
/ # exit
docker container exec -it 在一个已经运行的容器里执行一个额外的command
➜ ~ docker container run -d nginx
33d2ee50cfc46b5ee0b290f6ad75d724551be50217f691e68d15722328f11ef6
➜ ~
➜ ~ docker container exec -it 33d sh
#
#
# ls
bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
#
# exit
➜ ~
3.4 docker container run 背后发生了什么?
$ docker container run -d --publish 80:80 --name webhost nginx
-
- 在本地查找是否有nginx这个image镜像,但是没有发现
-
- 去远程的image registry查找nginx镜像(默认的registry是Docker Hub)
-
- 下载最新版本的nginx镜像 (nginx:latest 默认)
-
- 基于nginx镜像来创建一个新的容器,并且准备运行
-
- docker engine分配给这个容器一个虚拟IP地址
-
- 在宿主机上打开80端口并把容器的80端口转发到宿主机上
-
- 启动容器,运行指定的命令(这里是一个shell脚本去启动nginx)