容器

通俗地讲,容器是镜像的运行实体。镜像是静态的只读文件,而容器带有运行时需要 的可写文件层,并且容器中的进程属于运行状态。即容器运行着真正的应用进程。容 器有初建、运行、停止、暂停和删除五种状态。

虽然容器的本质主机上运行的一个进程,但是容器有自己独立的命名空间隔离和资 源限制。也就是说,在容器内部,无法看到主机上的进程、环境变量、网络等信息, 这是容器与直接运行在主机上进程的本质区别。

容器是基于镜像创建的可运行实例,并且单独存在,一个镜像可以创建出多个容器。 运行容器化环境时,实际上是在容器内部创建该文件系统的读写副本。 这将添加一个 容器层,该层允许修改镜像的整个副本。

容器的生命周期

容器的生命周期是容器可能处于的状态。

1. created:初建状态

2. running:运行状态

3. stopped:停止状态

4. paused: 暂停状态

5. deleted:删除状态

docker create : 创建容器后,不立即启动运行,容器进入初建状态

docker run : 创建容器,并立即启动运行,进入运行状态

docker start : 容器转为运行状态

docker stop : 容器将转入停止状态

docker kill : 容器在故障(死机)时,执行 kill(断电),容器转入停止状态,这种 操作容易丢失数据,除非必要,否则不建议使用;

docker restart : 重启容器,容器转入运行状态

docker pause : 容器进入暂停状态

docker unpause : 取消暂停状态,容器进入运行状态

docker rm : 删除容器,容器转入删除状态

killed by out-of-memory(因内存不足被终止) :宿主机内存被耗尽,也被称为 OOM:非计划终止 这时需要杀死最吃内存的容器

container process exitde(异常终止):出现容器被终止后,将进入 Should restart?

择操作:

        yes 需要重启,容器执行 start 命令,转为运行状态。

        no 不需要重启,容器转为停止状态。

容器的OOM

Docker 在处理 OOM 事件时分为三种情况

(1)如果容器中的应用耗尽了主机系统分配给容器的内存限额,就会触发 OOM 事件。 例如,在容器当中,部署了一个 web 服务。假设主机分配给此容器的内存上限为 1G, 当脚本申请的内存大于 1G 时,此容器就会触发 OOM 事件。而在这种情况下,此容 器将会被强制关闭。

        但需要注意的是,此时关闭容器的并非是 Docker Daemon,而是宿主机操作系统。因 为一个容器其实就是一组运行在宿主机操作系统当中的进程,宿主机操作系统通过 cgroups 对这组进程设定资源上限,当这些进程申请的资源到达上限时,触发的是宿 主机操作系统的内核 OOM 事件,因此最终是由宿主机内核来关闭这些进程.

(2) 如果用户不想关闭这个容器,那么可以选择--oom-kill-disable 来禁用 OOM-Killer。 使用此参数时,仍需要注意,如果使用-m 设置了此容器内存上限,那么当容器到达内 存资源上限时,主机不会关闭容器,但也不会继续向此容器继续分配资源,此时容器 将处于 hung 状态。只需要将最坏的情况封闭在一定范围之内,而不至于蔓延出去。

(3)如果用户使用了--oom-kill-disable,但也没有使用-m 来设定上限,因而此时此容器 将会尽可能多地使用主机内存资源。换言之,主机内存有多大,它就将用多大。

容器异常退出

每个容器内部都存在一个 Init 进程,容器中其他所有进程都是此进程的子进程。运行 的容器是因为 Init 进程在运行,如果一个子进程因为某种原因造成了退出,那么其父 进程也会同步退出,直至 Init 进程也退出。当 Init 进程退出时,也就代表着此容器被关 闭。ocker 目前没有办法知道此时的进程退出属于正常退出还是异常退出。当出现容器 关闭情况时,Docker Daemon 会尝试再次重新将此容器由 Stopped 状态转为 Running 状态。只有设置了--restart 参数的容器,Docker Daemon 才会去尝试启动,否则容器 会保持停止状态。

容器暂停

Docker“剥夺了此容器的 CPU 资源。而其他资源,如 Memory 资源、Network 资源 等还保留未动。如此一来,失去了 CPU 资源的进程,是不会被主机内核系统所调度的, 所以此容器就处于“冰封状态。

容器命令

