镜像和容器的关系
镜像和容器就像 类
与 对象实例
的关系,容器是以镜像为模板而创建的实例,
可以使用同一个镜像创建多个容器实例。
镜像与容器的基本使用
查看镜像列表 docker images
walker@LAPTOP-IHP7E9GG:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest f643c72bc252 2 months ago 72.9MB
hello-world latest bf756fb1ae65 13 months ago 13.3kB
获取新镜像 docker pull [镜像文件]
walker@LAPTOP-IHP7E9GG:~$ docker pull centos
Using default tag: latest
latest: Pulling from library/centos
7a0437f04f83: Pull complete
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
使用某个镜像,启动一个容器docker run -it centos
walker@LAPTOP-IHP7E9GG:~$ docker run -it centos bash
[root@0ced667255ee /]#
参数说明:
-i
: 交互式操作
-t
: 终端
-d
: 可指定为后台运行
centos
: centos 镜像
bash
:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash
退出终端:输入 exit
启动容器并指定后台运行 docker run -itd centos bash
walker@LAPTOP-IHP7E9GG:~$ docker run -itd centos bash
1d9751d8885da796b3788535fef348fa935545b1198b83914d4e860acbeb72fb
可使用同一镜像,启动多个不同的容器,使用命令查看所有实例化过的容器docker ps -a
walker@LAPTOP-IHP7E9GG:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
97d55661a7d2 ubuntu "bash" About a minute ago Exited (0) About a minute ago vigorous_robinson
e50724ae44f1 ubuntu "bash" 46 hours ago Exited (0) 46 hours ago lucid_blackburn
abe3d6db3db9 ubuntu "/bin/bash" 46 hours ago Exited (0) 46 hours ago peaceful_brattain
字段说明:
CONTAINER ID
: 容器的ID
STATUS
: 容器的状态
查看容器或镜像的信息, 可使用 docker inspect <容器名/容器ID/镜像名:tag/镜像ID>
walker@LAPTOP-IHP7E9GG:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ad3a444aac22 new_python:v1 "bash" 22 hours ago Up 6 hours xenodochial_hoover
3538926a9526 halohub/halo "/bin/sh -c 'java -X…" 29 hours ago Up 44 minutes 0.0.0.0:8090->8090/tcp halo
walker@LAPTOP-IHP7E9GG:~$ docker inspect ad3a444aac22
[
{
"Id": "ad3a444aac2258bb6274cafb4eb7be84ef305ea9de48524972bbf9a362d1e4a7",
"Created": "2021-02-15T11:34:44.5427533Z",
"Path": "bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
......
容器的更多操作
根据容器ID启动、停止、删除容器:
启动操作 start docker start <容器ID>
重启操作 restart docker restart <容器ID>
停止操作 stop docker stop <容器ID>
删除操作 rm -f docker rm -f <容器ID>
walker@LAPTOP-IHP7E9GG:~$ docker start 97d55661a7d2
97d55661a7d2
检查是否启动:
walker@LAPTOP-IHP7E9GG:~$ docker ps -a | grep 97d55661a7d2
97d55661a7d2 ubuntu "bash" 8 minutes ago Up 37 seconds vigorous_robinson
根据容器ID进入正在运行的容器
docker attach <容器ID>
: 可以进入容器,但退出时会导致容器停止,不推荐使用
docker exec -it <容器ID> bash
: 同样可以进入容器,退出时不会导致容器停止,推荐使用
walker@LAPTOP-IHP7E9GG:~$ docker exec -it 97d55661a7d2 bash
root@97d55661a7d2:/#
根据容器ID导出容器, 并使用导出文件导入成新镜像
导出容器: docker export 容器ID > 导出名.tar
walker@LAPTOP-IHP7E9GG:~$ docker export abcb7f35e236 > test_export_centos.tar
walker@LAPTOP-IHP7E9GG:~$ ls test_ex*
test_export_centos.tar
导入容器, 成为新镜像 docker import 文件名/URL 新镜像名:TAG名
以本地归档文件方式导入
walker@LAPTOP-IHP7E9GG:~$ docker import ./test_export_centos.tar new_centos:v1
sha256:d0a26340c261ecaac932ee8f379d95ec26e5fe09fbd832c1ac8dd408153016ec
walker@LAPTOP-IHP7E9GG:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
new_centos v1 d0a26340c261 16 seconds ago 209MB
centos latest 300e315adb2f 2 months ago 209MB
ubuntu latest f643c72bc252 2 months ago 72.9MB
hello-world latest bf756fb1ae65 13 months ago 13.3kB
以远程文件,URL方式 导入
sudo docker import http://example.com/exampleimage.tgz
镜像的更多操作
前面已经讲述了镜像的拉取, 使用镜像创建容器,导出容器快照成为一个新镜像, 下面讲述镜像的其他操作
删除镜像 docker rmi <镜像名/ID>
与删除容器不一样,删除镜像使用 rmi
, 如删除 hello-world 镜像
walker@LAPTOP-IHP7E9GG:~$ docker rmi hello-world
Untagged: hello-world:latest
Untagged: hello-world@sha256:31b9c7d48790f0d8c50ab433d9c3b7e17666d6993084c002c2ff1ca09b96391d
Deleted: sha256:bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b
Deleted: sha256:9c27e219663c25e0f28493790cc0b88bc973ba3b1686355f221c38a36978ac63
定制镜像
当镜像仓库中的镜像不足以满足我们的需求时
1、可以使用 已创建的容器
,将其作为新模板,提交更新镜像版本, 可覆盖旧版本,也可创建为新镜像
2、也可以使用 Dockerfile
指令新建一个更加符合需求的镜像
使用已创建的容器
覆盖/创建新镜像
当前的容器和镜像列表
walker@LAPTOP-IHP7E9GG:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
halohub/halo latest 17bf41d57c55 8 days ago 328MB
ubuntu latest f643c72bc252 2 months ago 72.9MB
walker@LAPTOP-IHP7E9GG:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ad3a444aac22 new_python:v1 "bash" 40 hours ago Exited (255) 2 minutes ago xenodochial_hoover
提交覆盖镜像: 容器ad3a444aac22, 是已经更改过了的,下面使用 commit
,
以该容器作为新版本,提交覆盖镜像new_python:v1
walker@LAPTOP-IHP7E9GG:~$ docker commit -m="load work station" -a="YuJun" ad3a444aac22 new_python:v1
sha256:32834ec58b8932d58857f6858f16c0cc81432ed5cfde2f0d1939e0731057a025
walker@LAPTOP-IHP7E9GG:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
new_python v1 32834ec58b89 7 seconds ago 955MB
halohub/halo latest 17bf41d57c55 8 days ago 328MB
ubuntu latest f643c72bc252 2 months ago 72.9MB
参数说明:
-m
: 提交的描述信息
-a
: 镜像的作者
ad3a444aac22
: 容器ID
new_python:v1
: 要覆盖或创建的目标镜像名
指定新的镜像名,创建成新的镜像
walker@LAPTOP-IHP7E9GG:~$ docker commit -m="load work station" -a="YuJun" ad3a444aac22 new_python:v2
sha256:60100bed6af4d504d873946c980e92de94ed2c852cbf5f8988eb7f7ebc3277a6
walker@LAPTOP-IHP7E9GG:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
new_python v2 60100bed6af4 7 seconds ago 955MB
new_python v1 e64a6ab46b42 40 hours ago 955MB
halohub/halo latest 17bf41d57c55 8 days ago 328MB
ubuntu latest f643c72bc252 2 months ago 72.9MB
使用Dockerfile
构建镜像
DockerFile 是一个包含一组指令的文件,这组指令描述了应该怎么创建镜像,在编写好 DockerFile 后,
使用 docker build 执行这些指令来创建镜像。