您现在的位置是:首页 >技术交流 >Docker容器网站首页技术交流

Docker容器

皮卡~~~丘 没电了 2023-06-08 16:00:03
简介Docker容器

目录

1、创建容器

2、查看容器的运行状态

3、启动容器

4、创建并启动容器 

5、在后台持续运行 docker run 创建的容器

6、终止容器运行

7、删除容器

8、进入容器

 1、前台运行容器时进入容器,使用exit退出后,容器就停止了。

 2、后台运行容器,之后使用docker exec进入容器,exit退出,容器不会停止。

 9、查看容器的元数据--docker inspect

10、docker system

docker system df

docker system events 等同于 docker events

docker system info 等同于 docker info

docker system prune

11、容器日志

 12、宿主机和容器之间文件复制

1、将宿主机的文件复制到容器中

2、将容器的文件复制到宿主机

13、容器的导出与导入(容器的迁移)


1、创建容器

就是将镜像加载到容器的过程。

新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器。

格式:docker create [选项] 镜像
常用选项:
-i:让容器开启标准输入
-t:让 Docker 分配一个伪终端 tty
-it :合起来实现和容器交互的作用,运行一个交互式会话 shell 

2、查看容器的运行状态

格式
docker ps [选项]

docker ps       #查看当前运行状态的容器
选项
-q         #只显示运行状态的容器的ID
-a         #显示所有的容器
-aq        #显示所有容器的IP
-s         #显示总的文件大小
-as        #显示所有容器的大小
-n 6       #查看最后创建的6个镜像
-f         #根据条件过滤显示的内容
-format    #指定返回值的模版文件
-l         #显示最近创建的容器
-no-trunc  #不间断输出




