【Docker学习笔记】

一、概述

Docker 是一个应用程序开发、部署、运行的平台,使用 go 语言开发。相较于传统的主机虚拟化,Docker 提供了轻量级的应用隔离方案,并且为我们提供了应用程序快速扩容、缩容的能力。
重要镜像网站:https://mirrors.aliyun.com/centos/
docker文档:https://docs.docker.com/
docker仓库:https://hub.docker.com/

1、Docker Engine

先来看一下 Docker Engine 的结构,它是一个Client-Server应用程序,包含了三个主要部分:dockerd守护进程、REST API接口层、cli接口层(管理容器、镜像、网络、存储等等)。

在这里插入图片描述

2、Docker 架构

Docker采用的是CS架构,docker client 通过Unix套接字或者网络接口访问 docker daemon,从而完成容器、镜像等内容的管理。在这里插入图片描述

2.1 Docker Daemon

Docker的守护进程监听对于API的请求,并且管理Docker对象,包括容器、镜像、网络、存储等。不同守护进程之间可以互相通信,从而构成集群服务。

2.2 Docker Client

Docker 客户端 docker 命令是与Docker交互的主要方式。

2.3 Docker 仓库

Docker仓库保存Docker镜像,可以通过docker pull以及docker push来下载、上传镜像文件。

3、Docker 对象

3.1 镜像

(1) 镜像是一个用来构建容器的只读模版,通常一个镜像会依赖其他的镜像。例如我们编写的一个Node程序需要依赖Node环境,那在构建这个应用镜像时就需要依赖基础的Node镜像。
(2) 我们可以创建自己的镜像,也可以使用仓库中已经创建好的镜像。创建镜像需要创建一个 Dockerfile 文件。每个Dockerfile定义镜像文件中的一层,当定义发生变化的时候,只需要更新着一层的文件即可。

3.2 容器

(1) 容器是一个运行时状态下的镜像,通过docker命令我们可以创建、启动、停止、删除容器。例如以下命令:

$ docker run -i -t ubuntu /bin/bash

(2) 实际上经过了6个步骤:

  1. 如果本地没有 ubuntu 镜像,那么首先执行 docker pull ubuntu镜像文件到本地;
  2. 自动创建一个容器,相当于命令 dock container create;
  3. Docker分配一块文件系统给容器;
  4. Docker创建网络接口、分配网络地址;
  5. 启动容器,并且执行/bin/bash命令;
  6. 我们可以在bash中执行命令,执行exit后,退出ubuntu的命令行,同时容器关闭。

3.3 网络

Docker的网络子系统是可插拔的,支持bridge、host、overlay、macvlan、none等网络模式。熟悉虚拟机的同学可能对这些有概念,想要了解更多参考这里。

3.4 存储

默认情况下,容器中的应用生成的所有文件都存放在一个可写的容器层,意味着这些数据的生命周期和容器保持一致,一旦容器重启数据就丢了。另外,这些文件与容器高度关联,想要将这些文件分享给其他的容器或者设备非常困难。
为此,Docker提供了两种方案解决数据问题:Volumes、bind mount。不管使用哪种方式,容器内看起来都是一样的,或者作为一个文件夹存在、或者作为一个文件存在。
Volumes 是存在本地文件系统中的一部分,其他应用程序不能对这个文件系统进行修改,Linux下在/var/lib/docker/volumes。这是数据持久化的最好方案。Bind Mount 允许将主机中任何位置的数据挂载,这些数据的读写没有收到保护。tmps是存储在主机内存中的数据。

二、配置环境 centos7_64

1、安装centos7后查看环境

1.1. uname -r

3.10.0-1160.el7.x86_64

1.2. cat /etc/os-release

NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

2、 安装docker

2.1、使用 root 权限登录 Centos。确保 yum 包更新到最新。

$ sudo yum update

2.2、卸载旧版本(如果安装过旧版本的话)

$ sudo yum remove docker  docker-common docker-selinux docker-engine

2.3、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的

$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2

2.4、设置yum源

$ sudo yum-config-manager --add-repo 

2.5、可以查看所有仓库中所有docker版本,并选择特定版本安装

$ yum list docker-ce --showduplicates | sort -r

2.6、安装docker

$ sudo yum install docker-ce  #由于repo中默认只开启stable仓库,故这里安装的是最新稳定版20.10.11
$ sudo yum install <FQPN>  # 例如:sudo yum install docker-ce-20.10.11.ce

2.7、启动并加入开机启动

$ sudo systemctl start docker
$ sudo systemctl enable docker

2.8、验证安装是否成功(有client和service两部分表示docker安装启动都成功了)

$ docker version

3、docker 权限问题

3.1、docker 权限问题 Got permission denied while trying to connect to the Docker daemon socket at
3.2、在用户权限下docker 命令需要 sudo,否则会出现3.1权限问题
3.3、解决办法:通过将用户添加到docker用户组可以将sudo去掉

