Docker基础

Docker简介

1、Docker为什么会出现?

一款软件产品必须经过:开发 -> 上线

开发人员负责将应用程序开发制作出来。
运维人员负责上线,配置应用程序。

在这里存在一个问题:开发环境和上线环境不一致;可能会导致,开发人员在自己的电脑上可以正常运行代码,运维人员将服务程序上线到服务器后,由于环境不一致可能会导致运行失败,服务不可用。

如何解决上述问题?

  • 对上线的服务器系统进行环境配置,但环境配置十分麻烦特别是集群部署时,集群中的每一台机器都需要部署环境。
  • 将开发环境和程序代码一起打包到服务器中运行。

Docker就是将开发环境和程序代码一起打包到服务器中运行的技术。

java语言 --> apk程序 --> 发布到应用商店 --> 客户下载apk --> 安装使用(必须要有环境才能安装成功)

java语言 --> jar环境 --> 打包项目和环境(镜像) --> 上传到docker仓库(商店) --> 下载仓库中的镜像 --> 运行使用

2、Docker介绍

Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

docker_logo.jpg

Docker的核心思想就是来自集装箱;集装箱的概念是隔离货物,所以docker的核心就是隔离机制。同时docker使用可移植镜像所以部署以及运维极其方便快捷。

2.1 Docker发展史

2010年,几个热爱IT的年轻人,在美国成立了一家公司叫做dotCloud,主要做一些Paas的云计算服务和LXC有关的容器技术赚钱盈利,他们将自己的容器技术命名为Docker!

Docker刚刚诞生的时候,并没有引起行业的注意!这个时候 dotCloud公司难以在行业中存活,所以这几个年轻人选择开放Docker源代码来引起注意!

2013年,Docker开源!越来越多的人发现docker的优点,在这一段时间docker每个月都会更新一个版本。

2014年4月9日,Docker1.0发布!

2.2 容器和虚拟机的区别

虚拟机:通过虚拟化技术模拟真实的硬件从而创建出来的一台拥有完整功能的逻辑计算机。

Docker容器:docker容器也是一种虚拟化技术,和传统虚拟化不一样的是docker只模拟一个程序最核心的运行环境,所以十分小巧,启动更快。

Docker虚拟化技术和传统虚拟化技术架构对比:
vm_vs_docker.png

vm_vs_docker.png

对比特点
虚拟机完整的系统功能,隔离性更好,占用空间大(通常以G为单位),运行占用资源较多,启动慢(分钟级启动)
容器只有程序运行的核心环境,不需要安装直接运行镜像即可,隔离性一般,十分小巧占用空间极小(一般以M为单位),启动快(秒级启动)

2.3 Docker引擎架构

Docker引擎组成:
docker_engine.png

docker_engine.png

Docker运行架构:
docker_framework.png

docker_framework.png

2.4 Docker底层技术

  1. 名称空间:Docker通过名称空间机制为容器提供隔离的工作空间。
  2. 控制组:Linux可以通过控制组设置进程使用CPU、内存和I/O资源的限额。Docker引擎正是依赖这种底层技术来限制容器使用的资源。
  3. 联合文件系统:可以将其他文件系统合并到一个联合挂载点。联合文件系统是实现Docker镜像的技术基础。Docker镜像可以通过分层来实现继承。
  4. 容器格式:Docker引擎将名称空间、控制组和联合文件系统打包到一起所使用的就是容器格式。默认的容器格式是Libcontainer。

2.5 Docker优势和用例

Docker优势:

  1. 应用程序快速、一致地交付
    1. 开发人员在本地编写应用程序代码,通过Docker与同事进行共享。
    2. 通过Docker将应用程序推送到测试环境中,执行自动测试和手动测试。
    3. 开发人员发现程序错误时,可以在开发环境中进行修复,然后重新部署到测试环境来进行测试和验证。
    4. 完成应用程序测试之后,向客户提供补丁程序非常简单,只需将更新后的镜像推送到生产环境中。
  2. 响应式部署和伸缩应用程序
  3. 更简单的系统运维
  4. 更高效的计算资源利用

Docker用例:

  1. 现代应用程序
  2. 微服务
  3. 持续集成和持续部署
  4. 大数据应用
  5. 边缘计算
  6. 云迁移
  7. 数字化转型
  8. 传统Windows服务器应用程序的现代化

3、Docker名词解释

镜像(image):docker镜像就好比是一个模板,可以通过这个模板来创建容器服务;一个镜像可以创建多个容器(应用运行在容器中)。

