docker学习笔记2-基础操作

万物始于Hello World !

//执行代码如果本地没有ubuntu:20.04,它会自动去官方拉取
root@iZbp13ivhh5aqlnjtzr427Z:~# docker run ubuntu:20.04 /bin/echo "Hello World!"

//得到信息
Unable to find image 'ubuntu:20.04' locally
20.04: Pulling from library/ubuntu
d4c3c94e5e10: Pull complete 
Digest: sha256:874aca52f79ae5f8258faff03e10ce99ae836f6e7d2df6ecd3da5c1cad3a912b
Status: Downloaded newer image for ubuntu:20.04
Hello World!

这时候我们得到了我们想要的hello wordel ,代表着你已经是一个会docker的程序员了。

相当于创建了一个新的系统或伪终端 下面第二行root@c4e4cae5a004:/# 说明我们已经进入到新的ubuntu 22.04的容器

//执行代码
root@iZbp13ivhh5aqlnjtzr427Z:~# docker run -i -t ubuntu:22.04 /bin/bash
//得到信息
Unable to find image 'ubuntu:22.04' locally
22.04: Pulling from library/ubuntu
a8b1c5f80c2d: Pull complete 
Digest: sha256:a6d2b38300ce017add71440577d5b0a90460d0e57fd7aec21dd0d1b0761bbfb2
Status: Downloaded newer image for ubuntu:22.04
root@c4e4cae5a004:/# 

参数解析:

  • -t 表示在新容器内指定一个伪终端或终端
  • -i 表示允许你对容器内的标准输入 (STDIN) 进行交互

退出容器:

  • ctrl+d
  • exit

//执行代码
root@iZbp13ivhh5aqlnjtzr427Z:~# docker run -d ubuntu:22.04 /bin/sh -c "while true; do echo hello world; sleep 1;done"

//得到信息
75cf98889e8606eb6c1fc0d667f22facfc76ed36965e266552badb268849d010

参数解析

-d 使容器后台运行

  • /bin/sh -c: 这部分告诉 Docker 在新创建的容器内部运行 /bin/sh 命令,并传递 -c 参数,-c 表示执行后面跟着的字符串作为命令。/bin/sh 是一个可执行的 shell 解释器,在这里用于执行用户提供的命令行脚本。

“while true; do echo hello world; sleep 1; done”: 这是传递给 /bin/sh -c 的命令字符串。它是一个无限循环,会一直执行,直到容器被停止。具体来说:

  • while true; 开始一个循环,条件始终为真,所以循环会一直持续。
  • do 开启循环体。
  • echo hello world; 在每次循环中打印 “hello world” 到标准输出(stdout)。
  • sleep 1; 让进程暂停 1 秒钟,这样循环就不会无限制地快速执行。
  • done 结束循环体。

也就是说当你运行这个容器以后,它会每秒打印一次hello world

那么我们如何查看后台运行的容器呢,答案是使用 docker ps 命令

root@iZbp13ivhh5aqlnjtzr427Z:~# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS     NAMES
75cf98889e86   ubuntu:22.04   "/bin/sh -c 'while t…"   10 minutes ago   Up 10 minutes             dazzling_banzai

参数解析:

CONTAINER ID: 容器 ID。
IMAGE: 使用的镜像。
COMMAND: 启动容器时运行的命令。
CREATED: 容器的创建时间。
STATUS: 容器状态。
PORTS: 容器的端口信息和使用的连接类型(tcp\udp)
NAMES: 自动分配的容器名称。
状态有7种:

  • created(已创建)
  • restarting(重启中)
  • running 或 Up(运行中)
  • removing(迁移中)
  • paused(暂停)
  • exited(停止)
  • dead(死亡)

这时候我们可以通过docker logs 命令查看上面的容器dazzling_banzai 输出的内容

docker logs dazzling_banzai  // 输出日志
docker logs -f dazzling_banzai  //实时输出日志
//列出我本机上面所有的镜像
root@iZbp13ivhh5aqlnjtzr427Z:~# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       latest    bf3dc08bfed0   4 weeks ago   76.2MB
ubuntu       20.04     2abc4dfd8318   4 weeks ago   72.8MB
ubuntu       22.04     52882761a72a   4 weeks ago   77.9MB
//搜索apache镜像
root@iZbp13ivhh5aqlnjtzr427Z:~# docker search http
//返回信息太多,就不在这写了