命令别名功能
docker create
docker container create
创建容器
docker run
docker container run
运行容器
docker attach
docker container attach
连接到正在运行中的容 器。
docker commit
docker container commit
将镜像提交为容器
docker cp
docker container cp
在容器和宿主机之间拷贝
docker diff
docker container diff
检查容器里文件结构的更 改。
docker exec
docker container exec
在运行的容器中执行命令
docker export
docker container export
将容器导出为 tar
docker container inspect
查看容器详细信息
docker kill
docker container kill
杀死容器
docker logs
docker container logs
查看日志
docker ps
docker container ls,
docker container list,
docker container ps
查看正在运行的进程
docker pause
docker container pause
暂停进程
docker port
docker container port
查看容器的端口映射
docker container prune
删除停止的容器
docker rename
docker container rename
重命名容器
docker restart
docker container restart
重启容器
docker rm
docker container rm,
docker container
remove
删除容器
docker start
docker container start
启动容器
docker stats
docker container stats
查看资源占用信息
docker stop
docker container stop
停止容器
docker top
docker container top
查看某个容器的资源占用
docker unpause
docker container unpause
继续运行容器
docker update
docker container update
更新容器配置
docker wait
docker container wait
阻止一个或多个容器停
止,然后打印退出代码

docker create命令

功能

        创建一个新的容器但不启动

语法

        docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

        别名        docker container create

关键参数

        -i: 以交互模式运行容器,通常与 -t 同时使用;

        ○ -P: 随机端口映射,容器内部端口随机映射到主机的端口

        ○ -p: 指定端口映射,格式为:主机(宿主)端口:容器端口

        ○ -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;

        ○ --name="nginx-lb": 为容器指定一个名称;

        ○ -h "mars": 指定容器的 hostname

        ○ -e username="ritchie": 设置环境变量;

        ○ --cpuset-cpus="0-2" or --cpuset-cpus="0,1,2": 绑定容器到指定 CPU 运行;

        ○ -m :设置容器使用内存最大值;

        ○ --network="bridge": 指定容器的网络连接类型;

        ○ --link=[]: 添加链接到另一个容器;

        ○ --volume , -v: 绑定一个卷

        ○ --rm :shell 退出的时候自动删除容器

        ○ --restart:自动重启

创建容器        docker create --name mywebsite1 -p 80:80 nginx:1.24.0

查看运行时容器        docker ps

查看所有容器        docker ps -a | grep mywebsite1

如果需要运行,执行命令        docker start mywebsite1

docker logs命令

功能

        查看容器日志

语法

        docker logs [OPTIONS] CONTAINER

        别名        docker container logs

关键参数

        -f ,--follow: 跟踪日志输出

        ○ --since :显示某个开始时间的所有日志

        ○ -t,--timestamps : 显示时间戳

        ○ -n--tail :仅列出最新 N 条容器日志

不加任何参数

运行完 docker logs mywebsite2 之后,就结束了。

加上 -f参数,看效果

-f参数

跟踪日志输出

可以看到,日志在实时输出。

--since参数

显示某个开始时间的所有日志

选择未来一个时间,就没有任何日志输出

-t参数

显示时间戳

-n参数

仅列出最新 N 条容器日志

docker attach命令

功能

        连接到正在运行中的容器。也就是将把当前终端“贴”到 正在运行容器的主进程(PID 1) 的标准输入/输出/错误上。

语法

        docker attach [OPTIONS] CONTAINER

        别名        docker container attach

关键参数

        --sig-proxy:是否将所有信号代理,默认是 true,如果设置为 false,退出的 话不会影响容器,否则退出会导致容器退出。

这里是将当前控制台接入到mywebsite2容器的输出输出流中,在web端刷新网页,也能看到对应的日志信息。

当执行exit命令退出时,容器也会跟着退出

--sig-proxy参数

是否将所有信号代理,默认是 true,如果设置为 false,退出的 话不会影响容器,否则退出会导致容器退出。

执行命令        docker attach mywebsite2 --sig-proxy=false

可以看到现在执行exit命令,但是容器依旧正常运行

docker exec命令

功能

        在容器中执行命令

语法

        docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

        别名        docker container exec

