虚拟化-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端口
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 logs命令
删除容器 – docker rm 命令
重新正确运行容器
[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
容器内使用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 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 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 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
两组命令的区别
- save和load是从镜像(images)中导入导出.
- export和import是从容器(container)中导入导出.
- 注意:两组不能搭配使用!
3.4 压力测试
下载压力测试软件包
yum install http-tools -y
使用参考:常用的HTTP服务压测工具介绍 - RandySun - 博客园 (cnblogs.com)
使用docker stats监控动态资源使用率
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 – 查看容器详细信息
容器进程没启动怎么办?
[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原理
4.1 docker的基本框架
容器是一个标准的软件单元,它打包了代码及其所有依赖项,因此应用程序可以从一个计算环境快速可靠地运行到另一个计算环境。Docker 容器映像是一个轻量级、独立、可执行的软件包,包括运行应用程序所需的一切:代码、运行时、系统工具、系统库和设置。
容器映像在运行时成为容器,对于 Docker 容器,当映像在 Docker 引擎上运行时,它们将成为容器。容器化软件可用于基于 Linux 和 Windows 的应用程序,无论基础结构如何,容器化软件都将始终以相同的方式运行。容器将软件与其环境隔离开来,并确保它能够统一工作,尽管开发和暂存之间存在差异。
在 Docker 引擎上运行的 Docker 容器:
- **标准:**Docker 为容器创建了行业标准,因此它们可以移植到任何地方
- **轻:**容器共享计算机的操作系统系统内核,因此不需要每个应用程序使用操作系统,从而提高服务器效率并降低服务器和许可成本
- **安全:**容器中的应用程序更安全,Docker 提供了业界最强大的默认隔离功能
4.2 比较容器和虚拟机
容器和虚拟机具有类似的资源隔离和分配优势,但功能不同,因为容器虚拟化的是操作系统而不是硬件。容器更便携、更高效。
容器
容器是应用层的抽象,它将代码和依赖项打包在一起。多个容器可以在同一台计算机上运行,并与其他容器共享操作系统内核,每个容器在用户空间中作为隔离的进程运行。容器占用的空间比 VM 少(容器映像的大小通常为数十 MB),可以处理更多的应用程序,并且需要更少的 VM 和操作系统。
虚拟机
虚拟机 (VM) 是将一台服务器转换为多台服务器的物理硬件的抽象。虚拟机管理程序允许在一台计算机上运行多个 VM。每个 VM 都包含操作系统、应用程序、必要二进制文件和库的完整副本, 占用数十 GB。VM 的启动速度也可能很慢。
4.3 docker底层隔离技术
底层隔离机制:
- 在Linux内核空间里通过lxc(linux container)这个软件,划分出不同的命名空间 (name space) 不同的容器都有自己独立的命名的空间来存放自己的数据,互相之间不能随意的访问。
- 为了实现对容器使用资源的限制(cpu 内存 网络带宽 等),还会使用cgroup来实现该功能。
namespace的六项隔离
namespace API操作四种方式