Docker 常用命令使用
目录
一、Docker简介
1.1Docker 是什么
- 使用广泛的开源容器引擎
- 一种进程级的虚拟化技术
- 依赖于Linux内核技术:Namespace(资源隔离)和cgroups(资源限制)
- 简单的应用程序打包工具
1.2Docker应用场景
- 应用程序的打包和发布
- 应用程序隔离
- 持续集成
- 部署微服务
- 快速搭建测试环境
- 提供PaaS产品(平台即服务)
1.3Docker基本组成
![](https://img-blog.csdnimg.cn/img_convert/f7a9f7559340dc0a3d5875bab0ceeef1.png)
1.4容器VS虚拟机
1.5 Docker 安装
官方地址:Docker Documentation | Docker Documentation
CentOS安装地址:Install Docker Engine on CentOS | Docker Documentation
yum install -y yum-utils
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io -y
vi /etc/docker.daemon.json
{
"registry-mirrors": ["https://tpqjuvmc.mirror.aliyuncs.com"]
}
#
systemctl enable docker
systemctl start docker
systemctl status docker
docker info
1.6镜像获取
Docker Hub 是由Docker公司负责维护的公共注册中心,包含大量的容器镜像,Docker工具默认公共镜像下载镜像地址 https://hub.docker.com
配置镜像加速器和harbor 仓库地址
[root@offline-client ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
"insecure-registries": ["winner-test.harbor.com"]
}
二、Docker镜像管理
Docker 把应用程序及其依赖,打包在 image 文件里面。只有通过这个文件,才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
image 是二进制文件。实际开发中,一个image 文件往往通过继承另一个image文件(镜像层共享),加上一些个性化设置而生成。举例来说,你可以在 Ubuntu 的 image 基础上,往里面加入Apache服务器,形成你的 image。
2.1 镜像和容器的关系
# 拉取nginx镜像
docker pull nginx
# 对nigix镜像,创建web1容器
docker run -d --name web1 nginx
镜像拉取、启动、查看容器
容器导出 、文件复制到容器内部
## 容器导出
[root@localhost ~]# docker export fd2f66e335c2 > nginx.tar
[root@localhost ~]# ll
total 132440
-rw-------. 1 root root 1479 May 17 17:48 anaconda-ks.cfg
-rw-r--r-- 1 root root 135611392 May 24 03:25 nginx.tar
[root@localhost ~]#
[root@localhost ~]#
## 文件复制到 容器的 /opt 目录下
[root@localhost ~]# docker cp nginx.tar web:/opt
[root@localhost ~]#
## 进入容器
[root@localhost ~]# docker exec -it web bash
root@fd2f66e335c2:/# ls /opt/
nginx.tar
root@fd2f66e335c2:/#
2.2 镜像存储位置
默认情况系统会将 Docker 容器存放在 /var/lib/docker 目录下,默认系统盘符需修改
-
迁移
docker
的存储目录,或者对/var
设备进行扩容来达到相同的目的。更多关于dockerd
的详细参数,请点击查看 官方文档 地址。 -
但是需要注意的一点就是,尽量不要用软链, 因为一些
docker
容器编排系统不支持这样做,比如我们所熟知的k8s
就在内
改动 docker 配置文件
# [方式一] 改动docker启动配置文件
$ sudo vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --graph=/data/docker/
# [方式二] 改动docker启动配置文件
$ sudo vim /etc/docker/daemon.json
{
"live-restore": true,
"graph": [ "/data/docker/" ]
}
修改 service 启动的配置文件, 重新使用 docker info 检查 是否修改成功。
2.3 镜像是什么
- 一个分层存储的文件,不是一个单一的文件
- 一个软件的环境
- 一个镜像可以创建多个容器
- 一种标准化的交付
- 一个不包含Linux内核而又精简的Linux 操作系统
2.4 管理镜像常用的命令
2.4.1查看镜像管理命令
使用 help 查看命令的使用
2.4.2history镜像历史
2.4.3inspect镜像的详细信息
### 镜像的详细信息 打印一堆
[root@localhost ~]# docker inspect nginx
2.4.4拉取Nginx镜像并删除
1. 删除所有镜像
docker rmi $(docker images -q)
2. 删除所有容器
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
2.4.5镜像save 导出 和load上载
[root@offline-client docker]# docker save -o mysql:5.7.19.tar mysql:5.7.19
[root@offline-client docker]# ll
total 409904
-rw------- 1 root root 419739136 May 14 18:54 mysql:5.7.19.tar
[root@offline-client docker]# docker rmi mysql:5.7.19
[root@offline-client docker]# docker load -i mysql:5.7.19.tar
2.5 联合文件系统(UnionFS)
镜像怎么高效存储?
难道像虚拟机一样一个容器对应一个独立的镜像文件,这样对于密集型容器,磁盘占用率太大,所以docker引入了联合文件系统,将镜像多层文件联合挂载到容器文件系统。
类似于创建软连接
容器层提供一个独立的运行环境。
2.6 写时复制(cow)
镜像是只读的,类似共享形式让多个容器使用,如果要在容器里修改文件,即镜像里的文件,那该怎么办?
为此,引入写时复制(copy-on-write),需要修改文件操作时,会先从镜像里把要写得文件复制到自己的文件系统中进行修改,基于容器修改不会影响基础镜像。
三、Docker容器管理
3.1 创建一个容器常用命令
[root@offline-client mysql]# docker run -itd -p 13306:3306 -m="1024M" --privileged=true \
> -v /opt/mysql/conf/my.cnf:/etc/my.cnf \
> -v /opt/mysql/data:/var/lib/mysql \
> -v /opt/mysql/log:/var/log \
> -v /opt/mysql/mysql-files:/var/lib/mysql-files \
> -e MYSQL_ROOT_PASSWORD=123456 --name=mysql_hue mysql:5.7.19
8a860ca596c82c3836f72f8b4758967f16345e30c329a2570eacb89d17bb517f
[root@offline-client mysql]#
[root@offline-client mysql]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8a860ca596c8 mysql:5.7.19 "docker-entrypoint.s…" 17 seconds ago Up 17 seconds 0.0.0.0:13306->3306/tcp, :::13306->3306/tcp mysql_hue
9fc0e2cfe1bd gethue/hue "./startup.sh" 23 hours ago Up 23 hours 0.0.0.0:8888->8888/tcp, :::8888->8888/tcp hue01
[root@offline-client mysql]# ls
-i : interface 交互
-t : terminal 终端
-d : detach 后台运行
-p : publis 宿主机端口映射,如上执行MySQL的端口为 13306
-m : memory容器运行内存
-v : volume 挂载一个路径,相当于软连接
-e : env指定容器内的环境变量
--name 容器命名
3.2 容器资源限制
默认创建的容器使用宿主机所有的资源
创建一个web容器 ,memory 限制最大100M
[root@offline-client docker]# docker run -itd -m="100M" --name=web nginx:1.17
ecfd8658c9c2c03d6c8f16870abb00f6e461160d825d9934c42dde371218634c
[root@offline-client docker]#
[root@offline-client docker]# docker stats web
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
ecfd8658c9c2 web 0.00% 1.379MiB / 100MiB 1.38% 656B / 0B 0B / 0B 2
[root@offline-client docker]# docker run -itd --name=web nginx:1.17
1be2ee3f97782d78c0959d99b0a34ea9d0687cfe976c11a92b40ff8a6aa1fe7c
[root@offline-client docker]#
[root@offline-client docker]#
### 没有做任何的限制,可以使用宿主机上的所有资源
[root@offline-client docker]# docker stats web
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
1be2ee3f9778 web 0.00% 1.379MiB / 10.59GiB 0.01% 656B / 0B 0B / 0B 2
3.3 容器配置扩容
容器配置更新,从下面的命令可以看出容器的cpu 和内存是可以动态更新的。
资源分配测试, 不错内存限制 ,使用 宿主机的全部内存
[root@offline-client docker]# docker run -itd --name=web nginx:1.17
1be2ee3f97782d78c0959d99b0a34ea9d0687cfe976c11a92b40ff8a6aa1fe7c
[root@offline-client docker]#
[root@offline-client docker]# docker stats web
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
1be2ee3f9778 web 0.00% 1.379MiB / 10.59GiB 0.01% 656B / 0B 0B / 0B 2
内存改小 好像不行
分配实践后得出:大改小不行,小改大可以内存分配实践后得出:大改小不行,小改大可以
3.4管理容器常用的命令
3.5 容器核心实现技术简介
3.5.1 容器实现核心技术:Namespace
在容器化中,一台物理计算机可以运行多个不同操作系统,那就需要解决“隔离性”,彼此感知不到对方存在,互不影响。
Linux内核从2.4.19版本引入了namespace概念,其目的是将特定的全局系统资源通过抽象的方法使得namespace中的进程看起来拥有自己隔离的资源。Docker就是借助这个机制实现容器资源隔离。
- IPC:隔离进程间通信
- MOUNT:隔离文件系统挂载点
- NET:隔离网络协议栈
- PID:隔离进程号,进程命名空间是一个父子结构,子空间对父空间可见
- USER:隔离用户
3.5.2容器实现核心技术:CGroups
Docker利用 namespace 实现容器之间资源隔离,但是namespace 不能实现对容器资源限制,比如CPU、内存。如果某一个容器属于CPU密集型任务,那么会影响其他容器使用CPU,导致多个容器相互影响并且抢占资源。
如何对多个容器的资源使用进行限制就成了容器化的主要问题。
解决:引入 Control Groups(简称CGroups),限制容器资源
CGroups: 所有的任务就是运行在系统中的一个进程,而 CGroups 以某种标准将一组进程为目标进行资源分配和控制。
例如:CPU、内存、带宽等,并且可以动态设置。
CGroups 主要功能:
- 限制进程组使用的资源数量(Resource limitation): 可以为进程组设定资源使用上限,例如内存
- 进程组优先级控制(Prioritization): 可以为进程组分配特定CPU、磁盘IO吞吐量
- 记录进程组使用的资源数量(Accounting): 例如使用记录某个进程组使用的CPU时间
- 进程组控制(Control): 可以将进程组挂起和恢复
3.5.3Docker 核心组件的关系
- Docker Daemo: Dokcer 守护进程,负责与Docker Client交互,并管理镜像、容器。
- Containerd: 是一个守护进程,向上给Docker Daemon提供接口,向下通过containerd-shim结合runC管理容器。
- runC: 一个命令行工具,它根据OCI标准来创建和运行容器。
--------------------------- 感谢点赞!------------------------------------
相关文章
- centos ERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running?
- Docker - 常用命令
- Docker - docker in docker(dind)
- Docker - 构建镜像:使用docker build命令和Dockerfile文件
- Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
- Docker-Compose简介及常用命令
- Docker Compose 常用命令
- 【Docker】在本地打包maven程序为docker镜像报错: Connect to localhost:2375 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1]
- y23.第二章 Docker从入门到精通 -- docker 的资源限制(五)
- 【云原生之Docker实战】使用docker部署Homebox内网测速工具
- 【云原生之Docker实战】使用docker部署Ghost个人博客系统
- 【云原生之Docker实战】使用docker部署短链接服务YOURLS
- 【云原生之Docker实战】使用docker部署webterminal堡垒机
- 【云原生之Docker实战】使用docker部署webssh工具
- 【云原生之Docker实战】使用docker部署nginx服务
- 【云原生之Docker实战】使用docker部署Wiznote私人笔记系统
- Docker----Docker镜像操作常用命令
- Docker学习笔记09:docker使用之容器连接
- Docker学习笔记08:docker使用之镜像使用
- 【Docker系列】1.docker-compose部署zk集群+kafka集群
- 云原生之使用Docker部署docker-compose-ui工具