虚拟化-Docker-安装docker-docker使用-docker原理

文章目录

  • 虚拟化-Docker-安装docker-docker使用-docker原理
  • @[toc]
  • 一、什么是虚拟化、容器?
  • 1.1 虚拟化(virtualization)
  • 二、安装docker
  • 2.1 卸载原来安装过的旧版docker,没安装过的忽略此步骤
  • 2.2 添加仓库文件(不适用docker官方源,使用阿里云镜像)
  • 2.3 安装docker-ce软件
  • **查看docker版本 -- docker --version命令**
  • 查看docker进程是否启动
  • 2.4 启动docker,并设置为开机自启
  • 2.5 测试
  • **查看有哪些docker容器在运行 -- docker ps命令**
  • **查看docker镜像** -- docker images命令
  • 2.6 ubuntu安装docker
  • 三、docker使用
  • 3.1 实例操作1:docker安装nginx
  • **创建并启动新的docker容器** -- docker run命令
  • 3.2 实例操作2:docker安装mysql
  • 运行容器
  • **模拟错误运行容器**
  • **查看容器日志 -- docker logs命令**
  • **删除容器 -- docker rm 命令**
  • **重新正确运行容器**
  • **容器内使用mysql -- docker exec命令**
  • 3.3 docker镜像导出、导入
  • 导出镜像 -- docker save
  • 导入镜像 -- docker load
  • 导出镜像 -- docker export
  • 导入镜像 -- docker import
  • 两组命令的区别
  • 3.4 压力测试
  • 3.5 总结
  • 三个概念
  • **基本命令**
  • 容器进程没启动怎么办?
  • 微服务
  • 科普概念、常识
  • 四、docker原理
  • 4.1 docker的基本框架
  • 4.2 比较容器和虚拟机
  • 4.3 docker底层隔离技术

一、什么是虚拟化、容器?

1.1 虚拟化(virtualization)

模拟出来的,不是物理的,算真的

虚拟化技术:

  • vmware:workstation 入门级的产品
  • docker:容器技术的经典代表
  • k8s(kubernetes)

1.2 容器(container)

容器技术

存放东西的地方 容纳别的东西的器皿 运行镜像的地方

容器:docker,containerd,k8s等

docker官网:https://www.docker.com/

CNCF 云原生基金会:google redhat ibm等

containerd(容器运行时软件)

docker是容器运行时软件 --》 容器软件

k8s是管理容器运行时的软件(docker、)

二、安装docker

官方文档:https://docs.docker.com/engine/install/

2.1 卸载原来安装过的旧版docker,没安装过的忽略此步骤

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

2.2 添加仓库文件(不适用docker官方源,使用阿里云镜像)

安装yum相关的工具,下载docker-ce.repo文件

yum install -y yum-utils
yum-config-manager \
>     --add-repo \
>     http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
已加载插件:fastestmirror
adding repo from: http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
grabbing file http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo

# 下载docker-ce.repo文件存放在/etc/yun.repos.d
[root@docker ~]# cd /etc/yum.repos.d
[root@docker yum.repos.d]# ls
CentOS-Base.repo  CentOS-Debuginfo.repo  CentOS-Media.repo    CentOS-Vault.repo          docker-ce.repo
CentOS-CR.repo    CentOS-fasttrack.repo  CentOS-Sources.repo  CentOS-x86_64-kernel.repo

2.3 安装docker-ce软件

yum install docker-ce docker-ce-cli containerd.io -y
  • container engine 容器引擎
  • docker是一个容器管理的软件
  • docker-ce 是服务器端软件 – server
  • docker-ce-cli 是客户端软件 – client
  • docker-compose-plugin 是compose插件,用来批量启动很多容器,在单台机器上
  • containerd.io 底层用来启动容器的
查看docker版本 – docker --version命令
[root@docker ~]# docker --version
Docker version 20.10.17, build 100c701
查看docker进程是否启动
[root@docker ~]# ps aux | grep docker	# 首先查看docker是否启动
root      11355  0.1  6.7 1095108 67488 ?       Ssl  11:38   0:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root      11528  0.0  0.0 112824   980 pts/0    S+   11:40   0:00 grep --color=auto docker

2.4 启动docker,并设置为开机自启

systemctl start docker
systemctl enable docker

2.5 测试

输入指令测试,显示如下说明docker安装成功

docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:f861ba8563637d693e3043069b0a4ebf3d92c2e865b541379f6a6b8164b7c8bb
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
The Docker client contacted the Docker daemon.
The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
查看有哪些docker容器在运行 – docker ps命令

docker启动的每一个容器背后就是一个linux进程

[root@docker ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
# 进程id

[root@docker yum.repos.d]# docker ps -a (查看启动和未启动的)
CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS                          PORTS                                                    NAMES
a3407b681a77   mysql:5.7.39   "docker-entrypoint.s…"   About a minute ago   Up About a minute               33060/tcp, 0.0.0.0:33060->3306/tcp, :::33060->3306/tcp   zkj-mysql-1
14574ea0d212   nginx          "/docker-entrypoint.…"   4 hours ago          Exited (0) About a minute ago
查看docker镜像 – docker images命令
docker images

[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
mysql        5.7.39    daff57b7d2d1   9 hours ago   430MB
nginx        latest    2b7d6430f78d   2 days ago    142MB

镜像里面包含了我们需要的软件的代码和基础环境,以及依赖软件

镜像:来源问题

默认从docker官方提供的网站去下载:https://hub.docker.com/

但是你想得到的一个软件,都有一个镜像,我们直接启动镜像就可以了,获得这个软件

docker:容器启动软件,颠覆了我们传统的软件安装方式

Dockerfile:是制作docker镜像的文件,理解成一个配方文件

2.6 ubuntu安装docker

1、卸载旧版本docker

sudo apt-get remove docker docker-engine docker.io containerd runc

2、更新系统所有能更新的软件

sudo apt-get update

3、添加仓库

sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release -y

4、添加官方GPG key

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

设置稳定仓库

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

5、安装docker

先更新软件再安装docker

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io -y
# ubuntu安装完docker会自动启动docker

6、验证

sudo docker run hello-world

三、docker使用

3.1 实例操作1:docker安装nginx

[root@docker ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
7a6db449b51b: Pull complete 
ca1981974b58: Pull complete 
d4019c921e20: Pull complete 
7cb804d746d4: Pull complete 
e7a561826262: Pull complete 
7247f6e5c182: Pull complete 
Digest: sha256:b95a99feebf7797479e0c5eb5ec0bdfa5d9f504bc94da550c2f58e839ea6914f
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
nginx        latest    2b7d6430f78d   2 days ago   142MB
创建并启动新的docker容器 – docker run命令

启动一个容器,可以理解为开启一台虚拟机

docker run是启动容器的命令

# 首先要确保8090端口没有被占用
[root@docker ~]# lsof -i:8090
# 启动容器
[root@docker ~]# docker run -d -p 8090:80 --name zkj-nginx nginx
14574ea0d2125e64a23a68264faf5d79353d9c5bea520684b05b982fe68ad451
# -d 在后台运行 daemon 守护进程
# -p 指定端口映射  DNAT 访问本机的8090端口,转发到docker容器的80端口
# --name  指定容器名字
# nginx 是镜像的名字

[root@docker ~]# docker ps	#查看启动的容器进程
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                   NAMES
14574ea0d212   nginx     "/docker-entrypoint.…"   6 minutes ago   Up 6 minutes   0.0.0.0:8090->80/tcp, :::8090->80/tcp   zkj-nginx

在客户机上测试能否访问宿主机的8090端口

http://192.168.40.136:8090/

如何在docker官网下载指定版本docker_docker

3.2 实例操作2:docker安装mysql

[root@docker yum.repos.d]# docker pull mysql:5.7.39
5.7.39: Pulling from library/mysql
9815334b7810: Pull complete 
f85cb6fccbfd: Pull complete 
b63612353671: Pull complete 
447901201612: Pull complete 
9b6bc806cc29: Pull complete 
24ec1f4b3b0d: Pull complete 
207ed1eb2fd4: Pull complete 
27cbde3edd97: Pull complete 
0a5aa35cc154: Pull complete 
e6c92bf6471b: Pull complete 
07b80de0d1af: Pull complete 
Digest: sha256:c1bda6ecdbc63d3b0d3a3a3ce195de3dd755c4a0658ed782a16a0682216b9a48
Status: Downloaded newer image for mysql:5.7.39
docker.io/library/mysql:5.7.39

# 再次查看容器镜像 --》新增mysql
[root@docker yum.repos.d]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
mysql        5.7.39    daff57b7d2d1   8 hours ago   430MB
nginx        latest    2b7d6430f78d   2 days ago    142MB
运行容器

下图为官方文档给的mysql运行命令格式

如何在docker官网下载指定版本docker_mysql_02

模拟错误运行容器

如何在docker官网下载指定版本docker_docker_03

查看容器日志 – docker logs命令

如何在docker官网下载指定版本docker_容器_04

删除容器 – docker rm 命令

如何在docker官网下载指定版本docker_运维_05

重新正确运行容器
[root@docker yum.repos.d]# docker run -d --name zkj-mysql-1 -p 33060:3306  -e MYSQL_ROOT_PASSWORD='zkj123456'  mysql:5.7.39
a3407b681a7771f37a8cb844b55c94f89181a9e1d114f5ac2be9cc06ccc7a3b8

[root@docker yum.repos.d]# docker ps -a	# 查看本地所有容器(包括启动和未启动的)
CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS                          PORTS                                                    NAMES
a3407b681a77   mysql:5.7.39   "docker-entrypoint.s…"   About a minute ago   Up About a minute               33060/tcp, 0.0.0.0:33060->3306/tcp, :::33060->3306/tcp   zkj-mysql-1
14574ea0d212   nginx          "/docker-entrypoint.…"   4 hours ago          Exited (0) About a minute ago                       
# 重启nginx
[root@docker yum.repos.d]# docker restart 14574ea0d212	# 容器ID号
14574ea0d212
[root@docker yum.repos.d]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
a3407b681a77   mysql:5.7.39   "docker-entrypoint.s…"   4 minutes ago   Up 4 minutes   33060/tcp, 0.0.0.0:33060->3306/tcp, :::33060->3306/tcp   zkj-mysql-1
14574ea0d212   nginx          "/docker-entrypoint.…"   4 hours ago     Up 3 seconds   0.0.0.0:8090->80/tcp, :::8090->80/tcp                    zkj-nginx

如何在docker官网下载指定版本docker_linux_06

容器内使用mysql – docker exec命令
[root@docker yum.repos.d]# docker exec -it zkj-mysql-1 bash
bash-4.2# mysql -uroot -p'zkj123456'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.39 MySQL Community Server (GPL)

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

3.3 docker镜像导出、导入

导出镜像 – docker save
docker save [OPTIONS] IMAGE [IMAGE...]

Save one or more images to a tar archive (streamed to STDOUT by default)

Options:
  -o, --output string   Write to a file, instead of STDOUT #输出为一个文件

如何在docker官网下载指定版本docker_linux_07

如何在docker官网下载指定版本docker_linux_08

如何在docker官网下载指定版本docker_容器_09

导入镜像 – docker load
docker load [OPTIONS]

Load an image from a tar archive or STDIN

Options:
  -i, --input string   Read from tar archive file, instead of STDIN #从一个rat文件中读入
  -q, --quiet          Suppress the load output

如何在docker官网下载指定版本docker_docker_10

导出镜像 – docker export
docker export [OPTIONS] CONTAINER

Export a container's filesystem as a tar archive

Options:
  -o, --output string   Write to a file, instead of STDOUT  #保存到文件

如何在docker官网下载指定版本docker_mysql_11

导入镜像 – docker import
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

Import the contents from a tarball to create a filesystem image

Options:
  -c, --change list       Apply Dockerfile instruction to the created image
  -m, --message string    Set commit message for imported image
      --platform string   Set platform if server is multi-platform capable

如何在docker官网下载指定版本docker_容器_12

两组命令的区别
  • save和load是从镜像(images)中导入导出.
  • export和import是从容器(container)中导入导出.
  • 注意:两组不能搭配使用!

3.4 压力测试

下载压力测试软件包

yum install http-tools -y

如何在docker官网下载指定版本docker_linux_13

使用参考:常用的HTTP服务压测工具介绍 - RandySun - 博客园 (cnblogs.com)

使用docker stats监控动态资源使用率

如何在docker官网下载指定版本docker_运维_14

3.5 总结

三个概念

镜像 image:镜像本质上就是打包好的文件 --》程序代码、基础操作系统、依赖关系的软件包、数据库、工具

容器 container:运行镜像的地方 --》原理是启动一个进程来运行这个镜像

仓库 repository:集中存放镜像的地方

基本命令
  • docker version – 查看版本
  • docker ps – 查看容器进程
  • docker images – 查看镜像
  • docker run – 创建并启动全新容器
  • docker start – 启动已存在的容器
  • docker pull – 下载镜像
  • docker search – 从docker hub 查找镜像
  • docker stop – 停止容器
  • docker top – 查看容器内的进程
  • docker stats – 查看容器的动态资源消耗
  • docker logs – 查看容器日志
  • docker exec – 进入容器内部
  • docker rm/rmi – 删除容器/镜像
  • docker inspect – 查看容器详细信息

如何在docker官网下载指定版本docker_容器_15

容器进程没启动怎么办?
[root@cali yum.repos.d]# service firewalld stop
Redirecting to /bin/systemctl stop firewalld.service
[root@cali yum.repos.d]# service docker restart
Redirecting to /bin/systemctl restart docker.service

# 重启docker服务之后 容器也会停止 需要重启
[root@cali yum.repos.d]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@cali yum.repos.d]# docker ps -a  查看所有的容器,包括停止的
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                      PORTS     NAMES
bda1e5c73838   nginx     "/docker-entrypoint.…"   14 minutes ago   Exited (0) 27 seconds ago             sc-nginx

[root@cali yum.repos.d]# docker start sc-nginx # 启动已经停止的容器
sc-nginx
[root@cali yum.repos.d]# docker ps 
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS         PORTS                                   NAMES
bda1e5c73838   nginx     "/docker-entrypoint.…"   14 minutes ago   Up 2 seconds   0.0.0.0:8090->80/tcp, :::8090->80/tcp   sc-nginx
微服务

微小的服务:尽量的将某个功能或者服务独立出来,跑在单独的容器里

如何在docker官网下载指定版本docker_运维_16

科普概念、常识

如何在docker官网下载指定版本docker_docker_17


如何在docker官网下载指定版本docker_linux_18

如何在docker官网下载指定版本docker_容器_19

四、docker原理

4.1 docker的基本框架

如何在docker官网下载指定版本docker_容器_20

容器是一个标准的软件单元,它打包了代码及其所有依赖项,因此应用程序可以从一个计算环境快速可靠地运行到另一个计算环境。Docker 容器映像是一个轻量级、独立、可执行的软件包,包括运行应用程序所需的一切:代码、运行时、系统工具、系统库和设置。

容器映像在运行时成为容器,对于 Docker 容器,当映像在 Docker 引擎上运行时,它们将成为容器。容器化软件可用于基于 Linux 和 Windows 的应用程序,无论基础结构如何,容器化软件都将始终以相同的方式运行。容器将软件与其环境隔离开来,并确保它能够统一工作,尽管开发和暂存之间存在差异。

在 Docker 引擎上运行的 Docker 容器:

  • **标准:**Docker 为容器创建了行业标准,因此它们可以移植到任何地方
  • **轻:**容器共享计算机的操作系统系统内核,因此不需要每个应用程序使用操作系统,从而提高服务器效率并降低服务器和许可成本
  • **安全:**容器中的应用程序更安全,Docker 提供了业界最强大的默认隔离功能

4.2 比较容器和虚拟机

容器和虚拟机具有类似的资源隔离和分配优势,但功能不同,因为容器虚拟化的是操作系统而不是硬件。容器更便携、更高效。

如何在docker官网下载指定版本docker_容器_21

容器

容器是应用层的抽象,它将代码和依赖项打包在一起。多个容器可以在同一台计算机上运行,并与其他容器共享操作系统内核,每个容器在用户空间中作为隔离的进程运行。容器占用的空间比 VM 少(容器映像的大小通常为数十 MB),可以处理更多的应用程序,并且需要更少的 VM 和操作系统。

虚拟机

虚拟机 (VM) 是将一台服务器转换为多台服务器的物理硬件的抽象。虚拟机管理程序允许在一台计算机上运行多个 VM。每个 VM 都包含操作系统、应用程序、必要二进制文件和库的完整副本, 占用数十 GB。VM 的启动速度也可能很慢。

4.3 docker底层隔离技术

底层隔离机制

  • 在Linux内核空间里通过lxc(linux container)这个软件,划分出不同的命名空间 (name space) 不同的容器都有自己独立的命名的空间来存放自己的数据,互相之间不能随意的访问。
  • 为了实现对容器使用资源的限制(cpu 内存 网络带宽 等),还会使用cgroup来实现该功能。

namespace的六项隔离

如何在docker官网下载指定版本docker_linux_22

namespace API操作四种方式

如何在docker官网下载指定版本docker_运维_23