image_to_container.png

image_to_container.png

容器(container):docker容器可以独立运行一个或者一组应用程序;容器是由镜像创建出来的。

仓库(repository):docker仓库是存放镜像的地方;docker仓库分为公有仓库和私有仓库。docker默认仓库是Docker Hub。

Docker容器

1、Docker容器概述

Docker容器是镜像运行的实例。容器是在一个资源隔离的环境中运行应用程序和其依赖项的、轻量化的虚拟化技术。容器运行在独立的沙箱环境中,这保证了容器内的进程不会影响到容器外的任何进程。

1.1 容器的优点

  1. 敏捷环境:容器技术的最大优势是比创建VM(虚拟机)实例更快的速度。它们的轻量化在性能和占用空间方面的开销更小。
  2. 提高生产力:提高开发、部署以及升级效率;每个容器都可以被看作是一个不同的微服务,因此可以独立升级,而不需要考虑它们的同步。
  3. 版本控制:容器的每个镜像都可以进行版本控制,因此可以跟踪不同版本的容器,注意版本之间的差异。
  4. 计算环境可移植性:docker的镜像封装了程序运行所依赖的环境,所以只要安装docker程序,并下载镜像在任何环境都可以运行容器。
  5. 标准化:大多数容器基于开放标准,可以运行在所有主要的Linux发行版,微软等。
  6. 安全:容器将一个容器的进程与另一个容器以及底层基础架构隔离开来;因此一个容器中的任何升级或更改都不会影响其他容器。

1.2 容器工作原理

名称空间: Docker通过名称空间机制为容器提供隔离的工作空间。

控制组: Linux可以通过控制组设置进程使用CPU、内存和I/O资源的限额。Docker引擎正是依赖这种底层技术来限制容器使用的资源。

联合文件系统: 可以将其他文件系统合并到一个联合挂载点。联合文件系统是实现Docker镜像的技术基础。Docker镜像可以通过分层来实现继承。

容器格式: Docker引擎将名称空间、控制组和联合文件系统打包到一起所使用的就是容器格式。默认的容器格式是Libcontainer。

Docker容器使用UnionFS(联合文件系统):
当docker容器加载镜像启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。所有对容器的改动,无论添加、删除、还是修改文件都只会发生在容器层中;只有容器层是可写的,容器层下面的所有镜像层都是只读的。

image_run.png

image_run.png

2、Docker环境部署

2.1 docker安装

[root@167 ~]# cd /etc/yum.repos.d/
[root@167 yum.repos.d]# curl -o docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1919  100  1919    0     0   4680      0 --:--:-- --:--:-- --:--:--  4680
[root@167 yum.repos.d]# sed -i 's@https://download.docker.com@https://mirrors.tuna.tsinghua.edu.cn/docker-ce@g' docker-ce.repo
[root@167 yum.repos.d]# yum -y install docker-ce

2.2 docker加速器

docker-ce的配置文件是/etc/docker/daemon.json,此文件默认不存在,需要我们手动创建并进行配置,而docker的加速就是通过配置此文件来实现的。

docker的加速有多种方式:

  • docker cn
  • 中国科技大学加速器
  • 阿里云加速器(需要通过阿里云开发者平台注册帐号,免费使用个人私有的加速器)
[root@167 ~]# vim /etc/docker/daemon.json
[root@167 ~]# systemctl restart docker
[root@167 ~]# sudo systemctl daemon-reload 
[root@167 ~]# sudo systemctl restart docker
[root@167 ~]# cat /etc/docker/daemon.json 
{
	  "registry-mirrors": ["https://fyc7gm7k.mirror.aliyuncs.com"]
}
[root@167 ~]# docker info
 Registry Mirrors:
  https://fyc7gm7k.mirror.aliyuncs.com/
 //显示上面两行则说明添加成功
[root@167 ~]# 

3、Docker容器管理命令

3.1 容器查看命令

docker ps		//查看容器运行状态
选项:
-a 			//显示所有的容器,包括未运行的
-q			//只显示容器id
-l			//显示最近创建的容器。
-f "筛选条件"		//根据条件过滤显示的内容

示例:
[root@docker ~]# docker ps -a 
CONTAINER ID   IMAGE         COMMAND                  CREATED          STATUS                     PORTS     NAMES
b2573716a20d   hello-world   "/hello"                 9 minutes ago    Exited (0) 9 minutes ago             focused_perlman

