Docker入门
容器安装与验证
安装参考:https://www.runoob.com/docker/ubuntu-docker-install.html
验证docker - Hello world
安装验证:$ sudo docker run hello-world 或者 docker run ubuntu:15.10 /bin/echo "Hello world"
demo@demo:~$ sudo docker run hello-world
Hello from Docker!...............
For more examples and ideas, visit:
https://docs.docker.com/get-started/
demo@demo:~$ docker run ubuntu:15.10 /bin/echo "Hello world"
Hello world
Status: Downloaded newer image for ubuntu:15.10
Hello world
各个参数解析:
-
docker: Docker 的二进制执行文件。
-
run: 与前面的 docker 组合来运行一个容器。
-
ubuntu:15.10 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
-
/bin/echo "Hello world": 在启动的容器里执行的命令
以上命令完整的意思可以解释为:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。
docker帮助
docker 客户端非常简单 ,我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项。
demo@demo:~$ docker
Usage: docker [OPTIONS] COMMAND
A self-sufficient runtime for containers
Options:
--config string Location of client config files (default "/home/keqin/.docker")
-c, --context string Name of the context to use to connect to the daemon (overrides DOCKER_HOST env var and default context set with "docker context use")
......
Run 'docker COMMAND --help' for more information on a command.
To get more help with docker, check out our guides at https://docs.docker.com/go/guides/
可以通过命令 docker command --help 更深入的了解指定的 Docker 命令使用方法。
例如我们要查看 docker stats 指令的具体使用方法:
demo@demo:~$ docker stats --help
Usage: docker stats [OPTIONS] [CONTAINER...]
Display a live stream of container(s) resource usage statistics
Options:
-a, --all Show all containers (default shows just running)
--format string Pretty-print images using a Go template
......
镜像Image
镜像是指docker中运行的一个沙盒,这里镜像和容器混用,具体语义需要自己把握。
一个新安装的docker内部一般是没有任何镜像的,在指定某个镜像运行时,如果没有docker会主动从docker hub下载。
获取镜像
如果我们本地没有 ubuntu 镜像,我们可以使用 docker pull 命令来载入 ubuntu 镜像:
demo@demo:~$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
6e3729cf69e0: Pull complete
Digest: sha256:27cb6e6ccef575a4698b66f5de06c7ecd61589132d5a91d098f7f3f9285415a9
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
运行镜像
demo@demo:~$ docker run -it ubuntu /bin/bash
root@23516e1ead71:/#
参数说明:
- -i: 交互式操作。
- -t: 终端。
- ubuntu: ubuntu 镜像。
- /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
我们尝试在容器中运行命令 cat /proc/version和ls分别查看当前系统的版本信息和当前目录下的文件列表
root@3378b0f38837:/# cat /proc/version
Linux version 5.4.0-135-generic (buildd@lcy02-amd64-066) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #152-Ubuntu SMP Wed Nov 23 20:19:22 UTC 2022
root@3378b0f38837:/# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
root@3378b0f38837:/#
要退出终端,直接输入 exit:
后台模式启动容器
demo@demo:~$ sudo docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63
在输出中,我们没有看到期望的 "hello world",而是一串长字符
2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63
这个长字符串叫做容器 ID,对每个容器来说都是唯一的,我们可以通过容器 ID 来查看对应的容器发生了什么。
首先,我们需要确认容器有在运行,可以通过 docker ps 来查看:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2a8944dccd3d ubuntu:15.10 "/bin/sh -c 'while t…" 6 minutes ago Up 6 minutes elegant_napier
输出详情介绍:
CONTAINER ID: 容器 ID。
IMAGE: 使用的镜像。
COMMAND: 启动容器时运行的命令。
CREATED: 容器的创建时间。
STATUS: 容器状态。
状态有7种:
-
- created(已创建)
- restarting(重启中)
- running 或 Up(运行中)
- removing(迁移中)
- paused(暂停)
- exited(停止)
- dead(死亡)
PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。
NAMES: 自动分配的容器名称。
查看后台运行镜像的输出
在宿主主机内使用 docker logs [容器ID/${NAMES} ] 命令,查看容器内的标准输出:
demo@demo:~$ docker logs 2b1b7a428627
hello world
......
demo@demo:~$ docker logs elegant_napier
hello world
......
停止容器
可以使用 [docker stop + ${NAMES} /容器ID] 来停止一个容器。
demo@demo:~$ docker stop elegant_napier
demo@demo:~$ docker stop 2b1b7a428627
查看所有容器的状态
demo@demo:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bf8f02b18927 ubuntu "/bin/bash" 43 seconds ago Exited (127) 29 seconds ago infallible_borg
2a8944dccd3d ubuntu:15.10 "/bin/sh -c 'while t…" 16 hours ago Exited (137) 32 minutes ago elegant_napier
4aa275de020a ubuntu:15.10 "/bin/echo 'Hello wo…" 16 hours ago Exited (0) 16 hours ago recursing_lehmann
24154461d166 hello-world "/hello" 17 hours ago Exited (0) 17 hours ago goofy_perlman
启动一个已经停止的镜像
[docker start + ${NAMES} /容器ID] :
demo@demo:~$ docker start recursing_lehmann
recursing_lehmann
停止或者重启容器
docker stop <容器 ID> / docker restart <容器 ID>
进入后台运行的容器
docker attach & docker exec
在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:docker attach [容器ID/NAMES]
demo@demo:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ecadd468c6ac ubuntu "/bin/bash" 17 minutes ago Up 17 minutes ubuntu-test
08603f632822 ubuntu "/bin/bash" 18 minutes ago Up 18 minutes ubuntu
demo@demo:~$ docker attach ecadd468c6ac
root@ecadd468c6ac:/#
注意: 如果从这个容器退出,会导致容器的停止。
docker exec 命令
下面演示了使用 docker exec 命令。
demo@demo:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
08603f632822 ubuntu "/bin/bash" 27 minutes ago Up 27 minutes ubuntu
demo@demo:~$ docker exec -it 08603f632822 /bin/bash
root@08603f632822:/#
注意: 如果从这个容器退出,容器不会停止,这就是为什么推荐大家使用 docker exec 的原因。更多参数说明请使用 docker exec --help 命令查看。
导出导入删除容器
导出容器快照
如果要导出本地某个容器,可以使用 docker export 命令。
demo@demo:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
08603f632822 ubuntu "/bin/bash" 30 minutes ago Up 30 minutes ubuntu
demo@demo:~$ docker export 08603f632822 > docker_ubuntu.tar
demo@demo:~$ ls -l docker_buntu.tar
-rw-rw-r-- 1 demo demo 80321536 1月 4 11:05 docker_ubuntu.tar
导入容器快照
可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 docker_ubuntu.tar 导入到镜像 test/ubuntu:v1:
demo@demo:~$ cat ./docker_buntu.tar | docker import - test/ubuntu:v1
sha256:799665d955ad907098774a70f6a60e343ea9c5b34c634856278e71f219ff4896
demo@demo:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/ubuntu v1 799665d955ad 2 minutes ago 77.8MB
<none> <none> f25418f9c7f0 2 minutes ago 0B
<none> <none> c3c6c1e78845 2 minutes ago 0B
ubuntu latest 6b7dfa7e8fdb 3 weeks ago 77.8MB
hello-world latest feb5d9fea6a5 15 months ago 13.3kB
ubuntu 15.10 9b9cb95443b5 6 years ago 137MB
demo@demo:~$
此外,也可以通过指定 URL 或者某个目录来导入,例如:
demo@demo:~$ docker import http://example.com/exampleimage.tgz example/imagerepo
删除容器
删除容器使用 docker rm 命令,docker rm -f 可以强制删除处于运行状态的容器。
demo@demo:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ecadd468c6ac ubuntu "/bin/bash" 44 minutes ago Exited (0) 24 minutes ago ubuntu-test
08603f632822 ubuntu "/bin/bash" 45 minutes ago Up 45 minutes ubuntudemo@demo:~$ docker rm ecadd468c6ac
ecadd468c6ac
下面的命令可以清理掉所有处于终止状态的容器。
$ docker container prune