关键参数

        -d :分离模式: 在后台运行

        ○ -i :即使没有附加也保持 STDIN 打开

        ○ -t :分配一个伪终端

        ○ -e :设置环境变量

        ○ -u,--user :指定用户 "<name|uid>[:<group|gid>]"

        ○ -w,--workdir:指定工作目录

-u参数

指定用户 "<name|uid>[:<group|gid>]"

查看mywebsite2容器下的用户, 执行命令        docker exec mywebsite2 cat /etc/passwd

docker exec -u nginx mywebsite2 nginx -v

以nginx用户查看nginx版本

-w参数

指定工作目录

指定之后,进去就在指定目录下。如果没有加这个参数就在默认目录 / 下面

docker start命令

功能

        启动停止的容器

语法

        docker start [OPTIONS] CONTAINER [CONTAINER...]

        别名        docker container start

docker stop命令

功能

        停止运行的容器

语法

        docker stop [OPTIONS] CONTAINER [CONTAINER...]

        别名        docker container stop

关键参数

        -s :发送的信号

docker restart命令

功能

        重启容器。先按顺序 Stop,再 Start——保留原来所有创建参数(端口、卷、网络、重启策略等)不变,只是让容器“重新活一遍”。

语法

        docker restart [OPTIONS] CONTAINER [CONTAINER...]

        别名        docker container restart

关键参数

        -s :发送的信号

复制终端观察mywebsite2的日志

在另一个终端进行重启

然后观察日志的终端如下

-s参数

发送的信号

同样在一个终端进行观察日志

在另一个终端重启容器        docker restart -s 9 mywebsite2

然后观察日志终端

看到日志终端没有刚刚的优雅退出了,这里如果容器需要释放什么东西是释放不了了,因为发送了信号9,强制杀死

docker kill命令

功能

        强制退出容器

语法

        docker kill [OPTIONS] CONTAINER [CONTAINER...]

        别名        docker container kill

关键参数

        -s :发送的信号

注意事项

        Docker stop 发送的是 SIGTERM 信号,docker kill 发送的是 SIGKILL 信号

观察到mywebsite2容器被干掉了。使用docker stop还会运行将该释放的进行释放,而docker kill是直接干掉

docker top命令

功能

        查看容器中运行的进程信息,支持 ps 命令参数。

语法

        docker top CONTAINER [ps OPTIONS]

        别名        docker container top

注意事项

        容器运行时不一定有/bin/bash 终端来交互执行 top 命令,而且容器还不一定有 top 命令,可以使用 docker top 来实现查看 container 中正在运行的进程。

查看 容器mywebsite2 中运行了哪些进程

docker stats命令

功能

        显示容器资源的使用情况,包括:CPU、内存、网络 I/O 等。

语法

        docker stats [OPTIONS] [CONTAINER...]

        别名        docker container stats

关键参数

        --all , -a :显示所有的容器,包括未运行的。

        ○ --format :指定返回值的模板文件。如 table,json

        ○ --no-stream :展示当前状态就直接退出了,不再实时更新。

        ○ --no-trunc :不截断输出。

返回报文

        CONTAINER ID NAME: 容器 ID 与名称。

        CPU % 与 MEM %: 容器使用的 CPU 和内存的百分比。

        MEM USAGE / LIMIT: 容器正在使用的总内存,以及允许使用的内存总量。

        NET I/O: 容器通过其网络接口发送和接收的数据量。

        BLOCK I/O: 容器从主机上的块设备读取和写入的数据量。

        PIDs: 容器创建的进程或线程数。

不带参数

这里是实时监控

-a参数

显示所有的容器,包括未运行的

--format参数

指定返回值的模板文件。如 table,json

--no-stream参数

展示当前状态就直接退出了,不再实时更新。

没有实时监控

--no-trunc参数

不截断输出。

docker container inspect参数

功能

        查看容器详细信息

语法

        docker container inspect [OPTIONS] CONTAINER [CONTAINER...]

关键参数

        -f :指定返回值的模板文件。如 tablejson

        -s :显示总的文件大小。

注意事项

        docker inspect 会自动检查是镜像还是容器然后显示相信信息

加上-f参数

加上-s参数

信息中会多两个字段显示大小

docker port参数

功能

        用于列出指定的容器的端口映射,或者查找将 PRIVATE_PORT NAT 到面向公众 的端口。

语法

        docker port CONTAINER [PRIVATE_PORT[/PROTO]]

        别名        docker container port

