容器说明 — 容器的启动和运行

[toc]

前言

有镜像才能创建容器,这是根本前提(下载一个Ubuntu或者centos镜像演示)

docker并非是一个通用的容器,它依赖已存在并运行的Linux内核环境

docker实质是在运行的Linux下制造了一个隔离的文件环境,必须要部署在Linux内核上

我们使用笔记本,搭建win11系统,系统上用VMware软件搭建Ubuntu环境,Ubuntu上下载docker,在docker上面再模拟一个Ubuntu

启动交互式容器(前台命令行)

  • --name:为容器指定一个新的name

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

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

    也即启动交互式容器(前端有伪终端,等待交互)

  • -P:随机端口映射,大写

  • -p:指定端口映射,小写

我们普通启动

root@ubuntu:/hyerledgerFabric# docker run ubuntu 
root@ubuntu:/hyerledgerFabric# 

没效果。此时需要用到交互式容器

启动、重启和删除容器

  1. 新建+启动容器,ubuntu要有bash/shell作为交互式接口。
docker run -it ubuntu /bin/bash

如果要退出终端,直接输入exit,此时容器停止

可以run进去容器,ctrl+p+q退出,容器不停止,此时可以启动已经停止的容器

docker start 容器ID或者容器名

重启容器

docker restart ID或者name

停止容器

docker stop ID或者name

强行停止容器

docker kill 容器ID或者容器名

删除已经停止的容器

docker rm ID或者name

后台交互式运行

1. 有镜像才能创建容器,这是根本前提(下载一个redis6.0.8镜像演示)

2. 启动守护式容器(后台服务器)

  • 在大部分场景下,我们希望docker的服务是在后台运行的,我们可以通过-d指定容器的后台运行模式

    docker run -d docker_name
    
  • redis前后台启动演示case

很重要一点:docker容器后台运行,==必须有一个前台进程==,否则会立即是自杀,所以对于ubuntu来说必须要用-it

容器的命令如果不是那种一直挂起的命令(top.tail),就是会自动退出,这个是docker的机制问题

image-20220509205710035

一般对于数据库都是使用-d后台默默启动

  • 前台交互式-it
  • 后台守护式-d

想起我们以前学redis的时候,到处都是坑,安装环境啥的配置config啥的,麻烦死了。现在有了docker一条命令解决问题

查看容器日志

docker logs 容器ID

当redis出错

root@ubuntu:/home/smile# docker logs a22dd4f7caf4 
1:C 09 May 2022 12:56:24.442 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 09 May 2022 12:56:24.442 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 09 May 2022 12:56:24.442 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
1:M 09 May 2022 12:56:24.443 * monotonic clock: POSIX clock_gettime
1:M 09 May 2022 12:56:24.445 * Running mode=standalone, port=6379.
1:M 09 May 2022 12:56:24.446 # Server initialized
1:M 09 May 2022 12:56:24.446 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
1:M 09 May 2022 12:56:24.447 * Ready to accept connections

后面还有图形化监控哈哈哈哈

一般有些情况下,用到logs很有必要,比如说我之前做一个云盘cloud,由于云盘用docker后台启动,所以出现的问题是初始化init时候的信息都没有显示出来,这个时候我们用docker logs …很有必要了

查看容器内运行的进程

docker top 容器ID

image-20220509210625854

查看容器内部细节

可以把容器看作一个简易版的Linux环境和运行在其中的应用程序

以json形式保存

docker inspect 容器ID

image-20220509210901032

进入正在运行的容器并且以命令行交互

docker exec -it 容器ID bashShell
#或者
docker attach 容器ID

root@ubuntu:/home/smile# docker exec -it 7672921e03e4 /bin/bash
root@7672921e03e4:/# uname 
Linux
root@ubuntu:/home/smile# docker attach 7672921e03e4
root@7672921e03e4:/# 

注意区别:

  • attach直接进入容器启动命令的终端,用exit退出不会产生新的进程
  • exec是在容器中打开新的终端,并且可以启动新的进程,用exit退出不会导致容器的停止

提示

推荐使用exec,保证容器不会退出

用redis案例实操

root@ubuntu:/home/smile# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS      NAMES
a22dd4f7caf4   redis     "docker-entrypoint.s…"   25 minutes ago   Up 25 minutes   6379/tcp   strange_elgamal
root@ubuntu:/home/smile# docker exec -it a22dd4f7caf4 /bin/bash    
root@a22dd4f7caf4:/data# redis-cli -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> get k1
"v1"

从容器中拷贝文件到主机上

如果我们在一家公司,我们在容器中的Ubuntu中新创建了一个文件,怎么把容器中的内容文件拷贝到主机上,用来备份下面是备份halo博客到本地

image-20220912191258516

docker cp 容器ID:容器内路径 目的主机路径

image-20220509213628075

导入和导出容器

上一个只能把容器中的资料拷贝出来,这个可以把整个镜像或者容器进行备份,默认导出到当前路径下面

导出

docker export 容器ID > abcd.tar

导入

cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号

image-20220509214436456

导出和拷贝

我们根据上面的命令看出导出可以选择文件夹的压缩方式,类似于数据库的导出,可以指定容器的版本号,但是拷贝就是Ctrl + v了,可以指定路径,毕竟docker机制很顽强。个人比较喜欢拷贝。

导出我一般喜欢提交到远程仓库~