【Docker】5.Docker Container

这篇具有很好参考价值的文章主要介绍了【Docker】5.Docker Container。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Docker Container

容器是镜像运行的实体,镜像是静态的只读文件,容器带有运行时需要的可写文件层,容器中的进程属于运行状态。具有初建、运行、停止、暂停、删除五种状态

容器的本质是主机上的运行的一个进程,但容器具有自己独立的命名空间和资源限制。容器是基于镜像创建的可运行实例,并且单独存在。

容器的生命周期

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

1、初建状态(created) 2、运行状态(running) 3、停止状态(stopped)

4、暂停状态(paused) 5、删除状态(deleted)

Docker Container Command

命令 别名 功能 备注
docker create docker container create 创建容器
docker run docker container run 运行容器 重要
docker attach docker container attach 链接到正在运行的容器
docker commit docker container 将镜像提交为容器 重要
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/list/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/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 run 非常相似,除了少了-d选项
docker create [options] image [command][arg...]
-i # 以交互模式运行容器,通常与 -t同时使用
-t # 为容器分配一个伪终端
-P # 随机端口映射,容器内部端口随机映射到主机端口
-p # 指定端口映射, 格式: 宿主端口:容器端口
--name="nginx-clx"  # 指定容器名称
-h # 指定主机名称
-e # 指定环境变量
--cpuset-cpu="0-1" # 指定程序在哪个cpu上跑
-m # 指定该容器执行可以使用最大内存量
--link=[] # 添加连接到另外一个容器
--rm # shell退出时自动删除容器

# 创建容器,并且指定容器80端口映射宿主机80端口
[root@VM-20-6-centos ~]# docker create --name mywebsite1 -p 80:80 nginx:1.21.4
## 容器创建成功
5ef282c6af17960e5b3bf1be1b90a21cb8fc25cc01705f910964043ef79e523e
### 可以看到宿主机80端口被使用
[root@VM-20-6-centos ~]# netstat -nltp | grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      21935/nginx: master 
#### 仅仅创建容器并不会去占用端口

[root@VM-20-6-centos ~]# docker ps -a 
CONTAINER ID   IMAGE            COMMAND                  CREATED         STATUS                      PORTS     NAMES
5ef282c6af17   nginx:1.21.4     "/docker-entrypoint.…"   3 minutes ago   Created                               mywebsite1

##### 当我们运行容器时,就会报错
[root@VM-20-6-centos ~]# docker start mywebsite1
Error response from daemon: driver failed programming external connectivity on endpoint mywebsite1 (a7928d24dc31c9825cbaf183aa4bd5e2952ca722cdda1b3a6227e5c06b434763): Error starting userland proxy: listen tcp4 0.0.0.0:80: bind: address already in use
Error: failed to start containers: mywebsite1

docker run

在上文Docker Registry/Dontainer Comment模块已经详细描述过了,这里不再赘述

docker logs 查看容器日志

docker logs [options] container
-f --follow 	# 跟踪日志输出,终端上实时输出
--since		    # 显示某个开始时间的所有日志
-t --timestamps # 显示时间戳
-n --tail 	    # 仅列出最新的N跳容器日志

docker attach 链接到正在运行中的容器

docker attach [options] container 
--sig-proxy #是否将所有信号代理,默认true,如果设置为false ,退出的话不会影响容器,否则退出会导致容器退出