docker cp命令

功能

        在容器和宿主机之间拷贝文件

语法

        docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-

        docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

        别名        docker container cp

将容器中的nginx主页拷出来

运行命令        docker cp mywebsite2:/usr/share/nginx/html/index.html .

对主页进行修改

再将修改后的index.html 拷回去

执行命令        docker cp ./index.html mywebsite2:/usr/share/nginx/html/

然后在web端查看效果

docker diff命令

功能

        检查容器里文件结构的更改。

语法

        docker diff CONTAINER

docker commit命令

功能

        从容器创建一个新的镜像。也就是将运行中的容器提交为一个新的镜像。

语法

        docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

参数

        -a :提交的镜像作者;

        -c :使用 Dockerfile 指令来创建镜像;可以修改启动指令

        -m :提交时的说明文字;

        -p :commit 时,将容器暂停。

首先启动一个容器,在容器中写入文件。再将容器提交为镜像。在运行该容器,查看写入文件内容

在提交镜像的时候指定作者,提交信息,和在提交时暂停容器。执行命令        docker commit -a 'hzp' -m 'create by hzp' -p mywebsiteForCommit mywebsite2:v2

检查容器信息

-c参数

使用 Dockerfile 指令来创建镜像;可以修改启动指令

执行命令        docker commit -a 'hzp' -m 'create by hzp' -c 'CMD ["tail", "f", "/etc/hosts"]' -p mywebsiteForCommit mywebsite2:v3

然后查看该镜像的详细信息,执行命令        docker image inspect mywebsite2:v3

可以看到这里已经改掉了

docker pause命令

功能

        暂停容器中所有的进程。

语法

        docker pause CONTAINER [CONTAINER...]

        别名        docker container pause

docker unpause命令

功能

        恢复容器中所有的进程。

语法

        docker unpause CONTAINER [CONTAINER...]

        别名        docker container unpause

docker rm命令

功能

        删除停止的容器

语法

        docker rm [OPTIONS] CONTAINER [CONTAINER...]

        别名        docker container rm

关键参数

        -f :通过 SIGKILL 信号强制删除一个运行中的容器。

-f参数

通过 SIGKILL 信号强制删除一个运行中的容器。

docker export命令

功能

        导出容器内容为 tar 文件

语法

        docker export [OPTIONS] CONTAINER

        别名        docker container export

关键参数

        -o:写入到文件。

借助镜像的一个命令叫 docker import,将这个tar包还原为一个镜像。

docker save也能打包,和docker export有什么区别呢?

docker save打包会携带元数据信息,而docker export则会丢失元数据信息。

docker import命令(属于镜像命令)

功能

       从归档文件中创建镜像。

语法

        docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

        别名        docker image import

关键参数

        -c :应用 docker 指令创建镜像;

        -m :提交时的说明文字;

docker load也能还原镜像。而docker load和docker import还原镜像有什么区别吗?

查看mywebsite1:v1.0镜像详细信息

看到 Config字段是空的。

执行命令        docker import -c 'CMD ["nginx", "-g", "daemon off;"]' -m "create by hzp" mywebsite1.tar mywebsite1:v2.0

再查看mywebsite1:v2.0的详细信息

可以看到Config中已经有了字段

也多了一个描述信息

docker wait命令

功能

        阻塞运行直到容器停止,然后打印出它的退出代码。

语法

        docker wait CONTAINER [CONTAINER...]

        别名        docker container wait

复制会话,在另一终端执行        docker wait mywebsite3

可以看到终端被hung住了

而在另一个终端杀死该容器,该终端就能看见这个容器退出的退出码了。

docker rename命令

功能

        重命名容器

语法

        docker rename CONTAINER NEW_NAME

        别名        docker container rename

docker container prune命令

功能

        删除所有停止的容器

语法

        docker container prune [OPTIONS]

关键参数

        -f, --force:不提示是否进行确认

docker update命令

功能

        更新容器配置

语法

        docker update [OPTIONS] CONTAINER [CONTAINER...]

        别名        docker container update

关键参数

        --cpuscpu 数量

        ○ --cpuset-cpus :使用哪些 cpu

        ○ --memory :内存限制

        ○ --memory-swap:交换内存

        ○ --cpu-period :是用来指定容器对 CPU 的使用要在多长时间内做一次重新分 配

        ○ --cpu-quota是用来指定在这个周期内,最多可以有多少时间用来跑这个容 器