CONTAINER ID		//容器 ID
IMAGE			//使用的镜像
COMMAND			//启动容器时运行的命令
CREATED			//容器的创建时间
STATUS			//容器状态
状态有7种:
	created(已创建)
	restarting(重启中)
	running(运行中)
	removing(迁移中)
	paused(暂停)
	exited(停止)
	dead(死亡)
PORTS			//容器的端口信息和使用的连接类型(tcp\udp)。
NAMES			//容器名称

3.2 容器详细信息查看命令

docker inspect 容器名	//查看容器详细信息

示例:
[root@docker ~]# docker inspect test
..............

3.3 容器创建命令

docker run		//从镜像运行一个容器
选项:
--name			//指定容器的名称,如果不指定随机给容器生成一个名称
-it			//为容器分配一个始终运行的伪终端,需要指定shell;-i保持运行状态,-t是分配伪终端,不建议run时使用
-d			//容器以守护进程的方式运行
-p 宿主机端口:容器端口	//将宿主机端口映射给容器端口
-v 宿主机目录:容器目录	//将宿主机目录挂载到容器中;直接写容器目录省略宿主机目录,将在宿主机自动创建一个目录挂载到容器中
--user uid:pid		//将宿主机用户和组映射至容器中
-e			//启动容器时传递环境及其值
--rm			//容器退出时删除容器
--cpuset-cpus CPU序号	//容器能够使用哪些物理cpu
--cpu-shares 数值	//CPU共享权值(相对权重)
--memory 数值		//容器内存限制,单位b,k,m,g
--memory-swap 数值	//容器内存+交换分区大小,不能小-m的值
--restart 策略		//指定容器停止后的重启策略
	no		//容器退出时不重启
	on-failure	//容器故障退出(返回值非零)时重启
	on-failure:3	//在容器非正常退出时重启容器,最多重启3次
	always		//容器退出时总是重启
	unless-stopped	//在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
--network 网络名称	//容器网络设置
	bridge 		//使用桥接模式
	host		//容器使用主机的网络
	container:NAME_or_ID //使用其他容器的网路,共享IP和PORT等网络资源
	none 		//容器使用自己的网络(类似bridge);但是不进行配置,如分配veth pair 和网桥连接,配置IP等
--link 容器名称		//指定容器间的关联,可以和指定容器进行通信

示例:
//使用nginx镜像启动一个名为nginx00的容器
[root@docker ~]# docker run --name nginx00 nginx 
.....略......

//使用nginx镜像启动一个名为nginx01的容器并分配一个bash shell的终端进入容器
[root@docker ~]# docker run --name nginx01 -it nginx /bin/bash
root@a4f41fb35ac3:/# 
root@a4f41fb35ac3:/# exit
注意:
1.指定-it选项为容器分配shell后,启动容器时运行的命令将会被shell替代
2.不加-d选项的容器一旦使用exit退出容器shell,容器就终止运行;ctrl+p+q可以退出shell,容器仍将继续运行

//使用nginx镜像启动一个名为nginx02的容器并在后台运行
[root@docker ~]# docker run --name nginx02 -d nginx
87dd1b06a58a87921178503024bfdfba79b0b80902606fc7bcccfce67939c6bc

//使用nginx镜像启动一个名为nginx03的容器,该容器在后台运行,访问宿主机的8080端口可以访问到容器的80端口
[root@docker ~]# docker run --name nginx03 -d -p 8080:80 nginx
9b2fa686b4aee04a7d564b6bf627b459e4aab43ca2b5b47ab590ee8e4ebd89f5

//查看所有容器状态
[root@docker ~]# docker ps -a 
CONTAINER ID   IMAGE         COMMAND                  CREATED          STATUS                     PORTS     NAMES
9b2fa686b4ae   nginx         "/docker-entrypoint.…"   23 minutes ago   Up 19 minutes              80/tcp    nginx03
87dd1b06a58a   nginx         "/docker-entrypoint.…"   42 minutes ago   Up 27 minutes              80/tcp    nginx02
a4f41fb35ac3   nginx         "/docker-entrypoint.…"   49 minutes ago   Exited (0) 4 seconds ago             nginx01
asdasd06a58a   nginx         "/docker-entrypoint.…"   59 minutes ago   Exited (0) 4 seconds ago             nginx00

3.4 容器生命周期管理命令

docker start   容器名	//开启容器
docker stop    容器名	//停止容器
docker kill    容器名	//杀死容器
docker restart 容器名	//重启容器
docker pause   容器名	//暂停容器中所有的进程
docker unpause 容器名	//恢复容器中所有的进程

