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个步骤:
- 如果本地没有 ubuntu 镜像,那么首先执行 docker pull ubuntu镜像文件到本地;
- 自动创建一个容器,相当于命令 dock container create;
- Docker分配一块文件系统给容器;
- Docker创建网络接口、分配网络地址;
- 启动容器,并且执行/bin/bash命令;
- 我们可以在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