现在mywebsite3容器的 cpu核上限为 1核

容器操作

容器基本操作

通过镜像拉取(本地没有)并启动容器
docker run -d --name=mynginx001 -p 8082:80 nginx:1.22.0

查看容器的详细情况

docker container inspect mynginx001

查看实时日志

docker logs -f mynginx001

清理容器

先停掉容器,在执行删除

docker stop mynginx001

docker rm mynginx001

容器状态迁移

创建一个容器,但是并不启动

docker create --name mynginx002  -p 8082:80 nginx:1.22.0

查看该容器状态信息,可以看到Created的状态,属于容器的stopped状态

docker ps -a | grep mynginx002

通过docker start命令调整到运行态

docker start mynginx002

再次查看该容器状态信息,可以看到Up的状态,属于容器的running状态

docker ps -a | grep mynginx002

使用docker kill命令,还原至stopped状态

docker kill mynginx002

再次查看该容器状态信息,可以看到Exited的状态,属于容器的stopped状态

docker ps -a | grep mynginx002

再次使用 docker start命令,让容器回到running状态

再次查看该容器状态信息,可以看到Up的状态,属于容器的running状态

docker ps -a | grep mynginx002

通过docker stop命令,使容器回到stopped状态

docker stop mynginx002

再次查看该容器状态信息,可以看到Exited的状态,属于容器的stopped状态

docker ps -a | grep mynginx002

再次使用 docker start命令,将容器拉回到running状态

再次查看该容器状态信息,可以看到Up的状态,属于容器的running状态

docker ps -a | grep mynginx002

使用restart命令重启容器,如果容器之前就处于running状态,重启之后依然处于running状态

docker restart mynginx002

再次查看该容器状态信息,可以看到Up的状态,并且运行时间重新开始了,属于容器的running状态

docker ps -a | grep mynginx002

使用pause命令暂停容器,也就是剥夺容器时间片

docker pause mynginx002

再次查看该容器状态信息,可以看到Paused的状态,属于容器的paused状态

docker ps -a | grep mynginx002

使用unpause命令将容器拉回running状态

docker unpause mynginx002

再次查看该容器状态信息,可以看到Up的状态,属于容器的running状态

docker ps -a | grep mynginx002

容器批量处理技巧

命令解释
docker container ls -qf name=xxx
根据名称过滤得到容器编号
docker container ls --filter status=running
根据状态过滤容器信息
docker container ls -aq
静默获取全部容器 id
docker container ls --filter ancestor=xxx
过滤镜像名为 xxx 的容器信息
docker container ls --filter ancestor=xxx
过滤镜像 id xxx 的容器信息

•  -a:表示打印所有的容器信息, 包括正在运行和已经退出

•  -q: 表示只返回容器 ID

•  -f: 表示基于给的条件过滤 等价于 --filter 选项

批量搜索

通过名字完成过滤

        docker ps -f name=mynginx003

通过状态过滤

        docker ps -f status=running/exited

通过镜像过滤

        docker ps -f ancestor=nginx:1.23.4        通过镜像名称过滤

        docker ps -f ancestor=f5747a42e3ad        通过镜像id过滤

批量操作

docker start、docker stop、docker restart、docker kill、docker rm等命令后面都能指定多个容器的id或者名称

通过批量查找到的容器id喂给这些命令,就能完成批量操作了

批量查找到的容器i,执行命令        docker ps -q

然后喂给docker stop命令,执行命令        docker stop `docker ps -q`

可以看到这些容器都被停掉了

然后再批量将这些容器都拉起来

执行命令        docker start `docker ps -a -q`

容器交互模式

attached模式

attached模式就是前台运行。

所有程序都有一个主线程,主线程中有一个主线程,也可以启动很多子线程,子线程运行的时候是感知不到的,最后给一个结果出来。子线程属于后台运行,而主线程属于前台运行。attached是附加到主线程上。

创建attached模式的容器,执行命令        docker run --name mynginx006 -p 8081:80 nginx:1.21.3

在web端访问nginx,可以看到控制台中会打印出日志。

按了ctrl c之后,就退出了容器。而且容器也退出了。当shell因为网络断开,也会导致同样的效果

attached模式不能用于生产环境,往往用于开发环境,用于调试目的等

