拥抱云原生《大厂学院——完结》

1,319 阅读7分钟

Docker实战

一、基本概念

1、Docker架构

K8S:CRI(Container Runtime Interface)

Client: 客户端;操作docker服务器的客户端(命令行或者界面)

Docker_Host:Docker主机;安装Docker服务的主机

Docker_Daemon:后台进程;运行在Docker服务器的后台进程

Containers:容器;在Docker服务器中的容器(一个容器一般是一个应用实例,容器间互相隔离)

拥抱云原生《大厂学院——完结》

提娶码:xb2k

Images:镜像、映像、程序包;Image是只读模板,其中包含创建Docker容器的说明。容器是由Image运

行而来,Image固定不变。

Registries:仓库;存储Docker Image的地方。官方远程仓库地址

Docker用Go编程语言编写,并利用Linux内核的多种功能来交付其功能。 Docker使用一种称为名称空间的技术来提供容器的隔离工作区。 运行容器时,Docker会为该容器创建一组名称空间。 这些名称空间提供了一层隔离。 容器的每个方面都在单独的名称空间中运行,并且对其的访问仅限于该名称空间。

容器与虚

2、Docker隔离原理

namespace 6项隔离 (资源隔离)

cgroups资源限制 (资源限制)

cgroup提供的主要功能如下:

资源限制:限制任务使用的资源总额,并在超过这个 配额 时发出提示

优先级分配:分配CPU时间片数量及磁盘IO带宽大小、控制任务运行的优先级

资源统计:统计系统资源使用量,如CPU使用时长、内存用量等

任务控制:对任务执行挂起、恢复等操作

cgroup资源控制系统,每种子系统独立地控制一种资源。功能如下

3、Docker

以下以centos为例;

更多其他安装方式,详细参照文档:

1、移除旧版本

sudo yum remove docker*

2、设置docker yum源

sudo yum install -y yum-utils

sudo yum-config-manager \

--add-repo \

https://download.docker.com/linux/centos/docker-ce.repo

#此处可以百度 docker yum aliyun 切换为ali的y

3、安装最新docker engine

sudo yum install docker-ce docker-ce-cli containerd.io

4、安装指定版本docker engine

1、在线安装

#找到所有可用docker版本列表

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

安装指定版本,用上面的版本号替换<VERSION_STRING>

sudo yum install docker-ce-<VERSION_STRING>.x86_64 docker-ce-cli-

<VERSION_STRING>.x86_64 containerd.io

#例如:

#yum install docker-ce-3:20.10.5-3.el7.x86_64 docker-ce-cli-3:20.10.5-

3.el7.x86_64 containerd.io

#注意加上 .x86_64 大版本号

2、离线安装

rpm -ivh xxx.rpm可以下载 tar解压启动

5、启动服务

systemctl start docker

systemctl enable docker

6、镜像加速

sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'

{

"registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"]

}

EOF

sudo systemctl daemon-reload

sudo systemctl restart docker

#以后docker下载直接从阿里云拉取相关镜像

/etc/docker/daemon.json 是Docker的核心配置文件。

7、可视化界面-Portainer

1、什么是Portainer

Portainer社区版2.0拥有超过50万的普通用户,是功能强大的开源工具集,可让您轻松地在Docker,Swarm,Kubernetes和Azure ACI中构建和管理容器。 Portainer的工作原理是在易于使用的GUI后面隐藏使管理容器变得困难的复杂性。通过消除用户使用CLI,编写YAML或理解清单的需求,Portainer使部署应用程序和解决问题变得如此简单,任何人都可以做到。 Portainer开发团队在这里为您的Docker之旅提

供帮助;

2、安装

服务端部署

docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v

/var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data

portainer/portainer-ce

访问 9000 端口即可

#agent端部署

docker run -d -p 9001:9001 --name portainer_agent --restart=always -v

/var/run/docker.sock:/var/run/docker.sock -v

/var/lib/docker/volumes:/var/lib/docker/volumes portainer/agent

二、命令复习

1、常见命令

所有Docker命令手册

根据正在运行的容器制作出相关的镜像:反向

根据镜像启动一个容器:正向

有了Docker:

1、先去软件市场搜镜像:registry.hub.docker.com/ docker hub

2、下载镜像 docker pull xxx

3、启动软件 docker run 镜像名;

对于镜像的所有管理操作都在这一个命令:docker image --help

docker pull redis == docker pull redis:latest(最新版)

# 阿里云的镜像是从docker hub来的,我们配置了加速,默认是从阿里云(缓存)下载

