Docker容器

Posted wshenjin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker容器相关的知识,希望对你有一定的参考价值。

启动容器

启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态的容器重新启动。

新建启动

docker run

常用选项:

  • -t:选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上
  • -i:则让容器的标准输入保持打开
  • -d:以后台方式启动容器

例如启动一个centos容器:

[[email protected]_Machine_192.168.31.130 ~]# docker run -tid centos
354861680ae5cdd0b807ad70f0968afa2a7717c8c55f0271cd76c95f905cf4ae
[[email protected]_Machine_192.168.31.130 ~]# docker ps -a
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                    PORTS                      NAMES
354861680ae5        centos                     "/bin/bash"              4 seconds ago       Up 4 seconds                                         competent_jang

容器启动后回到docker host 的终端并 返回该容器的 ID。

当利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载
  • 利用镜像创建并启动一个容器
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
  • 从地址池配置一个 ip 地址给容器
  • 执行用户指定的应用程序
  • 执行完毕后容器被终止

其他常用的选项:

  • --name:指定容器名称,默认随机分配
  • -v, --volume:挂载volume
  • --ip :指定IP地址

具体参考 docker run --help

重启终止状态的容器

docker start [id|name] 或者 docker container start [id|name]

我们先停止刚刚创建的centos容器,再启动

[[email protected]_Machine_192.168.31.130 ~]# docker stop 354861680ae5
354861680ae5
[[email protected]_Machine_192.168.31.130 ~]# docker start 354861680ae5
354861680ae5
[[email protected]_Machine_192.168.31.130 ~]# docker ps -a             
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                    PORTS                      NAMES
354861680ae5        centos                     "/bin/bash"              8 minutes ago       Up 8 seconds                                         competent_jang

docker stop [id|name] 或者 docker container stop[id|name] 命令停止正在运行的容器,用docker start [id|name] 或者 docker container start [id|name]命令停止终止状态的容器

查看容器

docker container ls 或者docker ps

查看运行中的容器docker container ls 或者docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
354861680ae5        centos              "/bin/bash"              14 minutes ago      Up 6 minutes                                   competent_jang
034b2c372153        registry            "/entrypoint.sh /etc…"   3 weeks ago         Up About an hour    127.0.0.1:5000->5000/tcp   musing_shockley

查看所有的容器docker container ls -a 或者docker ps -a

CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                    PORTS                      NAMES
354861680ae5        centos                     "/bin/bash"              14 minutes ago      Up 6 minutes                                         competent_jang
58a473f60b3c        my_redis_server:v3.2.7     "/usr/local/redis/bi…"   6 days ago          Exited (255) 6 days ago   6001/tcp                   infallible_meitner
1c8a8bbf61e9        centos                     "/bin/bash"              7 days ago          Exited (255) 6 days ago                              zealous_bose
277daebf58a7        my_nginx_server:v1.13.11   "/usr/local/nginx/sb…"   12 days ago         Exited (255) 6 days ago   80/tcp                     inspiring_heisenberg
75d87a4c17a0        centos                     "/bin/bash"              13 days ago         Exited (255) 6 days ago                              wonderful_goodall
034b2c372153        registry                   "/entrypoint.sh /etc…"   3 weeks ago         Up About an hour          127.0.0.1:5000->5000/tcp   musing_shockley

终止容器

docker stop [id|name]docker container stop[id|name]

[[email protected]_Machine_192.168.31.130 ~]# docker container  stop 354861680ae5
354861680ae5

此外,当 Docker 容器中应用终结时,容器也自动终止。

进入容器

docker attachdocker exec

常用的方式:

docker exec -it <container> bash|sh

attach 与 exec 主要区别:

  1. attach 直接进入容器 启动命令 的终端,不会启动新的进程。
  2. exec 则是在容器中打开新的终端,并且可以启动新的进程。
  3. 如果想直接在终端中查看启动命令的输出,用 attach;其他情况使用 exec。

容器导出导入

导出

docker export

[[email protected]_Machine_192.168.31.130 ~]# docker ps 
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                      NAMES
58a473f60b3c        my_redis_server:v3.2.7   "/usr/local/redis/bi…"   6 days ago          Up About a minute   6001/tcp                   infallible_meitner
[[email protected]_Machine_192.168.31.130 ~]# docker export 58a473f60b3c > my_redis_server:v3.2.7.tar 
导入

docker importdocker load

[[email protected]_Machine_192.168.31.130 ~]# cat  my_redis_server:v3.2.7.tar  | docker import - me/my_redis_server:v3.2.7 
sha256:a2d3c452841fac44bd6bed3006f48dca2e5f5e68b76d207fd14619063fc251e6
[[email protected]_Machine_192.168.31.130 ~]# docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
me/my_redis_server   v3.2.7              a2d3c452841f        3 seconds ago       281MB

不用docker import my_redis_server:v3.2.7.tar 直接导入,是因为本地镜像库已经有了my_redis_server:v3.2.7 这个镜像了。

importload区别:

想要清楚的了解docker loaddocker import命令的区别,就必须了解镜像与容器的区别:

  • 镜像:用来启动容器的只读模板,是容器启动所需的rootfs,类似于虚拟机所使用的镜像。
  • 容器:Docker 容器是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。

镜像是容器的基础,可以简单的理解为镜像是我们启动虚拟机时需要的镜像,容器时虚拟机成功启动后,运行的服务。

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

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

以上是关于Docker容器的主要内容,如果未能解决你的问题,请参考以下文章

linux_docker入门

无法使用 Rider 调试使用 docker 容器和 docker-compose 构建的 .net 核心应用程序。容器退出代码 139

vscode 远程连接 docker 容器进行 C++ 代码调试实践

使用 Spring Boot 代码运行 docker 容器

Springboot 容器使用 docker-compose 连接到 mongo 容器的 503 错误代码

如何使用 VS Code 在 Docker 容器中远程调试 python 代码