detached模式

detached模式就是后台运行。

创建detached模式的容器,执行命令        docker run -d --name mynginx007 -p 8083:80 nginx:1.21.3

按了ctrl c之后,或者shell因为网络断开,容器也不会退出。

查看实时容器日志,执行命令        docker logs -f mynginx007

然后在web端访问nginx,也能看见实时日志输出

另外在另一个终端使用docker attached到这个detached容器中,执行命令        docker attach mynginx007

然后在web端访问nginx网页,也能看见实时日志的输出。

然后按ctrl c退出,发现容器也被关闭了。

执行 docker attached会把一个detached模式的容器转换成attached模式,也就带来了attached模式的问题。

detached模式建议生产时使用,而attached模式建议开发调试的时候使用

interactive模式

interactive模式就是交互模式。

创建运行容器并进入到交互模式,执行命令        docker run -it --name mynginx006 -p 8084:80 nginx:1.24.0 bash

然后访问nginx发现并不能访问。因为执行docker run -it --name mynginx006 -p 8084:80 nginx:1.24.0 bash命令的时候,启动命令是bash,原先是nginx,所以nginx并没有启动。需要在容器中启动,输出nginx即可。然后在web端就能访问了

在容器内部输入ctrl c并没有影响。而执行exit退出容器,容器紧接着也就停掉了。

所以interactive模式用于做一些简单的测试。

对于一个已经运行的后台容器,如何进行交互。

创建后台运行的容器,执行命令        docker run -d --name mynginx006 -p 8085:80 nginx:1.24.0

和该容器交互,执行命令        docker exec -it mynginx006 bash

无论是按ctrl c还是exit退出容器,都不会影响该容器的正常运行

在实际生产中,使用detached模式和interactive模式配合使用更多。使用docker exec命令完成实际生产的问题的定位和容器运行。

容器与宿主机内容复制

 将容器中的nginx主页拷出来

运行命令        docker cp mywebsite2:/usr/share/nginx/html/index.html .

对主页进行修改

再将修改后的index.html 拷回去

执行命令        docker cp ./index.html mywebsite2:/usr/share/nginx/html/

然后在web端查看效果

容器与宿主机内容复制主要靠 docker cp命令。

容器之间内容拷贝是不支持的。

容器自动删除

交互模式下,指定--rm选项。

完成了容器的自动删除。

在后台运行的容器,指定--rm选项。

也完成了容器的自动删除

容器的自动删除,主要是在创建容器的时候指定--rm参数

容器自动重启

docker run --restart=no [容器名] :默认值不自动重启

docker run --restart=on-failure:3 [容器名] : on-failure 若容器的退出状态非 0,则docker 自动重启容器,还可以指定重启次数,若超过指定次数未能启动容器则放弃

docker run --restart=always [容器名] :always 容器退出时总是重启

docker run --restart=unless-stopped [容器名] unless-stopped 容器退出时总是重启, 但不考虑 Docker 守护进程启动时就已经停止的容器

如果容器启动时没有设置–restart 参数,则通过下面命令进行更新:

docker update --restart=always [容器名]

创建容器,设置总是重启        docker run -d --name mynginx007 -p 8086:80 --restart=always nginx:1.21.3

查看容器的详细信息        docker container inspect mynginx007

可以看到里面的RestartPolicy字段设置好了always

另起一个终端,查看容器状态,执行命令        docker ps | grep mynginx007

目前这个容器运行了4分钟。

然后在原先的终端中,使用docker exec命令进入容器,把nginx停掉

提到之后,看到就退出到了宿主机状态了。

然后在另外终端查看容器状态

可以看到目前容器运行了一分钟左右。也就是这个容器进行了重新启动。

使用docker stop停掉容器。

可以看到现在容器并没有发生重启。

always设定之后,只要容器是异常退出都会重新拉起来。

但是always控制不了docker stop命令,发生重启效果。

容器环境变量设置

创建容器并设置环境变量,通过多个-e选项设定

docker run -it -e testEvn1=1 -e testEvn2=2 --name mynginx008 nginx:1.21.3 bash

将环境变量写在配置文件中。通过--env-file选项设定配置文件

新建文件夹myTestEnv,并进入。vi myEnv进行环境变量编写

然后执行命令        docker run -it --rm --env-file=./myEnv nginx:1.22.0 bash

