什么是容器?
容器是一种快速打包的技术。
容器的特点:
- 标准化(集装箱)
- 轻量级(与虚拟机相比)
- 易移植
Linux Container是一种内核轻量级的操作系统层面的虚拟化技术。它主要由namespace和cgroup两大机制包保证。
- namespace:用于资源的隔离
- cgroup:负责资源的管理和控制。
docker快速上手
Linux下安装docker
curl -fsSL get.docker.com -o get-docker.sh # 下载自动安装docker脚本,下载之前要保证自己的Linux上没有docker
sh get-docker.sh # 启动脚本
sudo systemctl start docker # 开启docker server进程
sudo docker version # 查看docker版本
sudo usermod -aG docker $你的用户名 # 将你的用户加入docker用户组中,这样就不用每次都是用sudo执行docker了
基础命令
docker version # docker的版本信息
docker info # docker相关信息
docker --help # docker帮助手册
image和container简介
image镜像
docker image是一个只读的文件,但是这个文件比较特殊且强大,它包含了文件系统,库文件,工具等一些应用运行时需要的文件。
image可以自己创建,也可以直接从一个仓库(如:docker hub)中直接获得别人已经写好的image。
container容器
一个image运行起来之后就是一个容器,但是container在image的基础上加了一层容器层,使得我们可以修改这个容器中数据。并且基于容一个image可以创建多个container。
常用命令
基础命令(创建,删除,查看,运行,停止)
# 创建并运行一个容器
docker [container] run $image_name
# 查看所有容器
docker container ls
docker [container] ps
# 查看所有的容器同时查看容器状态
docker [container] ps -a
docker container ls -a
# 停止运行一个容器
docker [container] stop $container_id
docker [container] stop $container_name
# 删除一个容器
docker [container] rm $container_id
docker [container] rm $container_name
- 案例:
docker container run -d -p 80:80 --name my_nginx nginx
发生了什么
- 在本地中查看是否存在nginx的镜像
- 去远程的镜像仓库找nginx镜像(默认去Docker Hub中找)
- 下载最新版本的nginx镜像
- 基于nginx镜像运行一个容器,名字为my_nginx
- 将宿主机上的80端口和容器中的80端口做一个映射
- 启动容器,并执行默认的命令
技巧命令
# 删除一个运行的容器(注意:运行中的容器不能被删除)
docker container stop $container_id && docker container rm $container_id # 先停止容器,再删除容器
docker container rm -f $container_id # 直接强制删除运行的容器
# 删除/停止所有的容器
# docker ps -aq可以列出所有容器的id,将这些id当做参数传递给stop、rm等命令即可
docker container stop $(docker container ps -aq)
docker container rm $(docker container ps -aq)
attach模式和detach模式
attach模式是容器启动的默认模式,容器在终端的前台运行,会将日志等信息输出到前台
detach模式是将容器放在后台运行的模式
# 启动attach模式(默认启动模式)
docker container run $image_name
# 启动detach模式
docker container run -d $image_name
# 在detach模式下查看容器中的日志
docker container logs $container_id
docker container logs -f $container_id # 动态追踪容器中的日志
# 从detach模式转换成attach模式
docker [container] attach $container_id
注意:使用detach模式启动容器比较安全。因为如果容器在前台运行的话,一旦使用ctrl+c,那么容器就会停止运行,那么容器中的服务也就停止了。而detach模式会将容器放在后台运行就可以避免这个问题。
交互模式
# 以交互模式启动一个容器
docker container run -it $image_name $command # 在运行的容器中使用command命令
# 以交互模式运行处于detach模式的容器
docker exec -it $container_id $command
- 案例:使用交互模式去连接容器的shell
# 第一种方式
docker container run -it busybox sh # 进入busybox容器的shell
# 第二种方式
docker container run -d busybox
docker exec -it $busybox__container_id sh
容器本质是什么?
容器其实就是进程,只是容器本身和容器中的子进程在访问系统资源的时候被限制了。当容器退出了,那么容器中的进程也就都退出了。
# 查看容器中的进程
docker container top $container_id
# 在Linux的shell中查看进程
ps aux | grep $image_name
# shell中查看的进程和容器中运行的进程是一样的
# 所以容器和容器中的进程都是当前系统中的进程
- 案例
注意:系统查看的容器及其子进程的进程号和容器内部查看的进程号是不一样的,容器在内部做过一定的处理。但是本质上容器还是系统的进程。