万物始于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
//反馈信息太长,就不放了,请自行测试。