[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS    PORTS     NAMES
6f9f69b097a0   nginx:latest   "/docker-entrypoint.…"   16 seconds ago   Created             recursing_swanson
容器的ID号      加载的镜像      运行的程序                   创建时间          当前的状态   端口映射    名称

  

3、启动容器

格式:docker start 容器的ID/名称
docker start 2b3a87b5eeaa
docker ps -a

4、创建并启动容器 

可以直接执行 docker run 命令, 等同于先执行 docker create 命令,再执行 docker start 命令。

注意:容器是一个与其中运行的 shell 命令共存亡的终端,命令运行容器运行, 命令结束容器退出。

       docker 容器默认会把容器内部第一个进程,也就是 pid=1 的程序作为docker容器是否正在运行的依据,如果docker容器中 pid = 1 的进程挂了,那么docker容器便会直接退出,也就是说Docker容器中必须有一个前台进程,否则认为容器已经挂掉。

当利用 docker run 来创建容器时, Docker 在后台的标准运行过程是:

  1. 检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载;
  2. 利用镜像创建并启动一个容器;
  3. 分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层;
  4. 从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中;
  5. 分配一个地址池中的 IP 地址给容器;
  6. 执行用户指定的应用程序,执行完毕后容器被终止运行。
格式
docker run [选项] 镜像 [命令] [参数]

选项
-a     指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项
-d     后台运行容器,并返回容器ID
-i     以交互模式运行容器,通常与 -t 同时使用
-t     为容器重新分配一个伪输入终端,通常与 -i 同时使用
-P     随机端口映射,容器内部端口 随机 映射到主机的端口
-p     指定端口映射,格式为:主机(宿主)端口:容器端口
--name=        为容器指定一个名称
-dns-search    指定容器DNS搜索域名,默认和宿主一致
-h     指定容器的hostname
-m     设置容器使用内存最大值
-link=[ ]      连接到另一个容器
--privileged=true    授予此容器扩展特权,也就是开启特权模式; 这种模式下容器对docker宿主机拥有root访问权限。慎用!
--net/--network      指定网络模式



[root@localhost ~]# docker run centos:7 /usr/bin/bash -c ls /
[root@localhost ~]# docker ps -a   #会发现创建了一个新容器并启动执行一条 shell 命令,之后就停止了
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS                      PORTS     NAMES
834ca8d0b7c8   centos:7       "/usr/bin/bash -c ls…"   19 seconds ago   Exited (0) 19 seconds ago             upbeat_hamilton

5、在后台持续运行 docker run 创建的容器


       需要在 docker run 命令之后添加 -d 选项让 Docker 容器以守护形式在后台运行。并且容器所运行的程序不能结束。(容器中的命令仍然在前台运行)

        使用-itd选项,可以创建并持续运行容器,即便进入容器后使用exit命令退出容器,也不会停止容器。

[root@localhost ~]# docker run -d centos:7 /usr/bin/bash -c "while true;do echo hello;done"
31f9e237cec784175cd9599356c1d4d96ca1e4d1e7682e204b86f029dcecb26f
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS                     PORTS     NAMES
31f9e237cec7   centos:7       "/usr/bin/bash -c 'w…"   3 seconds ago    Up 2 seconds                         flamboyant_liskov


[root@localhost ~]# docker run -itd --name test1 centos:7 /bin/bash
da55f60024564b9e2134df12824c8657b95d9e33fc224deed59397026f35ace2
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS                      PORTS     NAMES
da55f6002456   centos:7       "/bin/bash"               7 seconds ago    Up 5 seconds                          test1

6、终止容器运行

格式:
docker stop 容器的ID/名称    #正常停止,可以给容器一个等待时间,以防止数据的丢失。
docker kill 容器的ID/名称    #强制停止,不给容器反应时间,可能造成数据丢失。
docker stop $(docker ps -aq)  #批量停止容器
docker ps -a | awk 'NR>=2 {print $1}' | xargs docker stop    #批量停止容器 

7、删除容器

 不能删除运行状态的容器,需要先停止再删除。或者使用-f强制删除。

格式:docker rm <容器ID/名称> [-f]   #删除容器
docker rm $(docker ps -aq)          #批量删除所有容器
docker ps -a |awk 'NR>=2 {print $1}' | xargs docker rm   #批量删除所有容器

已停止的可以直接删 

8、进入容器

       要进入容器进行命令操作时,可以使用 docker exec 命令进入运行中的容器。进入容器前,确保容器正在运行。

  • 我们通常会使用 docker  exec -it bash 进入容器并开启一个bash环境的伪终端。也可以将bash 换成其他一条命令,让容器执行完后,将结果输出到屏幕
  • 后面可以跟上 -c 选项  “命令序列" ,命令序列可以是多个命令,使用分号隔开,可以一次性执行多条命令。

docker run -it 会创建前台进程,但是会在输入exit后终止进程。

docker attach 会通过连接stdin,连接到容器内输入输出流,会在输入exit后终止容器进程。

docker exec -it 会连接到容器,可以像SSH一样进入容器内部,进行操作,可以通过exit退出容器,不影响容器运行。

格式:docker exec -it 容器ID/名称 /bin/bash
 ​
 -i 选项表示让容器的输入保持打开。
 -t 选项表示让 Docker 分配一个伪终端。
 -it /bin/bash:进入容器时需要指定一个shell环境。

 1、前台运行容器时进入容器,使用exit退出后,容器就停止了。

[root@localhost ~]# docker run -it --name t3 centos:7 /bin/bash
[root@e909cb89aa4d /]# exit
exit
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS                            PORTS     NAMES
e909cb89aa4d   centos:7       "/bin/bash"               19 seconds ago   Exited (0) 4 seconds ago                    t3
517344b41eab   centos:7       "/bin/bash"               21 hours ago     Exited (137) About a minute ago             t2
da55f6002456   centos:7       "/bin/bash"               21 hours ago     Up 21 hours                                 test1
2b3a87b5eeaa   nginx:latest   "/docker-entrypoint.…"   29 hours ago     Up 30 minutes                     80/tcp    heuristic_thompson

 2、后台运行容器,之后使用docker exec进入容器,exit退出,容器不会停止。

[root@localhost ~]# docker run -itd --name t4 centos:7
8b65edd88c09981bbbf716c4b24a5a9c9ba5e6ce233d4cf66a76c0245acd0c08
[root@localhost ~]# docker exec -it t4 /bin/bash
[root@8b65edd88c09 /]# exit
exit
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS                       PORTS     NAMES
8b65edd88c09   centos:7       "/bin/bash"               51 seconds ago   Up 50 seconds                          t4
e909cb89aa4d   centos:7       "/bin/bash"               7 minutes ago    Exited (0) 7 minutes ago               t3
517344b41eab   centos:7       "/bin/bash"               21 hours ago     Exited (137) 8 minutes ago             t2

 9、查看容器的元数据--docker inspect

格式:docker inspect 容器id/容器名称


[root@localhost ~]# docker inspect 8b65edd88c09

[root@localhost ~]# docker inspect -f '{{.State.Pid}}' 容器ID
#查看进程号

10、docker system

[root@localhost ~]# docker system --help

Usage:  docker system COMMAND

Manage Docker

Commands:
  df          Show docker disk usage    #显示docker磁盘使用情况
  events      Get real time events from the server    #从服务器获取实时事件
  info        Display system-wide information         #显示系统信息
  prune       Remove unused data        #删除不使用的数据

docker system df

       提供Docker整体磁盘使用率的概况,包括镜像、容器和(本地)volume。所以我们现在随时都可以查看Docker使用了多少资源。

[root@localhost ~]# docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          2         2         345.4MB   0B (0%)
Containers      3         3         1.174kB   0B (0%)
Local Volumes   0         0         0B        0B
Build Cache     0         0         0B        0B

Images  #所有镜像占用的空间,包括拉取下来的镜像,和本地构建的。
Containers    #运行的容器占用的空间,表示每个容器的读写层的空间。
Local Volumes   #容器挂载本地数据卷的空间。
Build Cache     #镜像构建过程中产生的缓存空间(只有在使用BuildKit时才有,Docker18.09以后可用)。

docker system events 等同于 docker events

获取docker系统实时事件,不包括容器内的。

docker system info 等同于 docker info

查看整个docker系统的信息

docker system prune

删除生成缓存

[root@localhost ~]# docker system prune --help

Usage:  docker system prune [OPTIONS]

Remove unused data

Options:
  -a, --all             Remove all unused images not just dangling ones   #删除所有未使用的构建缓存,而不仅仅是悬空的缓存
      --filter filter   Provide filter values (e.g. "label=<key>=<value>")  #提供过滤值
  -f, --force           Do not prompt for confirmation    #不提示确认
      --volumes         Prune volumes        #数据卷



[root@localhost ~]# docker system prune
WARNING! This will remove:
  - all stopped containers        #所有停止的容器
  - all networks not used by at least one container  #所有没有容器使用的网络
  - all dangling images           #所有悬空镜像即无tag的镜像
  - all dangling build cache      #所有悬空创建的缓存


[root@localhost ~]# docker system prune -a
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all images without at least one container associated to them #所有没有容器使用的镜像
  - all build cache      #所有创建的缓存

 

11、容器日志

 格式:
 docker logs 容器ID/容器名
[root@localhost ~]# docker run -itd -P nginx:latest
d6ca0d729ab071d820d6fd623e43017ec738e2b31d5919f9c64ab08f96a232bc
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS         PORTS                                     NAMES
d6ca0d729ab0   nginx:latest   "/docker-entrypoint.…"   5 seconds ago   Up 4 seconds   0.0.0.0:32769->80/tcp, :::32769->80/tcp   determined_nobel

浏览器使用宿主机IP加映射端口:192.168.247.160:32769

[root@localhost ~]# docker logs d6ca0d729ab0    #查看容器日志
192.168.247.1 - - [20/Apr/2023:10:32:03 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://192.168.247.160:32769/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.48" "-"

 

 12、宿主机和容器之间文件复制

1、将宿主机的文件复制到容器中

[root@localhost ~]# echo 222 > /opt/1.txt
[root@localhost ~]# docker cp /opt/1.txt d6ca0d729ab0:/tmp/   #将文件复制到容器
Successfully copied 2.05kB to d6ca0d729ab0:/tmp/
[root@localhost ~]# docker exec -it d6ca0d729ab0 /bin/bash
root@d6ca0d729ab0:/# cd /tmp
root@d6ca0d729ab0:/tmp# ls     #文件存在,复制成功
1.txt
root@d6ca0d729ab0:/tmp# cat 1.txt
222

2、将容器的文件复制到宿主机

root@d6ca0d729ab0:/# cd /tmp
root@d6ca0d729ab0:/tmp# echo 666 > ./6.txt
root@d6ca0d729ab0:/tmp# ls
1.txt  6.txt
root@d6ca0d729ab0:/tmp# exit
exit
[root@localhost ~]# docker cp d6ca0d729ab0:/tmp/6.txt ~/
Successfully copied 2.05kB to /root/
[root@localhost ~]# ls
6.txt 
[root@localhost ~]# cat 6.txt
666

13、容器的导出与导入(容器的迁移)

       用户可以将任何一个 Docker 容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker export 命令将已经创建好的容器导出为文件,无论这个容器是处于运行状态还是停止状态均可导出。

       可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。(注意:导入文件后会生成镜像,但不会自动创建容器。)

#导出格式:
 docker export 容器ID/名称 > 导出文件名
 ​
#导入格式:
 cat 导出文件名 | docker import – 镜像名称:标签
导出主机
[root@localhost ~]# docker export d6ca0d729ab0 > mycentos7
[root@localhost ~]# scp ~/mycentos7 192.168.247.160:/root/


导入主机
[root@zbx-agent1 ~]# ls
anaconda-ks.cfg  initial-setup-ks.cfg  mycentos7 
[root@zbx-agent1 ~]# cat mycentos7 | docker import - centos7:test
sha256:7c1ebe5d74ad7e89c3f366de73c0f27ccd5b6f2d8a925a74a8a067b6e9ff92dd
[root@zbx-agent1 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@zbx-agent1 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
centos7      test      7c1ebe5d74ad   48 seconds ago   140MB

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。