sudo groupadd docker #添加docker用户组
sudo gpasswd -a $USER docker #将登陆用户加入到docker用户组中
newgrp docker #更新用户组

4、删除docker

4.1、卸载依赖

yum remove docker-ce docker-ce-cli containerd.io

4.2、删除资源

rm -rf /var/lib/docker

5、配置阿里云

sudo mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirror":["https://qiyb9988.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker

6、RUN的运行流程图

在这里插入图片描述

7、docker底层原理

7.1 docker工作原理:C/S结构,Docker的守护进程运行在主机上,通过Socket从客户端访问,Docker-Server接收到Docker-Client的命令,就会执行该命令。
在这里插入图片描述
7.2 Docker为什么比VM快:Docker有着比虚拟机更少的抽象层;Docker利用宿主机的内核,而VM需要Guest OS。
在这里插入图片描述
故创建一个新的Docker时不需要想vm一样加载一个新的操作系统内核,避免引导;vm加载时分钟级,而Docker是秒级。

三、Docker的常用命令

1、帮助命令

docker info 			#显示Docker系统信息
docker version		 	#显示Docker版本信息
cosker 命令 --help      #帮助命令

帮助文档地址:https://docs.docker.com/reference/,https://docs.docker.com/engine/reference/commandline/dockerd/

2、镜像命令

2.1 docker image

docker images -a   #显示所有的镜像
docker images -q   #只显示镜像的id

2.2 docker search

docker search mysql --filter=stars=3000  #搜索stars>=3000

2.3 docker pull 镜像名[:tag]

docker pull  mysql     #如果不指定tag,则下载最新的,分层级下载
ffbb094f4f9e: Downloading [=====================================>             ]  20.61MB/27.15MB
ffbb094f4f9e: Downloading [=================================================> ]  27.02MB/27.15MB
fa362a6aa7bd: Download complete 
5af7cb1a200e: Download complete 
949da226cc6d: Download complete 
bce007079ee9: Download complete 
eab9f076e5a3: Download complete 
8a57a7529e8d: Download complete 
b1ccc6ed6fc7: Downloading [=============>                                     ]  28.09MB/105.2MB
b1ccc6ed6fc7: Downloading [==============>                                    ]  30.25MB/105.2MB
3aed6a9cd681: Download complete 
23390142f76f: Download complete

在这里插入图片描述

2.4 docker rmi 镜像名或镜像ID

docker rmi  -f   镜像ID   #删除单个镜像
docker rmi  -f   镜像ID  镜像ID 镜像ID  #删除多个镜像
docker rmi  -f  $(docker images  -aq) #删除所有镜像

3、容器命令

有了镜像才能创建容器
3.1 新建容器并使用

docker run [可选参数] image
--name ="name"   #容器名称,如tomcat1、tomca2用来区分容器
-d   #后台方式运行
-it  #使用交互方式运行,进入容器查看内容
-P  #指定容器的端口  -P 8080:8080
     -P 主机端口:容器端口 (常用)
     -P 容器端口
     容器端口     
-p  #随机指定窗口

3.2 进入容器

 docker run -it centos /bin/bash

在这里插入图片描述
3.3 退出容器

exit  退出并终止容器
ctrl+P+Q 退出不终止空气

3.4 列出所有运行的容器

docker ps
docker ps -n=1
docker ps -a
docker ps -q

3.5 删除容器

docker rm -f 容器id                  #删除指定容器
docker rm -f $(docker ps -aq)  #删除所有容器
docker  ps -a -q |xargs docker rm  #删除所有容器

3.6 启动或停止容器

docker start 容器id 
docker restart 容器id 
docker stop 容器id 
docker kill 容器id 

4、其他常用命令

4.1 后台启动容器

docker run -d 容器名
docker run -d centos
docker ps
#发现centos已经停止,这是一个坑,docker后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止。
#Nginx ,容器启动后,发现自己没有提供服务,就会立刻执行。

在这里插入图片描述
4.2 查看日志命令

docker run -d centos /bin/sh -c "while true;do echo lwp;sleep 1;done"
docker logs -tf --tail 10 7a398afa3a8b 

4.3 查看容器中的进程信息

docker top 容器ID

4.4 查看镜像的元数据

docker inspect a5126cd82361 

在这里插入图片描述
4.5 进入当前正在运行的容器

容器通常都是以后台方式运行,我们往往需要进入容器,修改配置。

docker exec -it 容器ID /bin/bash
 docker exec -it 7a398afa3a8b /bin/bash #打开一个新的命令行
docker attach  容器id
docker attach 7a398afa3a8b  #显示正在执行代码的命令行

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

docker cp 容器id:容器内文件  目的主机路径
docker cp 0b3a46600a3d:/home/text.java  /home

5、命令图解

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值