Docker简单介绍

159 阅读2分钟

1. Docker简单介绍

1.1 什么是container

容器是一种快速的打包技术 Package Software into Standardized Units for Development, Shipment and Deployment

  • 标准化
  • 轻量级
  • 易移植

1.2 容器技术和docker的联系

容器container是指的一种技术,而Docker只是一个容器技术的实现,或者说让容器技术普及开来的最成功的实现

1.3 为什么容器技术会出现

容器技术出现之前 image.png

容器技术出现之后 image.png

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

    1. 在本地查找是否有nginx这个image镜像,但是没有发现
    1. 去远程的image registry查找nginx镜像(默认的registry是Docker Hub)
    1. 下载最新版本的nginx镜像 (nginx:latest 默认)
    1. 基于nginx镜像来创建一个新的容器,并且准备运行
    1. docker engine分配给这个容器一个虚拟IP地址
    1. 在宿主机上打开80端口并把容器的80端口转发到宿主机上
    1. 启动容器,运行指定的命令(这里是一个shell脚本去启动nginx)