# 当前有两个容器正在运行
[root@VM-20-6-centos ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                   NAMES
ee8f6e4cea2b   nginx:1.21.4   "/docker-entrypoint.…"   3 seconds ago    Up 2 seconds    0.0.0.0:8889->80/tcp, :::8889->80/tcp   mywebsite3
c262f9fa4d8d   nginx:1.21.4   "/docker-entrypoint.…"   21 minutes ago   Up 20 minutes   0.0.0.0:8888->80/tcp, :::8888->80/tcp   mywebsite2

# 链接mywebsite2,之后mywebsite2收到的信息都会被打印出来
[root@VM-20-6-centos ~]# docker attach mywebsite2
120.199.62.146 - - [30/May/2023:03:19:22 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36" "-"
120.199.62.146 - - [30/May/2023:03:19:22 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36" "-"
# 输入Ctrl + C 发送SIGINT信号,进程退出
^C2023/05/30 03:19:38 [notice] 1#1: signal 2 (SIGINT) received, exiting
2023/05/30 03:19:38 [notice] 32#32: exiting
2023/05/30 03:19:38 [notice] 32#32: exit
2023/05/30 03:19:38 [notice] 31#31: exiting
2023/05/30 03:19:38 [notice] 31#31: exit
2023/05/30 03:19:38 [notice] 1#1: signal 17 (SIGCHLD) received from 32
2023/05/30 03:19:38 [notice] 1#1: worker process 32 exited with code 0
2023/05/30 03:19:38 [notice] 1#1: signal 29 (SIGIO) received
2023/05/30 03:19:38 [notice] 1#1: signal 17 (SIGCHLD) received from 31
2023/05/30 03:19:38 [notice] 1#1: worker process 31 exited with code 0
2023/05/30 03:19:38 [notice] 1#1: exit

# 可以看到容器推出了,加上sig-proxy就不会出现这样的现象
[root@VM-20-6-centos ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS              PORTS                                   NAMES
ee8f6e4cea2b   nginx:1.21.4   "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:8889->80/tcp, :::8889->80/tcp   mywebsite3

# 使用docker --sig-proxy=false 
[root@VM-20-6-centos ~]# docker attach --sig-proxy=false mywebsite2
120.199.62.146 - - [30/May/2023:03:34:04 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36" "-"
120.199.62.146 - - [30/May/2023:03:34:05 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36" "-"
^C
# 容器并没有被终止
[root@VM-20-6-centos ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                   NAMES
ee8f6e4cea2b   nginx:1.21.4   "/docker-entrypoint.…"   15 minutes ago   Up 15 minutes   0.0.0.0:8889->80/tcp, :::8889->80/tcp   mywebsite3
c262f9fa4d8d   nginx:1.21.4   "/docker-entrypoint.…"   36 minutes ago   Up 11 minutes   0.0.0.0:8888->80/tcp, :::8888->80/tcp   mywebsite2

docker exec 在容器中执行命令

docker exec [options] container command [arg...]
-d # 分离模式 后台运行
-i # 即使没有附加也会保持STDIN打开,进行交互
-t # 分配一个伪终端
-e # 设置环境变量
-u # --user 指定用户"<name|uid>[:<group|gid>]"
-w ,--workdir # 指定工作目录 

# 新建终端并执行bash指令
[root@VM-20-6-centos ~]# docker exec -it mywebsite2 bash
root@c262f9fa4d8d:/# curl 127.0.0.1 

# -e 选项
[root@VM-20-6-centos ~]# docker exec -it -e mynginx=maxxin mywebsite2 bash
root@c262f9fa4d8d:/# env | grep mynginx
mynginx=maxxin

# -u 选项指定用户
# 查看nginx镜像用户信息
[root@VM-20-6-centos ~]# docker exec -it mywebsite2 cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
nginx:x:101:101:nginx user,,,:/nonexistent:/bin/false # 接下来使用这个用户
# 指定用户执行查看版本命令
[root@VM-20-6-centos ~]# docker exec -it -u nginx mywebsite2 nginx -v
nginx version: nginx/1.21.4

# -w 选项指定工作目录
[root@VM-20-6-centos ~]# docker exec -it -w /etc  mywebsite2 bash
root@c262f9fa4d8d:/etc# pwd
/etc

docker start/stop 将容器启动/终止

docker start [options] container [container...]
docker stop [options] container [container...]

docker kill 强制退出容器

docker kill [options] container [container...]
-s # 发送的信号
# 注意 Docker Stop 发送的是SIGTERM信号,Docker Kill 发送的是SIGKILL信号

docker top 查看容器中运行的进程信息

docker top container [ps OPTIONS] # 查看容器中运行的进程信息,支持ps命令参数
# 因为部分容器内部并不支持 ps 指令,此时我们可以使用docker top进行替代


[root@VM-20-6-centos ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED       STATUS       PORTS                                   NAMES
ee8f6e4cea2b   nginx:1.21.4   "/docker-entrypoint.…"   4 hours ago   Up 4 hours   0.0.0.0:8889->80/tcp, :::8889->80/tcp   mywebsite3
c262f9fa4d8d   nginx:1.21.4   "/docker-entrypoint.…"   4 hours ago   Up 4 hours   0.0.0.0:8888->80/tcp, :::8888->80/tcp   mywebsite2

[root@VM-20-6-centos ~]# docker top ee8f6e4cea2b
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                6785                6765                0                   11:18               ?                   00:00:00            nginx: master process nginx -g daemon off;
101                 6829                6785                0                   11:18               ?                   00:00:00            nginx: worker process
101                 6830                6785                0                   11:18               ?                   00:00:00            nginx: worker process

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

docker stats [options][container...]
--all, -a   # 显示所有容器,包括不运行的
--format    # 指定返回值的模板文件 如table json
--no-stream # 展示当前状态就直接退出了,不再实时更新。
--no-trunc  # 不截断输出。


[root@VM-20-6-centos ~]# docker stats  --no-stream  
CONTAINER ID   NAME         CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O    PIDS
ee8f6e4cea2b   mywebsite3   0.00%     1.957MiB / 3.608GiB   0.05%     1.48kB / 142B     0B / 4.1kB   3
c262f9fa4d8d   mywebsite2   0.00%     1.996MiB / 3.608GiB   0.05%     6.75kB / 7.03kB   0B / 0B      3

CONTAINER ID 	  # 容器 ID
NAME 			 # 容器 名称。
CPU % 与 MEM %    # 容器使用的 CPU 和内存的百分比。
MEM USAGE / LIMIT # 容器正在使用的总内存,以及允许使用的内存总量。
NET I/O			 # 容器通过其网络接口发送和接收的数据量。
BLOCK I/O         # 容器从主机上的块设备读取和写入的数据量。
PIDs              # 容器创建的进程或线程数

docker container inspect 查看容器详细信息

docker container inspect [options] container [container...]
-f # 指定返回值的模板文件 如table、json
-s # 显示总的文件大小
# docker inspect 会自动检查是镜像还是容器,然后显示响应信息

[root@VM-20-6-centos ~]# docker container inspect mywebsite2

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

docker port container [private_port[/proto]]

# 查看mywebsite2容器端口映射情况
[root@VM-20-6-centos ~]# docker port mywebsite2
80/tcp -> 0.0.0.0:8888
80/tcp -> [::]:8888

# 查看mywebsite2容器80
[root@VM-20-6-centos ~]# docker port mywebsite2 80/tcp
0.0.0.0:8888
[::]:8888

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

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

# 查看mywebsite2文件系统
[root@VM-20-6-centos ~]# docker exec -it mywebsite2 bash
root@c262f9fa4d8d:/# cd /usr/share/nginx/html/

# 发现在/usr/share/nginx/html/目录下存储 index.html, 我们想要将其拷贝到本地
root@c262f9fa4d8d:/usr/share/nginx/html# ls
50x.html  index.html
root@c262f9fa4d8d:/usr/share/nginx/html# exit
exit

# 使用docker cp 进行拷贝
[root@VM-20-6-centos ~]# docker cp mywebsite2:/usr/share/nginx/html/index.html .
Successfully copied 2.56kB to /root/.
[root@VM-20-6-centos ~]# ll
-rw-r--r--  1 root root     615 Nov  2  2021 index.html

docker diff 检查容器李文件结构的更改

docker diff container 

# A代表add C代表change,说明容器启动修改或新增了这些文件
[root@VM-20-6-centos ~]# docker diff mywebsite2
C /etc
C /etc/nginx
C /etc/nginx/conf.d
C /etc/nginx/conf.d/default.conf
C /run
A /run/nginx.pid
C /root
A /root/.bash_history
C /var
C /var/cache
C /var/cache/nginx
A /var/cache/nginx/client_temp
A /var/cache/nginx/fastcgi_temp
A /var/cache/nginx/proxy_temp
A /var/cache/nginx/scgi_temp
A /var/cache/nginx/uwsgi_temp

# 手动新增一个文件
[root@VM-20-6-centos ~]# docker exec -it mywebsite2 bash
root@c262f9fa4d8d:/# ls
bin  boot  dev	docker-entrypoint.d  docker-entrypoint.sh  etc	home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@c262f9fa4d8d:/# echo "hello" > /test.html
root@c262f9fa4d8d:/# exit
exit
[root@VM-20-6-centos ~]# docker diff mywebsite2
C /etc
C /etc/nginx
C /etc/nginx/conf.d
C /etc/nginx/conf.d/default.conf
C /root
A /root/.bash_history
A /test.html						# 这个就是我们新增的文件
C /var
C /var/cache
C /var/cache/nginx
A /var/cache/nginx/client_temp
A /var/cache/nginx/fastcgi_temp
A /var/cache/nginx/proxy_temp
A /var/cache/nginx/scgi_temp
A /var/cache/nginx/uwsgi_temp
C /run
A /run/nginx.pid

docker commit 从容器中创建一个新的镜像

docker commit [options] container [repository[:TAG]]
-a # 提交的镜像作者
-c # 使用Dockerfile 指令来创建镜像;可以修改启动指令
-m # 提交时的说明文字
-p # 在commit时,将容器暂停




[root@VM-20-6-centos ~]# docker images nginx
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
nginx        1.21.4    f6987c8d6ed5   17 months ago   141MB
nginx        1.21.1    822b7ec2aaf2   21 months ago   133MB

# 创建一个运行的容器
[root@VM-20-6-centos ~]# docker run -d --name mywebsite2forcommit nginx:1.21.4
f5216b4b133ad2bb4851a554274e984ae339e4c1c5b09dc038dfe1a7a39c15e1
[root@VM-20-6-centos ~]# docker ps | grep mywebsite2forcommit
f5216b4b133a   nginx:1.21.4   "/docker-entrypoint.…"   16 seconds ago   Up 15 seconds   80/tcp                                  mywebsite2forcommit

[root@VM-20-6-centos ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                   NAMES
f5216b4b133a   nginx:1.21.4   "/docker-entrypoint.…"   50 seconds ago   Up 49 seconds   80/tcp                                  mywebsite2forcommit
ee8f6e4cea2b   nginx:1.21.4   "/docker-entrypoint.…"   5 hours ago      Up 5 hours      0.0.0.0:8889->80/tcp, :::8889->80/tcp   mywebsite3
c262f9fa4d8d   nginx:1.21.4   "/docker-entrypoint.…"   5 hours ago      Up 5 hours      0.0.0.0:8888->80/tcp, :::8888->80/tcp   mywebsite2

# 使用运行中的容器制作一个镜像 mywebsite2:v1.0
[root@VM-20-6-centos ~]# docker commit mywebsite2forcommit mywebsite2:v1.0
sha256:d52a851164d0eeb8bf944526676bcaace63b5236c79962a7a7749b6735f47192

# 镜像制作完成
[root@VM-20-6-centos ~]# docker images mywebsite2
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
mywebsite2   v1.0      d52a851164d0   9 seconds ago   141MB

# -a -m -p 
[root@VM-20-6-centos ~]# docker commit -a 'clx' -m 'create by clx' -p mywebsite2forcommit mywebsite2:v2.0
sha256:8c09df24ff7e3405154e92f0d8b2c109cb379e489bc3d40444817649287193ef
[root@VM-20-6-centos ~]# docker images mywebsite2
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
mywebsite2   v2.0      8c09df24ff7e   16 seconds ago   141MB
mywebsite2   v1.0      d52a851164d0   5 minutes ago    141MB
[root@VM-20-6-centos ~]# docker inspect mywebsite2:v2.0 | grep clx
        "Comment": "create by clx",
        "Author": "clx",
        
# -c 选项修改启动指令
[root@VM-20-6-centos ~]# docker commit -a 'clx' -m 'create by clx for commit test' -c 'CMD ["tail", "-f", "/etc/hosts"]' -p mywebsite2forcommit mywebsite2:v3.0
sha256:372d230e3edb5123675bc52d85d6c54ee6bc724fd4a33d43540a01451ee05e01
[root@VM-20-6-centos ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED        STATUS        PORTS                                   NAMES
f5216b4b133a   nginx:1.21.4   "/docker-entrypoint.…"   18 hours ago   Up 18 hours   80/tcp                                  mywebsite2forcommit
ee8f6e4cea2b   nginx:1.21.4   "/docker-entrypoint.…"   23 hours ago   Up 23 hours   0.0.0.0:8889->80/tcp, :::8889->80/tcp   mywebsite3
c262f9fa4d8d   nginx:1.21.4   "/docker-entrypoint.…"   23 hours ago   Up 23 hours   0.0.0.0:8888->80/tcp, :::8888->80/tcp   mywebsite2
[root@VM-20-6-centos ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
mywebsite2   v3.0      372d230e3edb   12 seconds ago   141MB

# 运行新生成镜像
[root@VM-20-6-centos ~]# docker run -d --name mywebsite2forcommit2 mywebsite2:v3.0
60f2be510c1bde7b9f9633855917b21385e33c0a895dbf116afed6d768912e61
# 发现后者启动命令确实被修改了
[root@VM-20-6-centos ~]# docker ps --no-trunc | grep mywebsite2forcommit
60f2be510c1bde7b9f9633855917b21385e33c0a895dbf116afed6d768912e61   mywebsite2:v3.0   "/docker-entrypoint.sh tail -f /etc/hosts"       16 seconds ago   Up 15 seconds   80/tcp                                  mywebsite2forcommit2
f5216b4b133ad2bb4851a554274e984ae339e4c1c5b09dc038dfe1a7a39c15e1   nginx:1.21.4      "/docker-entrypoint.sh nginx -g 'daemon off;'"   18 hours ago     Up 18 hours     80/tcp                                  mywebsite2forcommit

docker pause/unpause 暂停/取消暂停容器中所有的进程,剥夺/赋予该进程时间片

docker pause container [container...]

# 暂停容器
[root@VM-20-6-centos ~]# docker pause mywebsite2
mywebsite2
[root@VM-20-6-centos ~]# docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS                 PORTS                                   NAMES
c262f9fa4d8d   nginx:1.21.4      "/docker-entrypoint.…"   24 hours ago    Up 23 hours (Paused)   0.0.0.0:8888->80/tcp, :::8888->80/tcp   mywebsite2 # 该容器被暂停
# 取消暂停该容器
[root@VM-20-6-centos ~]# docker unpause mywebsite2 
mywebsite2
[root@VM-20-6-centos ~]# docker ps
c262f9fa4d8d   nginx:1.21.4      "/docker-entrypoint.…"   24 hours ago    Up 23 hours    0.0.0.0:8888->80/tcp, :::8888->80/tcp   mywebsite2

docker rm 删除容器

docker rm [options] container [container...]
-f # 公国SIGKILL信号强制删除一个运行中的容器(非常危险,慎用)

# 删除正在运行的容器会报错
[root@VM-20-6-centos ~]# docker rm mywebsite2forcommit2
Error response from daemon: You cannot remove a running container 60f2be510c1bde7b9f9633855917b21385e33c0a895dbf116afed6d768912e61. Stop the container before attempting removal or force remove

# 现将容器停止后才可以进行删除
[root@VM-20-6-centos ~]# docker stop mywebsite2forcommit2
mywebsite2forcommit2
[root@VM-20-6-centos ~]# docker rm mywebsite2forcommit2
mywebsite2forcommit2

docker export 导出容器为tar文件

docker export [options] container 
# -o # 写入到文件
# 注意: 由docker export制作的tar文件导出的镜像的config会被清空,需要我们手动配置 

[root@VM-20-6-centos ~]# mkdir -p /data/maxxin/testexport
[root@VM-20-6-centos ~]# cd /data/maxxin/testexport
[root@VM-20-6-centos testexport]# ll
total 0
# 进行导出容器 
[root@VM-20-6-centos testexport]# docker export -o mywebsite4.tar mywebsite4
ls[root@VM-20-6-centos testexport]# ls -l
total 140640
-rw------- 1 root root 144015360 May 31 10:51 mywebsite4.tar

docker import 从归档文件中创建镜像

docker import [options] file | URL | - [repository[:TAG]]
-c # 设置config参数
-m # 设置注释

[root@VM-20-6-centos testexport]# docker import mywebsite4.tar mywebsite4:v1.0
sha256:b517c6812cdeb137d81b3052ed41283e08ff4a49b4b5197737a0378a04cc784c

# 设置启动指令
[root@VM-20-6-centos testexport]# docker import -c 'CMD ["nginx", "-g", "daemon off;"]' mywebsite4.tar mywebsite4:v2.0
sha256:04a952bbf5b5ff4ff6e278da95482eadca06aff1ebd6ddaf59e677899f95a5e9

docker wait 阻塞运行置容器停止,然后打印它的退出码

docker wait container 

# 创建一个容器
[root@VM-20-6-centos testexport]# docker run --name mywebsite5 -d nginx:1.21.4
8d8f79a42c3a9488a4e3ce58e7d3ddd0d4e4eb997d16616a08109e7e52cea799
# 终止容器
[root@VM-20-6-centos testexport]# docker kill mywebsite5
mywebsite5

## 新建终端,进行等待
[root@VM-20-6-centos testexport]# docker wait mywebsite5
137

docker rename 重命名容器

docker rename container new_name

[root@VM-20-6-centos testexport]# docker rename mywebsite6 mywebsite7

docker container prune 删除所有停止的容器

docker container prune [options]
-f --force # 不提示是否进行确认

docekr update 更新容器配置

docker update [options] container [container...]
--cpus 		    # cpu数量
--cpuset-cpus 	# 使用哪些cpu
--memory 	    # 内存限制
--memory-swap   # 交换内存的限制
--cpu-period    # 用来指定容器对CPU的使用要在多长时间内做一次重新分配
--cpu-quota     # 是用来指定在这个周期内,最多可以由多少时间来跑这个容器

# 更新容器配置
[root@VM-20-6-centos testexport]# docker update --memory 500Mib mywebsite8

容器批量处理技巧

命令 解释
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 选项

容器批量操作技巧

# 使用 ` ` 将id喂给docker stop
[root@VM-20-6-centos ~]# docker stop `docker ps -q`
67bc13afce8c
2b710ba85db4
a9d251bfc68e
420f60ae5014
[root@VM-20-6-centos ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

容器的交互模式

attached 模式(调试使用)

[root@VM-20-6-centos ~]# docker run --name mynginx006  -p 8889:80 nginx:1.24.0
# 类似这样创建的容器,就是attached模式,这样容器会在前台运行
# 访问服务器网址时,每访问一次就会打印一次日志,主要用于开发环境(便于调试)
# 不用于生产环境,日志进程被杀死会连带着服务被杀死

detached 模式(生产使用)

[root@VM-20-6-centos ~]# docker run -d --name mynginx007  -p 8889:80 nginx:1.24.0
# 在 attached模式基础上加上一个-d 或者 --detach选项表示detached 模式,即在后台执行

# 使用该指令可以将容器由 detached 模式转换到 attached 模式
[root@VM-20-6-centos ~]# docker attach mynginx007

interactive 模式 交互式容器

# 创建一个容器后,可能需要取容器内部获取一些信息或者执行一些命令,就需要进入到交互式模式

# 1、创建交互式容器
[root@VM-20-6-centos ~]# docker run -it --name mynginx008 -p 8890:80 nginx:1.24.0  bash
# shell退出容器也就推出了,所以不推荐在生产环境使用

# 2、和detached模式容器进行交互
[root@VM-20-6-centos ~]# docker exec -it  mynginx010 bash  # 在 mynginx010容器中执行交互式 bash指令

# 使用exec容器交互模式,使用exit推出后,不影响器正常运行
root@477394966da9:/# exit
exit

容器和宿主机数据交互

[root@VM-20-6-centos ~]# docker run -d --name mynginx011 -p 8888:80 nginx:1.24.0
340121d997a7cbaaef4ac5868a89290047534924f8f7bb5f199bc5933da35065
	
[root@VM-20-6-centos testcp]# docker cp mynginx011:/usr/share/nginx/html/index.html .
Successfully copied 2.56kB to /data/maxxin/testcp/.

# 可以看到容器中的文件被我们拷贝到宿主机上了
[root@VM-20-6-centos testcp]# ls
index.html
# 进行修改
[root@VM-20-6-centos testcp]# vim index.html 
# 拷贝回去
[root@VM-20-6-centos testcp]# docker cp ./index.html mynginx011:/usr/share/nginx/html/
Successfully copied 2.56kB to mynginx011:/usr/share/nginx/html/
[root@VM-20-6-centos testcp]# docker exec -it mynginx011 bash
# 到该目录下查看文件是否被修改
root@340121d997a7:/# cd /usr/share/nginx/html

## 容器和容器之间进行文件拷贝,发现并不支持
[root@VM-20-6-centos testcp]# docker cp mynginx011:/usr/share/nginx/html/index.html mynginx010:/usr/share/nginx/html/
copying between containers is not supported

容器自动删除

# 1、attached状态容器退出自动删除
[root@VM-20-6-centos ~]# docker run --name mynginx012 --rm nginx:1.24.0

# 2、后台运行容器,(stop)停止后也会被自动删除
[root@VM-20-6-centos ~]# docker run -d --rm --name mynginx012 nginx:1.24.0

# 注意:生产环境慎重使用该选项,因为误停止服务可能会导致容器删除

容器自动重启

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 stop终止容器则不会进行重启

容器环境变量设置

# 使用-e选项添加环境变量
[root@VM-20-6-centos ~]# docker run -it --name mynginx014 -e MYTEST1=1 -e MYTEST2=2 -e MYTEST3=3 nginx:1.24.0 bash
root@1c9bd5aa3ddc:/# env | grep MYTEST
MYTEST1=1
MYTEST3=3
MYTEST2=2

# 使用配置文件完成环境变量设置
[root@VM-20-6-centos ~]# mkdir /data/maxxin/mytestenv
[root@VM-20-6-centos ~]# cd /data/maxxin/mytestenv
[root@VM-20-6-centos mytestenv]# vim myenv
[root@VM-20-6-centos mytestenv]# docker run -it --rm --name mynginx015 --env-file=./myenv nginx:1.24.0 bash
root@e1ed65d01133:/# env | grep MYTEST
MYTEST1=1
MYTEST3=3
MYTEST2=2

容器信息查看

[root@VM-20-6-centos mytestenv]# docker run -d --name mynginx015 -p 8815:80 -e MYTEST=1 -h mynginx015.com  nginx:1.24.0
c8fe774a80cccf3ede6f5a9c1219b751bdbda6b91cdf392585ef6531c6f9dfee
# 查看摘要信息
[root@VM-20-6-centos mytestenv]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                   NAMES
c8fe774a80cc   nginx:1.24.0   "/docker-entrypoint.…"   7 seconds ago   Up 6 seconds   0.0.0.0:8815->80/tcp, :::8815->80/tcp   mynginx015
# 查看详情
[root@VM-20-6-centos mytestenv]# docker container inspect mynginx015

容器镜像导入和导出

[root@VM-20-6-centos mytestenv]# docker run -d --name mynginx016 -p 8816:80 nginx:1.24.0
6b58beb6a70cd1554cd535c460116b5c2294baaa02d9e06da822ff3d9003eebb
[root@VM-20-6-centos mytestenv]# docker exec -it mynginx016 bash
root@6b58beb6a70c:/# cd /usr/share/nginx/html
root@6b58beb6a70c:/usr/share/nginx/html# echo "I am from xiaobais-attack docker" > index.html
root@6b58beb6a70c:/usr/share/nginx/html# exit
exit

[root@VM-20-6-centos mytestenv]# mkdir -p /data/maxxin/testtar
[root@VM-20-6-centos mytestenv]# cd /data/maxxin/testtar
[root@VM-20-6-centos testtar]# ll
total 0
[root@VM-20-6-centos testtar]# docker export -o mynginx016.tar mynginx016
[root@VM-20-6-centos testtar]# ls
mynginx016.tar

# 两台机器的.tar文件传输即可以使用scp也可以使用xshell自带的文件传输

[root@VM-20-6-centos testtar]# docker import mynginx016.tar mynginx:v016
sha256:c0f09cd18c8ce8e31beb97712493a5cfbea5453933ce4f8d2ea3356ff932ce3a
[root@VM-20-6-centos testtar]# docker images mynginx
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
mynginx      v016      c0f09cd18c8c   16 seconds ago   140MB

# 可以发现导入的容器没有找到启动命令,这是因为export 导出会清空一些配置
[root@VM-20-6-centos testtar]# docker run -d --name mynginx017 -p 8817:80 mynginx:v016
docker: Error response from daemon: No command specified.

# 手动添加启动指令就可以完成启动
[root@VM-20-6-centos testtar]# docker run -d --name mynginx017 -p 8817:80 mynginx:v016 nginx -g "daemon off;"
61de81924d6208ad359e73abf9e0aaf5b807fb21bf18c8dc6f92082a74277269
[root@VM-20-6-centos testtar]# docker exec -it mynginx017 bash
root@61de81924d62:/# cd /usr/share/nginx/html
root@61de81924d62:/usr/share/nginx/html# cat index.html
I am from xiaobais-attack docker

相比于docker save/load指令制作镜像,docker export/import 会清空一些配置,所以前者更为常用文章来源地址https://www.toymoban.com/news/detail-474950.html

容器日志查看


容器占用资源查看

# 方法1、
[root@VM-20-6-centos ~]# docker stats --no-stream mynginx018 
CONTAINER ID   NAME         CPU %     MEM USAGE / LIMIT     MEM %     NET I/O     BLOCK I/O     PIDS
48686bc5b757   mynginx018   0.00%     2.023MiB / 3.608GiB   0.05%     656B / 0B   0B / 8.19kB   3

# 方法2、使用docker top [container] + ps命令的参数
[root@VM-20-6-centos ~]# docker top mynginx018 aux

MySQL容器化安装

[root@VM-20-6-centos ~]# docker run --name mysql -e MYSQL_ROOT_PASSWORD=2519375966 -p 8888:3306 -d mysql:5.7

Redis容器化安装

[root@VM-20-6-centos ~]# docker run --name redis -d -p 8889:6379 redis:7
a6696e0c0f45cb2219d13db37df0fc69b5f656f19e022d8d2422cffa2e31b91e
[root@VM-20-6-centos ~]# docker exec -it redis bash
root@a6696e0c0f45:/data# 
root@a6696e0c0f45:/data# redis-cli
127.0.0.1:6379> set sellcount 1
OK
127.0.0.1:6379> get sellcount
"1"

镜像源配置

# 中科大源网站 推荐使用这个
https://mirrors.ustc.edu.cn/help/centos.html

# 清华大学开源软件镜像站
https://mirrors.tuna.tsinghua.edu.cn/help/centos/

制作C++容器

# 1、下载Centos镜像
[root@VM-20-6-centos ~]# docker pull centos:7

# 2、启动容器 配置镜像源 刷新缓存 下载gcc
[root@VM-20-6-centos ~]# docker run -it --name mycpp centos:7 bash
[root@4050678bfc8c /]# sed -e 's|^mirrorlist=|#mirrorlist=|g' \
>          -e 's|^#baseurl=http://mirror.centos.org/centos|baseurl=https://mirrors.ustc.edu.cn/centos|g' \
>          -i.bak \
>          /etc/yum.repos.d/CentOS-Base.repo
[root@4050678bfc8c /]# yum makecache
[root@4050678bfc8c /]# yum install gcc
# 3、编写cpp代码进行编译

到了这里,关于【Docker】5.Docker Container的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Windows下启动Docker容器遇到Error invoking remote method ‘docker-start-container‘: Error解决办法

    报错 :Error invoking remote method \\\'docker-start-container\\\': Error: (HTTP code 500) server error - Ports are not available: exposing port TCP 0.0.0.0:5903 - 0.0.0.0:0: listen tcp 0.0.0.0:5903: bind: An attempt was made to access a socket in a way forbidden by its access permissions. 解决方法 1.使用管理员权限在cmd中执行 net stop winnat  2.启

    2024年02月11日
    浏览(43)
  • Docker 删除镜像文件以及解决删除报错image is being used by stopped container 的问题

    1.使用命令查看所有镜像 2.根据ID删除需要删除的镜像 3.如果删除时出现了image is being used by stopped container的错误就先使用一下命令再执行删除指令: 4.再次执行成功

    2024年02月05日
    浏览(30)
  • OCI runtime create failed: runc create failed: unable to start container process: --docker加载镜像

    OCI runtime create failed: runc create failed: unable to start container process: exec: “env”: executable file not found in $PATH: unknown 运行docker容器时出现上述报错。 原因: 别人给我的镜像是已解压的,并且告知我是用load去加载镜像。 命令报错。 报错信息为: open /var/lib/docker/tmp/docker-import-*******

    2024年02月11日
    浏览(43)
  • Docker学习:容器五种(3+2)网络模式 | bridge模式 | host模式 | none模式 | container 模式 | 自定义网络模式详解

    本讲是从Docker系列讲解课程,单独抽离出来的一个小节,重点介绍 容器网络模式 , 属于了解范畴,充分了容器的网络模式, 更有助于更好的理解Docker的容器之间的访问逻辑 。 疑问: 为什么要了解容器的网络模式? 首先, 容器之间 虽然不是物理隔离,但是它们彼此之间

    2024年02月09日
    浏览(33)
  • docker 保存镜像、容器与导入镜像容器

    可以通过以下步骤将Docker镜像导出到另一台计算机上: 在本地计算机上使用以下命令将Docker镜像保存为tar文件: 其中,image-name是要导出的Docker镜像的名称。 将保存的tar文件传输到另一台计算机上,可以使用scp命令或其他文件传输工具。 在目标计算机上使用以下命令将tar文

    2024年02月13日
    浏览(32)
  • Win11中docker镜像Failed to run image. Error invoking remote method ‘docker-run-container‘: Error: conne

    Failed to run image. Error invoking remote method \\\'docker-run-container\\\': Error: connect ENOENT \\\\.pipedockerDesktopEngine 使用管理员权限在cmd中执行 : 启动Docker容器: 使用管理员权限在cmd中执行 : 重新启动Docker就可以正常启动镜像了(如果不行的话,就重启电脑试试)。 初步怀疑可能是未关闭容

    2024年02月11日
    浏览(37)
  • docker 启动容器异常Error response from daemon: OCI runtime create failed: container with id exists

    问题描述 docker服务异常停止,重启docker后,容器启动失败 错误信息 Error response from daemon: OCI runtime create failed: container with id exists: xxx unknown 错误原因 docker启动的时候,会在运行目录(/var/run/docker/runtime-runc/moby)(不同环境,可能目录不一样,可以通过 find / -name \\\'容器ID\\\' 查找

    2024年02月16日
    浏览(27)
  • docker导出镜像、容器打镜像

    有两种方法,一种是通过容器,一种是通过镜像 1 首先使用 docker ps -a 查看本机上的所有容器 2 导出镜像 使用 docker export 命令根据容器 id 将镜像导成一个文件 上面命令执行之后,我们便可以通过 ls 命令在当前目录下发现 image.tar 3 导入镜像 使用 docker import 命令将这个镜像导

    2024年02月03日
    浏览(39)
  • Docker容器------镜像,容器基础命令

    目录  一,docker镜像  1,查看docker版本  2,获取镜像 2.1查看下载到本地的所有镜像   2.2 获取镜像信息 2.3 添加镜像标签(上传镜像到仓库)   2.4 镜像导出  2.5 镜像导入  2.6 ,删除镜像  2.7 上传镜像 ​编辑 二,docker 容器操作 1,查看容器 2,容器创建----docker create  

    2024年02月05日
    浏览(39)
  • docker容器挂了,显卡驱动异常问题:nvidia-container-cli: initialization error: nvml error: driver not loaded...

    1.具体报错 2.问题分析 容器依赖于Nvidia显卡驱动,驱动掉了。 题外话:该客户的服务器长年有外网,显卡驱动在这几个月不止一次掉,排查原因Linux/Ubuntu内核自动更新,驱动程序失效,重装驱动往往是一个解决办法,但是内核一旦再次更新,可能还是会导致显卡驱动失效。

    2024年02月12日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包