您现在的位置是:首页 >技术杂谈 >【Docker】5.Docker Container网站首页技术杂谈

【Docker】5.Docker Container

小白在进击 2024-09-07 00:01:02
简介【Docker】5.Docker Container

Docker Container

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

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

容器的生命周期

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

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

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

Docker Container Command

命令别名功能备注
docker createdocker container create创建容器
docker rundocker container run运行容器重要
docker attachdocker container attach链接到正在运行的容器
docker commitdocker container将镜像提交为容器重要
docker cpdocker container cp在容器和宿主机之间拷贝重要
docker diffdocker container diff检查容器李文件结构的更改
docker execdocker container exec在运行的容器中执行命令重要
docker exportdocker container export将容器到处为tar
docker container inspect查看容器详细信息重要
docker killdocker container kill杀死容器重要
docker logsdocker container logs查看日志重要
docker psdocker container ls/list/ps查看正在运行的进程重要
docker pausedocker container pause暂停进程
docker portdocker container port查看容器端口映射
docker container prune删除停止容器
docker renamedocker container rename容器重命名
docker restartdocker container restart重启容器重要
docker rmdocker container rm/remove删除容器重要
docker startdocker container start启动容器重要
docker statsdocker container stats查看容器资源占用信息重要
docker stopdocker container stop停止容器重要
docker topdocker container top查看某个容器的资源占用重要
docker unpausedocker container unpause继续运行容器
docker updatedocker container update更新容器配置
docker waitdocker 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 会清空一些配置,所以前者更为常用

容器日志查看


容器占用资源查看

# 方法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代码进行编译
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。