# 镜像是怎么做成的。基础环境+软件

redis的完整镜像应该是: linux系统+redis软件

alpine:超级经典版的linux 5mb;+ redis = 29.0mb

没有alpine3的:就是centos基本版

# 以后自己选择下载镜像的时候尽量使用

alpine: slim:

docker rmi -f $(docker images -aq) #删除全部镜像

docker image prune #移除游离镜像 dangling:游离镜像(没有镜像名字的)

docker tag 原镜像:标签 新镜像名:标签 #重命名

docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

docker create [设置项] 镜像名 [启动] [启动参数...]

docker create redis: 按照redis:latest镜像启动一个容器

docker kill是强制kill -9(直接拔电源);

docker stop可以允许优雅停机(当前正在运行中的程序处理完所有事情后再停止)

docker create --name myredis -p 6379(主机的端口):6379(容器的端口) redis

-p port1:port2

port1是必须唯一的,那个是没关系的。

docker run --name myredis2 -p 6379:6379 -p 8888:6379 redis :默认是前台启动的,一

再加上-d 让他后台悄悄启动, 虚拟机的很多端口绑定容器的一个端口是允许的

docker run -d == docker create + docker start

#启动了nginx;一个容器。docker 容器里面安装了nginx,要对nginx的所有修改都要进容器

#进容器:

docker attach 绑定的是控制台. 可能导致容器停止。不要用这个

docker exec -it -u 0:0 --privileged mynginx4 /bin/bash: 0用户,以特权方式进入容器

docker container inspect 容器名 = docker inspect 容器名

docker inspect image/network/volume ....

# 一般运行中的容器会常年修改,我们要使用最终的新镜像

docker commit -a leifengyang -m "first commit" mynginx4 mynginx:v4

#把新的镜像放到远程docker hub,方便后来在其他机器下载

#---------export操作容器/import-------------------

docker export导出的文件被import导入以后变成镜像,并不能直接启动容器,需要知道之前的启动命令

(docker ps --no-trunc),然后再用下面启动。

docker run -d -P mynginx:v6 /docker-entrypoint.sh nginx -g 'daemon off;'

或者docker image inspect 看之前的镜像,把 之前镜像的 Entrypoint的所有和 Cmd的连接起来就

能得到启动命令

#----save/load--操作镜像--

docker save -o busybox.tar busybox:latest 把busybox镜像保存成tar文件

docker load -i busybox.tar 把压缩包里面的内容直接导成镜像

#----------

镜像为什么能长久运行

镜像启动一定得有一个阻塞的进程,一直干活,在这里代理。

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

docker run --name myredis2 -p 6379:6379 -p 8888:6379 redis

镜像启动以后做镜像里面默认规定的活。

docker run -it busybox; 交互模式进入当前镜像启动的容器


#----产生镜像-----

1、基于已经存在的容器,提取成镜像

2、人家给了我tar包,导入成镜像

3、做出镜像

-1)、准备一个文件Dockerfile

FROM busybox

容器的状态

Created(新建)、Up(运行中)、Pause(暂停)、Exited(退出)

docker run的立即启动,docker create得稍后自己启动

推送镜像

注册docker hub并登录

可以创建一个仓库,选为public

docker push leifengyang/mynginx:tagname

docker hub一个完整镜像的全路径是

docker.io/library/redis:alpine3.13 我们的 docker.io/leifengyang/mynginx:tagname

docker images的时候镜像缩略了全名 默认官方镜像没有docker.io/library/

docker.io/ rediscommander / redis-commander:latest

docker.io/leifengyang/mynginx:v4 我的镜像的全称

登录远程docker仓库

当前会话登录以后 docker login 。所有的东西都会push到这个人的仓库

docker push leifengyang/mynginx:tagname

上面命令的完整版 docker push docker.io/leifengyang/mynginx:v4

怎么知道是否登录了 cat ~/.docker/config.json 有没有 auth的值,没有就是没有登录

docker hub太慢了,用阿里云的镜像仓库,或者以后的habor仓库

2、典型命令

1、docker run

常用关键参数 OPTIONS 说明:

CMD ping baidu.com

-2)、编写Dockerfile

-3)、构建镜像

docker build -t mybusy66:v6 -f Dockerfile .

#---做redis的镜像---

FROM alpine(基础镜像)

//下载安装包

//解压

//准备配置文件

CMD redis-server redis.conf

#----------

build 是根据一个Dockerfile构建出镜像

commit 是正在运行中的容器提交成一个镜像