镜像:一个特殊的文件系统,Docker镜像就是一个只读的模板
操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间
支持。而 Docker 镜像(Image),就相当于是一个 root 文件系统。
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包
含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
镜像不包含任何动态数据,其内容在构建之后也不会被改变。
Docker 设计时,就充分利用 Union FS 的技术,将其设计为分层存储的架构。 镜像实际是由多层文件系
统联合组成。
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任
何改变只发生在自己这一层。
比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删
除。
在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。
因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应
该在该层构建结束前清理掉。
分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然
后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
容器:镜像运行时的实体,Docker利用容器来运行应用。
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态
的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等 。
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。前
面讲过镜像使用的是分层存储,容器也是如此。
容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储
层的信息都会随容器删除而丢失。
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据 ,容器存储层要保持无状态化。
所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容
器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此, 使用数据卷后,容器可以随意删
除、重新 run,数据却不会丢失。
注意:容器在整个应用程序生命周期工作流中提供以下优点:隔离性、可移植性、灵活性、可伸缩性和可控
性。 最重要的优点是可在开发和运营之间提供隔离
docker容器图
docker环境图
操作内容 | 命令 |
---|---|
镜像 从官方仓库拉取 | pull |
未来可以自建仓库或者上传到公共仓库 | push |
镜像有不同的版本需要打标签 | tag |
镜像需要保存保存为tar文件 | save |
将打包后的镜像进行加载 | load |
Dockerfile使用脚本文件 构建镜像 | build |
将运行的容器提交成一个镜像 | commit |
通过镜像运行容器 使容器运行
容器操作
[root@node1 ~]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 17284 [OK]
linuxserver/nginx An Nginx container, brought to you by LinuxS… 173
bitnami/nginx Bitnami nginx Docker Image 139 [OK]
ubuntu/nginx Nginx, a high-performance reverse proxy & we… 57
bitnami/nginx-ingress-controller Bitnami Docker Image for NGINX Ingress Contr… 19 [OK]
rancher/nginx-ingress-controller 10
webdevops/nginx Nginx container 9 [OK]
参数 | 说明 |
---|---|
NAME | 镜像名称 |
DESCRIPTION | 镜像说明 |
STARS | 点赞数量 |
OFFICIAL | 是否是官方的 |
AUTOMATED | 是否是自动构建的 |
可以 : 后面带版本
[root@node1 ~]# docker pull nginx:1.14-alpine
1.14-alpine: Pulling from library/nginx
bdf0201b3a05: Pull complete
3d0a573c81ed: Pull complete
8129faeb2eb6: Pull complete
3dc99f571daf: Pull complete
Digest: sha256:485b610fefec7ff6c463ced9623314a04ed67e3945b9c08d7e53a47f6d108dc7
Status: Downloaded newer image for nginx:1.14-alpine
docker.io/library/nginx:1.14-alpine
如果不带版本号默认拉取最新版的镜像
[root@node1 ~]# docker pull nginx
[root@node1 ~]# docker images
[root@node1 ~]# docker image ls
第一种 -o output
[root@node1 ~]# docker image save -o centos7.tar centos
第二种 也可以使用重定向导出镜像
[root@node1 ~]# docker image save centos > centos7_2.tar
将导出的镜像发送到另一台docker上
[root@node1 ~]# scp centos7.tar 192.168.142.140:/root
在另一台上进行下载
[root@node3 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@node3 ~]# docker image load -i centos7.tar
74ddd0ec08fa: Loading layer 238.6MB/238.6MB
Loaded image: centos:latest
[root@node3 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 5d0da3dc9764 10 months ago 231MB
镜像的删除操作会比较简单
[root@node1 ~]# docker image rm nginx:1.14-alpine
Untagged: nginx:1.14-alpine
Untagged: nginx@sha256:485b610fefec7ff6c463ced9623314a04ed67e3945b9c08d7e53a47f6d108dc7
Deleted: sha256:8a2fb25a19f5dc1528b7a3fabe8b3145ff57fe10e4f1edac6c718a3cf4aa4b73
Deleted: sha256:f68a8bcb9dbd06e0d2750eabf63c45f51734a72831ed650d2349775865d5fc20
Deleted: sha256:cbf2c7789332fe231e8defa490527a7b2c3ae8589997ceee00895f3263f0a8cf
Deleted: sha256:894f3fad7e6ecd7f24e88340a44b7b73663a85c0eb7740e7ade169e9d8491a4c
Deleted: sha256:a464c54f93a9e88fc1d33df1e0e39cca427d60145a360962e8f19a1dbf900da9
将容器提交成镜像 commit
从镜像中运行一个容器 run
启动容器 start 停止容器 stop 重启容器 restart
先创建一个容器:docker create 镜像名
[root@node1 ~]# docker container create centos
dd0b13352b4e1a14993fc980f2768b303fdbe0c2923b8c17a964b643929bf3f3
[root@node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dd0b13352b4e centos "/bin/bash" 6 seconds ago Created naughty_bose
再启动容器:docker start 容器名
[root@node1 ~]# docker container start dd0b13352b4e
dd0b13352b4e
[root@node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dd0b13352b4e centos "/bin/bash" 44 seconds ago Exited (0) 6 seconds ago naughty_bose
(1)格式
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
(2)options常用命令选项
-i -t 一般同时使用 -it
(可以临时调测使用)
(很常用)-d 也会跟 -i 分开使用
(3)示例:运行一个容器
-d 放后台运行 -p 端口映射 81端口映射80端口 ; 没有指定名字name为随机分配名字
[root@node1 ~]# docker run -d -p 81:80 nginx:1.14-alpine
162c76ef388b43d783634e1a4b9820bbdc7a623c1ac3e312a04f7d78707aca91
[root@node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
162c76ef388b nginx:1.14-alpine "nginx -g 'daemon of…" 15 seconds ago Up 14 seconds 0.0.0.0:81->80/tcp, :::81->80/tcp keen_saha
添加 --name 指定名字查看
[root@node1 ~]# docker run -d -p 82:80 --name web2 nginx:1.14-alpine
25479bdf29976a7fb0e9bb5993cc9b84c80766d2a81a4acee905f80b51fdfa2e
[root@node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
25479bdf2997 nginx:1.14-alpine "nginx -g 'daemon of…" 4 seconds ago Up 3 seconds 0.0.0.0:82->80/tcp, :::82->80/tcp web2
162c76ef388b nginx:1.14-alpine "nginx -g 'daemon of…" 50 seconds ago Up 48 seconds 0.0.0.0:81->80/tcp, :::81->80/tcp keen_saha
[root@node1 ~]# docker port web2 查询docker端口映射
80/tcp -> 0.0.0.0:82
80/tcp -> :::82
容器启动成功,这是安装web服务可以通过网页进行访问测试
使用 --rm 临时做功能调试,减少删除时间
,退出容器即删除容器
运行容器不做端口映射
[root@node1 ~]# docker run -it --rm nginx:1.14-alpine /bin/sh
启动另一个会话可以查看到启动的80端口的nginx容器
当我们退出时再查看容器状态
[root@node1 ~]# docker run -it --rm nginx:1.14-alpine /bin/sh
/ # ls
bin dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
/ # exit
[root@node1 ~]#
当退出该容器时,也自动删除容器
[root@localhost~]# docker ps / docker container ls 两个命令是一样的效果
添加 -a 参数 :查询所有的容器
[root@node1 ~]# docker ps #`只显示运行的容器`
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
25479bdf2997 nginx:1.14-alpine "nginx -g 'daemon of…" 18 minutes ago Up 18 minutes 0.0.0.0:82->80/tcp, :::82->80/tcp web2
162c76ef388b nginx:1.14-alpine "nginx -g 'daemon of…" 18 minutes ago Up 18 minutes 0.0.0.0:81->80/tcp, :::81->80/tcp keen_saha
[root@node1 ~]# docker ps -a #`查询所有容器`
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
25479bdf2997 nginx:1.14-alpine "nginx -g 'daemon of…" 18 minutes ago Up 18 minutes 0.0.0.0:82->80/tcp, :::82->80/tcp web2
162c76ef388b nginx:1.14-alpine "nginx -g 'daemon of…" 19 minutes ago Up 19 minutes 0.0.0.0:81->80/tcp, :::81->80/tcp keen_saha
dd0b13352b4e centos "/bin/bash" 26 minutes ago Exited (0) 25 minutes ago naughty_bose
docker stop 关闭运行的容器
docker kill 杀死运行的容器
-s:指定信号,和kill 用法一样;-9 强制停止容器
查看容器信息会显示退出状态
[root@node1 ~]# docker stop web2
web2
[root@node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
25479bdf2997 nginx:1.14-alpine "nginx -g 'daemon of…" 20 minutes ago Exited (0) 6 seconds ago web2
162c76ef388b nginx:1.14-alpine "nginx -g 'daemon of…" 21 minutes ago Up 21 minutes 0.0.0.0:81->80/tcp, :::81->80/tcp keen_saha
dd0b13352b4e centos "/bin/bash" 29 minutes ago Exited (0) 28 minutes ago naughty_bose
对于未运行退出的容器,可以直接删除即可
[root@node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
25479bdf2997 nginx:1.14-alpine "nginx -g 'daemon of…" About an hour ago Up 45 minutes 0.0.0.0:82->80/tcp, :::82->80/tcp web2
162c76ef388b nginx:1.14-alpine "nginx -g 'daemon of…" About an hour ago Up About an hour 0.0.0.0:81->80/tcp, :::81->80/tcp keen_saha
dd0b13352b4e centos "/bin/bash" About an hour ago Exited (0) About an hour ago naughty_bose
[root@node1 ~]# docker rm dd0b13352b4e
dd0b13352b4e
[root@node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
25479bdf2997 nginx:1.14-alpine "nginx -g 'daemon of…" About an hour ago Up 45 minutes 0.0.0.0:82->80/tcp, :::82->80/tcp web2
162c76ef388b nginx:1.14-alpine "nginx -g 'daemon of…" About an hour ago Up About an hour 0.0.0.0:81->80/tcp, :::81->80/tcp keen_saha
对于运行中的容器建议先stop 或 kill 停止容器
或者可以强制删除运作中的容器 -f
[root@node1 ~]# docker rm -f 25479bdf2997
25479bdf2997
[root@node1 ~]# docker inspect web2
[root@localhost ~]# docker exec / docker container exec
(1)格式
Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
(2)options 选项
(3)示例
对运行着的容器进入容器查看
[root@node1 ~]# docker exec -it web2 /bin/sh
/ # ls
bin dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:03
inet addr:172.17.0.3 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:656 (656.0 B) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
/ # cd /usr/share/nginx/html/
/usr/share/nginx/html # ls
50x.html index.html
docker logs 容器名字
[root@node1 ~]# curl 192.168.142.149:82
welcome to test page.
[root@node1 ~]# docker logs web2