3.5 容器占用资源查看命令

docker stats  容器名	//查看容器使用资源信息
docker top    容器名	//查看容器中运行的进程信息,支持ps命令参数
docker port   容器名	//查看宿主机端口和容器端口之间的端口映射

3.6 容器日志查看命令

//当容器创建失败时,因为容器没有启动成功则无法看到错误日志,无法判断问题所在,下面命令可以查看日志,不管容器时候启动成功

docker logs   容器名	//获取容器的日志信息
选项:
-f			//跟随打印最新的日志追加在最后面
-t			//显示日志打印的时间戳
--tail 数量		//只显示最新的指定数量的几条日志信息

3.7 容器内进程连接和命令执行

docker attach 容器名	//连接到正在运行的容器进程中,默认连接到容器启动时启动的进程

示例:
//连接到nginx02容器中的nginx进程,此时可以看到nginx工作日志
[root@docker ~]# docker attach nginx02
172.17.0.1 - - [27/Apr/2021:16:21:11 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.61.1" "-"
注意:使用attach连接到容器容器进程,一旦终止容器内的进程,容器就终止运行

//如果容器启动时运行的命令是shell进程,则连接shell终端
[root@docker ~]# docker attach nginx01
root@9b2fa686b4ae:/# 
root@9b2fa686b4ae:/# exit
exit
注意:使用attache连接到容器的shell一旦使用exit退出容器shell,容器就终止运行;ctrl+p+q可以退出shell,容器仍将继续运行

docker exec 容器名 执行命令	//不进入容器执行容器中的命令
选项:
-d				//后台执行,不显示结果
-it				//为容器分配一个始终运行的伪终端,需要指定shell;-i保持运行状态,-t是分配伪终端

示例:
//不进入容器执行容器中的ls命令
[root@docker ~]# docker exec nginx03 ls 
bin
boot
dev
......

//使用docker exec命令打开一个shell进入到容器中,使用exit退出shell,容器也不会终止运行
[root@docker ~]# docker exec -it nginx03 /bin/bash
root@87dd1b06a58a:/# 
root@87dd1b06a58a:/# exit
exit

3.8 宿主机和容器文件复制命令

docker cp 容器名:容器文件路径 宿主机路径	//将容器中的文件复制到宿主机中

docker cp 宿主机路径 容器名:容器文件路径	//将宿主机中的文件复制到容器中

示例:
//将容器中的nginx配置文件复制到宿主机
[root@docker ~]# docker cp nginx03:/etc/nginx/nginx.conf /root/
[root@docker ~]# ls
Documents  Music     Public     Videos           initial-setup-ks.cfg
Desktop  Downloads  Pictures  Templates  anaconda-ks.cfg  nginx.conf

3.9 容器导出和导入命令

docker export 容器名 > 导出的容器文件名	//容器导出

docker import 导出的容器文件名 镜像:标签	//容器导入,导入之后只会生成镜像

示例:
//将nginx01容器导出为/tmp/nginx-hzz文件
[root@docker ~]# docker export nginx03 > /tmp/nginx-zwl

//将导出的容器导入为镜像,名字叫nginx-zwl:zwl
[root@docker ~]# docker import /tmp/nginx-zwl nginx-zwl:zwl
sha256:e46da7739eede49b1f2aa5851f8c75a700d1159a69daa05427b65b3619d88353

3.10 容器删除命令

docker rm 容器名			//删除容器,无法删除运行状态下的容器
选项:
-f				//强制,可以删除运行状态下的容器

示例:
//删除nginx01容器
[root@docker ~]# docker rm nginx01
nginx01

//批量删除所有容器
[root@docker ~]# docker rm `docker ps -qa`
9b2fa686b4ae
a4f41fb35ac3
的容器导入为镜像,名字叫nginx-zwl:zwl
[root@docker ~]# docker import /tmp/nginx-zwl nginx-zwl:zwl
sha256:e46da7739eede49b1f2aa5851f8c75a700d1159a69daa05427b65b3619d88353

3.10 容器删除命令

docker rm 容器名			//删除容器,无法删除运行状态下的容器
选项:
-f				//强制,可以删除运行状态下的容器

示例:
//删除nginx01容器
[root@docker ~]# docker rm nginx01
nginx01

//批量删除所有容器
[root@docker ~]# docker rm `docker ps -qa`
9b2fa686b4ae
a4f41fb35ac3
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值