BHOL301 - Docker 基本操作

本节动手实验带你完成最基本的docker操作,理解容器化应用运行的基本特点。

请在安装了 Docker Desktop 的主机上运行以下实验内容,因为实验内容包含了清理操作,如果在DevOpsBox运行会造成环境被删除。

注意:以下操作中使用了Docker Hub提供的公开镜像仓库,请确保你的实验环境可以链接互联网。

01 - 使用容器运行 Hello Boathouse

使用命令行运行以下命令,此命令通过 busybox 容器输出 Hello Boathouse 文本,执行完毕后,容器自动退出。

  1. ## 运行容器
  2. docker run busybox /bin/echo 'Hello Boathouse'
  3. Hello Boathouse
  4. ## 查看正在运行的容器
  5. docker ps
  6. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  7. ## 查看正在运行和已经退出的容器
  8. docker ps -a
  9. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  10. 13f29240c769 busybox "/bin/echo 'Hello Bo…" 3 seconds ago Exited (0) 2 seconds ago sleepy_burnell

实验要点:

  • 以上第二步的docker ps中未输出任何容器示例,这是因为我们的容器在完成输出 ‘Hello World’ 的任务之后已经退出了
  • 查看第三部的STATUS字段可以看到已经退出的字样
  • 这说明容器和虚拟机的本质区别,容器就是一个进程,如果我们不要求容器持续运行,它完成任务后就会直接退出。

02 - 使用容器持续运行 Hello Boathouse

使用以下命令启动一个会持久化运行的 busybox 容器,并在其中持续输出 ‘Hello Boathouse’ 文本

  1. ## 使用 -d 参数持久化运行容器,docker会返回容器ID
  2. ### 注意你的容器所输出的ID会和我的不同
  3. docker run -d busybox /bin/sh -c "while true; do echo Hello Boathouse; sleep 1; done"
  4. bfd6cc5fc3869a034582c4572323143e84a7fd89de0d0e0fa438c42351b928ad
  5. ## 使用 docker ps 查看正在运行的容器
  6. docker ps
  7. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  8. bfd6cc5fc386 busybox "/bin/sh -c 'while t…" 3 seconds ago Up 2 seconds elated_faraday
  9. ## 复制你的 CONTAINER ID 并查看容器日志
  10. docker logs -f {CONTAINER ID}
  11. ## 停止容器运行
  12. docker stop {CONTAINER ID}

实验要点:

  • 使用 -d 参数可以让容器进入后台运行
  • 使用 while 循环让容器置于持续运行状态
  • 通过 docker logs 可以查看容器内日志

03 - 和容器进行交互(在容器内运行命令)

使用命令行运行以下命令,此命令将启动一个 busybox 容器并在其中运行 sh 交互命令行界面,你可以尝试运行pwd,ls,ps等命令查看容器内环境。

  1. ## 使用 -i -t 参数,我们会将容器的交互功能启动,允许我们进入容器进行操作
  2. docker run -i -t busybox /bin/sh
  3. / # ls
  4. bin dev etc home proc root sys tmp usr var
  5. / # pwd
  6. /
  7. / # ls -la
  8. total 44
  9. drwxr-xr-x 1 root root 4096 Jun 9 00:36 .
  10. drwxr-xr-x 1 root root 4096 Jun 9 00:36 ..
  11. -rwxr-xr-x 1 root root 0 Jun 9 00:36 .dockerenv
  12. drwxr-xr-x 2 root root 12288 Oct 1 2018 bin
  13. drwxr-xr-x 5 root root 360 Jun 9 00:36 dev
  14. drwxr-xr-x 1 root root 4096 Jun 9 00:36 etc
  15. drwxr-xr-x 2 nobody nogroup 4096 Oct 1 2018 home
  16. dr-xr-xr-x 204 root root 0 Jun 9 00:36 proc
  17. drwx------ 1 root root 4096 Jun 9 00:36 root
  18. dr-xr-xr-x 13 root root 0 Jun 9 00:36 sys
  19. drwxrwxrwt 2 root root 4096 Oct 1 2018 tmp
  20. drwxr-xr-x 3 root root 4096 Oct 1 2018 usr
  21. drwxr-xr-x 4 root root 4096 Oct 1 2018 var
  22. / # exit
  23. ## 添加 -d 参数,我们可以将容器置于后台运行,同时允许交互操作
  24. docker run -i -t -d busybox /bin/sh
  25. d66297ef608b97ca2a98122f681b92dff4933055597aebeafcc44a2b548bd66e
  26. ## 使用 docker ps 获取 CONTAINER ID
  27. docker ps
  28. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  29. d66297ef608b busybox "/bin/sh" 6 seconds ago Up 5 seconds magical_mendeleev
  30. ## 使用 docker exec 进入容器执行 /bin/sh
  31. docker exec -it {CONTAINER ID} /bin/sh
  32. / # ls
  33. bin dev etc home proc root sys tmp usr var
  34. / # exit