当本地没有镜像的时候,我们可以动过docker pull 命令拉取一个镜像,我们拉取的时候没有指定版本,docker会自动给我们拉取最新,或者最推荐的版本latest 你也可以指定版本例如 ubuntu:22.04

//执行代码 
root@iZbp13ivhh5aqlnjtzr427Z:~# docker pull ubuntu
//得到结果
Using default tag: latest
latest: Pulling from library/ubuntu
49b384cc7b4a: Pull complete 
Digest: sha256:3f85b7caad41a95462cf5b787d8a04604c8262cdcdf9a472b8c52ef83375fe15
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

//执行docker images  查看我们刚刚拉取的镜像
root@iZbp13ivhh5aqlnjtzr427Z:~# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       latest    bf3dc08bfed0   4 weeks ago   76.2MB
//拉取阿帕奇 httpd 镜像
root@iZbp13ivhh5aqlnjtzr427Z:~# docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
09f376ebb190: Pull complete 
dab55b4abfc3: Pull complete 
4f4fb700ef54: Pull complete 
1a6d0283f224: Pull complete 
1abf9110528c: Pull complete 
7bacb8f85f3a: Pull complete 
Digest: sha256:43c7661a3243c04b0955c81ac994ea13a1d8a1e53c15023a7b3cd5e8bb25de3c
Status: Downloaded newer image for httpd:latest
docker.io/library/httpd:latest

//执行删除代码 : 在镜像没有被容器使用的情况下可以直接删除
root@iZbp13ivhh5aqlnjtzr427Z:~# docker rmi httpd
//得到回复
Untagged: httpd:latest
Untagged: httpd@sha256:43c7661a3243c04b0955c81ac994ea13a1d8a1e53c15023a7b3cd5e8bb25de3c
Deleted: sha256:356125da059505ee31a72f8a27fe5703c84886832b08ea565fa4a5ec4bfb722c
Deleted: sha256:ded5f8d76c41660beaeb35797adfc5a8d7163f008b85c329c70465336647b3b0
Deleted: sha256:709a3c8d98a49c52edadea69e64e62c5b72097b1e25bda4fb7ad153cf32a645d
Deleted: sha256:6df5b1227f477e1c0dca369fc45945fefd61e4dce82979a6bfa9f2b1a93ca8bb
Deleted: sha256:a1713ed8b6e9a28c07b9d3e74bcd6150edb48e52961414343b5100d8856496a9
Deleted: sha256:aa49b91f34eff711f5617aa4eaca3c56528b57057b07b005033e689180275947
Deleted: sha256:5d4427064ecc46e3c2add169e9b5eafc7ed2be7861081ec925938ab628ac0e25

//在镜像被容器使用了的时候删除会报错
root@iZbp13ivhh5aqlnjtzr427Z:~# docker rmi httpd
Error response from daemon: conflict: unable to remove repository reference "httpd" (must force) - container 750e6c924253 is using its referenced image 356125da0595

//这时候我们需要先把与这个镜像有联系的容器全部删除掉
root@iZbp13ivhh5aqlnjtzr427Z:~# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS                        PORTS     NAMES
750e6c924253   httpd          "/bin/bash"              About a minute ago   Exited (137) 23 seconds ago             nostalgic_austin
root@iZbp13ivhh5aqlnjtzr427Z:~# docker rm nostalgic_austin
//如果容器是运行状态,则需要docker rm -f强制删除
Error response from daemon: cannot remove container "/nostalgic_austin": container is running: stop the container before removing or force remove
root@iZbp13ivhh5aqlnjtzr427Z:~# docker rm -f nostalgic_austin
//先查看我们有那些镜像
root@iZbp13ivhh5aqlnjtzr427Z:~# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       latest    bf3dc08bfed0   4 weeks ago   76.2MB
ubuntu       20.04     2abc4dfd8318   4 weeks ago   72.8MB
ubuntu       22.04     52882761a72a   4 weeks ago   77.9MB