在容器内部查看环境变量

容器详情查看

使用docker container inspect命令进行查看

docker ps 查看容器摘要信息

docker container inspect 查看容器详细信息

容器执行单行命令

我们可以直接借助 docker 的容器环境执行一些命令,比如容器中有某个命令而宿主机 上没有这个时候借助容器可以完成某些任务。

执行命令        docker run --rm --name mybusybox busybox:1.37.0 ls

执行命令        docker run --rm --name mybusybox busybox:1.37.0 ping www.baidu.com

容器镜像导入导出

1、创建容器,执行命令        docker run -d --name mynginx007 -p 8081:80 nginx:1.24.0

2、进入容器修改主页内容

访问nginx主页

3、将容器保存为tar包

新建目录并进入,然后将容器保存为tar包

4、将tar包还原为镜像,并且将这个镜像启动为新的容器

这里发生报错是因为docker export的时候,丢失了元数据,包括启动的cmd参数,所以需要指定。

执行命令        docker run -d --name mynginx009 -p 8083:80 mynginx:v1.0 nginx -g "daemon off;"

在8083端口访问nginx主页

docker save & docker load

操作对象:

        镜像(Image)

特点:

        保存完整的镜像,包括所有层、历史记录、元数据

        可以保存多个镜像到一个文件

        保持镜像的完整结构

        导出的文件通常更大(包含所有层)

docker export & docker import

操作对象:

        容器(Container)

特点:

        只保存容器的当前文件系统快照

        不包含历史记录、层结构

        导出的文件通常更小

        生成的镜像为单层

容器日志查看

1、启动nginx容器

执行命令        docker run -d --name mynginx01 -p 8081:80 nginx:1.23.4

2、实时查看日志

执行命令        docker logs -f mynginx01

3、把日志转化为文件

方式1,流的重定向

执行命令 docker logs mynginx01 > info.log 2> err.log

第一个是标准信息流,2是标准错误流

方式2,docker安装之后存容器管理中拿日志文件

容器资源查看

1、创建容器

执行命令        docker run -d --name mynginx02 -p 8082:80 nginx:1.23.4

2、查看容器的整个资源占用

执行命令        docker stats mynginx02

3、查看具体某个进程的资源占用

执行命令        docker top mynginx02 aux

MySQL容器化安装

1、安装并运行musql镜像

执行命令        docker run --name mysql -e MYSQL_ROOT_PASSWORD=704756098 -p 8083:3306 -d mysql:5.7

2、进入mysql容器客户端操作

进入mysql容器,执行命令        docker exec -it mysql bash

还可以再mysql中创建数据库,建表,进行增删改查等操作,进行检查是否正常运行。

然后退出 exit,是退出的mysql的shell。再执行exit,就退出mysql容器了

3、通过可视化工具远程连接mysql容器

使用的可视化工具是 mysql workbench

配置链接

然后输入密码

然后就登录上了。

Redis容器化安装

1、安装并运行redis镜像

执行命令        docker run --name redis -d -p 8084:6379 redis:7

2、进入容器,使用容器自带的客户端进行redis操作

进入容器        docker exec -it redis bash

3、可视化工具远程连接到redis服务

使用的可视化工具是Another,下载链接https://gitee.com/qishibo/AnotherRedisDesktopManager/releases

配置链接

查看刚刚操作的数据

C++容器制作

        就是你安装软件时,程序从哪里获取软件包(安装程序在你的机器上,但需要安装的 东西却在软件源服务器上)。 源,Ubuntu ,相当于软件库,需要什么软件,只要记得正确的软件名就可以用命令 安装:

其实你可以把它称为软件仓库。安装软件时,就是从仓库里面调取数据放在你的机器 上。

镜像

        镜像(Mirroring)是一种文件存储形式,是冗余的一种类型,一个磁盘上的数据在另 一个磁盘上存在一个完全相同的副本即为镜像。

        常见的镜像文件格式有 ISO、BINIMGTAODAOCIFFCD

        所谓镜像文件其实和 ZIP 压缩包类似,它将特定的一系列文件按照一定的格式制作成 单一的文件,以方便用户下载和使用,例如一个测试版的操作系统、游戏等。(安装过 操作系统的人应该对 xxx.iso 不陌生)

        镜像文件不仅具有 ZIP 压缩包的合成功能,它最重要的特点是可以被特定的软件识别 并可直接刻录到光盘上。

