容器说明 — 容器的启动和运行
[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#
没效果。此时需要用到交互式容器
启动、重启和删除容器
- 新建+启动容器,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的机制问题
一般对于数据库都是使用-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
查看容器内部细节
可以把容器看作一个简易版的Linux环境和运行在其中的应用程序
以json形式保存
docker inspect 容器ID
进入正在运行的容器并且以命令行交互
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博客到本地
docker cp 容器ID:容器内路径 目的主机路径
导入和导出容器
上一个只能把容器中的资料拷贝出来,这个可以把整个镜像或者容器进行备份,默认导出到当前路径下面
导出
docker export 容器ID > abcd.tar
导入
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
导出和拷贝
我们根据上面的命令看出导出可以选择文件夹的压缩方式,类似于数据库的导出,可以指定容器的版本号,但是拷贝就是Ctrl + v
了,可以指定路径,毕竟docker机制很顽强。个人比较喜欢拷贝。
导出我一般喜欢提交到远程仓库~