04 - 运行带有WebUI的容器并通过浏览器访问

docker-demo 是Boathouse训练营提供的演示程序,带有简单的WebUI,通过以下命令运行此容器。

  1. docker run -itd -p 3000:3000 boathousex/docker-demo
  2. 5c2ca9520b7f43a40cd594fd887abce51eb86081c4246ce59a719de164536138

打开浏览器并访问 http://localhost:3000 可以看到以下界面

BHOL301 - Docker 基本操作 - 图1

再运行一个同样的 docker-demo 容器,使用另外一个端口(3001)

  1. docker run -itd -p 3001:3000 boathousex/docker-demo
  2. 29c8d086350977f4628b10d80cb0a2fe797fa46e14a32e90dddd6df8fcdd9e7a

打开另外一个浏览器并访问 http://localhost:3001 我们现在通过容器同时运行了一个应用的两个实例

BHOL301 - Docker 基本操作 - 图2

05 - 清理容器

运行容器一段时候,我们的环境中会遗留大量已经退出的容器,会占用我们的磁盘资源,使用以下命令可以清理。

  1. ## 使用 docker ps -a 获取所有正在运行和已经退出的容器
  2. docker ps -a
  3. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  4. d66297ef608b busybox "/bin/sh" 9 minutes ago Up 9 minutes magical_mendeleev
  5. f21ff0357755 busybox "/bin/sh" 12 minutes ago Exited (0) 9 minutes ago youthful_hermann
  6. 5c31d491b2f3 busybox "/bin/sh" 13 minutes ago Exited (0) 13 minutes ago peaceful_bohr
  7. 4338f1bb6a19 busybox "/bin/bash" 13 minutes ago Created quizzical_payne
  8. bfd6cc5fc386 busybox "/bin/sh -c 'while t…" 22 minutes ago Exited (137) 16 minutes ago elated_faraday
  9. 13f29240c769 busybox "/bin/echo 'Hello Bo…" 26 minutes ago Exited (0) 26 minutes ago sleepy_burnell
  10. ## 使用 docker rm 可以清理容器
  11. ### 你可以使用容器id的前几位作为容器标识,只要不重复就可以
  12. docker rm 13f bfd
  13. 13f
  14. bfd
  15. ## 使用以下命令组合可以一键清理所有已经退出的容器
  16. ### 注意最后一行提示我们还有一个容器正在运行,无法清理
  17. docker rm $(docker ps -qa)
  18. f21ff0357755
  19. 5c31d491b2f3
  20. 4338f1bb6a19
  21. Error response from daemon: You cannot remove a running container d66297ef608b97ca2a98122f681b92dff4933055597aebeafcc44a2b548bd66e. Stop the container before attempting removal or force remove
  22. ## 添加 -f 强制清理,无论是否正在运行
  23. docker rm -f $(docker ps -qa)
  24. d66297ef608b

常用命令

  1. ## Windows 环境
  2. ### 一键停止所有容器
  3. FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker stop %i
  4. ### 一键删除所有容器
  5. FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i
  6. ### 一键强制删除所有容器
  7. FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm -f %i
  8. ## Mac/Linux 环境
  9. ### 一键停止所有容器
  10. docker stop $(docker ps -qa)
  11. ### 一键删除所有容器
  12. docker rm $(docker ps -qa)
  13. ### 一键强制删除所有容器
  14. docker rm -f $(docker ps -qa)

小结

本节内容我们熟悉了docker的基本操作,对容器就是一个进程的本质了理解。