镜像源

        镜像源就是把官方的源做一个镜像,你可以在这下载软件。比如 ubuntu 官方源在国外,下载软件可能会很慢,这时候就需要换成国内的镜像源。

中科大源        https://mirrors.ustc.edu.cn/help/

清华源

1、下载操作系统镜像并启动

执行命令        docker run -it --name mycpp --rm ubuntu:22.04 bash

2、配置镜像源,下载gcc

配置中科大源,https://mirrors.ustc.edu.cn/help/ubuntu.html#_8

执行命令        sed -i 's@//.*archive.ubuntu.com@//mirrors.ustc.edu.cn@g' /etc/apt/sources.list

然后执行        apt-get update更新源,更新索引以生效

安装gcc,执行命令        apt install gcc

查看gcc是否安装成功,执行命令        gcc -v

3、创建c++源代码并编译

4、执行编译好的源文件

SpringBoot容器制作

1、编写一个spring应用。创建maven项目,创建java应用

把spring应用打成jar包 

2、制作spring容器,下载jdk

运行容器,执行命令        docker run -it --name myjava -p 8081:8080 ubuntu:22.04

配置中科大源,https://mirrors.ustc.edu.cn/help/ubuntu.html#_8

配置镜像源加速,执行命令        sed -i 's@//.*archive.ubuntu.com@//mirrors.ustc.edu.cn@g' /etc/apt/sources.list

然后执行        apt-get update更新源,更新索引以生效

安装jdk,执行命令        apt install -y openjdk-8-jdk

检查jdk是否安装好,执行命令        java -version

3、将jar包拷进容器,然后运行jar包

在web端访问

容器资源更新

内存资源控制

1、在容器中启动一个应用(可以java应用或者是c++应用)。

2、执行内存更新命令        docker update -m 200m --memory-swap 200m 容器名

--memory-swap交换内存如果不指定,默认无限大。如果指定交换内存和 -m是一样的内存,就说明只能只用物理内存,不能使用交换内存。

如果更新的内存比目前容器使用的内存小,就会更新失败

3、停掉应用,再把内存更新很小。然后在启动应用

执行内存更新命令        docker update -m 10m --memory-swap 10m 容器名

再启动应用,就会失败。

cpu资源控制

1、启动一个容器

2、在容器中执行命令,把cpu打满

for i in `seq 1 $(cat /proc/cpuinfo |grep "physical id" |wc -l)`

do

        dd if=/dev/zero of=/dev/null &

done

3、使用docker update把cpu限制在一定的比例

执行命令        docker update --cpu-period 100000 --cpu-quota 10000 容器名

常见问题

docker createdocker start docker run 有什么区别?

docker create 命令从 Docker 映像创建一个全新的容器。但是,它不会立即运行它。 docker start 命令将启动任何已停止的容器。如果使用 docker create 命令创建容器, 则可以使用此命令启动它。

docker run 命令是创建和启动的组合,因为它创建了一个新容器并立即启动它。实际 上,如果 docker run 命令在您的系统上找不到上述映像,它可以从 Docker Hub 中提 取映像。

docker import docker load 有什么区别?

想要了解 docker load docker import 命令的区别,还必须知道 docker save docker export 命令:

docker save images_name:将一个镜像导出为文件,再使用 docker load 命令将文件导入为一个镜像,会保存该镜像的的所有历史记录。比 docker export 命令 导出的文件大,很好理解,因为会保存镜像的所有历史记录。

docker export container_id:将一个容器导出为文件,再使用 docker import 命令将容器导入成为一个新的镜像,但是相比 docker save 命令,容器文件 会丢失所有元数据和历史记录,仅保存容器当时的状态,相当于虚拟机快照。

既可以使用 docker load 命令来导入镜像库存储文件到本地镜像库,也可以使用 docker import 命令来导入一个容器快照到本地镜像库。

两者的区别在于容器快照将会丢弃所有的历史记录和元数据信息,而镜像存储文件将 保存完整记录,体积也会更大。

docker rm & docker rmi & docker prune 的差异?

docker rm : 删除一个或多个容器

docker rmi : 删除一个或多个镜像

docker prune: 用来删除不再使用的 docker 对象

更多推荐