//设置镜像标签 格式为 docker tag 镜像ID 新镜像名:新镜像标签
//当然你也已使用这种格式  docker tag 镜像名:TAG 新镜像名:新镜像标签
root@iZbp13ivhh5aqlnjtzr427Z:~# docker tag bf3dc08bfed0 newubuntu:tag1
root@iZbp13ivhh5aqlnjtzr427Z:~# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
newubuntu    tag1      bf3dc08bfed0   4 weeks ago   76.2MB
ubuntu       latest    bf3dc08bfed0   4 weeks ago   76.2MB
ubuntu       20.04     2abc4dfd8318   4 weeks ago   72.8MB
//命令行的形式启动ubuntu容器 参数为 “/bin/bash   以命令行形式进入容器”
root@iZbp13ivhh5aqlnjtzr427Z:~# docker run -it ubuntu /bin/bash
//得到消息 root@64891bf298a9  说明我们容器已经创建成功
root@64891bf298a9:/# 
//退出该容器
root@64891bf298a9:/# exit
//后台启动容器
root@iZbp13ivhh5aqlnjtzr427Z:~# docker run -itd --name ubuntu-test ubuntu /bin/bash
//得到回复 看到这串字符说明已经后台创建成功
ed78896e0b405fc68a05a15d5d0cfcb33691decc9a4f6fe4e4b4116739fd08d0
//查看刚刚创建的两个容器
root@iZbp13ivhh5aqlnjtzr427Z:~# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS              PORTS     NAMES
ed78896e0b40   ubuntu         "/bin/bash"              About a minute ago   Up About a minute             ubuntu-test

//这时候发现只有一个ubuntu容器,那是因为,我们创建第一个容器64891bf298a9 的时候,我使用了exit 命令退出了这个容器,这时候当然查不到了这时候需要通过 docker ps -a 来查询所有容器,包括已停止的
root@iZbp13ivhh5aqlnjtzr427Z:~# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS                     PORTS     NAMES
ed78896e0b40   ubuntu         "/bin/bash"              About a minute ago   Up About a minute                    ubuntu-test
64891bf298a9   ubuntu         "/bin/bash"              4 minutes ago        Exited (0) 2 minutes ago             kind_morse
  • restart 重启
  • stop 停止
  • start 启动
  • rm 删除容器 :注意,只有已经停止的容器才可以删除,否则需要开启强制删除 rm -f
  • rmi 删除镜像 docker rmi ubuntu:22.04
  • attach 进入容器 不推荐,该操作会导致容器停止
  • exec 进入容器 推荐 该操作只会退出终端,但不会退出容器
//执行代码
root@iZbp13ivhh5aqlnjtzr427Z:~# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
ed78896e0b40   ubuntu    "/bin/bash"   34 minutes ago   Up 34 minutes             ubuntu-test

//本机有个叫ubuntu-test的容器正在运行,直接运行docker attach ubuntu-test  看到ed78896e0b40 说明已经成功进入容器,但这个操作会导致容器停止 attach方法,好像得是启动了交互终端容器 -it的才能进去
root@iZbp13ivhh5aqlnjtzr427Z:~# docker attach ubuntu-test 
root@ed78896e0b40:/# 

//方法二
root@iZbp13ivhh5aqlnjtzr427Z:~# docker exec -it ubuntu-test /bin/bash
root@ed78896e0b40:/# 
//这样你退出的时候只会退出终端,不会停止容器
//直接执行docker container prune  然后根据提示回复y 确定
root@iZbp13ivhh5aqlnjtzr427Z:~# docker container prune 
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
64891bf298a9f50af4a781d7136082a303e66dfb1f5fccbbcc9f3d1f185013e7

Total reclaimed space: 8B
//可以使用docker top  后面跟container id  或container name
root@iZbp13ivhh5aqlnjtzr427Z:~# docker top ubuntu-test
root@iZbp13ivhh5aqlnjtzr427Z:~# docker top ed78896e0b40
//你也可以查看docker 实时进程状态先通过docker exec 命令进入容器,然后使用top命令
//第一步
root@iZbp13ivhh5aqlnjtzr427Z:~# docker exec -it ubuntu-test /bin/bash
//第二步
root@ed78896e0b40:/#top 
//可以使用docker inspect  后面跟container id  或container name
root@iZbp13ivhh5aqlnjtzr427Z:~# docker inspect ubuntu-test
root@iZbp13ivhh5aqlnjtzr427Z:~# docker inspect ed78896e0b40
//反馈信息太长,就不放了,请自行测试。